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.c24
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++;