summaryrefslogtreecommitdiff
path: root/src/lua51/lvm.c
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-09-27 20:31:53 +0800
committerchai <chaifix@163.com>2020-09-27 20:31:53 +0800
commit63cb4fbbb961da133c68865845eaf22d9b876700 (patch)
tree42be163db598df2cf1c11d329c3e5843db4faa0c /src/lua51/lvm.c
parent2dfa15a926f06137f2ba6afcce2e3c1d23300100 (diff)
*misc
Diffstat (limited to 'src/lua51/lvm.c')
-rw-r--r--src/lua51/lvm.c8
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;// 当前函数原型里面的常数表