summaryrefslogtreecommitdiff
path: root/src/lua51/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua51/lvm.c')
-rw-r--r--src/lua51/lvm.c9
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 */