先来看看lua if语句最简单的用法:
local n = 3
if n > 3 then
n = 4
else
n = 5
end
字节码
要分析lua如何通过词法(llex.c),语法(lparse.c),代码生成器(lcode.c)来解析上面这段代码,生成供虚拟机执行的字节码, 就得先知道这段lua代码最终究竟生成了什么模样的字节码。先来一步步断点调试虚拟机的执行入口luaV_execute(lvm.c),发现上述代码执行流程为:
1:OP_LOADK ----> 2:OP_LE ---> 3:OP_LOADK ---> 4:OP_RETURN就这4步。 第1步,第4步分别把3和4加载到n(加载到栈). 第4步就是退出函数了。第2步是条件语句的关键. 来看看OP_LE干了些啥工作:
void luaV_execute (lua_State *L, int nexeccalls) {
...
...
const Instruction i = *pc++; // (1)
...
switch (GET_OPCODE(i)) {
case OP_LE: {
Protect(
if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) // (2)B,C操作数比较多结果是否等于A操作数
dojump(L, pc, GETARG_sBx(*p