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;  | 
