blueloveTH 1 год назад
Родитель
Сommit
f1dc9486a5
4 измененных файлов с 13 добавлено и 6 удалено
  1. 1 0
      include/pocketpy/opcodes.h
  2. 8 1
      src/ceval.cpp
  3. 4 4
      src/expr.cpp
  4. 0 1
      src/vm.cpp

+ 1 - 0
include/pocketpy/opcodes.h

@@ -84,6 +84,7 @@ OPCODE(BITWISE_XOR)
 OPCODE(BINARY_MATMUL)
 
 OPCODE(IS_OP)
+OPCODE(IS_NOT_OP)
 OPCODE(CONTAINS_OP)
 /**************************/
 OPCODE(JUMP_ABSOLUTE)

+ 8 - 1
src/ceval.cpp

@@ -542,11 +542,13 @@ __NEXT_STEP:
     case OP_COMPARE_EQ:{
         PyVar _1 = POPX();
         PyVar _0 = TOP();
+        PREDICT_INT_OP(==)
         TOP() = VAR(py_eq(_0, _1));
     } DISPATCH()
     case OP_COMPARE_NE:{
         PyVar _1 = POPX();
         PyVar _0 = TOP();
+        PREDICT_INT_OP(!=)
         TOP() = VAR(py_ne(_0, _1));
     } DISPATCH()
     case OP_COMPARE_GT:{
@@ -616,7 +618,12 @@ __NEXT_STEP:
     case OP_IS_OP:{
         PyVar _1 = POPX();    // rhs
         PyVar _0 = TOP();     // lhs
-        TOP() = VAR(static_cast<bool>((uint16_t)(_0==_1) ^ byte.arg));
+        TOP() = _0 == _1 ? True : False;
+    } DISPATCH()
+    case OP_IS_NOT_OP:{
+        PyVar _1 = POPX();    // rhs
+        PyVar _0 = TOP();     // lhs
+        TOP() = _0 != _1 ? True : False;
     } DISPATCH()
     case OP_CONTAINS_OP:{
         // a in b -> b __contains__ a

+ 4 - 4
src/expr.cpp

@@ -709,10 +709,10 @@ namespace pkpy{
             case TK(">"):   ctx->emit_(OP_COMPARE_GT, BC_NOARG, line);  break;
             case TK(">="):  ctx->emit_(OP_COMPARE_GE, BC_NOARG, line);  break;
 
-            case TK("in"):      ctx->emit_(OP_CONTAINS_OP, 0, line);   break;
-            case TK("not in"):  ctx->emit_(OP_CONTAINS_OP, 1, line);   break;
-            case TK("is"):      ctx->emit_(OP_IS_OP, 0, line);         break;
-            case TK("is not"):  ctx->emit_(OP_IS_OP, 1, line);         break;
+            case TK("in"):      ctx->emit_(OP_CONTAINS_OP,  0, line);   break;
+            case TK("not in"):  ctx->emit_(OP_CONTAINS_OP,  1, line);   break;
+            case TK("is"):      ctx->emit_(OP_IS_OP,        BC_NOARG, line);   break;
+            case TK("is not"):  ctx->emit_(OP_IS_NOT_OP,    BC_NOARG, line);   break;
 
             case TK("<<"):  ctx->emit_(OP_BITWISE_LSHIFT, BC_NOARG, line);  break;
             case TK(">>"):  ctx->emit_(OP_BITWISE_RSHIFT, BC_NOARG, line);  break;

+ 0 - 1
src/vm.cpp

@@ -224,7 +224,6 @@ namespace pkpy{
     }
 
     bool VM::py_eq(PyVar lhs, PyVar rhs){
-        if(lhs == rhs) return true;
         const PyTypeInfo* ti = _tp_info(lhs);
         PyVar res;
         if(ti->m__eq__){