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