This commit is contained in:
blueloveTH 2024-05-19 17:47:40 +08:00
parent 79ae2cdc28
commit f1dc9486a5
4 changed files with 13 additions and 6 deletions

View File

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

View File

@ -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

View File

@ -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;

View File

@ -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__){