summaryrefslogtreecommitdiff
path: root/script-beta/src/vm/getGlobals.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/src/vm/getGlobals.lua')
-rw-r--r--script-beta/src/vm/getGlobals.lua45
1 files changed, 45 insertions, 0 deletions
diff --git a/script-beta/src/vm/getGlobals.lua b/script-beta/src/vm/getGlobals.lua
new file mode 100644
index 00000000..699dd270
--- /dev/null
+++ b/script-beta/src/vm/getGlobals.lua
@@ -0,0 +1,45 @@
+local guide = require 'parser.guide'
+local vm = require 'vm.vm'
+
+local function getGlobals(root)
+ local env = guide.getENV(root)
+ local cache = {}
+ local mark = {}
+ vm.eachField(env, function (info)
+ local src = info.source
+ if mark[src] then
+ return
+ end
+ mark[src] = true
+ local name = info.key
+ if not name then
+ return
+ end
+ if not cache[name] then
+ cache[name] = {
+ key = name,
+ mode = {},
+ }
+ end
+ cache[name][#cache[name]+1] = info
+ cache[name].mode[info.mode] = true
+ vm.cache.getGlobal[src] = name
+ end)
+ return cache
+end
+
+function vm.getGlobals(source)
+ source = guide.getRoot(source)
+ local cache = vm.cache.getGlobals[source]
+ if cache ~= nil then
+ return cache
+ end
+ local unlock = vm.lock('getGlobals', source)
+ if not unlock then
+ return nil
+ end
+ cache = getGlobals(source) or false
+ vm.cache.getGlobals[source] = cache
+ unlock()
+ return cache
+end