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/lvm.js | |
| parent | 20846070c7809ac30a0aed3dbd4d04716e1ef1be (diff) | |
| download | fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.tar.gz fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.tar.bz2 fengari-01d7a43f5ef8e7a74bad9b39916d553d61b29fc3.zip | |
TEST, TESTSET
Diffstat (limited to 'src/lvm.js')
| -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 = { | 
