lua-users home
lua-l archive

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


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?

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

Thanks,
Xingzhi 'Harry' Pan