add inplace op

Update ceval.h
This commit is contained in:
blueloveTH 2023-02-18 21:36:33 +08:00
parent cae01cb5b7
commit f4248e25b1
3 changed files with 35 additions and 16 deletions

View File

@ -128,10 +128,28 @@ PyVar VM::run_frame(Frame* frame){
} break; } break;
case OP_BITWISE_OP: case OP_BITWISE_OP:
{ {
frame->push( pkpy::Args args(2);
fast_call(BITWISE_SPECIAL_METHODS[byte.arg], args[1] = frame->pop_value(this);
frame->pop_n_values_reversed(this, 2)) args[0] = frame->top_value(this);
); frame->top() = fast_call(BITWISE_SPECIAL_METHODS[byte.arg], std::move(args));
} break;
case OP_INPLACE_BINARY_OP:
{
pkpy::Args args(2);
args[1] = frame->pop_value(this);
args[0] = frame->top_value(this);
PyVar ret = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
PyRef_AS_C(frame->top())->set(this, frame, std::move(ret));
frame->_pop();
} break;
case OP_INPLACE_BITWISE_OP:
{
pkpy::Args args(2);
args[1] = frame->pop_value(this);
args[0] = frame->top_value(this);
PyVar ret = fast_call(BITWISE_SPECIAL_METHODS[byte.arg], std::move(args));
PyRef_AS_C(frame->top())->set(this, frame, std::move(ret));
frame->_pop();
} break; } break;
case OP_COMPARE_OP: case OP_COMPARE_OP:
{ {

View File

@ -406,21 +406,19 @@ private:
EXPR_TUPLE(); EXPR_TUPLE();
emit(OP_STORE_REF); emit(OP_STORE_REF);
}else{ // a += (expr) -> a = a + (expr) }else{ // a += (expr) -> a = a + (expr)
emit(OP_DUP_TOP_VALUE);
EXPR(); EXPR();
switch (op) { switch (op) {
case TK("+="): emit(OP_BINARY_OP, 0); break; case TK("+="): emit(OP_INPLACE_BINARY_OP, 0); break;
case TK("-="): emit(OP_BINARY_OP, 1); break; case TK("-="): emit(OP_INPLACE_BINARY_OP, 1); break;
case TK("*="): emit(OP_BINARY_OP, 2); break; case TK("*="): emit(OP_INPLACE_BINARY_OP, 2); break;
case TK("/="): emit(OP_BINARY_OP, 3); break; case TK("/="): emit(OP_INPLACE_BINARY_OP, 3); break;
case TK("//="): emit(OP_BINARY_OP, 4); break; case TK("//="): emit(OP_INPLACE_BINARY_OP, 4); break;
case TK("%="): emit(OP_BINARY_OP, 5); break; case TK("%="): emit(OP_INPLACE_BINARY_OP, 5); break;
case TK("&="): emit(OP_BITWISE_OP, 2); break; case TK("&="): emit(OP_INPLACE_BITWISE_OP, 2); break;
case TK("|="): emit(OP_BITWISE_OP, 3); break; case TK("|="): emit(OP_INPLACE_BITWISE_OP, 3); break;
case TK("^="): emit(OP_BITWISE_OP, 4); break; case TK("^="): emit(OP_INPLACE_BITWISE_OP, 4); break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
emit(OP_STORE_REF);
} }
co()->_rvalue = false; co()->_rvalue = false;
} }
@ -939,7 +937,7 @@ __LISTCOMP:
consume_end_stmt(); consume_end_stmt();
// If last op is not an assignment, pop the result. // If last op is not an assignment, pop the result.
uint8_t last_op = co()->codes.back().op; uint8_t last_op = co()->codes.back().op;
if( last_op!=OP_STORE_NAME && last_op!=OP_STORE_REF){ if( last_op!=OP_STORE_NAME && last_op!=OP_STORE_REF && last_op!=OP_INPLACE_BINARY_OP && last_op!=OP_INPLACE_BITWISE_OP){
if(mode()==REPL_MODE && parser->indents.top()==0) emit(OP_PRINT_EXPR, -1, true); if(mode()==REPL_MODE && parser->indents.top()==0) emit(OP_PRINT_EXPR, -1, true);
emit(OP_POP_TOP, -1, true); emit(OP_POP_TOP, -1, true);
} }

View File

@ -73,4 +73,7 @@ OPCODE(YIELD_VALUE)
OPCODE(FAST_INDEX) // a[x] OPCODE(FAST_INDEX) // a[x]
OPCODE(FAST_INDEX_REF) // a[x] OPCODE(FAST_INDEX_REF) // a[x]
OPCODE(INPLACE_BINARY_OP)
OPCODE(INPLACE_BITWISE_OP)
#endif #endif