summaryrefslogtreecommitdiff
path: root/server/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/core')
-rw-r--r--server/src/core/value.lua38
-rw-r--r--server/src/core/vm.lua4
2 files changed, 34 insertions, 8 deletions
diff --git a/server/src/core/value.lua b/server/src/core/value.lua
index e7ba547b..7b79d2ab 100644
--- a/server/src/core/value.lua
+++ b/server/src/core/value.lua
@@ -1,4 +1,6 @@
-local DefaultSource = { start = 0, finish = 0 }
+local function getDefaultSource()
+ return { start = 0, finish = 0 }
+end
local mt = {}
mt.__index = mt
@@ -62,7 +64,7 @@ function mt:createField(name, source)
local field = {
type = 'field',
key = name,
- source = source or DefaultSource,
+ source = source or getDefaultSource(),
}
if not self._child then
@@ -149,11 +151,13 @@ function mt:getField(name, source, stack)
return field
end
-function mt:rawEachField(callback)
+function mt:rawEachField(callback, mark)
if not self._child then
return nil
end
- local mark = {}
+ if not mark then
+ mark = {}
+ end
for _, childs in pairs(self._child) do
for name, field in pairs(childs) do
if not mark[name] then
@@ -168,8 +172,26 @@ function mt:rawEachField(callback)
return nil
end
-function mt:eachField(callback)
- return self:rawEachField(callback)
+function mt:eachField(callback, mark, stack)
+ if not mark then
+ mark = {}
+ end
+ local res = self:rawEachField(callback, mark)
+ if res ~= nil then
+ return res
+ end
+ local indexMeta = self:getMeta('__index')
+ if not indexMeta then
+ return nil
+ end
+ if not stack then
+ stack = 0
+ end
+ stack = stack + 1
+ if stack > 10 then
+ return nil
+ end
+ return indexMeta.value:eachField(callback, mark, stack)
end
function mt:removeUri(uri)
@@ -224,7 +246,7 @@ function mt:addInfo(tp, source, var)
end
self._info[uri][#self._info[uri]+1] = {
type = tp,
- source = source or DefaultSource,
+ source = source or getDefaultSource(),
var = var,
}
return self
@@ -251,7 +273,7 @@ return function (tp, source, value)
end
-- TODO lib里的多类型
local self = setmetatable({
- source = source or DefaultSource,
+ source = source or getDefaultSource(),
uri = source and source.uri,
}, mt)
if value ~= nil then
diff --git a/server/src/core/vm.lua b/server/src/core/vm.lua
index 156b73d4..518277e2 100644
--- a/server/src/core/vm.lua
+++ b/server/src/core/vm.lua
@@ -20,6 +20,7 @@ function mt:createDummyVar(source, value)
type = 'local',
key = '',
source = source or getDefaultSource(),
+ close = self.scope.block.finish,
}
if source then
@@ -43,6 +44,9 @@ function mt:createLocal(key, source, value)
source = source or getDefaultSource(),
close = self.scope.block.finish,
}
+ if not loc.close then
+ error('Miss close')
+ end
if source then
source.bind = loc