0%

cocos2d-x3.0rc0版本lua的初始化过程中的一些问题

首先调用的是LuaEngine的init()方法,
LuaEngine::init首先初始化了LuaStack,
然后去加载被被标记为过时的lua api库

其实主要的lua初始化过程在LuaStack

LuaStack::init中首先创建luastate,
然后加载基础类库,
之后加载tolua++的fix.

再之后就开始注册cocos2d-x在lua中所能使用的函数了

首先注册的是print函数,这里需要特别注意
*luaL_register的调用会在lua栈中push进_G这个table*

在之后register_all_xxx的时候会调用一个tolua_module的函数,
而这个函数会用到栈顶的_G这个table.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (name)
{
/* tolua module */
lua_pushstring(L,name);
lua_rawget(L,-2); //看见这里了吗?这里实际上是在luaL_register时候添加到栈里的
if (!lua_istable(L,-1)) /* check if module already exists */
{
lua_pop(L,1);
lua_newtable(L);
lua_pushstring(L,name);
lua_pushvalue(L,-2);
lua_rawset(L,-4); /* assing module into module */
}
}

这也就是为什么我们在自己的函数中使用相同的方式register_all_xxx的时候会报错的原因,
因为_G已经不在栈里了

其他部分都可以通过读源码了解,但是这个tolua_module_G表的使用方式感觉多少有些不恰当