upvalue的类型为
typedef struct UpVal {
CommonHeader;TValue *v; /* points to stack or to its own value */
union {
TValue value; /* the value (when closed) */
struct { /* double linked list (when open) */
struct UpVal *prev;
struct UpVal *next;
} l;
} u;
} UpVal;
当其为open时,是对当前栈上数据的引用.
lua采用mark and sweep GC. 其中main invariant (white objects cannot point to black ones)
新创建的upvalue默认为关闭的,并加入allgc
UpVal *luaF_newupval (lua_State *L) {
UpVal *uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), NULL, 0)->uv;
uv->v = &uv->u.value;
setnilvalue(uv->v);
return uv;
}