summaryrefslogtreecommitdiff
path: root/server/src/vm
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/vm')
-rw-r--r--server/src/vm/function.lua11
-rw-r--r--server/src/vm/local.lua10
-rw-r--r--server/src/vm/vm.lua6
3 files changed, 22 insertions, 5 deletions
diff --git a/server/src/vm/function.lua b/server/src/vm/function.lua
index 8cebdf8f..d5f67e25 100644
--- a/server/src/vm/function.lua
+++ b/server/src/vm/function.lua
@@ -12,12 +12,18 @@ function mt:getUri()
return self.source.uri
end
-function mt:push()
+function mt:push(source)
self._top = self._top + 1
self.locals[self._top] = {}
+ self.blocks[self._top] = source
end
function mt:pop()
+ local closedBlock = self.blocks[self._top]
+ local closedLocals = self.locals[self._top]
+ for _, loc in pairs(closedLocals) do
+ loc:close(closedBlock.finish)
+ end
self._top = self._top - 1
end
@@ -234,9 +240,10 @@ return function (source)
local self = setmetatable({
source = source,
locals = {},
+ blocks = {},
args = {},
argValues = {},
}, mt)
- self:push()
+ self:push(source)
return self
end
diff --git a/server/src/vm/local.lua b/server/src/vm/local.lua
index 570f453d..fe8b3fe4 100644
--- a/server/src/vm/local.lua
+++ b/server/src/vm/local.lua
@@ -9,6 +9,7 @@ end
local mt = {}
mt.__index = mt
mt.type = 'local'
+mt._close = math.maxinteger
function mt:setValue(value)
if self.value then
@@ -67,6 +68,15 @@ function mt:shadow(old)
end
group[#group+1] = self
self._shadow = group
+ old:close(self.source.start - 1)
+end
+
+function mt:close(pos)
+ if pos then
+ self._close = pos
+ else
+ return self._close
+ end
end
return function (name, source, value)
diff --git a/server/src/vm/vm.lua b/server/src/vm/vm.lua
index 7168d0eb..47080454 100644
--- a/server/src/vm/vm.lua
+++ b/server/src/vm/vm.lua
@@ -19,8 +19,8 @@ function mt:getDefaultSource()
}
end
-function mt:scopePush()
- self.currentFunction:push()
+function mt:scopePush(source)
+ self.currentFunction:push(source)
end
function mt:scopePop()
@@ -99,7 +99,7 @@ function mt:runFunction(func)
local originFunction = self:getCurrentFunction()
self:setCurrentFunction(func)
- func:push()
+ func:push(func.source)
self:doActions(func.source)