summaryrefslogtreecommitdiff
path: root/script/vm/state.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/vm/state.lua')
-rw-r--r--script/vm/state.lua29
1 files changed, 23 insertions, 6 deletions
diff --git a/script/vm/state.lua b/script/vm/state.lua
index 0048649e..15f4af70 100644
--- a/script/vm/state.lua
+++ b/script/vm/state.lua
@@ -1,5 +1,4 @@
local util = require 'utility'
-local guide = require 'parser.guide'
local global = require 'vm.node.global'
---@class vm.state
@@ -16,6 +15,8 @@ m.literals = util.multiTable(2)
m.literalSubs = util.multiTable(2, function ()
return setmetatable({}, util.MODE_K)
end)
+---@type table<parser.object, boolean>
+m.allLiterals = {}
---@param name string
---@param uri uri
@@ -41,14 +42,29 @@ end
---@param uri uri
---@param source parser.object
function m.declareLiteral(uri, source)
+ if m.allLiterals[source] then
+ return
+ end
+ m.allLiterals[source] = true
local literals = m.literals[uri]
literals[#literals+1] = source
end
----@param literal parser.object
----@param source parser.object
-function m.subscribeLiteral(literal, source)
- m.literalSubs[literal][source] = true
+---@param source parser.object
+---@param node vm.node
+function m.subscribeLiteral(source, node)
+ if not node then
+ return
+ end
+ if node.type == 'union'
+ or node.type == 'cross' then
+ node:subscribeLiteral(source)
+ return
+ end
+ if not m.allLiterals[source] then
+ return
+ end
+ m.literalSubs[node][source] = true
end
---@param uri uri
@@ -61,10 +77,11 @@ function m.dropUri(uri)
local literals = m.literals[uri]
m.literals[uri] = nil
for _, literal in ipairs(literals) do
+ m.allLiterals[literal] = nil
local literalSubs = m.literalSubs[literal]
m.literalSubs[literal] = nil
for source in pairs(literalSubs) do
- source._compiled = nil
+ source._node = nil
end
end
end