Lua5 3 虛擬機器指令分析(十)表相關指令

2021-08-07 04:13:21 字數 2333 閱讀 7923

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-mini:opcode ttc$ ./luac -l -l top_newtable.lua

main (4 instructions at 0x7f883b5001c0)

0+ params, 2 slots, 1 upvalue, 1 local, 4 constants, 0 functions

1 [1] newtable (iabc) [a]0 [isk]0[b]0[isk]0[c]0

2 [2] settable (iabc) [a]0 [isk]256[b]-1[isk]256[c]-2 ; 1 100

3 [3] settable (iabc) [a]0 [isk]256[b]-3[isk]256[c]-4 ; 2 "ttc"

4 [3] return (iabc) [a]0 [isk]0[b]1[isk]0

constants (4) for 0x7f883b5001c0:

1(idx) 1

2(idx) 100

3(idx) 2

4(idx) "ttc"

locals (1) for 0x7f883b5001c0:

0 a(name) 2(startpc) 5(endpc)

upvalues (1) for 0x7f883b5001c0:

0 _env(name) 1(instack) 0(idx)

ttcs-mac-mini:opcode ttc$

op_setlist,/*   a b c   r(a)[(c-1)*fpf+i] := r(a+i), 1 <= i <= b    */
a所在的棧位置是乙個表,該指令將初始化該錶的陣列元素,元素數量由b指定,而c指定是初始化時的塊索引,在lua中每塊的元素數量由lfields_per_flush指定,該值為50.換言之,r(a)[1] = r(a+1), r(a)[2] = r(a + 2) … 以此類推。

但是也有特殊的情況需要考慮。

1. 當b為0時,表示這個賦值操作中右邊的表示式是可變長度的表示式,比如乙個函式的返回值或者可變操作,此時上面的迴圈賦值過程將持續到棧頂位置.

2. 當c為0的時候,表示下乙個指令將為乙個整數儲存真正的c數值.這種情況很少,只會出現指令符c的範圍不足以表示塊大小的情況下:

ttcs-mac-mini:opcode ttc$ cat top\_setlist.lua 

local a =

ttcs-mac-mini:opcode ttc$ ./luac -l -l top\_setlist.lua

main (6 instructions at 0x7fe19c4039d0)

0+ params, 4 slots, 1 upvalue, 1 local, 1 constant, 0 functions

1 [1] newtable (iabc) [a]0 [isk]0[b]3[isk]0[c]0

2 [1] loadk (iabx) [a]1 [k]-1 ; 1

3 [1] loadk (iabx) [a]2 [k]-1 ; 1

4 [1] loadk (iabx) [a]3 [k]-1 ; 1

5 [1] setlist (iabc) [a]0 [isk]0[b]3[isk]0[c]1 ; 1

6 [1] return (iabc) [a]0 [isk]0[b]1[isk]0

constants (1) for 0x7fe19c4039d0:

1(idx) 1

locals (1) for 0x7fe19c4039d0:

0 a(name) 6(startpc) 7(endpc)

upvalues (1) for 0x7fe19c4039d0:

0 _env(name) 1(instack) 0(idx)

ttcs-mac-mini:opcode ttc$

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

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 m...

lua 5 3語法分析的BNF

看lua直譯器源 的時候發現和lua官網上給的有點出入,自己記錄一下 官網的文件 直接在頁面搜尋bnf就行了 以下是從原始碼的注釋裡扣出來的,原始碼注釋有些地方寫的有點問題,可能是作者版本迭代的時候忘記改注釋了,幫作者改了一點 block statlist statlist fieldsel nam...

虛擬機器 指令寫出

是的,還有幾個節點的指令生成沒有測試呢,包括流控制語句,io.不過呢,流控制是相對比較容易優化的,進行 生成指令再對比 的測試不太好維護,而 io 指令很簡單 所以要不這樣,把指令寫出來,然後開個虛擬機器執行,如果執行沒問題就算測試通過了.一些常見的語義錯誤處理在之前的之前的內容中都以注釋形式出現,...