diff --git a/lualib/sharedata/corelib.lua b/lualib/sharedata/corelib.lua index 90dc1f94..481e85fa 100644 --- a/lualib/sharedata/corelib.lua +++ b/lualib/sharedata/corelib.lua @@ -31,14 +31,14 @@ end local function update(root, cobj, gcobj) root.__obj = cobj root.__gcobj = gcobj - -- don't use pairs - for k,v in next, root do - if type(v)=="table" and k~="__parent" then + local children = root.__cache + if children then + for k,v in pairs(children) do local pointer = index(cobj, k) if type(pointer) == "userdata" then update(v, pointer, gcobj) else - root[k] = nil + children[k] = nil end end end @@ -74,13 +74,22 @@ function meta:__index(key) local obj = getcobj(self) local v = index(obj, key) if type(v) == "userdata" then - local r = setmetatable({ + local children = self.__cache + if children == nil then + children = {} + self.__cache = children + end + local r = children[key] + if r then + return r + end + r = setmetatable({ __obj = v, __gcobj = self.__gcobj, __parent = self, __key = key, }, meta) - self[key] = r + children[key] = r return r else return v