首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

LUA源码分析2:了解lua的文件结构和思考方式

2012-11-09 
LUA源码分析二:了解lua的文件结构和思考方式版本整理日期:2011/3/27对lmathlib.c文件中的函数进行跟调。函

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是最基础的结构文件

热点排行