diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-17 11:33:23 +0100 |
---|---|---|
committer | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-17 11:34:49 +0100 |
commit | a8e82fc01f2558550289f76f55c917039296ec11 (patch) | |
tree | b226aeca2d8445ee8bcfd644477992a0635e46e0 /src/lapi.js | |
parent | 4a03542f6ebc8c6d4ed624bc0d30f5a7148a279b (diff) | |
download | fengari-a8e82fc01f2558550289f76f55c917039296ec11.tar.gz fengari-a8e82fc01f2558550289f76f55c917039296ec11.tar.bz2 fengari-a8e82fc01f2558550289f76f55c917039296ec11.zip |
lua_load (bytecode only), lua_call(k)
Diffstat (limited to 'src/lapi.js')
-rw-r--r-- | src/lapi.js | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/lapi.js b/src/lapi.js index 976841d..6cc95b2 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -240,6 +240,24 @@ const lua_typename = function(L, t) { ** 'load' and 'call' functions (run Lua code) */ +const lua_load = function(L, data, chunckname) { + if (!chunckname) chunckname = "?"; + + let status = ldo.luaD_protectedparser(L, data, chunckname); + if (status === TS.LUA_OK) { + let f = L.stack[L.top - 1]; /* get newly created function */ + if (f.nupvalues >= 1) { /* does it have an upvalue? */ + /* get global table from registry */ + let reg = L.l_G.l_registry; + let gt = reg.value.array[lua.LUA_RIDX_GLOBALS]; + /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ + f.upvals[0].v = gt; // TODO: is gt on the stack ? is that upvalue opened or closed ? + } + } + + return status; +}; + 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"); @@ -333,6 +351,7 @@ module.exports.lua_tointeger = lua_tointeger; module.exports.lua_toboolean = lua_toboolean; module.exports.lua_tolstring = lua_tolstring; module.exports.lua_tostring = lua_tostring; +module.exports.lua_load = lua_load; module.exports.lua_callk = lua_callk; module.exports.lua_call = lua_call; module.exports.lua_pop = lua_pop;
\ No newline at end of file |