您的位置:首页 > 编程语言 > Lua

Lua5.3 虚拟机指令分析(五)函数调用

2017-08-20 01:56 253 查看

Lua5.3 虚拟机指令分析(五)函数调用

OP_CLOSURE

OP_CLOSURE,/*   A Bx    R(A) := closure(KPROTO[Bx])         */

TTcs-Mac-mini:OpCode ttc$ cat tOP_CLOSURE.lua
function f1() end

TTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CLOSURE.lua

main <tOP_CLOSURE.lua:0,0> (3 instructions at 0x7fdcfcc039d0)
0+ params, 2 slots, 1 upvalue, 0 locals, 1 constant, 1 function
1   [1] CLOSURE     (iABx) [A]0 [U]0    ; 0x7fdcfcc03b80
2   [1] SETTABUP    (iABC) [A]0 [ISK]256[B]-1[ISK]0[C]0 ; _ENV "f1"
3   [1] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (1) for 0x7fdcfcc039d0:
1(idx)  "f1"
locals (0) for 0x7fdcfcc039d0:
upvalues (1) for 0x7fdcfcc039d0:
0    _ENV(name)      1(instack)      0(idx)

function <tOP_CLOSURE.lua:1,1> (1 instruction at 0x7fdcfcc03b80)
0 params, 2 slots, 0 upvalues, 0 locals, 0 constants, 0 functions
1   [1] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (0) for 0x7fdcfcc03b80:
locals (0) for 0x7fdcfcc03b80:
upvalues (0) for 0x7fdcfcc03b80:
TTcs-Mac-mini:OpCode ttc$

TTcs-Mac-mini:OpCode ttc$ cat tOP_CLOSURE_2.lua
f1 = function() end
TTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CLOSURE_2.lua

main <tOP_CLOSURE_2.lua:0,0> (3 instructions at 0x7f9bd64038f0)
0+ params, 2 slots, 1 upvalue, 0 locals, 1 constant, 1 function
1   [1] CLOSURE     (iABx) [A]0 [U]0    ; 0x7f9bd6403aa0
2   [1] SETTABUP    (iABC) [A]0 [ISK]256[B]-1[ISK]0[C]0 ; _ENV "f1"
3   [1] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (1) for 0x7f9bd64038f0:
1(idx)  "f1"
locals (0) for 0x7f9bd64038f0:
upvalues (1) for 0x7f9bd64038f0:
0    _ENV(name)      1(instack)      0(idx)

function <tOP_CLOSURE_2.lua:1,1> (1 instruction at 0x7f9bd6403aa0)
0 params, 2 slots, 0 upvalues, 0 locals, 0 constants, 0 functions
1   [1] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (0) for 0x7f9bd6403aa0:
locals (0) for 0x7f9bd6403aa0:
upvalues (0) for 0x7f9bd6403aa0:
TTcs-Mac-mini:OpCode ttc$


由于函数在Lua 中 是“first class type”,所以其实上面两段 代码是等价的,也就是说,生成的 字节码是相同的,用于保存函数 f1 的相关信息,之后再将这些信息赋值给变量 f1(局部变量或者全局变量)。

OP_CALL

OP_CALL,/*  A B C   R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */


OP_TAILCALL

OP_TAILCALL,/*  A B C   return R(A)(R(A+1), ... ,R(A+B-1))      */


OP_RETURN

OP_RETURN,/*    A B return R(A), ... ,R(A+B-2)  (see note)  */

TTcs-Mac-mini:OpCode ttc$ cat tOP_CALL_2.lua
function foo()
print(1)
end

foo()
TTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CALL_2.lua

main <tOP_CALL_2.lua:0,0> (5 instructions at 0x7f83e14039c0)
0+ params, 2 slots, 1 upvalue, 0 locals, 1 constant, 1 function
1   [3] CLOSURE     (iABx) [A]0 [U]0    ; 0x7f83e1403b70
2   [1] SETTABUP    (iABC) [A]0 [ISK]256[B]-1[ISK]0[C]0 ; _ENV "foo"
3   [5] GETTABUP    (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; _ENV "foo"
4   [5] CALL        (iABC) [A]0 [ISK]0[B]1[ISK]0[C]1
5   [5] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (1) for 0x7f83e14039c0:
1(idx)  "foo"
locals (0) for 0x7f83e14039c0:
upvalues (1) for 0x7f83e14039c0:
0    _ENV(name)      1(instack)      0(idx)

function <tOP_CALL_2.lua:1,3> (4 instructions at 0x7f83e1403b70)
0 params, 2 slots, 1 upvalue, 0 locals, 2 constants, 0 functions
1   [2] GETTABUP    (iABC) [A]0 [ISK]0[B]0[ISK]256[C]-1 ; _ENV "print"
2   [2] LOADK       (iABx) [A]1 [K]-2   ; 1
3   [2] CALL        (iABC) [A]0 [ISK]0[B]2[ISK]0[C]1
4   [3] RETURN      (iABC) [A]0 [ISK]0[B]1[ISK]0
constants (2) for 0x7f83e1403b70:
1(idx)  "print"
2(idx)  1
locals (0) for 0x7f83e1403b70:
upvalues (1) for 0x7f83e1403b70:
0    _ENV(name)      0(instack)      0(idx)
TTcs-Mac-mini:OpCode ttc$
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua