LUA源码分析二:了解lua的文件结构和思考方式
版本整理日期:2011/3/27
对lmathlib.c文件中的函数进行跟调。函数是那个不重要,这里选取math_abs
//lapi.cstatic TValue *index2adr (lua_State *L, int idx) { if (idx > 0) { TValue *o = L->base + (idx - 1); api_check(L, idx <= L->ci->top - L->base); if (o >= L->top) return cast(TValue *, luaO_nilobject); else return o; } else if (idx > LUA_REGISTRYINDEX) { api_check(L, idx != 0 && -idx <= L->top - L->base); return L->top + idx; } else switch (idx) { /* pseudo-indices */ case LUA_REGISTRYINDEX: return registry(L); case LUA_ENVIRONINDEX: { Closure *func = curr_func(L); sethvalue(L, &L->env, func->c.env); return &L->env; } case LUA_GLOBALSINDEX: return gt(L); default: { Closure *func = curr_func(L); idx = LUA_GLOBALSINDEX - idx; return (idx <= func->c.nupvalues) ? &func->c.upvalue[idx-1] : cast(TValue *, luaO_nilobject); } }}?
?
先不具体去追究里面意思,可以知道这么几个信息
1)根据idx不同,可以取到不同的目标,而且idx可以是全局的
2)top其实是个连续的栈信息
3)L->ci似乎是个监测边界的东西
4)Closure的东西,有其他的存储方式
OK,到这,起码可以了解lua库的调用流程和思考方式习惯,再把各个调用函数对应的文件流程
整理下:
?
lmathlib.c(math_abs)
lauxlib.c(luaL_checknumber)
lapi.c(lua_tonumber,lua_isnumber)
lapi.c(index2adr)
lvm.h(tonumber)
lvm.h(luaV_tonumber)
lobject.h(luaO_str2d)
luaconf.h(lua_str2number)
可以得到如下信息:
1)luaX_,X可以表示lvm,lobject等
2)api.c表示lua内部的函数,lib库是对外开放的
3)lobject.h,luaconf.h是最基础的结构文件