aboutsummaryrefslogtreecommitdiff
path: root/src/lapi.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/lapi.js')
-rw-r--r--src/lapi.js31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/lapi.js b/src/lapi.js
index ee976e1..99955a3 100644
--- a/src/lapi.js
+++ b/src/lapi.js
@@ -219,10 +219,33 @@ const lua_typename = function(L, t) {
** 'load' and 'call' functions (run Lua code)
*/
+const lua_callk = function(L, nargs, nresults, ctx, k) {
+ assert(k === null || !(L.ci.callstatus & CIST_LUA), "cannot use continuations inside hooks");
+ assert(nargs + 1 < L.top - L.ci.funcOff, "not enough elements in the stack");
+ assert(L.status === TS.LUA_OK, "cannot do calls on non-normal thread");
+ assert(nargs === lua.LUA_MULTRET || (L.ci.top - L.top >= nargs - nresults, "results from function overflow current stack size"));
+
+ let func = L.top - (nargs + 1);
+ if (k !== null && L.nny === 0) { /* need to prepare continuation? */
+ L.ci.u.c.k = k;
+ L.ci.u.c.ctx = ctx;
+ ldo.luaD_call(L, func, nresults);
+ } else { /* no continuation or no yieldable */
+ ldo.luaD_callnoyield(L, func, nresults);
+ }
+
+ if (nresults == lua.LUA_MULTRET && L.ci.top < L.top)
+ L.ci.top = L.top;
+};
+
+const lua_call = function(L, n, r) {
+ lua_callk(L, n, r, 0, null);
+};
+
const lua_pcallk = function(L, nargs, nresults, errfunc, ctx, k) {
- assert(nargs + 1 < L.top - L.ci.func, "not enough elements in the stack");
+ assert(nargs + 1 < L.top - L.ci.funcOff, "not enough elements in the stack");
assert(L.status === TS.LUA_OK, "cannot do calls on non-normal thread");
- assert(nargs == lua.LUA_MULTRET || (L.ci.top - L.top >= nargs - nresults, "results from function overflow current stack size"));
+ assert(nargs === lua.LUA_MULTRET || (L.ci.top - L.top >= nargs - nresults, "results from function overflow current stack size"));
let c = {
func: null,
@@ -286,4 +309,6 @@ module.exports.lua_tonumber = lua_tonumber;
module.exports.lua_tointeger = lua_tointeger;
module.exports.lua_toboolean = lua_toboolean;
module.exports.lua_tolstring = lua_tolstring;
-module.exports.lua_tostring = lua_tostring; \ No newline at end of file
+module.exports.lua_tostring = lua_tostring;
+module.exports.lua_callk = lua_callk;
+module.exports.lua_call = lua_call; \ No newline at end of file