diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-08 10:29:20 +0100 |
---|---|---|
committer | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-08 10:32:04 +0100 |
commit | 01d7a43f5ef8e7a74bad9b39916d553d61b29fc3 (patch) | |
tree | 265a99d1117a95c802cd213f490b5bbcfa8d13e2 /src | |
parent | 20846070c7809ac30a0aed3dbd4d04716e1ef1be (diff) | |
download | fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.tar.gz fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.tar.bz2 fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.zip |
TEST, TESTSET
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 = { |