diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lvm.js | 21 |
1 files changed, 18 insertions, 3 deletions
@@ -333,7 +333,7 @@ class LuaVM { } case "OP_NOT": { let op = L.stack[this.RB(base, i)]; - L.stack[ra] = new TValue(CT.LUA_TBOOLEAN, !!((op.type === CT.LUA_TBOOLEAN && !op.value) || op.type === CT.LUA_TNIL)); + L.stack[ra] = new TValue(CT.LUA_TBOOLEAN, LuaVM.l_isfalse(op)); break; } case "OP_LEN": { @@ -371,9 +371,20 @@ class LuaVM { break; } case "OP_TEST": { + if (i.C ? LuaVM.l_isfalse(L.stack[ra]) : !LuaVM.l_isfalse(L.stack[ra])) + ci.pcOff++; + else + this.donextjump(ci); break; } case "OP_TESTSET": { + let rb = L.stack[this.RB(base, i)]; + if (i.C ? LuaVM.l_isfalse(rb) : !LuaVM.l_isfalse(rb)) + ci.pcOff++; + else { + L.stack[ra] = rb; + this.donextjump(ci); + } break; } case "OP_CALL": { @@ -747,12 +758,12 @@ class LuaVM { } static LEintfloat(l, r) { - // TODO + // TODO: LEintfloat return l <= r ? 1 : 0; } static LTintfloat(l, r) { - // TODO + // TODO: LTintfloat return l < r ? 1 : 0; } @@ -761,6 +772,10 @@ class LuaVM { return ls.value === rs.value ? 0 : (ls.value < rs.value ? -1 : 1); } + static l_isfalse(o) { + return o.ttisnil() || (o.ttisboolean() && o.value === false) + } + } module.exports = { |