From d19d4f24431fcb2b3e87ab4ec13c14e628ea9e98 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 4 Mar 2015 16:27:59 +0800 Subject: [PATCH] bugfix: clear cached sub node --- lualib/sharedata/corelib.lua | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) 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