@@ -4843,24 +4843,18 @@ fn trans_pat_match(&@block_ctxt cx, &@ast::pat pat, ValueRef llval,
4843
4843
}
4844
4844
4845
4845
fn trans_pat_binding( & @block_ctxt cx, & @ast:: pat pat, ValueRef llval,
4846
- bool bind_alias ) -> result {
4846
+ bool is_mem ) -> result {
4847
4847
alt ( pat. node) {
4848
4848
case ( ast:: pat_wild) { ret rslt( cx, llval) ; }
4849
4849
case ( ast:: pat_lit( _) ) { ret rslt( cx, llval) ; }
4850
4850
case ( ast:: pat_bind( ?name) ) {
4851
- if ( bind_alias) {
4852
- cx. fcx. lllocals. insert( pat. id, llval) ;
4853
- ret rslt( cx, llval) ;
4854
- } else {
4855
- auto t = node_id_type( cx. fcx. lcx. ccx, pat. id) ;
4856
- auto rslt = alloc_ty( cx, t) ;
4857
- auto dst = rslt. val;
4858
- auto bcx = rslt. bcx;
4859
- maybe_name_value( cx. fcx. lcx. ccx, dst, name) ;
4860
- bcx. fcx. lllocals. insert( pat. id, dst) ;
4861
- add_clean( bcx, dst, t) ;
4862
- ret copy_val( bcx, INIT , dst, llval, t) ;
4851
+ auto val = llval;
4852
+ if ( !is_mem) {
4853
+ val = spill_if_immediate
4854
+ ( cx, llval, node_id_type( cx. fcx. lcx. ccx, pat. id) ) ;
4863
4855
}
4856
+ cx. fcx. lllocals. insert( pat. id, val) ;
4857
+ ret rslt( cx, val) ;
4864
4858
}
4865
4859
case ( ast:: pat_tag( _, ?subpats) ) {
4866
4860
if ( std:: ivec:: len[ @ast:: pat] ( subpats) == 0 u) {
@@ -4911,11 +4905,11 @@ fn trans_alt(&@block_ctxt cx, &@ast::expr expr, &ast::arm[] arms,
4911
4905
auto next_cx = new_sub_block_ctxt( expr_res. bcx, "next") ;
4912
4906
auto match_res =
4913
4907
trans_pat_match( this_cx, arm. pat, expr_res. val, next_cx) ;
4914
- auto binding_cx = new_scope_block_ctxt( match_res. bcx, "binding") ;
4915
- match_res. bcx. build. Br ( binding_cx. llbb) ;
4916
4908
auto binding_res =
4917
- trans_pat_binding( binding_cx, arm. pat, expr_res. val, false) ;
4918
- auto block_res = trans_block( binding_res. bcx, arm. block, output) ;
4909
+ trans_pat_binding( match_res. bcx, arm. pat, expr_res. val, false) ;
4910
+ auto block_cx = new_scope_block_ctxt( match_res. bcx, "case block") ;
4911
+ binding_res. bcx. build. Br ( block_cx. llbb) ;
4912
+ auto block_res = trans_block( block_cx, arm. block, output) ;
4919
4913
arm_results += ~[ block_res] ;
4920
4914
this_cx = next_cx;
4921
4915
}
0 commit comments