about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-11-02 14:30:51 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-11-02 14:30:51 +0100
commiteef9a0bd3941a6d2d25db4635295198903575e6b (patch)
treeedbd0c076d9ebd8cfec4ca74b9e86a9371b5587b /src/comp
parentd8d35e7c400fe0140de128a41d4b9f2ff7a3735b (diff)
Evaluate alt expressions in their own block context
Closes #785
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans_alt.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/comp/middle/trans_alt.rs b/src/comp/middle/trans_alt.rs
index c6d59a72831..8ac7a6e8a23 100644
--- a/src/comp/middle/trans_alt.rs
+++ b/src/comp/middle/trans_alt.rs
@@ -624,7 +624,10 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
              dest: trans::dest) -> @block_ctxt {
     let bodies = [];
     let match: match = [];
-    let er = trans::trans_temp_expr(cx, expr);
+    let alt_cx = new_scope_block_ctxt(cx, "alt");
+    Br(cx, alt_cx.llbb);
+
+    let er = trans::trans_temp_expr(alt_cx, expr);
     if er.bcx.unreachable { ret er.bcx; }
 
     for a: ast::arm in arms {
@@ -654,7 +657,7 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
     let t = trans::node_id_type(cx.fcx.lcx.ccx, expr.id);
     let vr = trans::spill_if_immediate(er.bcx, er.val, t);
     compile_submatch(vr.bcx, match, [vr.val],
-                     bind mk_fail(cx, expr.span, fail_cx), exit_map);
+                     bind mk_fail(alt_cx, expr.span, fail_cx), exit_map);
 
     let arm_cxs = [], arm_dests = [], i = 0u;
     for a: ast::arm in arms {
@@ -667,7 +670,11 @@ fn trans_alt(cx: @block_ctxt, expr: @ast::expr, arms: [ast::arm],
         }
         i += 1u;
     }
-    ret trans::join_returns(cx, arm_cxs, arm_dests, dest);
+    let after_cx = trans::join_returns(cx, arm_cxs, arm_dests, dest);
+    after_cx = trans::trans_block_cleanups(after_cx, alt_cx);
+    let next_cx = new_sub_block_ctxt(after_cx, "next");
+    Br(after_cx, next_cx.llbb);
+    ret next_cx;
 }
 
 // Not alt-related, but similar to the pattern-munging code above