bugfix: clear cached sub node

This commit is contained in:
Cloud Wu
2015-03-04 16:27:59 +08:00
parent 9a6e26db96
commit d19d4f2443

View File

@@ -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