From 6072655369db89d8c8ec0f79ef03f04f695f7459 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 5 Nov 2016 10:52:33 +0800 Subject: MIR Gen - Drop InnerMoved early for cleaner logic --- src/mir/mir_builder.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'src/mir/mir_builder.cpp') diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp index c2667025..24972b10 100644 --- a/src/mir/mir_builder.cpp +++ b/src/mir/mir_builder.cpp @@ -480,7 +480,21 @@ void MirBuilder::end_split_arm(const Span& sp, const ScopeHandle& handle, bool r sd_split.arms.back().always_early_terminated = /*sd_split.arms.back().has_early_terminated &&*/ !reachable; - // TODO: Undo moves from within the other scope + // HACK: If this arm's end is reachable, convert InnerMoved (shallow drop) variable states to Moved + // - I'm not 100% sure this is the correct place for calling drop. + if( reachable ) + { + for(unsigned int i = 0; i < sd_split.arms.back().var_states.size(); i ++ ) + { + auto& vs = sd_split.arms.back().var_states[i]; + if( vs == VarState::InnerMoved ) { + // Emit the shallow drop + push_stmt_drop_shallow( sp, ::MIR::LValue::make_Variable(i) ); + vs = VarState::Moved; + } + } + } + sd_split.arms.push_back( {} ); } void MirBuilder::end_split_arm_early(const Span& sp) @@ -500,6 +514,16 @@ void MirBuilder::end_split_arm_early(const Span& sp) auto& sd = m_scopes[ m_scope_stack.back() ]; auto& sd_split = sd.data.as_Split(); sd_split.arms.back().has_early_terminated = true; + + for(unsigned int i = 0; i < sd_split.arms.back().var_states.size(); i ++ ) + { + auto& vs = sd_split.arms.back().var_states[i]; + if( vs == VarState::InnerMoved ) { + // Emit the shallow drop + push_stmt_drop_shallow( sp, ::MIR::LValue::make_Variable(i) ); + //vs = VarState::Dropped; + } + } } } void MirBuilder::complete_scope(ScopeDef& sd) @@ -546,7 +570,7 @@ void MirBuilder::complete_scope(ScopeDef& sd) assert(i < changed.size()); if( changed[i] ) { - DEBUG("("<