diff options
| author | daurnimator <quae@daurnimator.com> | 2017-05-22 18:06:40 +1000 | 
|---|---|---|
| committer | daurnimator <quae@daurnimator.com> | 2017-05-22 18:46:30 +1000 | 
| commit | 91e09ea32148c34965809b8d69987d439d389870 (patch) | |
| tree | 216ca00cad9be1eb1f85c2bdca90ad99f1a28c12 | |
| parent | 6646bebd474b95a2d4cbb8558c0d1cb5b5353de0 (diff) | |
| download | fengari-91e09ea32148c34965809b8d69987d439d389870.tar.gz fengari-91e09ea32148c34965809b8d69987d439d389870.tar.bz2 fengari-91e09ea32148c34965809b8d69987d439d389870.zip  | |
Compare allowed stack indices to stack_last
Not L.stack.length which is more equivalent to C's L->stacksize
| -rw-r--r-- | src/lapi.js | 3 | ||||
| -rw-r--r-- | src/ldo.js | 8 | ||||
| -rw-r--r-- | src/lstate.js | 7 | 
3 files changed, 12 insertions, 6 deletions
diff --git a/src/lapi.js b/src/lapi.js index 79c666c..ca5a8a0 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -94,7 +94,7 @@ const lua_checkstack = function(L, n) {      let res;      let ci = L.ci;      assert(n >= 0, "negative 'n'"); -    if (L.stack.length - L.top > n) /* stack large enough? */ +    if (L.stack_last - L.top > n) /* stack large enough? */          res = true;      else { /* no; need to grow stack */          let inuse = L.top + lstate.EXTRA_STACK; @@ -152,6 +152,7 @@ const lua_pushvalue = function(L, idx) {  const lua_settop = function(L, idx) {      let func = L.ci.funcOff;      if (idx >= 0) { +        assert(idx <= L.stack_last - (func + 1), "new top too large");          while (L.top < func + 1 + idx)              L.stack[L.top++] = new TValue(CT.LUA_TNIL, null);          L.top = func + 1 + idx; @@ -43,6 +43,7 @@ const ERRORSTACKSIZE = luaconf.LUAI_MAXSTACK + 200;  const luaD_reallocstack = function(L, newsize) {      L.stack.length = newsize; +    L.stack_last = newsize - lstate.EXTRA_STACK;  };  const luaD_growstack = function(L, n) { @@ -64,7 +65,7 @@ const luaD_growstack = function(L, n) {  };  const luaD_checkstack = function(L, n) { -    if (L.stack.length - L.top <= n) +    if (L.stack_last - L.top <= n)          luaD_growstack(L, n);  }; @@ -73,7 +74,7 @@ const stackinuse = function(L) {      for (let ci = L.ci; ci !== null; ci = ci.previous) {          if (lim < ci.top) lim = ci.top;      } -    assert(lim <= L.stack.length); +    assert(lim <= L.stack_last);      return lim + 1; /* part of stack in use */  }; @@ -107,7 +108,7 @@ const luaD_precall = function(L, off, nresults) {              ci.nresults = nresults;              ci.func = func;              ci.top = L.top + defs.LUA_MINSTACK; -            assert(ci.top <= L.stack.length); +            assert(ci.top <= L.stack_last);              ci.callstatus = 0;              if (L.hookmask & defs.LUA_MASKCALL)                  luaD_hook(L, defs.LUA_HOOKCALL, -1); @@ -219,6 +220,7 @@ const luaD_hook = function(L, event, line) {          ar.currentline = line;          ar.i_ci = ci;          ci.top = L.top + defs.LUA_MINSTACK; +        assert(ci.top <= L.stack_last);          L.allowhook = 0;  /* cannot call hooks inside a hook */          ci.callstatus |= lstate.CIST_HOOKED;          hook(L, ar); diff --git a/src/lstate.js b/src/lstate.js index 5481f95..b71e011 100644 --- a/src/lstate.js +++ b/src/lstate.js @@ -49,7 +49,8 @@ class lua_State {          this.base_ci = new CallInfo(); // Will be populated later          this.top = 0;          this.ci = null; -        this.stack = []; +        this.stack = null; +        this.stack_last = NaN;          this.openupval = null;          this.status = TS.LUA_OK;          this.next = null; @@ -86,8 +87,10 @@ const luaE_extendCI = function(L) {  };  const stack_init = function(L1, L) { -    L1.stack = new Array(BASIC_STACK_SIZE); // TODO: for now we don't care about the stack size +    L1.stack = new Array(BASIC_STACK_SIZE);      L1.top = 0; +    L1.stack_last = BASIC_STACK_SIZE - EXTRA_STACK; +    /* initialize first ci */      let ci = L1.base_ci;      ci.next = ci.previous = null;      ci.callstatus = 0;  | 
