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 (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 (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 (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 (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,/* a b c r(a), ... ,r(a+c-2) := r(a)(r(a+1), ... ,r(a+b-1)) */
op_tailcall,/* a b c return r(a)(r(a+1), ... ,r(a+b-1)) */
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 (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 (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 虛擬機器指令分析(十)表相關指令
op newtable,a b c r a size b,c 建立乙個新錶,結果存放在a所在的棧位置,表的陣列大小為b,表的hash大小為c.ttcs mac mini opcode ttc cat top newtable.lua local a a 1 100 a 2 ttc ttcs mac ...
lua 5 3語法分析的BNF
看lua直譯器源 的時候發現和lua官網上給的有點出入,自己記錄一下 官網的文件 直接在頁面搜尋bnf就行了 以下是從原始碼的注釋裡扣出來的,原始碼注釋有些地方寫的有點問題,可能是作者版本迭代的時候忘記改注釋了,幫作者改了一點 block statlist statlist fieldsel nam...
虛擬機器 指令寫出
是的,還有幾個節點的指令生成沒有測試呢,包括流控制語句,io.不過呢,流控制是相對比較容易優化的,進行 生成指令再對比 的測試不太好維護,而 io 指令很簡單 所以要不這樣,把指令寫出來,然後開個虛擬機器執行,如果執行沒問題就算測試通過了.一些常見的語義錯誤處理在之前的之前的內容中都以注釋形式出現,...