diff options
Diffstat (limited to 'src/lua51/lvm.c')
| -rw-r--r-- | src/lua51/lvm.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/lua51/lvm.c b/src/lua51/lvm.c index e0a0cd8..85e214a 100644 --- a/src/lua51/lvm.c +++ b/src/lua51/lvm.c @@ -343,7 +343,7 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, */ #define runtime_check(L, c) { if (!(c)) break; } - +//c 获得指令中的某个部分的值,并根据opmode进行校验 #define RA(i) (base+GETARG_A(i)) /* to be used after possible stack reallocation */ #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) @@ -374,17 +374,25 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, +//c 执行lua函数(不含C函数,C函数在luaD_precall执行) +//c 读取字节码并运行,沟通前端和后端的桥梁 +//c 在ldo.c->luaD_call函数中执行,前一步是luaD_precall() void luaV_execute (lua_State *L, int nexeccalls) { - LClosure *cl; - StkId base; - TValue *k; - const Instruction *pc; + //c 管理指令和数据栈的4个变量,会随着函数调用而改变 + LClosure *cl;// lua closure,包含函数原型、upvalue、环境env + StkId base;// 当前调用的base地址 + TValue *k;// 当前函数原型里面的常数表 + const Instruction *pc; //c 执行的指令 + + //c 此函数已经返回或调用了其他函数 reentry: /* entry point */ - lua_assert(isLua(L->ci)); - pc = L->savedpc; + lua_assert(isLua(L->ci)); // 做一个防护,重入必然是lua代码,OP_CALL和OP_TAILCALL会用luaD_precall处理C函数调用 + + pc = L->savedpc;//c 最开始是luaD_precall中赋值的函数原型的指令开头 cl = &clvalue(L->ci->func)->l; base = L->base; - k = cl->p->k; + k = cl->p->k; //c 当前函数原型的常量,所有函数调用都会用到的 + /* main loop of interpreter */ for (;;) { const Instruction i = *pc++; |
