diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-11-02 14:30:51 +0100 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-11-02 14:30:51 +0100 |
| commit | eef9a0bd3941a6d2d25db4635295198903575e6b (patch) | |
| tree | edbd0c076d9ebd8cfec4ca74b9e86a9371b5587b /src/comp | |
| parent | d8d35e7c400fe0140de128a41d4b9f2ff7a3735b (diff) | |
Evaluate alt expressions in their own block context
Closes #785
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/trans_alt.rs | 13 |
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 |
