diff options
Diffstat (limited to 'server/src/vm')
-rw-r--r-- | server/src/vm/function.lua | 11 | ||||
-rw-r--r-- | server/src/vm/local.lua | 10 | ||||
-rw-r--r-- | server/src/vm/vm.lua | 6 |
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) |