Closed ghost closed 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 函数,无限递归。
cc.Node.v = 10
if (lua_getmetatable(L,1) && lua_getmetatable(L,-1))
cc.Node, k, v, nil, cc.ref, cc.re
module_newindex_event
谢谢你的递交。不过此问题在2.2.3版本之后已经修正,经测试,现已经无此问题。
不好意思,我没有在 quick-cocos2d-x 上测试过,我在最新的 Cocos2d-X 3.2 上遇到这个问题,仔细看了下 quick 中 class_newindex_event 已经做了更改,谢谢回复。
quick-cocos2d-x
Cocos2d-X 3.2
quick
class_newindex_event
如果一个module表没有设置过.set表,在module_newindex_event中会走到下面这部分
例如
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
函数,无限递归。