@@ -524,17 +524,24 @@ fn decr_refcnt_and_if_zero(@block_ctxt cx,
524
524
str inner_name ,
525
525
TypeRef t_else, ValueRef v_else) -> result {
526
526
527
+ auto load_rc_cx = new_sub_block_ctxt ( cx, "load rc" ) ;
527
528
auto rc_adj_cx = new_sub_block_ctxt ( cx, "rc--" ) ;
528
529
auto inner_cx = new_sub_block_ctxt ( cx, inner_name) ;
529
530
auto next_cx = new_sub_block_ctxt ( cx, "next" ) ;
530
531
531
- auto rc_ptr = cx. build . GEP ( box_ptr, vec ( C_int ( 0 ) ,
532
- C_int ( abi. box_rc_field_refcnt ) ) ) ;
533
- auto rc = cx. build . Load ( rc_ptr) ;
532
+ auto null_test = cx. build . IsNull ( box_ptr) ;
533
+ cx. build . CondBr ( null_test, next_cx. llbb , load_rc_cx. llbb ) ;
534
534
535
- auto const_test = cx. build . ICmp ( lib. llvm . LLVMIntEQ ,
536
- C_int ( abi. const_refcount as int ) , rc) ;
537
- cx. build . CondBr ( const_test, next_cx. llbb , rc_adj_cx. llbb ) ;
535
+
536
+ auto rc_ptr = load_rc_cx. build . GEP ( box_ptr,
537
+ vec ( C_int ( 0 ) ,
538
+ C_int ( abi. box_rc_field_refcnt ) ) ) ;
539
+
540
+ auto rc = load_rc_cx. build . Load ( rc_ptr) ;
541
+ auto const_test =
542
+ load_rc_cx. build . ICmp ( lib. llvm . LLVMIntEQ ,
543
+ C_int ( abi. const_refcount as int ) , rc) ;
544
+ load_rc_cx. build . CondBr ( const_test, next_cx. llbb , rc_adj_cx. llbb ) ;
538
545
539
546
rc = rc_adj_cx. build . Sub ( rc, C_int ( 1 ) ) ;
540
547
rc_adj_cx. build . Store ( rc, rc_ptr) ;
@@ -545,8 +552,9 @@ fn decr_refcnt_and_if_zero(@block_ctxt cx,
545
552
inner_res. bcx . build . Br ( next_cx. llbb ) ;
546
553
547
554
auto phi = next_cx. build . Phi ( t_else,
548
- vec ( v_else, v_else, inner_res. val ) ,
555
+ vec ( v_else, v_else, v_else , inner_res. val ) ,
549
556
vec ( cx. llbb ,
557
+ load_rc_cx. llbb ,
550
558
rc_adj_cx. llbb ,
551
559
inner_res. bcx . llbb ) ) ;
552
560
@@ -865,7 +873,7 @@ fn copy_ty(@block_ctxt cx,
865
873
} else if ( typeck. type_is_boxed( t) ) {
866
874
auto r = incr_refcnt( cx, src) ;
867
875
if ( ! is_init) {
868
- r = drop_ty( r. bcx, dst, t) ;
876
+ r = drop_ty( r. bcx, r . bcx . build . Load ( dst) , t) ;
869
877
}
870
878
ret res( r. bcx, r. bcx. build. Store ( src, dst) ) ;
871
879
@@ -1499,7 +1507,7 @@ impure fn trans_expr(@block_ctxt cx, @ast.expr e) -> result {
1499
1507
auto rhs_res = trans_expr( lhs_res. _0. bcx, src) ;
1500
1508
auto t = node_ann_type( cx. fcx. ccx, ann) ;
1501
1509
// FIXME: calculate copy init-ness in typestate.
1502
- ret copy_ty( rhs_res. bcx, true , lhs_res. _0. val, rhs_res. val, t) ;
1510
+ ret copy_ty( rhs_res. bcx, false , lhs_res. _0. val, rhs_res. val, t) ;
1503
1511
}
1504
1512
1505
1513
case ( ast. expr_call( ?f, ?args, _) ) {
@@ -1659,15 +1667,19 @@ impure fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
1659
1667
check ( cx. fcx. lllocals. contains_key( local. id) ) ;
1660
1668
auto llptr = cx. fcx. lllocals. get( local. id) ;
1661
1669
auto ty = node_ann_type( cx. fcx. ccx, local. ann) ;
1662
- find_scope_cx( sub . bcx ) . cleanups +=
1670
+ find_scope_cx( cx ) . cleanups +=
1663
1671
clean( bind drop_slot( _, llptr, ty) ) ;
1664
1672
1665
1673
alt ( local. init) {
1666
1674
case ( some[ @ast. expr] ( ?e) ) {
1667
1675
sub = trans_expr( cx, e) ;
1668
1676
sub = copy_ty( sub. bcx, true, llptr, sub. val, ty) ;
1669
1677
}
1670
- case ( _) { /* fall through */ }
1678
+ case ( _) {
1679
+ auto llty = type_of( cx. fcx. ccx, ty) ;
1680
+ auto null = lib. llvm. llvm. LLVMConstNull ( llty) ;
1681
+ sub = res( cx, cx. build. Store ( null, llptr) ) ;
1682
+ }
1671
1683
}
1672
1684
}
1673
1685
}
0 commit comments