summaryrefslogtreecommitdiff
path: root/server/src/vm/pcall.lua
diff options
context:
space:
mode:
authorsumneko <sumneko@hotmail.com>2019-04-10 20:32:51 +0800
committersumneko <sumneko@hotmail.com>2019-04-10 20:32:51 +0800
commitcf5c0eaeb60c5610e7b9fe34f1d2df1376cb856d (patch)
tree009b7f0896c6d60654a153e3297141df45a9b597 /server/src/vm/pcall.lua
parentce9e8a5033dd9ea9bfd2bb2c53af0906e638db28 (diff)
downloadlua-language-server-cf5c0eaeb60c5610e7b9fe34f1d2df1376cb856d.zip
穿透pcall与xpcall
Diffstat (limited to 'server/src/vm/pcall.lua')
-rw-r--r--server/src/vm/pcall.lua50
1 files changed, 50 insertions, 0 deletions
diff --git a/server/src/vm/pcall.lua b/server/src/vm/pcall.lua
new file mode 100644
index 00000000..e5d1e26f
--- /dev/null
+++ b/server/src/vm/pcall.lua
@@ -0,0 +1,50 @@
+local mt = require 'vm.manager'
+local multi = require 'vm.multi'
+
+function mt:callPcall(func, values, source)
+ local funcValue = values:first()
+ if not funcValue then
+ return
+ end
+ local realFunc = funcValue:getFunction()
+ if not realFunc then
+ return
+ end
+ local argList = multi()
+ values:eachValue(function (i, v)
+ if i >= 2 then
+ argList:push(v)
+ end
+ end)
+ self:call(funcValue, argList, source)
+ if realFunc ~= func then
+ func:setReturn(1, self:createValue('boolean', source))
+ realFunc:getReturn():eachValue(function (i, v)
+ func:setReturn(i + 1, v)
+ end)
+ end
+end
+
+function mt:callXpcall(func, values, source)
+ local funcValue = values:first()
+ if not funcValue then
+ return
+ end
+ local realFunc = funcValue:getFunction()
+ if not realFunc then
+ return
+ end
+ local argList = multi()
+ values:eachValue(function (i, v)
+ if i >= 3 then
+ argList:push(v)
+ end
+ end)
+ self:call(funcValue, argList, source)
+ if realFunc ~= func then
+ func:setReturn(1, self:createValue('boolean', source))
+ realFunc:getReturn():eachValue(function (i, v)
+ func:setReturn(i + 1, v)
+ end)
+ end
+end