mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-25 04:33:05 +00:00
bugfix: clear cached sub node
This commit is contained in:
@@ -31,14 +31,14 @@ end
|
|||||||
local function update(root, cobj, gcobj)
|
local function update(root, cobj, gcobj)
|
||||||
root.__obj = cobj
|
root.__obj = cobj
|
||||||
root.__gcobj = gcobj
|
root.__gcobj = gcobj
|
||||||
-- don't use pairs
|
local children = root.__cache
|
||||||
for k,v in next, root do
|
if children then
|
||||||
if type(v)=="table" and k~="__parent" then
|
for k,v in pairs(children) do
|
||||||
local pointer = index(cobj, k)
|
local pointer = index(cobj, k)
|
||||||
if type(pointer) == "userdata" then
|
if type(pointer) == "userdata" then
|
||||||
update(v, pointer, gcobj)
|
update(v, pointer, gcobj)
|
||||||
else
|
else
|
||||||
root[k] = nil
|
children[k] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -74,13 +74,22 @@ function meta:__index(key)
|
|||||||
local obj = getcobj(self)
|
local obj = getcobj(self)
|
||||||
local v = index(obj, key)
|
local v = index(obj, key)
|
||||||
if type(v) == "userdata" then
|
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,
|
__obj = v,
|
||||||
__gcobj = self.__gcobj,
|
__gcobj = self.__gcobj,
|
||||||
__parent = self,
|
__parent = self,
|
||||||
__key = key,
|
__key = key,
|
||||||
}, meta)
|
}, meta)
|
||||||
self[key] = r
|
children[key] = r
|
||||||
return r
|
return r
|
||||||
else
|
else
|
||||||
return v
|
return v
|
||||||
|
|||||||
Reference in New Issue
Block a user