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

来源:互联网 发布:剑网三捏脸数据免费 编辑:程序博客网 时间:2024/06/05 14:32

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

OP_CLOSURE

OP_CLOSURE,/*   A Bx    R(A) := closure(KPROTO[Bx])         */TTcs-Mac-mini:OpCode ttc$ cat tOP_CLOSURE.luafunction f1() endTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CLOSURE.luamain <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]0constants (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]0constants (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.luaf1 = function() endTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CLOSURE_2.luamain <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]0constants (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]0constants (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)endfoo()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]0constants (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]0constants (2) for 0x7f83e1403b70:    1(idx)  "print"    2(idx)  1locals (0) for 0x7f83e1403b70:upvalues (1) for 0x7f83e1403b70:    0    _ENV(name)      0(instack)      0(idx)TTcs-Mac-mini:OpCode ttc$ 
原创粉丝点击