之前读书的时候,比较喜欢玩python,对于lua,就知道专门用来做游戏脚本的,一直没机会接触到。有幸的是,今年进入了一个新项目,用到了lua.我做事不喜欢不明不白,所以在使用lua过程中遇到不明一般都喜欢看源码探其原由。
lua51和lua52都有一个叫全局表_G,遍历这个表就可以知道,这个表保存了lua所有的全局函数和全局变量。
而到了lua52,有个叫_ENV的玩意,遍历这个表也知道,也得到跟_G一样的结果.
先看看这个_G是如何产生的。
在lua中,多个lua state会共享一个global state,在通过luaL_newstate()产生lua state而后初始化的过程中,在f_luaopen这个函数会调用init_registry初始化一个叫注册表的玩意.
如下,调用栈:
test.exe!init_registry(lua_State * L, global_State * g) 行 168 C
test.exe!f_luaopen(lua_State * L, void * ud) 行 187 + 0xd 字节 C
test.exe!luaD_rawrunprotected(lua_State * L, void (lua_State *, void *)* f, void * ud) 行 133 + 0x1f 字节 C
test.exe!lua_newstate(void * (void *, void *, unsigned int, unsigned int)* f, void * ud) 行 304 + 0x10 字节 C
tes