Lua中关于C API的内容。
Iapi.c
index2addr:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | static TValue *index2addr (lua_State *L, int idx) {CallInfo *ci = L->ci;
 if (idx > 0) {
 TValue *o = ci->func + idx;
 api_check(idx <= ci->top - (ci->func + 1), "unacceptable index");
 if (o >= L->top) return NONVALIDVALUE;
 else return o;
 }
 else if (!ispseudo(idx)) {
 api_check(idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
 return L->top + idx;
 }
 else if (idx == LUA_REGISTRYINDEX)
 return &G(L)->l_registry;
 else {
 idx = LUA_REGISTRYINDEX - idx;
 api_check(idx <= MAXUPVAL + 1, "upvalue index too large");
 if (ttislcf(ci->func))
 return NONVALIDVALUE;
 else {
 CClosure *func = clCvalue(ci->func);
 return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;
 }
 }
 }
 
 | 
这个index2addr函数的作用就是通过给定的 index 参数取出对应的TValue类型的对象指针。
| 情况 | 执行 | 
| 当 index > 0 时 | 在当前function的栈空间找对应的TValue | 
| 当 LUA_REGISTRYINDEX < index <= 0 时 | 在当前function的栈空间逆向找对应的TValue | 
| 当LUA_REGISTRYINDEX == index 时 | 返回registry(注册表) | 
| 否则当 LUA_REGISTRYINDEX > index 时 | 查找upvalues |