@@ -1639,21 +1639,18 @@ fn compare_scalar_values(cx: &@block_ctxt, lhs: ValueRef, rhs: ValueRef,
1639
1639
}
1640
1640
1641
1641
type val_pair_fn = fn ( & @block_ctxt , ValueRef , ValueRef ) -> result ;
1642
-
1642
+ type val_fn = fn ( & @ block_ctxt , ValueRef ) -> result ;
1643
1643
type val_and_ty_fn = fn ( & @block_ctxt , ValueRef , ty:: t ) -> result ;
1644
1644
1645
- type val_pair_and_ty_fn =
1646
- fn ( & @block_ctxt , ValueRef , ValueRef , ty:: t ) -> result ;
1647
-
1648
1645
1649
1646
// Iterates through the elements of a structural type.
1650
1647
fn iter_structural_ty ( cx : & @block_ctxt , v : ValueRef , t : & ty:: t ,
1651
1648
f : val_and_ty_fn ) -> result {
1652
1649
fn adaptor_fn ( f : val_and_ty_fn , cx : & @block_ctxt , av : ValueRef ,
1653
- bv : ValueRef , t : ty:: t ) -> result {
1650
+ t : ty:: t ) -> result {
1654
1651
ret f( cx, av, t) ;
1655
1652
}
1656
- ret iter_structural_ty_full ( cx, v, v , t, bind adaptor_fn ( f, _ , _, _, _) ) ;
1653
+ ret iter_structural_ty_full ( cx, v, t, bind adaptor_fn ( f, _, _, _) ) ;
1657
1654
}
1658
1655
1659
1656
fn load_inbounds ( cx : & @block_ctxt , p : ValueRef , idxs : & [ ValueRef ] ) ->
@@ -1672,74 +1669,63 @@ fn incr_ptr(cx: &@block_ctxt, p: ValueRef, incr: ValueRef, pp: ValueRef) {
1672
1669
cx. build . Store ( cx. build . InBoundsGEP ( p, ~[ incr] ) , pp) ;
1673
1670
}
1674
1671
1675
- fn iter_structural_ty_full ( cx : & @block_ctxt , av : ValueRef , bv : ValueRef ,
1676
- t : & ty:: t , f : & val_pair_and_ty_fn ) -> result {
1677
- fn iter_boxpp ( cx : @block_ctxt , box_a_cell : ValueRef , box_b_cell : ValueRef ,
1678
- f : & val_pair_and_ty_fn ) -> result {
1679
- let box_a_ptr = cx. build . Load ( box_a_cell) ;
1680
- let box_b_ptr = cx. build . Load ( box_b_cell) ;
1672
+ fn iter_structural_ty_full ( cx : & @block_ctxt , av : ValueRef , t : & ty:: t ,
1673
+ f : & val_and_ty_fn ) -> result {
1674
+ fn iter_boxpp ( cx : @block_ctxt , box_cell : ValueRef , f : & val_and_ty_fn )
1675
+ -> result {
1676
+ let box_ptr = cx. build . Load ( box_cell) ;
1681
1677
let tnil = ty:: mk_nil ( bcx_tcx ( cx) ) ;
1682
1678
let tbox = ty:: mk_imm_box ( bcx_tcx ( cx) , tnil) ;
1683
1679
let inner_cx = new_sub_block_ctxt ( cx, "iter box" ) ;
1684
1680
let next_cx = new_sub_block_ctxt ( cx, "next" ) ;
1685
- let null_test = cx. build . IsNull ( box_a_ptr ) ;
1681
+ let null_test = cx. build . IsNull ( box_ptr ) ;
1686
1682
cx. build . CondBr ( null_test, next_cx. llbb , inner_cx. llbb ) ;
1687
- let r = f ( inner_cx, box_a_ptr , box_b_ptr , tbox) ;
1683
+ let r = f ( inner_cx, box_ptr , tbox) ;
1688
1684
r. bcx . build . Br ( next_cx. llbb ) ;
1689
1685
ret rslt( next_cx, C_nil ( ) ) ;
1690
1686
}
1691
1687
1692
- fn iter_ivec ( bcx : @block_ctxt , av : ValueRef , bv : ValueRef , unit_ty : ty:: t ,
1693
- f : & val_pair_and_ty_fn ) -> result {
1688
+ fn iter_ivec ( bcx : @block_ctxt , av : ValueRef , unit_ty : ty:: t ,
1689
+ f : & val_and_ty_fn ) -> result {
1694
1690
// FIXME: "unimplemented rebinding existing function" workaround
1695
1691
1696
- fn adapter ( bcx : & @block_ctxt , av : ValueRef , bv : ValueRef ,
1697
- unit_ty : ty :: t , f : val_pair_and_ty_fn ) -> result {
1698
- ret f( bcx, av, bv , unit_ty) ;
1692
+ fn adapter ( bcx : & @block_ctxt , av : ValueRef , unit_ty : ty :: t ,
1693
+ f : val_and_ty_fn ) -> result {
1694
+ ret f( bcx, av, unit_ty) ;
1699
1695
}
1700
1696
let llunitty = type_of_or_i8 ( bcx, unit_ty) ;
1701
1697
let rs = size_of ( bcx, unit_ty) ;
1702
1698
let unit_sz = rs. val ;
1703
1699
bcx = rs. bcx ;
1704
1700
let a_len_and_data = ivec:: get_len_and_data ( bcx, av, unit_ty) ;
1705
- let a_len = a_len_and_data. len ;
1701
+ let len = a_len_and_data. len ;
1706
1702
let a_elem = a_len_and_data. data ;
1707
1703
bcx = a_len_and_data. bcx ;
1708
- let b_len_and_data = ivec:: get_len_and_data ( bcx, bv, unit_ty) ;
1709
- let b_len = b_len_and_data. len ;
1710
- let b_elem = b_len_and_data. data ;
1711
- bcx = b_len_and_data. bcx ;
1712
1704
// Calculate the last pointer address we want to handle.
1713
1705
// TODO: Optimize this when the size of the unit type is statically
1714
1706
// known to not use pointer casts, which tend to confuse LLVM.
1715
1707
1716
- let len = umin ( bcx, a_len, b_len) ;
1717
- let b_elem_i8 = bcx. build . PointerCast ( b_elem, T_ptr ( T_i8 ( ) ) ) ;
1718
- let b_end_i8 = bcx. build . GEP ( b_elem_i8, ~[ len] ) ;
1719
- let b_end = bcx. build . PointerCast ( b_end_i8, T_ptr ( llunitty) ) ;
1708
+ let a_elem_i8 = bcx. build . PointerCast ( a_elem, T_ptr ( T_i8 ( ) ) ) ;
1709
+ let a_end_i8 = bcx. build . GEP ( a_elem_i8, ~[ len] ) ;
1710
+ let a_end = bcx. build . PointerCast ( a_end_i8, T_ptr ( llunitty) ) ;
1720
1711
1721
1712
let dest_elem_ptr = alloca ( bcx, T_ptr ( llunitty) ) ;
1722
- let src_elem_ptr = alloca ( bcx, T_ptr ( llunitty) ) ;
1723
1713
bcx. build . Store ( a_elem, dest_elem_ptr) ;
1724
- bcx. build . Store ( b_elem, src_elem_ptr) ;
1725
1714
1726
1715
// Now perform the iteration.
1727
1716
let loop_header_cx = new_sub_block_ctxt ( bcx, "iter_ivec_loop_header" ) ;
1728
1717
bcx. build . Br ( loop_header_cx. llbb ) ;
1729
1718
let dest_elem = loop_header_cx. build . Load ( dest_elem_ptr) ;
1730
- let src_elem = loop_header_cx. build . Load ( src_elem_ptr) ;
1731
1719
let not_yet_at_end =
1732
1720
loop_header_cx. build . ICmp ( lib:: llvm:: LLVMIntULT , dest_elem,
1733
- b_end ) ;
1721
+ a_end ) ;
1734
1722
let loop_body_cx = new_sub_block_ctxt ( bcx, "iter_ivec_loop_body" ) ;
1735
1723
let next_cx = new_sub_block_ctxt ( bcx, "iter_ivec_next" ) ;
1736
1724
loop_header_cx. build . CondBr ( not_yet_at_end, loop_body_cx. llbb ,
1737
1725
next_cx. llbb ) ;
1738
1726
1739
- rs =
1740
- f ( loop_body_cx,
1741
- load_if_immediate ( loop_body_cx, dest_elem, unit_ty) ,
1742
- load_if_immediate ( loop_body_cx, src_elem, unit_ty) , unit_ty) ;
1727
+ rs = f ( loop_body_cx,
1728
+ load_if_immediate ( loop_body_cx, dest_elem, unit_ty) , unit_ty) ;
1743
1729
1744
1730
loop_body_cx = rs. bcx ;
1745
1731
@@ -1749,15 +1735,14 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1749
1735
} else { increment = C_int ( 1 ) ; }
1750
1736
1751
1737
incr_ptr ( loop_body_cx, dest_elem, increment, dest_elem_ptr) ;
1752
- incr_ptr ( loop_body_cx, src_elem, increment, src_elem_ptr) ;
1753
1738
loop_body_cx. build . Br ( loop_header_cx. llbb ) ;
1754
1739
1755
1740
ret rslt( next_cx, C_nil ( ) ) ;
1756
1741
}
1757
1742
1758
- fn iter_variant ( cx : @block_ctxt , a_tup : ValueRef , b_tup : ValueRef ,
1743
+ fn iter_variant ( cx : @block_ctxt , a_tup : ValueRef ,
1759
1744
variant : & ty:: variant_info , tps : & [ ty:: t ] ,
1760
- tid : & ast:: def_id , f : & val_pair_and_ty_fn ) -> result {
1745
+ tid : & ast:: def_id , f : & val_and_ty_fn ) -> result {
1761
1746
if std:: ivec:: len[ ty:: t] ( variant. args ) == 0 u {
1762
1747
ret rslt ( cx, C_nil ( ) ) ;
1763
1748
}
@@ -1770,13 +1755,9 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1770
1755
let rslt = GEP_tag ( cx, a_tup, tid, variant. id , tps, j) ;
1771
1756
let llfldp_a = rslt. val ;
1772
1757
cx = rslt. bcx ;
1773
- rslt = GEP_tag ( cx, b_tup, tid, variant. id , tps, j) ;
1774
- let llfldp_b = rslt. val ;
1775
- cx = rslt. bcx ;
1776
1758
let ty_subst = ty:: substitute_type_params ( ccx. tcx , tps, a. ty ) ;
1777
1759
let llfld_a = load_if_immediate ( cx, llfldp_a, ty_subst) ;
1778
- let llfld_b = load_if_immediate ( cx, llfldp_b, ty_subst) ;
1779
- rslt = f ( cx, llfld_a, llfld_b, ty_subst) ;
1760
+ rslt = f ( cx, llfld_a, ty_subst) ;
1780
1761
cx = rslt. bcx ;
1781
1762
j += 1 ;
1782
1763
}
@@ -1792,11 +1773,8 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1792
1773
for fld: ty:: field in fields {
1793
1774
r = GEP_tup_like ( r. bcx , t, av, ~[ 0 , i] ) ;
1794
1775
let llfld_a = r. val ;
1795
- r = GEP_tup_like ( r. bcx , t, bv, ~[ 0 , i] ) ;
1796
- let llfld_b = r. val ;
1797
- r =
1798
- f ( r. bcx , load_if_immediate ( r. bcx , llfld_a, fld. mt . ty ) ,
1799
- load_if_immediate ( r. bcx , llfld_b, fld. mt . ty ) , fld. mt . ty ) ;
1776
+ r = f ( r. bcx , load_if_immediate ( r. bcx , llfld_a, fld. mt . ty ) ,
1777
+ fld. mt . ty ) ;
1800
1778
i += 1 ;
1801
1779
}
1802
1780
}
@@ -1807,34 +1785,27 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1807
1785
let tup_t = ty:: mk_imm_tup ( tcx, ~[ ty:: mk_int ( tcx) , inner_t_s] ) ;
1808
1786
r = GEP_tup_like ( r. bcx , tup_t, av, ~[ 0 , 1 ] ) ;
1809
1787
let llfld_a = r. val ;
1810
- r = GEP_tup_like ( r. bcx , tup_t, bv, ~[ 0 , 1 ] ) ;
1811
- let llfld_b = r. val ;
1812
- r = f ( r. bcx , load_if_immediate ( r. bcx , llfld_a, inner1) ,
1813
- load_if_immediate ( r. bcx , llfld_b, inner1) , inner1) ;
1788
+ r = f ( r. bcx , load_if_immediate ( r. bcx , llfld_a, inner1) , inner1) ;
1814
1789
}
1815
1790
ty:: ty_tag ( tid, tps) {
1816
1791
let variants = ty:: tag_variants ( bcx_tcx ( cx) , tid) ;
1817
1792
let n_variants = std:: ivec:: len ( variants) ;
1818
1793
1819
1794
// Cast the tags to types we can GEP into.
1820
1795
if n_variants == 1 u {
1821
- ret iter_variant ( cx, av, bv , variants. ( 0 ) , tps, tid, f) ;
1796
+ ret iter_variant ( cx, av, variants. ( 0 ) , tps, tid, f) ;
1822
1797
}
1823
1798
1824
1799
let lltagty = T_opaque_tag_ptr ( bcx_ccx ( cx) . tn ) ;
1825
1800
let av_tag = cx. build . PointerCast ( av, lltagty) ;
1826
- let bv_tag = cx. build . PointerCast ( bv, lltagty) ;
1827
1801
let lldiscrim_a_ptr = cx. build . GEP ( av_tag, ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ;
1828
1802
let llunion_a_ptr = cx. build . GEP ( av_tag, ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ;
1829
1803
let lldiscrim_a = cx. build . Load ( lldiscrim_a_ptr) ;
1830
- let lldiscrim_b_ptr = cx. build . GEP ( bv_tag, ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ;
1831
- let llunion_b_ptr = cx. build . GEP ( bv_tag, ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ;
1832
- let lldiscrim_b = cx. build . Load ( lldiscrim_b_ptr) ;
1833
1804
1834
1805
// NB: we must hit the discriminant first so that structural
1835
1806
// comparison know not to proceed when the discriminants differ.
1836
1807
let bcx = cx;
1837
- bcx = f ( bcx, lldiscrim_a, lldiscrim_b , ty:: mk_int ( bcx_tcx ( cx) ) ) . bcx ;
1808
+ bcx = f ( bcx, lldiscrim_a, ty:: mk_int ( bcx_tcx ( cx) ) ) . bcx ;
1838
1809
let unr_cx = new_sub_block_ctxt ( bcx, "tag-iter-unr" ) ;
1839
1810
unr_cx. build . Unreachable ( ) ;
1840
1811
let llswitch = bcx. build . Switch ( lldiscrim_a, unr_cx. llbb , n_variants) ;
@@ -1846,9 +1817,8 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1846
1817
"tag-iter-variant-" +
1847
1818
uint:: to_str ( i, 10 u) ) ;
1848
1819
llvm:: LLVMAddCase ( llswitch, C_int ( i as int ) , variant_cx. llbb ) ;
1849
- variant_cx =
1850
- iter_variant ( variant_cx, llunion_a_ptr, llunion_b_ptr,
1851
- variant, tps, tid, f) . bcx ;
1820
+ variant_cx = iter_variant ( variant_cx, llunion_a_ptr, variant, tps,
1821
+ tid, f) . bcx ;
1852
1822
variant_cx. build . Br ( next_cx. llbb ) ;
1853
1823
i += 1 u;
1854
1824
}
@@ -1857,21 +1827,17 @@ fn iter_structural_ty_full(cx: &@block_ctxt, av: ValueRef, bv: ValueRef,
1857
1827
ty:: ty_fn ( _, _, _, _, _) {
1858
1828
let box_cell_a =
1859
1829
cx. build . GEP ( av, ~[ C_int ( 0 ) , C_int ( abi:: fn_field_box) ] ) ;
1860
- let box_cell_b =
1861
- cx. build . GEP ( bv, ~[ C_int ( 0 ) , C_int ( abi:: fn_field_box) ] ) ;
1862
- ret iter_boxpp( cx, box_cell_a, box_cell_b, f) ;
1830
+ ret iter_boxpp( cx, box_cell_a, f) ;
1863
1831
}
1864
1832
ty:: ty_obj ( _) {
1865
1833
let box_cell_a =
1866
1834
cx. build . GEP ( av, ~[ C_int ( 0 ) , C_int ( abi:: obj_field_box) ] ) ;
1867
- let box_cell_b =
1868
- cx. build . GEP ( bv, ~[ C_int ( 0 ) , C_int ( abi:: obj_field_box) ] ) ;
1869
- ret iter_boxpp( cx, box_cell_a, box_cell_b, f) ;
1835
+ ret iter_boxpp( cx, box_cell_a, f) ;
1870
1836
}
1871
- ty:: ty_ivec ( unit_tm) { ret iter_ivec ( cx, av, bv , unit_tm. ty , f) ; }
1837
+ ty:: ty_ivec ( unit_tm) { ret iter_ivec ( cx, av, unit_tm. ty , f) ; }
1872
1838
ty:: ty_istr. {
1873
1839
let unit_ty = ty:: mk_mach ( bcx_tcx ( cx) , ast:: ty_u8) ;
1874
- ret iter_ivec( cx, av, bv , unit_ty, f) ;
1840
+ ret iter_ivec( cx, av, unit_ty, f) ;
1875
1841
}
1876
1842
_ { bcx_ccx( cx) . sess . unimpl ( "type in iter_structural_ty_full" ) ; }
1877
1843
}
0 commit comments