diff options
| author | chai <chaifix@163.com> | 2020-09-27 20:31:53 +0800 |
|---|---|---|
| committer | chai <chaifix@163.com> | 2020-09-27 20:31:53 +0800 |
| commit | 63cb4fbbb961da133c68865845eaf22d9b876700 (patch) | |
| tree | 42be163db598df2cf1c11d329c3e5843db4faa0c /src/lua51/lvm.c | |
| parent | 2dfa15a926f06137f2ba6afcce2e3c1d23300100 (diff) | |
*misc
Diffstat (limited to 'src/lua51/lvm.c')
| -rw-r--r-- | src/lua51/lvm.c | 8 |
1 files changed, 5 insertions, 3 deletions
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;// 当前函数原型里面的常数表 |
