diff options
author | Benoit Giannangeli <giann008@gmail.com> | 2017-02-16 21:29:06 +0100 |
---|---|---|
committer | Benoit Giannangeli <giann008@gmail.com> | 2017-02-16 21:52:32 +0100 |
commit | be0757bcfc96dc6146d72e9536fa8e32d9a3dec7 (patch) | |
tree | 2c2b67ccef73149166cac94b908f92115c3b0b9f /src/lapi.js | |
parent | 62cb8279094fd137ce2382fe99592ef0aae0f557 (diff) | |
download | fengari-be0757bcfc96dc6146d72e9536fa8e32d9a3dec7.tar.gz fengari-be0757bcfc96dc6146d72e9536fa8e32d9a3dec7.tar.bz2 fengari-be0757bcfc96dc6146d72e9536fa8e32d9a3dec7.zip |
lua_pop, lua_settop, js closure
Diffstat (limited to 'src/lapi.js')
-rw-r--r-- | src/lapi.js | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/lapi.js b/src/lapi.js index 99955a3..41c0fbb 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -10,7 +10,6 @@ const lfunc = require('./lfunc.js'); const lua = require('./lua.js'); const lstate = require('./lstate.js'); const lvm = require('./lvm.js'); -const nil = ldo.nil; const MAXUPVAL = lfunc.MAXUPVAL; const CT = lua.constant_types; const TS = lua.thread_status; @@ -34,7 +33,7 @@ const index2addr = function(L, idx) { if (idx > 0) { let o = ci.funcOff + idx; assert(idx <= ci.top - (ci.funcOff + 1), "unacceptable index"); - if (o >= L.top) return nil; + if (o >= L.top) return ldo.nil; else return L.stack[o]; } else if (idx < 0) { // TODO: pseudo-indices relative to LUA_REGISTRYINDEX assert(idx !== 0 && -idx <= L.top, "invalid index"); @@ -44,9 +43,9 @@ const index2addr = function(L, idx) { idx = -idx; assert(idx <= MAXUPVAL + 1, "upvalue index too large"); if (ci.func.ttislcf()) /* light C function? */ - return nil; /* it has no upvalues */ + return ldo.nil; /* it has no upvalues */ else { - return idx <= ci.func.nupvalues ? ci.func.upvalue[idx - 1] : nil; + return idx <= ci.func.nupvalues ? ci.func.upvalue[idx - 1] : ldo.nil; } } @@ -67,12 +66,28 @@ const lua_pushvalue = function(L, idx) { assert(L.top <= L.ci.top, "stack overflow"); }; +const lua_settop = function(L, idx) { + let func = L.ci.funcOff; + if (idx >= 0) { + while (L.top < func + 1 + idx) + L.stack[L.top++] = ldo.nil; + L.top = func + 1 + idx; + } else { + assert(-(idx + 1) <= L.top - (func + 1), "invalid new top"); + L.top += idx + 1; /* 'subtract' index (index is negative) */ + } +}; + +const lua_pop = function(L, n) { + lua_settop(L, -n - 1); +} + /* ** push functions (JS -> stack) */ const lua_pushnil = function(L) { - L.stack[L.top] = nil; + L.stack[L.top] = ldo.nil; L.top++; assert(L.top <= L.ci.top, "stack overflow"); @@ -112,7 +127,7 @@ const lua_pushlstring = function(L, s, len) { // TODO: embedded \0 const lua_pushstring = function (L, s) { assert(typeof s === "string"); if (!s) - L.stack[L.top] = nil; + L.stack[L.top] = ldo.nil; else { let ts = new TValue(CT.LUA_TLNGSTR, s); L.stack[L.top] = ts; |