diff options
author | sumneko <sumneko@hotmail.com> | 2019-04-10 20:32:51 +0800 |
---|---|---|
committer | sumneko <sumneko@hotmail.com> | 2019-04-10 20:32:51 +0800 |
commit | cf5c0eaeb60c5610e7b9fe34f1d2df1376cb856d (patch) | |
tree | 009b7f0896c6d60654a153e3297141df45a9b597 /server/src/vm/pcall.lua | |
parent | ce9e8a5033dd9ea9bfd2bb2c53af0906e638db28 (diff) | |
download | lua-language-server-cf5c0eaeb60c5610e7b9fe34f1d2df1376cb856d.zip |
穿透pcall与xpcall
Diffstat (limited to 'server/src/vm/pcall.lua')
-rw-r--r-- | server/src/vm/pcall.lua | 50 |
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 |