diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-16 16:04:03 +0100 |
---|---|---|
committer | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-16 16:04:44 +0100 |
commit | 62cb8279094fd137ce2382fe99592ef0aae0f557 (patch) | |
tree | 0ec59ec29c410e20f177e874e0a001ab620e02e2 /src/lapi.js | |
parent | f556eada483134f5dc433e6bd4510047e4953649 (diff) | |
download | fengari-62cb8279094fd137ce2382fe99592ef0aae0f557.tar.gz fengari-62cb8279094fd137ce2382fe99592ef0aae0f557.tar.bz2 fengari-62cb8279094fd137ce2382fe99592ef0aae0f557.zip |
lua_call
Diffstat (limited to 'src/lapi.js')
-rw-r--r-- | src/lapi.js | 31 |
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 |