首先调用的是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表的使用方式感觉多少有些不恰当