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$
相关文章推荐
- Lua5.3 虚拟机指令分析(八)循环
- Lua5.3 虚拟机指令分析(十)表相关指令
- Lua5.3 虚拟机指令分析(四)分支与跳转
- Lua5.3 虚拟机指令分析(一)概述
- Lua5.3 虚拟机指令分析(二)赋值指令
- Lua5.3 虚拟机指令分析(三)表达式运算
- Lua5.3 虚拟机指令分析(六)不定参数
- Lua源码分析 -- 虚拟机以及指令解释
- Lua1.1 虚拟机指令分析
- lua源码分析之函数调用
- lua2.1函数调用过程分析(完善中)
- JavaScript:new 一个函数和直接调用函数的区别分析
- 通过例子学习Lua(4)--函数的调用
- Lua中调用C++函数示例
- CodeViz —— 一款分析 C/C++源代码中函数调用关系的调用图生成工具
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- lua进阶5-C++调用lua函数
- Lua 函数、闭包、尾调用总结
- 内核编译init脚本调用mountroot()函数分析
- Lua篇(第06章):Lua调用C++的函数