From ff52c5234916b4a7a53d33259278a133cb0a0e31 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 20 May 2024 12:47:20 +0800 Subject: [PATCH] merge iblock --- include/pocketpy/codeobject.h | 6 +++--- src/expr.cpp | 4 +--- src/frame.cpp | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/pocketpy/codeobject.h b/include/pocketpy/codeobject.h index fd3b6638..c01123e0 100644 --- a/include/pocketpy/codeobject.h +++ b/include/pocketpy/codeobject.h @@ -56,17 +56,17 @@ struct CodeObject { struct LineInfo{ int lineno; // line number for each bytecode bool is_virtual; // whether this bytecode is virtual (not in source code) + int iblock; // block index }; std::shared_ptr src; Str name; std::vector codes; - std::vector iblocks; // block index for each bytecode std::vector lines; small_vector_2 consts; // constants - small_vector_2 varnames; // local variables + small_vector_2 varnames; // local variables NameDictInt varnames_inv; std::vector blocks; @@ -77,7 +77,7 @@ struct CodeObject { int end_line; const CodeBlock& _get_block_codei(int codei) const{ - return blocks[iblocks[codei]]; + return blocks[lines[codei].iblock]; } CodeObject(std::shared_ptr src, const Str& name); diff --git a/src/expr.cpp b/src/expr.cpp index 1d7faa62..48413e54 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -54,8 +54,7 @@ namespace pkpy{ int CodeEmitContext::emit_(Opcode opcode, uint16_t arg, int line, bool is_virtual) { co->codes.push_back(Bytecode{(uint8_t)opcode, arg}); - co->iblocks.push_back(curr_block_i); - co->lines.push_back(CodeObject::LineInfo{line, is_virtual}); + co->lines.push_back(CodeObject::LineInfo{line, is_virtual, curr_block_i}); int i = co->codes.size() - 1; if(line == BC_KEEPLINE){ if(i >= 1) co->lines[i].lineno = co->lines[i-1].lineno; @@ -66,7 +65,6 @@ namespace pkpy{ void CodeEmitContext::revert_last_emit_(){ co->codes.pop_back(); - co->iblocks.pop_back(); co->lines.pop_back(); } diff --git a/src/frame.cpp b/src/frame.cpp index 48bcbcbd..7a461ba1 100644 --- a/src/frame.cpp +++ b/src/frame.cpp @@ -25,7 +25,7 @@ namespace pkpy{ int Frame::prepare_jump_exception_handler(ValueStack* _s){ // try to find a parent try block - int block = co->iblocks[ip()]; + int block = co->lines[ip()].iblock; while(block >= 0){ if(co->blocks[block].type == CodeBlockType::TRY_EXCEPT) break; block = co->blocks[block].parent; @@ -47,7 +47,7 @@ namespace pkpy{ } void Frame::prepare_jump_break(ValueStack* _s, int target){ - int i = co->iblocks[ip()]; + int i = co->lines[ip()].iblock; if(target >= co->codes.size()){ while(i>=0) i = _exit_block(_s, i); }else{ @@ -56,7 +56,7 @@ namespace pkpy{ // _ = 0 // # if there is no op here, the block check will fail // while i: --i - int next_block = co->iblocks[target]; + int next_block = co->lines[target].iblock; while(i>=0 && i!=next_block) i = _exit_block(_s, i); if(i!=next_block) throw std::runtime_error("invalid jump"); }