From 63cb4fbbb961da133c68865845eaf22d9b876700 Mon Sep 17 00:00:00 2001 From: chai Date: Sun, 27 Sep 2020 20:31:53 +0800 Subject: *misc --- src/lua51/lvm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/lua51/lvm.c') diff --git a/src/lua51/lvm.c b/src/lua51/lvm.c index ea1d019..8733b07 100644 --- a/src/lua51/lvm.c +++ b/src/lua51/lvm.c @@ -143,7 +143,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ setobj2t(L, oldval, val); h->flags = 0; - luaC_barriert(L, h, val); + luaC_barriert(L, h, val); // 向后屏障 return; } /* else will try the tag method */ @@ -344,6 +344,7 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, #define runtime_check(L, c) { if (!(c)) break; } //c 获得指令中的某个部分的值,并根据opmode进行校验 +//c 这里的base就是luaV_execute中的base #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)) @@ -373,13 +374,14 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, } -//c 虚拟机主入口 +//c!! 虚拟机主入口 +//c 在执行前,需要调用luaD_precall()设置虚拟机的指针、栈等,指向这个函数 //c 执行lua函数(不含C函数,C函数在luaD_precall执行) //c 读取字节码并运行,沟通前端和后端的桥梁 //c 在ldo.c->luaD_call函数中执行,前一步是luaD_precall() void luaV_execute (lua_State *L, int nexeccalls) { - //c 管理指令和数据栈的4个变量,会随着函数调用而改变 + //c 管理指令和数据栈的4个变量,会随着函数调用而改变,这样就实现的调用栈 LClosure *cl;// lua closure,包含函数原型、upvalue、环境env StkId base;// 当前调用的base地址 TValue *k;// 当前函数原型里面的常数表 -- cgit v1.1-26-g67d0