lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]




2011/6/2 Xingzhi Pan <vengeance.storm@gmail.com>
Hi,

I'm using luac -l to observe the bytecode of the following Lua source:

 1 function fo (i)
 2     uv = 0
 3     function fi1 ()
 4         print(uv)
 5         uv = 1
 6         print(uv)
 7     end
 8     function fi2 ()
 9         print(uv)
10         uv = 2
11         print(uv)
12     end
13     if i == 1 then return fi1 end
14     if i == 2 then return fi2 end
15 end
16

And this is what I get:

main <../upval.lua:0,0> (3 instructions, 12 bytes at 0x100101050)
0+ params, 2 slots, 0 upvalues, 0 locals, 1 constant, 1 function
       1       [15]    CLOSURE         0 0     ; 0x1001011f0
       2       [1]     SETGLOBAL       0 -1    ; fo
       3       [15]    RETURN          0 1

function <../upval.lua:1,15> (15 instructions, 60 bytes at 0x1001011f0)
1 param, 2 slots, 0 upvalues, 1 local, 6 constants, 2 functions
       1       [2]     LOADK           1 -2    ; 0
       2       [2]     SETGLOBAL       1 -1    ; uv
       3       [7]     CLOSURE         1 0     ; 0x1001015c0
       4       [3]     SETGLOBAL       1 -3    ; fi1
       5       [12]    CLOSURE         1 1     ; 0x1001017c0
       6       [8]     SETGLOBAL       1 -4    ; fi2
       7       [13]    EQ              0 0 -5  ; - 1
       8       [13]    JMP             2       ; to 11
       9       [13]    GETGLOBAL       1 -3    ; fi1
       10      [13]    RETURN          1 2
       11      [14]    EQ              0 0 -6  ; - 2
       12      [14]    JMP             2       ; to 15
       13      [14]    GETGLOBAL       1 -4    ; fi2
       14      [14]    RETURN          1 2
       15      [15]    RETURN          0 1

function <../upval.lua:3,7> (9 instructions, 36 bytes at 0x1001015c0)
0 params, 2 slots, 0 upvalues, 0 locals, 3 constants, 0 functions
       1       [4]     GETGLOBAL       0 -1    ; print
       2       [4]     GETGLOBAL       1 -2    ; uv
       3       [4]     CALL            0 2 1
       4       [5]     LOADK           0 -3    ; 1
       5       [5]     SETGLOBAL       0 -2    ; uv
       6       [6]     GETGLOBAL       0 -1    ; print
       7       [6]     GETGLOBAL       1 -2    ; uv
       8       [6]     CALL            0 2 1
       9       [7]     RETURN          0 1

function <../upval.lua:8,12> (9 instructions, 36 bytes at 0x1001017c0)
0 params, 2 slots, 0 upvalues, 0 locals, 3 constants, 0 functions
       1       [9]     GETGLOBAL       0 -1    ; print
       2       [9]     GETGLOBAL       1 -2    ; uv
       3       [9]     CALL            0 2 1
       4       [10]    LOADK           0 -3    ; 2
       5       [10]    SETGLOBAL       0 -2    ; uv
       6       [11]    GETGLOBAL       0 -1    ; print
       7       [11]    GETGLOBAL       1 -2    ; uv
       8       [11]    CALL            0 2 1
       9       [12]    RETURN          0 1

So my question is that for inner functions fi1 and fi2, why GETGLOBAL
and SETGLOBAL, rather than GETUPVAL and SETUPVAL, are used?  Isn't uv
an upvalue?

Currently, uv is a global variable.
If you want an upvalue, you must use 'local uv = 0' line 2.

François
 

Also, it shows "0 upvalues" for these 2 functions, where I thought
should be one.

Thanks,
Xingzhi 'Harry' Pan