保证要加载的rb(executor)不带函数调用,只有声明
$ luac -l -p nocalling.rbo
main <?:0,0> (4 instructions at 000002064b78b960)
0+ params, 2 slots, 1 upvalue, 0 locals, 1 constant, 1 function
1 [-] VARARGPREP 0
2 [-] CLOSURE 0 0 ; 000002064b7937b0
3 [-] SETTABUP 0 0 0 ; - "called_later"
4 [-] RETURN 0 1 1 ; 0 out
function <?:1,3> (4 instructions at 000002064b7937b0)
0 params, 2 slots, 1 upvalue, 0 locals, 2 constants, 0 functions
1 [-] GETTABUP 0 0 0 ; - "print"
2 [-] LOADK 1 1 ; "hi"
3 [-] CALL 0 2 1 ; 1 in 0 out
4 [-] RETURN0
$ cat test.lua
function called_later()
print("hi")
end
$ luac -l -p call.rbo
main <?:0,0> (9 instructions at 000002b8fea3fe50)
0+ params, 2 slots, 1 upvalue, 0 locals, 4 constants, 0 functions
1 [-] VARARGPREP 0
2 [-] GETTABUP 0 0 0 ; - "print"
3 [-] LOADK 1 1 ; "hello!"
4 [-] CALL 0 2 1 ; 1 in 0 out
5 [-] GETTABUP 0 0 2 ; - "fn_a"
6 [-] CALL 0 1 1 ; 0 in 0 out
7 [-] GETTABUP 0 0 3 ; - "fn_b"
8 [-] CALL 0 1 1 ; 0 in 0 out
9 [-] RETURN 0 1 1 ; 0 out
所以要保证 main 函数没有 call 指令
lua vm源码: