From f1dc9486a571a4a2f529fd0d8e036f6b9c3696ae Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sun, 19 May 2024 17:47:40 +0800 Subject: [PATCH] some fix --- include/pocketpy/opcodes.h | 1 + src/ceval.cpp | 9 ++++++++- src/expr.cpp | 8 ++++---- src/vm.cpp | 1 - 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/include/pocketpy/opcodes.h b/include/pocketpy/opcodes.h index 5bdf2581..b10fe130 100644 --- a/include/pocketpy/opcodes.h +++ b/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) diff --git a/src/ceval.cpp b/src/ceval.cpp index 81b03351..67d28506 100644 --- a/src/ceval.cpp +++ b/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((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 diff --git a/src/expr.cpp b/src/expr.cpp index 43d80c6e..1d7faa62 100644 --- a/src/expr.cpp +++ b/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; diff --git a/src/vm.cpp b/src/vm.cpp index a81128b4..d67eab91 100644 --- a/src/vm.cpp +++ b/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__){