diff options
-rw-r--r-- | src/mir/from_hir.hpp | 2 | ||||
-rw-r--r-- | src/mir/from_hir_match.cpp | 23 | ||||
-rw-r--r-- | src/mir/mir_builder.cpp | 10 |
3 files changed, 21 insertions, 14 deletions
diff --git a/src/mir/from_hir.hpp b/src/mir/from_hir.hpp index 7ade2b6d..9e1ea5c1 100644 --- a/src/mir/from_hir.hpp +++ b/src/mir/from_hir.hpp @@ -123,7 +123,7 @@ public: } void set_cur_block(unsigned int new_block); - void pause_cur_block(); + ::MIR::BasicBlockId pause_cur_block(); void end_block(::MIR::Terminator term); ::MIR::BasicBlockId new_bb_linked(); diff --git a/src/mir/from_hir_match.cpp b/src/mir/from_hir_match.cpp index 392918c6..694a088a 100644 --- a/src/mir/from_hir_match.cpp +++ b/src/mir/from_hir_match.cpp @@ -45,11 +45,12 @@ struct PatternRuleset }; /// Generated code for an arm struct ArmCode { - ::MIR::BasicBlockId code; - bool has_condition; - ::MIR::BasicBlockId cond_code; // NOTE: Incomplete, requires terminating If + ::MIR::BasicBlockId code = 0; + bool has_condition = false; + ::MIR::BasicBlockId cond_start; + ::MIR::BasicBlockId cond_end; ::MIR::LValue cond_lval; - ::std::vector< ::MIR::BasicBlockId> destructures; + ::std::vector< ::MIR::BasicBlockId> destructures; // NOTE: Incomplete }; typedef ::std::vector<PatternRuleset> t_arm_rules; @@ -93,6 +94,7 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod t_arm_rules arm_rules; for(unsigned int arm_idx = 0; arm_idx < node.m_arms.size(); arm_idx ++) { + DEBUG("ARM " << arm_idx); /*const*/ auto& arm = node.m_arms[arm_idx]; ArmCode ac; @@ -104,6 +106,7 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod unsigned int pat_idx = 0; for( const auto& pat : arm.m_patterns ) { + // - Convert HIR pattern into ruleset auto pat_builder = PatternRulesetBuilder {}; pat_builder.append_from(node.span(), pat, node.m_value->m_res_type); @@ -126,13 +129,14 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod // - The above is rustc E0008 "cannot bind by-move into a pattern guard" if(arm.m_cond) { + DEBUG("-- Condition Code"); ac.has_condition = true; - ac.cond_code = builder.new_bb_unlinked(); - builder.set_cur_block( ac.cond_code ); + ac.cond_start = builder.new_bb_unlinked(); + builder.set_cur_block( ac.cond_start ); conv.visit_node_ptr( arm.m_cond ); ac.cond_lval = builder.lvalue_or_temp( ::HIR::TypeRef(::HIR::CoreType::Bool), builder.get_result(arm.m_cond->span()) ); - builder.pause_cur_block(); + ac.cond_end = builder.pause_cur_block(); // NOTE: Paused so that later code (which knows what the false branch will be) can end it correctly // TODO: What to do with contidionals in the fast model? @@ -145,6 +149,7 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod } // Code + DEBUG("-- Body Code"); ac.code = builder.new_bb_unlinked(); builder.set_cur_block( ac.code ); conv.visit_node_ptr( arm.m_code ); @@ -220,7 +225,7 @@ void MIR_LowerHIR_Match_Simple( MirBuilder& builder, MirConverter& conv, ::HIR:: // - Go to code/condition check if( arm_code.has_condition ) { - builder.end_block( ::MIR::Terminator::make_Goto(arm_code.cond_code) ); + builder.end_block( ::MIR::Terminator::make_Goto(arm_code.cond_start) ); } else { @@ -236,7 +241,7 @@ void MIR_LowerHIR_Match_Simple( MirBuilder& builder, MirConverter& conv, ::HIR:: } if( arm_code.has_condition ) { - builder.set_cur_block( arm_code.cond_code ); + builder.set_cur_block( arm_code.cond_end ); builder.end_block( ::MIR::Terminator::make_If({ mv$(arm_code.cond_lval), arm_code.code, next_arm_bb }) ); } builder.set_cur_block( next_arm_bb ); diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp index 893dcffa..9b97794d 100644 --- a/src/mir/mir_builder.cpp +++ b/src/mir/mir_builder.cpp @@ -259,9 +259,9 @@ void MirBuilder::push_stmt_drop(::MIR::LValue val) void MirBuilder::set_cur_block(unsigned int new_block) { - if( m_block_active ) { - BUG(Span(), "Updating block when previous is active"); - } + ASSERT_BUG(Span(), !m_block_active, "Updating block when previous is active"); + ASSERT_BUG(Span(), new_block < m_output.blocks.size(), "Invalid block ID being started - " << new_block); + ASSERT_BUG(Span(), m_output.blocks[new_block].terminator.is_Incomplete(), "Attempting to resume a completed block - BB" << new_block); DEBUG("BB" << new_block << " START"); m_current_block = new_block; m_block_active = true; @@ -276,14 +276,16 @@ void MirBuilder::end_block(::MIR::Terminator term) m_block_active = false; m_current_block = 0; } -void MirBuilder::pause_cur_block() +::MIR::BasicBlockId MirBuilder::pause_cur_block() { if( !m_block_active ) { BUG(Span(), "Pausing block when none active"); } DEBUG("BB" << m_current_block << " PAUSE"); m_block_active = false; + auto rv = m_current_block; m_current_block = 0; + return rv; } ::MIR::BasicBlockId MirBuilder::new_bb_linked() { |