From db86ecdcb117b1b69cc18ced0d7c39037f085ec7 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 16 Mar 2024 18:32:43 +0800 Subject: [PATCH] some fix --- include/pocketpy/expr.h | 1 + src/expr.cpp | 26 +++++++++++--------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/include/pocketpy/expr.h b/include/pocketpy/expr.h index 5cd06956..d030c2ad 100644 --- a/include/pocketpy/expr.h +++ b/include/pocketpy/expr.h @@ -105,6 +105,7 @@ struct CodeEmitContext{ void exit_block(); void emit_expr(); // clear the expression stack and generate bytecode int emit_(Opcode opcode, uint16_t arg, int line, bool is_virtual=false); + int emit_int(i64 value, int line); void patch_jump(int index); bool add_label(StrName name); int add_varname(StrName name); diff --git a/src/expr.cpp b/src/expr.cpp index a0beae27..a359178e 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -64,6 +64,14 @@ namespace pkpy{ return i; } + int CodeEmitContext::emit_int(i64 _val, int line){ + if(is_imm_int(_val)){ + return emit_(OP_LOAD_INTEGER, (uint16_t)_val, line); + }else{ + return emit_(OP_LOAD_CONST, add_const(VAR(_val)), line); + } + } + void CodeEmitContext::patch_jump(int index) { int target = co->codes.size(); co->codes[index].arg = target; @@ -246,11 +254,7 @@ namespace pkpy{ VM* vm = ctx->vm; if(std::holds_alternative(value)){ i64 _val = std::get(value); - if(is_imm_int(_val)){ - ctx->emit_(OP_LOAD_INTEGER, (uint16_t)_val, line); - return; - } - ctx->emit_(OP_LOAD_CONST, ctx->add_const(VAR(_val)), line); + ctx->emit_int(_val, line); return; } if(std::holds_alternative(value)){ @@ -272,11 +276,7 @@ namespace pkpy{ LiteralExpr* lit = static_cast(child.get()); if(std::holds_alternative(lit->value)){ i64 _val = -std::get(lit->value); - if(is_imm_int(_val)){ - ctx->emit_(OP_LOAD_INTEGER, (uint16_t)_val, line); - }else{ - ctx->emit_(OP_LOAD_CONST, ctx->add_const(VAR(_val)), line); - } + ctx->emit_int(_val, line); return; } if(std::holds_alternative(lit->value)){ @@ -595,11 +595,7 @@ namespace pkpy{ for(auto& item: args) item->emit_(ctx); for(auto& item: kwargs){ i64 _val = StrName(item.first.sv()).index; - if(is_imm_int(_val)){ - ctx->emit_(OP_LOAD_INTEGER, (uint16_t)_val, line); - }else{ - ctx->emit_(OP_LOAD_CONST, ctx->add_const(py_var(ctx->vm, _val)), line); - } + ctx->emit_int(_val, line); item.second->emit_(ctx); } int KWARGC = kwargs.size();