summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mir/from_hir.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 4b60640d..a2527e19 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -207,7 +207,11 @@ namespace {
),
(EnumTuple,
ASSERT_BUG(sp, allow_refutable, "Refutable pattern not expected");
- TODO(sp, "Destructure using " << pat);
+ auto lval_var = ::MIR::LValue::make_Downcast({ box$(mv$(lval)), e.binding_idx });
+ for(unsigned int i = 0; i < e.sub_patterns.size(); i ++ )
+ {
+ destructure_from(sp, e.sub_patterns[i], ::MIR::LValue::make_Field({ box$( lval_var.clone() ), i}));
+ }
),
(EnumTupleWildcard,
ASSERT_BUG(sp, allow_refutable, "Refutable pattern not expected");
@@ -609,6 +613,8 @@ namespace {
// Assign bindings (drop registration happens in previous loop) - Allow refutable patterns
this->destructure_from( arm.m_code->span(), pat, match_val.clone(), 1 );
+
+ m_builder.end_block( ::MIR::Terminator::make_Goto( arm_blocks[rule.first] ) );
}
// ## Create descision tree in-memory based off the ruleset
@@ -720,6 +726,14 @@ namespace {
}
};
+ // - Build tree by running each arm's pattern across it
+ DecisionTreeNode root_node;
+ for( const auto& arm_rule : arm_rules )
+ {
+ root_node.populate_tree_from_rule( node.m_arms[arm_rule.first].m_code->span(), arm_rule.first, arm_rule.second.m_rules.data(), arm_rule.second.m_rules.size() );
+ }
+
+ // - Convert the above decision tree into MIR
struct DecisionTreeGen
{
MirBuilder& m_builder;
@@ -868,15 +882,9 @@ namespace {
}
};
- // - Build tree by running each arm's pattern across it
- DecisionTreeNode root_node;
- for( const auto& arm_rule : arm_rules )
- {
- root_node.populate_tree_from_rule( node.m_arms[arm_rule.first].m_code->span(), arm_rule.first, arm_rule.second.m_rules.data(), arm_rule.second.m_rules.size() );
- }
-
- // TODO: Convert the above decision tree into MIR
- TODO(node.span(), "Turn decision tree into MIR");
+ DecisionTreeGen gen { m_builder, rule_blocks };
+ m_builder.set_cur_block( descision_block );
+ gen.populate_tree_vals( node.span(), root_node, node.m_value->m_res_type, mv$(match_val) );
m_builder.set_cur_block(next_block);
m_builder.set_result( node.span(), mv$(result_val) );