因此,在对 LCLosures 进行调查时,我发现它具有与 CClosures 相同的类型外观,但在原型中更进一步,其中也存储了 upvalues。
#define ClosureHeader \
CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
struct Table *env
typedef struct LClosure {
ClosureHeader;
struct Proto *p;
UpVal *upvals[1];
} LClosure;
然后在原型里面你有
typedef struct Proto {
CommonHeader;
TValue *k; /* constants used by the function */
Instruction *code;
struct Proto **p; /* functions defined inside the function */
int *lineinfo; /* map from opcodes to source lines */
struct LocVar *locvars; /* information about local variables */
TString **upvalues; /* upvalue names */
TString *source;
int sizeupvalues;
int sizek; /* size of `k' */
int sizecode;
int sizelineinfo;
int sizep; /* size of `p' */
int sizelocvars;
int linedefined;
int lastlinedefined;
GCObject *gclist;
lu_byte nups; /* number of upvalues */
lu_byte numparams;
lu_byte is_vararg;
lu_byte maxstacksize;
} Proto;
我的问题是你两个都用吗?就 Lua 而言,它们是否意味着不同的东西?我找不到任何好的解释。由于 lua_getupvalue 函数不涉及前一个,它只使用原型中的 upvalues。任何帮助,将不胜感激。