diff options
Diffstat (limited to 'src/lua51/lvm.c')
| -rw-r--r-- | src/lua51/lvm.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lua51/lvm.c b/src/lua51/lvm.c index b353500..ea1d019 100644 --- a/src/lua51/lvm.c +++ b/src/lua51/lvm.c @@ -378,17 +378,18 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, //c 读取字节码并运行,沟通前端和后端的桥梁 //c 在ldo.c->luaD_call函数中执行,前一步是luaD_precall() void luaV_execute (lua_State *L, int nexeccalls) { + //c 管理指令和数据栈的4个变量,会随着函数调用而改变 LClosure *cl;// lua closure,包含函数原型、upvalue、环境env StkId base;// 当前调用的base地址 TValue *k;// 当前函数原型里面的常数表 - const Instruction *pc; //c 执行的指令 + const Instruction *pc; //c 指令指针 //c 此函数已经返回或调用了其他函数 - reentry: /* entry point */ +reentry: /* entry point */ lua_assert(isLua(L->ci)); // 做一个防护,重入必然是lua代码,OP_CALL和OP_TAILCALL会用luaD_precall处理C函数调用 - pc = L->savedpc;//c 最开始是luaD_precall中赋值的函数原型的指令开头 + pc = L->savedpc;//c 最开始是luaD_precall中赋值的函数原型的指令开头,L->savedpc在luaD_precall中设置 cl = &clvalue(L->ci->func)->l; base = L->base; //c base是寄存器开始地址,每个方法被调用时都会得到自己的一组虚拟寄存器 k = cl->p->k; //c 当前函数原型的常量,所有函数调用都会用到的 @@ -650,7 +651,7 @@ void luaV_execute (lua_State *L, int nexeccalls) { if (b != 0) L->top = ra+b-1; if (L->openupval) luaF_close(L, base); L->savedpc = pc; - b = luaD_poscall(L, ra); + b = luaD_poscall(L, ra); //c! 执行结束后,将L恢复到调用前的状态 if (--nexeccalls == 0) /* was previous function running `here'? */ return; /* no: return */ else { /* yes: continue its execution */ |
