Lua5 3 虛擬機器指令分析(五)函式呼叫

2021-08-07 04:13:21 字數 3859 閱讀 5516

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 指令很簡單 所以要不這樣,把指令寫出來,然後開個虛擬機器執行,如果執行沒問題就算測試通過了.一些常見的語義錯誤處理在之前的之前的內容中都以注釋形式出現,...