From 6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Sat, 23 Nov 2019 00:05:30 +0800 Subject: =?UTF-8?q?=E6=AD=A3=E8=B7=AF=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script-beta/vm/getLinks.lua | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 script-beta/vm/getLinks.lua (limited to 'script-beta/vm/getLinks.lua') 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 -- cgit v1.2.3