From 35eebe63a3546f416cb31f94fc33901f472d4de1 Mon Sep 17 00:00:00 2001 From: ah Date: Fri, 10 May 2024 20:09:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=A4=84=E7=90=86runtimecore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ah --- abc2program/tests/js/HelloWorld.js | 12 ++++++------ assembler/assembly-ins.h | 3 ++- assembler/assembly-parser.cpp | 1 - assembler/meta.h | 1 - compiler/optimizer/analysis/linear_order.cpp | 1 - .../optimizer/analysis/liveness_analyzer.cpp | 2 +- compiler/optimizer/analysis/loop_analyzer.cpp | 1 + compiler/optimizer/ir/basicblock.cpp | 3 +++ compiler/optimizer/ir/graph.h | 1 + compiler/optimizer/ir/graph_cloner.cpp | 19 +++++++++++++++++-- compiler/optimizer/ir/graph_cloner.h | 1 + .../optimizer/ir_builder/inst_builder-inl.h | 1 - compiler/optimizer/ir_builder/inst_builder.h | 3 +++ compiler/optimizer/optimizations/cleanup.cpp | 1 - .../optimizations/move_constants.cpp | 1 - .../regalloc/interference_graph.cpp | 1 - .../optimizations/regalloc/reg_alloc_base.cpp | 3 +-- .../optimizer/pass_manager_statistics.cpp | 5 +++-- disassembler/disassembler.cpp | 9 +-------- 19 files changed, 40 insertions(+), 29 deletions(-) diff --git a/abc2program/tests/js/HelloWorld.js b/abc2program/tests/js/HelloWorld.js index 40803a3bb..8bd4a05ac 100644 --- a/abc2program/tests/js/HelloWorld.js +++ b/abc2program/tests/js/HelloWorld.js @@ -36,24 +36,24 @@ function foo() { try { varA = 1; } catch (e) { - msg = "inner catch"; + msg = 'inner catch'; print(msg); } if (varA == "") { - throw "null"; + throw 'null'; } if (x > 100) { - throw "max" + throw 'max' } else { - throw "min"; + throw 'min'; } } catch (err) { - masg = "outter catch"; + masg = 'outter catch'; print(msg); } finally { - msg = "error"; + msg = 'error'; print(msg); } } diff --git a/assembler/assembly-ins.h b/assembler/assembly-ins.h index ea79a5fea..6c4fc7ce1 100644 --- a/assembler/assembly-ins.h +++ b/assembler/assembly-ins.h @@ -83,7 +83,8 @@ constexpr std::array(Opcode::NUM_OPCODES)> DEF_IDX_TABL #define OPLIST(opcode, name, optype, width, flags, def_idx, use_idxs) use_idxs, // clang-format off -constexpr std::array, static_cast(Opcode::NUM_OPCODES)> USE_IDXS_TABLE = { +constexpr std::array, + static_cast(Opcode::NUM_OPCODES)> USE_IDXS_TABLE = { PANDA_INSTRUCTION_LIST(OPLIST)}; // clang-format on #undef OPLIST diff --git a/assembler/assembly-parser.cpp b/assembler/assembly-parser.cpp index ee569eacb..727afba36 100644 --- a/assembler/assembly-parser.cpp +++ b/assembler/assembly-parser.cpp @@ -1912,7 +1912,6 @@ bool Parser::UpdateFunctionName() { auto signature = GetFunctionSignatureFromName(curr_func_->name, curr_func_->params); auto iter = program_.function_table.find(signature); - if (iter == program_.function_table.end() || !iter->second.file_location->is_defined) { program_.function_synonyms[curr_func_->name].push_back(signature); program_.function_table.erase(signature); diff --git a/assembler/meta.h b/assembler/meta.h index 5c6ced681..24735cd07 100644 --- a/assembler/meta.h +++ b/assembler/meta.h @@ -118,7 +118,6 @@ public: std::optional GetAttributeValue(const std::string &attribute) const { auto values = GetAttributeValues(attribute); - if (!values.empty()) { return values.front(); } diff --git a/compiler/optimizer/analysis/linear_order.cpp b/compiler/optimizer/analysis/linear_order.cpp index 24926d5fc..abf49d83d 100644 --- a/compiler/optimizer/analysis/linear_order.cpp +++ b/compiler/optimizer/analysis/linear_order.cpp @@ -130,7 +130,6 @@ BasicBlock *LinearOrder::LeastLikelySuccessor(const BasicBlock *block) auto counter0 = GetGraph()->GetBranchCounter(block, true); auto counter1 = GetGraph()->GetBranchCounter(block, false); - if (counter0 > 0 || counter1 > 0) { auto denom = std::max(counter0, counter1); // NOLINTNEXTLINE(readability-magic-numbers) diff --git a/compiler/optimizer/analysis/liveness_analyzer.cpp b/compiler/optimizer/analysis/liveness_analyzer.cpp index 40ea2908a..3656560ea 100644 --- a/compiler/optimizer/analysis/liveness_analyzer.cpp +++ b/compiler/optimizer/analysis/liveness_analyzer.cpp @@ -565,6 +565,7 @@ void LivenessAnalyzer::BlockReg(Register reg, LifeNumber block_from) auto interval = intervals.at(reg); if (interval == nullptr) { interval = GetGraph()->GetAllocator()->New(GetGraph()->GetAllocator()); + ASSERT(interval != nullptr); interval->SetPhysicalReg(reg, is_fp ? DataType::FLOAT64 : DataType::UINT64); intervals.at(reg) = interval; } @@ -667,7 +668,6 @@ LifeNumber LifeIntervals::GetFirstIntersectionWith(const LifeIntervals *other, L } auto range_begin = std::max(search_from, range.GetBegin()); auto other_range_begin = std::max(search_from, other_range.GetBegin()); - if (range_begin <= other_range_begin) { if (other_range_begin < range.GetEnd()) { // [range] diff --git a/compiler/optimizer/analysis/loop_analyzer.cpp b/compiler/optimizer/analysis/loop_analyzer.cpp index a1e30089d..484e7063a 100644 --- a/compiler/optimizer/analysis/loop_analyzer.cpp +++ b/compiler/optimizer/analysis/loop_analyzer.cpp @@ -310,6 +310,7 @@ void LoopAnalyzer::SearchInfiniteLoops(Loop *loop) void Loop::AppendBlock(BasicBlock *block) { ASSERT(std::find(blocks_.begin(), blocks_.end(), block) == blocks_.end()); + ASSERT(block != nullptr); block->SetLoop(this); blocks_.push_back(block); } diff --git a/compiler/optimizer/ir/basicblock.cpp b/compiler/optimizer/ir/basicblock.cpp index 55b7fc4bb..6e8bc69f5 100644 --- a/compiler/optimizer/ir/basicblock.cpp +++ b/compiler/optimizer/ir/basicblock.cpp @@ -57,6 +57,7 @@ BasicBlock *BasicBlock::SplitBlockAfterInstruction(Inst *inst, bool make_edge) auto next_inst = inst->GetNext(); auto new_bb = GetGraph()->CreateEmptyBlock((next_inst != nullptr) ? next_inst->GetPc() : INVALID_PC); + ASSERT(new_bb != nullptr); new_bb->SetAllFields(this->GetAllFields()); GetLoop()->AppendBlock(new_bb); @@ -119,6 +120,7 @@ BasicBlock *BasicBlock::InsertNewBlockToSuccEdge(BasicBlock *succ) BasicBlock *BasicBlock::InsertEmptyBlockBefore() { auto block = GetGraph()->CreateEmptyBlock(this->GetGuestPc()); + ASSERT(block != nullptr); for (auto pred : preds_) { pred->ReplaceSucc(this, block); this->RemovePred(pred); @@ -382,6 +384,7 @@ void BasicBlock::AppendPhi(Inst *inst) template void BasicBlock::AddInst(Inst *inst) { + ASSERT(inst != nullptr); ASSERT_PRINT(!inst->IsPhi(), "Instruction mustn't be phi"); inst->SetBasicBlock(this); if (first_inst_ == nullptr) { diff --git a/compiler/optimizer/ir/graph.h b/compiler/optimizer/ir/graph.h index f9be736e3..5bc6a33d0 100644 --- a/compiler/optimizer/ir/graph.h +++ b/compiler/optimizer/ir/graph.h @@ -834,6 +834,7 @@ public: #define INST_DEF(OPCODE, BASE, ...) \ case Opcode::OPCODE: { \ auto inst = Inst::New(ALLOCATOR, Opcode::OPCODE); \ + ASSERT(inst != nullptr); \ inst->SetId(instr_current_id_++); \ return inst; \ } diff --git a/compiler/optimizer/ir/graph_cloner.cpp b/compiler/optimizer/ir/graph_cloner.cpp index 1d82efe99..a7296b6d6 100644 --- a/compiler/optimizer/ir/graph_cloner.cpp +++ b/compiler/optimizer/ir/graph_cloner.cpp @@ -38,6 +38,7 @@ Graph *GraphCloner::CloneGraph() auto new_graph = allocator_->New(allocator_, local_allocator_, GetGraph()->GetArch(), GetGraph()->GetMethod(), GetGraph()->GetRuntime(), GetGraph()->GetParentGraph(), GetGraph()->GetMode()); + ASSERT(new_graph != nullptr); new_graph->SetCurrentInstructionId(GetGraph()->GetCurrentInstructionId()); CloneBlocksAndInstructions(GetGraph()->GetVectorBlocks(), new_graph); BuildControlFlow(); @@ -181,6 +182,7 @@ void GraphCloner::BuildDataFlow() BasicBlock *GraphCloner::CreateResolverBlock(Loop *loop, BasicBlock *back_edge) { auto outside_succ = GetLoopOutsideSuccessor(loop); + ASSERT(back_edge != nullptr); auto resolver = back_edge->InsertNewBlockToSuccEdge(outside_succ); back_edge->GetLoop()->GetOuterLoop()->AppendBlock(resolver); // Populate resolver-block with phis for each instruction which has outside-loop user @@ -255,6 +257,7 @@ GraphCloner::LoopUnrollData *GraphCloner::PrepareLoopToUnroll(Loop *loop, bool c // Populate `LoopUnrollData` auto allocator = loop->GetHeader()->GetGraph()->GetLocalAllocator(); auto unroll_data = allocator->New(); + ASSERT(unroll_data != nullptr); unroll_data->blocks = allocator->New>(allocator->Adapter()); unroll_data->blocks->resize(loop->GetBlocks().size()); std::copy(loop->GetBlocks().begin(), loop->GetBlocks().end(), unroll_data->blocks->begin()); @@ -597,6 +600,7 @@ BasicBlock *GraphCloner::CloneLoopHeader(BasicBlock *block, BasicBlock *outer, B } auto clone_block = replaceable_pred->InsertNewBlockToSuccEdge(block); ASSERT(block->GetLoop()->GetPreHeader() == replaceable_pred); + ASSERT(clone_block != nullptr); block->GetLoop()->SetPreHeader(clone_block); replaceable_pred->GetLoop()->AppendBlock(clone_block); clone_block->AddSucc(resolver); @@ -639,6 +643,7 @@ void GraphCloner::UpdateUsersForClonedLoopHeader(Inst *inst, BasicBlock *outer_b auto clone = GetClone(inst); auto clone_block = clone->GetBasicBlock(); ASSERT(clone_block != nullptr); + ASSERT(outer_block != nullptr); // phi for inside users auto phi_in = GetGraph()->CreateInstPhi(inst->GetType(), inst->GetPc()); // phi for outside users @@ -724,6 +729,7 @@ Loop *GraphCloner::CloneLoop(Loop *loop) auto marker_holder = MarkerHolder(GetGraph()); clone_marker_ = marker_holder.GetMarker(); auto unroll_data = PrepareLoopToClone(loop); + ASSERT(unroll_data != nullptr); CloneBlocksAndInstructions(*unroll_data->blocks, GetGraph()); BuildLoopCloneControlFlow(unroll_data); @@ -740,6 +746,7 @@ Loop *GraphCloner::CloneLoop(Loop *loop) BasicBlock *GraphCloner::CreateNewOutsideSucc(BasicBlock *outside_succ, BasicBlock *back_edge, BasicBlock *pre_header) { + ASSERT(pre_header != nullptr); auto back_edge_idx = outside_succ->GetPredBlockIndex(back_edge); auto pre_header_idx = outside_succ->GetPredBlockIndex(pre_header); auto rm_idx_max = std::max(back_edge_idx, pre_header_idx); @@ -772,9 +779,8 @@ BasicBlock *GraphCloner::CreateNewOutsideSucc(BasicBlock *outside_succ, BasicBlo * - Make sure `outside_succ` has 2 predecessors only: loop header and back-edge; * - Split `outside_succ` to contain phi-instructions only; */ -GraphCloner::LoopClonerData *GraphCloner::PrepareLoopToClone(Loop *loop) +void GraphCloner::HandleLoopPreHeader(Loop *loop, BasicBlock *&pre_header) { - auto pre_header = loop->GetPreHeader(); auto ifimm = pre_header->GetLastInst(); ASSERT(ifimm->GetOpcode() == Opcode::IfImm); auto compare = ifimm->GetInput(0).GetInst(); @@ -794,6 +800,12 @@ GraphCloner::LoopClonerData *GraphCloner::PrepareLoopToClone(Loop *loop) } [[maybe_unused]] static constexpr auto PRE_HEADER_INST_COUNT = 2; ASSERT(std::distance(pre_header->AllInsts().begin(), pre_header->AllInsts().end()) == PRE_HEADER_INST_COUNT); +} + +GraphCloner::LoopClonerData *GraphCloner::PrepareLoopToClone(Loop *loop) +{ + auto pre_header = loop->GetPreHeader(); + HandleLoopPreHeader(loop, pre_header); // If `outside_succ` has more than 2 predecessors, create a new one // with loop header and back-edge predecessors only and insert it before `outside_succ` auto outside_succ = GetLoopOutsideSuccessor(loop); @@ -802,6 +814,7 @@ GraphCloner::LoopClonerData *GraphCloner::PrepareLoopToClone(Loop *loop) auto back_edge = loop->GetBackEdges()[0]; outside_succ = CreateNewOutsideSucc(outside_succ, back_edge, pre_header); } + ASSERT(outside_succ != nullptr); // Split outside succ after last phi // create empty block before outside succ if outside succ don't contain phi insts if (outside_succ->HasPhi() && outside_succ->GetFirstInst() != nullptr) { @@ -873,6 +886,8 @@ void GraphCloner::MakeLoopCloneInfo(LoopClonerData *unroll_data) auto header_clone = GetClone(loop->GetHeader()); auto clone_loop = GetGraph()->GetAnalysis().CreateNewLoop(header_clone); auto outer_loop = loop->GetOuterLoop(); + ASSERT(clone_loop != nullptr); + ASSERT(outer_loop != nullptr); outer_loop->AppendInnerLoop(clone_loop); clone_loop->SetOuterLoop(outer_loop); diff --git a/compiler/optimizer/ir/graph_cloner.h b/compiler/optimizer/ir/graph_cloner.h index 362657f4b..cc4273c89 100644 --- a/compiler/optimizer/ir/graph_cloner.h +++ b/compiler/optimizer/ir/graph_cloner.h @@ -164,6 +164,7 @@ private: void BuildLoopCloneControlFlow(LoopClonerData *unroll_data); void BuildLoopCloneDataFlow(LoopClonerData *unroll_data); void MakeLoopCloneInfo(LoopClonerData *unroll_data); + void HandleLoopPreHeader(Loop *loop, BasicBlock *&pre_header); // Unroll cloning LoopUnrollData *PrepareLoopToUnroll(Loop *loop, bool clone_side_exits); BasicBlock *CreateResolverBlock(Loop *loop, BasicBlock *back_edge); diff --git a/compiler/optimizer/ir_builder/inst_builder-inl.h b/compiler/optimizer/ir_builder/inst_builder-inl.h index 0f98cecd4..6b0f3178d 100644 --- a/compiler/optimizer/ir_builder/inst_builder-inl.h +++ b/compiler/optimizer/ir_builder/inst_builder-inl.h @@ -65,7 +65,6 @@ void InstBuilder::BuildCastToAnyNumber(const BytecodeInstruction *bc_inst) { auto input = GetDefinitionAcc(); auto type = input->GetType(); - if (input->IsConst() && !DataType::IsFloatType(type)) { auto const_insn = input->CastToConstant(); if (const_insn->GetType() == DataType::INT64) { diff --git a/compiler/optimizer/ir_builder/inst_builder.h b/compiler/optimizer/ir_builder/inst_builder.h index 3208bd0ce..afbb3e94e 100644 --- a/compiler/optimizer/ir_builder/inst_builder.h +++ b/compiler/optimizer/ir_builder/inst_builder.h @@ -192,6 +192,7 @@ private: auto FindOrCreate32BitConstant(uint32_t value) { auto inst = GetGraph()->FindOrCreateConstant(value); + ASSERT(inst != nullptr); if (inst->GetId() == GetGraph()->GetCurrentInstructionId() - 1) { COMPILER_LOG(DEBUG, IR_BUILDER) << "create new constant: value=" << value << ", inst=" << inst->GetId(); } @@ -201,6 +202,7 @@ private: auto FindOrCreateConstant(uint64_t value) { auto inst = GetGraph()->FindOrCreateConstant(value); + ASSERT(inst != nullptr); if (inst->GetId() == GetGraph()->GetCurrentInstructionId() - 1) { COMPILER_LOG(DEBUG, IR_BUILDER) << "create new constant: value=" << value << ", inst=" << inst->GetId(); } @@ -210,6 +212,7 @@ private: auto FindOrCreateDoubleConstant(double value) { auto inst = GetGraph()->FindOrCreateConstant(value); + ASSERT(inst != nullptr); if (inst->GetId() == GetGraph()->GetCurrentInstructionId() - 1) { COMPILER_LOG(DEBUG, IR_BUILDER) << "create new constant: value=" << value << ", inst=" << inst->GetId(); } diff --git a/compiler/optimizer/optimizations/cleanup.cpp b/compiler/optimizer/optimizations/cleanup.cpp index 325b68bef..96685df3a 100644 --- a/compiler/optimizer/optimizations/cleanup.cpp +++ b/compiler/optimizer/optimizations/cleanup.cpp @@ -109,7 +109,6 @@ bool Cleanup::RunOnce(ArenaSet *empty_blocks, ArenaSetGetSuccessor(0); - // Strange infinite loop with only one empty block, or loop pre-header - lets bail out if (succ == bb || succ->GetLoop()->GetPreHeader() == bb) { continue; diff --git a/compiler/optimizer/optimizations/move_constants.cpp b/compiler/optimizer/optimizations/move_constants.cpp index c17400b02..8eef96bf5 100644 --- a/compiler/optimizer/optimizations/move_constants.cpp +++ b/compiler/optimizer/optimizations/move_constants.cpp @@ -57,7 +57,6 @@ void MoveConstants::MoveFromStartBlock(Inst *inst) auto user_inst = SingleBlockNoPhiDominatingUser(inst); if (user_inst != nullptr) { target_bb = user_inst->GetBasicBlock(); - if (IsBlockSuitable(target_bb)) { graph->GetStartBlock()->EraseInst(inst); target_bb->InsertBefore(inst, user_inst); diff --git a/compiler/optimizer/optimizations/regalloc/interference_graph.cpp b/compiler/optimizer/optimizations/regalloc/interference_graph.cpp index e4a9a7cc6..c6bec0c10 100644 --- a/compiler/optimizer/optimizations/regalloc/interference_graph.cpp +++ b/compiler/optimizer/optimizations/regalloc/interference_graph.cpp @@ -124,7 +124,6 @@ ArenaVector InterferenceGraph::LexBFS() const auto it = std::stable_partition(out.begin() + pos, out.begin() + prev_end, [id, &out, this](unsigned val) { return HasEdge(id, out[val]); }); auto pivot = static_cast(std::distance(out.begin(), it)); - // Split group if needed if (pivot > pos && pivot != prev_end) { boundary_stack.push_back(pivot); diff --git a/compiler/optimizer/optimizations/regalloc/reg_alloc_base.cpp b/compiler/optimizer/optimizations/regalloc/reg_alloc_base.cpp index f97da90f5..4ce0e304e 100644 --- a/compiler/optimizer/optimizations/regalloc/reg_alloc_base.cpp +++ b/compiler/optimizer/optimizations/regalloc/reg_alloc_base.cpp @@ -87,7 +87,6 @@ bool RegAllocBase::Prepare() // Apply pre-allocated registers on construction GetGraph()->InitUsedRegs(&GetRegMask().GetVector()); GetGraph()->InitUsedRegs(&GetVRegMask().GetVector()); - GetGraph()->RunPass(); // Because linear numbers should stay unchanged from Liveness @@ -167,7 +166,6 @@ void RegAllocBase::SetType(LifeIntervals *interval) void RegAllocBase::SetPreassignedRegisters(LifeIntervals *interval) { auto inst = interval->GetInst(); - if (inst->GetDstReg() != INVALID_REG) { interval->SetPreassignedReg(inst->GetDstReg()); return; @@ -251,6 +249,7 @@ size_t RegAllocBase::GetTotalSlotsCount() void ConnectIntervals(SpillFillInst *spill_fill, const LifeIntervals *src, const LifeIntervals *dst) { + ASSERT(spill_fill != nullptr); ASSERT(spill_fill->IsSpillFill()); spill_fill->AddSpillFill(src->GetLocation(), dst->GetLocation(), dst->GetType()); diff --git a/compiler/optimizer/pass_manager_statistics.cpp b/compiler/optimizer/pass_manager_statistics.cpp index eb9a81133..aa2cbd2ed 100644 --- a/compiler/optimizer/pass_manager_statistics.cpp +++ b/compiler/optimizer/pass_manager_statistics.cpp @@ -54,8 +54,9 @@ void PassManagerStatistics::PrintStatistics() const for (const auto& stat : pass_stat_list_) { auto indent = stat.run_depth * OFFSET_STAT; space_buf[indent] = 0; - out << std::setw(OFFSET_ID) << std::right << index << space_buf << " " << std::left << std::setw(OFFSET_PASS_NAME - indent) - << stat.pass_name << ": " << std::right << std::setw(OFFSET_DEFAULT) << stat.mem_used_ir << std::setw(OFFSET_DEFAULT) + out << std::setw(OFFSET_ID) << std::right << index << space_buf << " " << std::left + << std::setw(OFFSET_PASS_NAME - indent) << stat.pass_name << ": " << std::right + << std::setw(OFFSET_DEFAULT) << stat.mem_used_ir << std::setw(OFFSET_DEFAULT) << stat.mem_used_local << std::setw(OFFSET_DEFAULT) << stat.time_us << std::endl; space_buf[indent] = ' '; index++; diff --git a/disassembler/disassembler.cpp b/disassembler/disassembler.cpp index 82197bff5..ecacaaed0 100755 --- a/disassembler/disassembler.cpp +++ b/disassembler/disassembler.cpp @@ -453,7 +453,6 @@ void Disassembler::GetRecords() const panda_file::File::EntityId record_id {class_id}; auto language = GetRecordLanguage(record_id); - if (language != file_language_) { if (file_language_ == panda_file::SourceLang::PANDA_ASSEMBLY) { file_language_ = language; @@ -547,7 +546,7 @@ void Disassembler::AddAnnotationElement(pandasm::Function &method, const std::st if (annotation_name.empty() || key.empty()) { return; } - + std::vector method_annotation = method.metadata->GetAnnotations(); const auto ann_iter = std::find_if(method_annotation.begin(), method_annotation.end(), [&](pandasm::AnnotationData &ann) -> bool { @@ -632,7 +631,6 @@ void Disassembler::GetParams(pandasm::Function *method, const panda_file::File:: panda_file::CodeDataAccessor code_accessor(*file_, code_id); auto params_num = code_accessor.GetNumArgs(); - if (params_num > MAX_ARG_NUM) { LOG(ERROR, DISASSEMBLER) << "> error encountered at " << code_id << " (0x" << std::hex << code_id << "). number of function's arguments (" << std::dec << params_num @@ -673,7 +671,6 @@ LabelTable Disassembler::GetExceptions(pandasm::Function *method, panda_file::Fi size_t catch_idx = 0; try_block.EnumerateCatchBlocks([&](panda_file::CodeDataAccessor::CatchBlock &catch_block) { auto class_idx = catch_block.GetTypeIdx(); - if (class_idx == panda_file::INVALID_INDEX) { catch_block_pa.exception_record = ""; } else { @@ -1490,7 +1487,6 @@ void Disassembler::Serialize(const pandasm::Record &record, std::ostream &os, bo const auto record_iter = prog_ann_.record_annotations.find(record.name); const bool record_in_table = record_iter != prog_ann_.record_annotations.end(); - if (record_in_table) { Serialize(*record.metadata, record_iter->second.ann_list, os); } else { @@ -1832,7 +1828,6 @@ std::string Disassembler::IDToString(BytecodeInstruction bc_ins, panda_file::Fil std::stringstream name; const auto offset = file_->ResolveOffsetByIndex(method_id, bc_ins.GetId(idx).AsIndex()); std::string str_data = StringDataToString(file_->GetStringData(offset)); - if (bc_ins.IsIdMatchFlag(idx, BytecodeInstruction::Flags::METHOD_ID)) { name << GetMethodSignature(offset); } else if (bc_ins.IsIdMatchFlag(idx, BytecodeInstruction::Flags::STRING_ID)) { @@ -1868,7 +1863,6 @@ static void translateImmToLabel(pandasm::Ins *pa_ins, LabelTable *label_table, c const auto bc_ins_dest = bc_ins.JumpTo(jmp_offset); if (bc_ins_last.GetAddress() > bc_ins_dest.GetAddress()) { size_t idx = getBytecodeInstructionNumber(BytecodeInstruction(ins_arr), bc_ins_dest); - if (idx != std::numeric_limits::max()) { if (label_table->find(idx) == label_table->end()) { std::stringstream ss {}; @@ -1931,7 +1925,6 @@ IdList Disassembler::GetInstructions(pandasm::Function *method, panda_file::File const bool is_present = prog_.function_table.find(arg_method_signature) != prog_.function_table.cend(); const bool is_external = file_->IsExternal(arg_method_id); - if (is_external && !is_present) { unknown_external_methods.push_back(arg_method_id); } -- Gitee