summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lobject.js2
-rw-r--r--src/lvm.js4
2 files changed, 3 insertions, 3 deletions
diff --git a/src/lobject.js b/src/lobject.js
index 3ec04f6..05b1fad 100644
--- a/src/lobject.js
+++ b/src/lobject.js
@@ -528,7 +528,7 @@ const intarith = function(L, op, v1, v2) {
case defs.LUA_OPBOR: return (v1 | v2);
case defs.LUA_OPBXOR: return (v1 ^ v2);
case defs.LUA_OPSHL: return (v1 << v2);
- case defs.LUA_OPSHR: return (v1 >> v2);
+ case defs.LUA_OPSHR: return (v1 >>> v2)|0;
case defs.LUA_OPUNM: return (0 - v1)|0;
case defs.LUA_OPBNOT: return (~0 ^ v1);
default: assert(0);
diff --git a/src/lvm.js b/src/lvm.js
index 35a4a51..6bc5377 100644
--- a/src/lvm.js
+++ b/src/lvm.js
@@ -365,7 +365,8 @@ const luaV_execute = function(L) {
let numberop2 = tointeger(op2);
if (numberop1 !== false && numberop2 !== false) {
- L.stack[ra] = new lobject.TValue(CT.LUA_TNUMINT, (numberop1 >> numberop2));
+ // >>> to have same overflow semantic as lua
+ L.stack[ra] = new lobject.TValue(CT.LUA_TNUMINT, (numberop1 >>> numberop2)|0);
} else {
ltm.luaT_trybinTM(L, op1, op2, ra, ltm.TMS.TM_SHR);
}
@@ -386,7 +387,6 @@ const luaV_execute = function(L) {
}
case OCi.OP_BNOT: {
let op = L.stack[RB(L, base, i)];
- let numberop = tonumber(op);
if (op.ttisinteger()) {
L.stack[ra] = new lobject.TValue(CT.LUA_TNUMINT, ~op.value);