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$
阅读全文
0 0
- Lua5.3 虚拟机指令分析(五)函数调用
- Lua5.3 虚拟机指令分析(二)赋值指令
- Lua5.3 虚拟机指令分析(十)表相关指令
- Lua5.3 虚拟机指令分析(一)概述
- Lua5.3 虚拟机指令分析(三)表达式运算
- Lua5.3 虚拟机指令分析(四)分支与跳转
- Lua5.3 虚拟机指令分析(六)不定参数
- Lua5.3 虚拟机指令分析(八)循环
- 探索Lua5.2内部实现:虚拟机指令(3) Upvalues & Globals
- 探索Lua5.2内部实现:虚拟机指令(5)Arithmetic
- 探索Lua5.2内部实现:虚拟机指令(6)FUNCTION
- lua5.2 调用lua函数
- lua虚拟机函数调用指令OP_CALL、OP_RETURN
- Lua5.3 数学函数
- 探索Lua5.2内部实现:虚拟机指令(1) 概述
- 探索Lua5.2内部实现:虚拟机指令(2) MOVE & LOAD
- 探索Lua5.2内部实现:虚拟机指令(4) Table
- 探索Lua5.2内部实现:虚拟机指令(8) LOOP
- 学生成绩管理系统(Linux Shell版)
- c++入门教程(十四)
- c++的类模板
- Java虚拟机二:垃圾回收机制
- Django中models文件中的字段
- Lua5.3 虚拟机指令分析(五)函数调用
- 搭建javaweb服务器
- Lua5.3 虚拟机指令分析(六)不定参数
- Lua5.3 虚拟机指令分析(八)循环
- Lua5.3 虚拟机指令分析(十)表相关指令
- Linux后台开发具备能力集锦
- Lua 5.3 源文件加载
- cocos studio 3.10
- 怎样理解阻塞非阻塞与同步异步的区别?(个人理解)