diff options
Diffstat (limited to 'script-beta/vm/vm.lua')
-rw-r--r-- | script-beta/vm/vm.lua | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/script-beta/vm/vm.lua b/script-beta/vm/vm.lua new file mode 100644 index 00000000..23a691df --- /dev/null +++ b/script-beta/vm/vm.lua @@ -0,0 +1,81 @@ +local guide = require 'parser.guide' +local util = require 'utility' + +local setmetatable = setmetatable +local assert = assert +local require = require +local type = type + +_ENV = nil + +local specials = { + ['_G'] = true, + ['rawset'] = true, + ['rawget'] = true, + ['setmetatable'] = true, + ['require'] = true, + ['dofile'] = true, + ['loadfile'] = true, +} + +---@class vm +local m = {} + +function m.lock(tp, source) + if m.locked[tp][source] then + return nil + end + m.locked[tp][source] = true + return function () + m.locked[tp][source] = nil + end +end + +--- 获取link的uri +function m.getLinkUris(call) + local workspace = require 'workspace' + local func = call.node + local name = func.special + if name == 'require' then + local args = call.args + if not args[1] then + return nil + end + local literal = guide.getLiteral(args[1]) + if type(literal) ~= 'string' then + return nil + end + return workspace.findUrisByRequirePath(literal, true) + end +end + +m.cacheTracker = setmetatable({}, { __mode = 'kv' }) + +--- 刷新缓存 +function m.refreshCache() + if m.cache then + m.cache.dead = true + end + m.cache = { + eachRef = {}, + eachField = {}, + getGlobals = {}, + getLinks = {}, + getGlobal = {}, + specialName = {}, + getLibrary = {}, + getValue = {}, + specials = nil, + } + m.locked = { + eachRef = {}, + eachField = {}, + getGlobals = {}, + getLinks = {}, + getLibrary = {}, + getValue = {}, + } + m.cacheTracker[m.cache] = true +end + +return m |