summaryrefslogtreecommitdiff
path: root/script-beta/vm/getLinks.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/vm/getLinks.lua')
-rw-r--r--script-beta/vm/getLinks.lua48
1 files changed, 48 insertions, 0 deletions
diff --git a/script-beta/vm/getLinks.lua b/script-beta/vm/getLinks.lua
new file mode 100644
index 00000000..6875771f
--- /dev/null
+++ b/script-beta/vm/getLinks.lua
@@ -0,0 +1,48 @@
+local guide = require 'parser.guide'
+local vm = require 'vm.vm'
+
+local function getLinks(root)
+ local cache = {}
+ local ok
+ guide.eachSpecialOf(root, 'require', function (source)
+ local call = source.parent
+ if call.type == 'call' then
+ local uris = vm.getLinkUris(call)
+ if uris then
+ ok = true
+ for i = 1, #uris do
+ local uri = uris[i]
+ if not cache[uri] then
+ cache[uri] = {}
+ end
+ cache[uri][#cache[uri]+1] = call
+ end
+ end
+ end
+ end)
+ if not ok then
+ return nil
+ end
+ return cache
+end
+
+function vm.getLinks(source)
+ source = guide.getRoot(source)
+ local cache = vm.cache.getLinks[source]
+ if cache ~= nil then
+ return cache
+ end
+ local unlock = vm.lock('getLinks', source)
+ if not unlock then
+ return nil
+ end
+ local clock = os.clock()
+ cache = getLinks(source) or false
+ local passed = os.clock() - clock
+ if passed > 0.1 then
+ log.warn(('getLinks takes [%.3f] sec!'):format(passed))
+ end
+ vm.cache.getLinks[source] = cache
+ unlock()
+ return cache
+end