chukong / quick-cocos2d-x

quick-cocos2d-x is a quick framework, based on cocos2d-x. Make mobile games in Lua.
http://quick-x.com/
1.48k stars 868 forks source link

module_newindex_event 导致无限递归 #427

Closed ghost closed 10 years ago

ghost commented 10 years ago

如果一个module表没有设置过.set表,在module_newindex_event中会走到下面这部分

/* call old newindex meta event */
if (lua_getmetatable(L,1) && lua_getmetatable(L,-1))
{
    lua_pushstring(L,"__newindex");
    lua_rawget(L,-2);
    if (lua_isfunction(L,-1))
    {
        lua_pushvalue(L,1);
        lua_pushvalue(L,2);
        lua_pushvalue(L,3);
        lua_call(L,3,0);
    }
}

例如 cc.Node.v = 10,走完上面 if (lua_getmetatable(L,1) && lua_getmetatable(L,-1))后栈中的数据是 cc.Node, k, v, nil, cc.ref, cc.re 由于顶层的module table的元表就是自己,每次拿到元表的元表调用__newindex(module 默认永远是一个方法),这个方法又会继续调用 module_newindex_event 函数,无限递归。

SunLightJuly commented 10 years ago

谢谢你的递交。不过此问题在2.2.3版本之后已经修正,经测试,现已经无此问题。

ghost commented 10 years ago

不好意思,我没有在 quick-cocos2d-x 上测试过,我在最新的 Cocos2d-X 3.2 上遇到这个问题,仔细看了下 quickclass_newindex_event 已经做了更改,谢谢回复。