summaryrefslogtreecommitdiff
path: root/server/src/vm/pcall.lua
diff options
context:
space:
mode:
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