diff options
-rw-r--r-- | src/lfunc.js | 34 | ||||
-rw-r--r-- | src/lobject.js | 6 | ||||
-rw-r--r-- | src/lvm.js | 4 |
3 files changed, 22 insertions, 22 deletions
diff --git a/src/lfunc.js b/src/lfunc.js index 7e324da..663f614 100644 --- a/src/lfunc.js +++ b/src/lfunc.js @@ -54,28 +54,26 @@ const luaF_newLclosure = function(L, n) { const luaF_findupval = function(L, level) { - let pp = L.openupval; - let p = pp; - while (pp !== null && pp.v >= level) { - p = pp; + let prevp; + let p = L.openupval; + while (p !== null && p.v >= level) { assert(p.isopen()); - if (p.v === level) - return p; - - pp = p.open_next; + if (p.v === level) /* found a corresponding upvalue? */ + return p; /* return it */ + prevp = p; + p = p.open_next; } - + /* not found: create a new upvalue */ let uv = new UpVal(); - - if (p) { /* The openupval list is not empty */ - uv.open_next = p; /* link it to list of open upvalues */ - } - - L.openupval = uv; - + /* link it to list of open upvalues */ + uv.open_next = p; + if (prevp) + prevp.open_next = uv; + else + L.openupval = uv; + /* current value lives in the stack */ uv.L = L; - uv.v = level; /* current value lives in the stack */ - + uv.v = level; return uv; }; diff --git a/src/lobject.js b/src/lobject.js index 9790d23..680e293 100644 --- a/src/lobject.js +++ b/src/lobject.js @@ -523,7 +523,7 @@ const intarith = function(L, op, v1, v2) { case defs.LUA_OPSUB: return (v1 - v2)|0; case defs.LUA_OPMUL: return (v1 * v2)|0; case defs.LUA_OPMOD: return (v1 - Math.floor(v1 / v2) * v2)|0; // % semantic on negative numbers is different in js - case defs.LUA_OPIDIV: return (v1 / v2)|0; + case defs.LUA_OPIDIV: return Math.floor(v1 / v2)|0; case defs.LUA_OPBAND: return (v1 & v2); case defs.LUA_OPBOR: return (v1 | v2); case defs.LUA_OPBXOR: return (v1 ^ v2); @@ -531,6 +531,7 @@ const intarith = function(L, op, v1, v2) { case defs.LUA_OPSHR: return (v1 >> v2); case defs.LUA_OPUNM: return (0 - v1)|0; case defs.LUA_OPBNOT: return (~0 ^ v1); + default: assert(0); } }; @@ -542,9 +543,10 @@ const numarith = function(L, op, v1, v2) { case defs.LUA_OPMUL: return v1 * v2; case defs.LUA_OPDIV: return v1 / v2; case defs.LUA_OPPOW: return Math.pow(v1, v2); - case defs.LUA_OPIDIV: return (v1 / v2); + case defs.LUA_OPIDIV: return Math.floor(v1 / v2); case defs.LUA_OPUNM: return -v1; case defs.LUA_OPMOD: return v1 % v2; + default: assert(0); } }; @@ -713,8 +713,8 @@ const luaV_equalobj = function(L, t1, t2) { if (t1.ttnov() !== t2.ttnov() || t1.ttnov() !== CT.LUA_TNUMBER) return 0; /* only numbers can be equal with different variants */ else { /* two numbers with different variants */ - /* compare them as integers */ - return Math.floor(t1.value) === Math.floor(t2.value) ? 1 : 0; // TODO: tointeger + /* OPTIMIZATION: instead of calling luaV_tointeger we can just let JS do the comparison */ + return (t1.value === t2.value) ? 1 : 0; } } |