@@ -1770,6 +1770,81 @@ fn iter_structural_ty_full(@block_ctxt cx,
1770
1770
ret r;
1771
1771
}
1772
1772
1773
+ // Iterates through a pair of sequences, until the src* hits the src_lim*.
1774
+ fn iter_sequence_pair_inner( @block_ctxt cx,
1775
+ ValueRef dst, // elt*
1776
+ ValueRef src, // elt*
1777
+ ValueRef src_lim, // elt*
1778
+ @ty. t elt_ty,
1779
+ val_pair_and_ty_fn f) -> result {
1780
+
1781
+ auto bcx = cx;
1782
+
1783
+ auto llunit_ty = type_of( cx. fcx. ccx, elt_ty) ;
1784
+ auto unit_sz = size_of( bcx, elt_ty) ;
1785
+ bcx = unit_sz. bcx;
1786
+
1787
+ let ValueRef src_int = vp2i( bcx, src) ;
1788
+ let ValueRef src_lim_int = vp2i( bcx, src_lim) ;
1789
+ let ValueRef dst_int = vp2i( bcx, dst) ;
1790
+
1791
+ auto cond_cx = new_scope_block_ctxt( cx, "sequence-iter cond") ;
1792
+ auto body_cx = new_scope_block_ctxt( cx, "sequence-iter body") ;
1793
+ auto next_cx = new_sub_block_ctxt( cx, "next") ;
1794
+
1795
+ bcx. build. Br ( cond_cx. llbb) ;
1796
+
1797
+ let ValueRef src_curr = cond_cx. build. Phi ( T_int( ) ,
1798
+ vec( src_int) , vec( bcx. llbb) ) ;
1799
+ let ValueRef dst_curr = cond_cx. build. Phi ( T_int( ) ,
1800
+ vec( dst_int) , vec( bcx. llbb) ) ;
1801
+
1802
+ auto end_test = cond_cx. build. ICmp ( lib. llvm. LLVMIntNE,
1803
+ src_curr, src_lim_int) ;
1804
+
1805
+ cond_cx. build. CondBr ( end_test, body_cx. llbb, next_cx. llbb) ;
1806
+
1807
+ auto src_curr_ptr = vi2p( body_cx, src_curr, T_ptr ( llunit_ty) ) ;
1808
+ auto dst_curr_ptr = vi2p( body_cx, dst_curr, T_ptr ( llunit_ty) ) ;
1809
+
1810
+ auto body_res = f( body_cx,
1811
+ dst_curr_ptr,
1812
+ load_scalar_or_boxed( body_cx, src_curr_ptr, elt_ty) ,
1813
+ elt_ty) ;
1814
+ body_cx = body_res. bcx;
1815
+
1816
+ auto src_next = body_cx. build. Add ( src_curr, unit_sz. val) ;
1817
+ auto dst_next = body_cx. build. Add ( dst_curr, unit_sz. val) ;
1818
+ body_cx. build. Br ( cond_cx. llbb) ;
1819
+
1820
+ cond_cx. build. AddIncomingToPhi ( src_curr, vec( src_next) ,
1821
+ vec( body_cx. llbb) ) ;
1822
+
1823
+ cond_cx. build. AddIncomingToPhi ( dst_curr, vec( dst_next) ,
1824
+ vec( body_cx. llbb) ) ;
1825
+
1826
+ ret res( next_cx, C_nil( ) ) ;
1827
+ }
1828
+
1829
+
1830
+ fn iter_sequence_inner( @block_ctxt cx,
1831
+ ValueRef src, // elt*
1832
+ ValueRef src_lim, // elt*
1833
+ @ty. t elt_ty,
1834
+ val_and_ty_fn f) -> result {
1835
+ fn adaptor_fn( val_and_ty_fn f,
1836
+ @block_ctxt cx,
1837
+ ValueRef av,
1838
+ ValueRef bv,
1839
+ @ty. t t) -> result {
1840
+ ret f( cx, bv, t) ;
1841
+ }
1842
+
1843
+ be iter_sequence_pair_inner( cx, src, src, src_lim, elt_ty,
1844
+ bind adaptor_fn( f, _, _, _, _) ) ;
1845
+ }
1846
+
1847
+
1773
1848
// Iterates through the elements of a vec or str.
1774
1849
fn iter_sequence( @block_ctxt cx,
1775
1850
ValueRef v,
@@ -1789,43 +1864,18 @@ fn iter_sequence(@block_ctxt cx,
1789
1864
1790
1865
auto llunit_ty = type_of( cx. fcx. ccx, elt_ty) ;
1791
1866
auto bcx = cx;
1792
- auto unit_sz = size_of( bcx, elt_ty) ;
1793
- bcx = unit_sz. bcx;
1794
1867
1795
1868
auto len = bcx. build. Load ( lenptr) ;
1796
1869
if ( trailing_null) {
1870
+ auto unit_sz = size_of( bcx, elt_ty) ;
1871
+ bcx = unit_sz. bcx;
1797
1872
len = bcx. build. Sub ( len, unit_sz. val) ;
1798
1873
}
1799
1874
1800
- auto cond_cx = new_scope_block_ctxt( cx, "sequence-iter cond" ) ;
1801
- auto body_cx = new_scope_block_ctxt( cx, "sequence-iter body" ) ;
1802
- auto next_cx = new_sub_block_ctxt( cx, "next" ) ;
1803
-
1804
- bcx. build. Br ( cond_cx. llbb) ;
1805
-
1806
- auto ix = cond_cx. build. Phi ( T_int ( ) , vec( C_int ( 0 ) ) , vec( cx. llbb) ) ;
1807
- auto scaled_ix = cond_cx. build. Phi ( T_int ( ) ,
1808
- vec( C_int ( 0 ) ) , vec( cx. llbb) ) ;
1809
-
1810
- auto end_test = cond_cx. build. ICmp ( lib. llvm. LLVMIntNE ,
1811
- scaled_ix, len) ;
1812
- cond_cx. build. CondBr ( end_test, body_cx. llbb, next_cx. llbb) ;
1875
+ auto p1 = vi2p( bcx, bcx. build. Add ( vp2i( bcx, p0) , len) ,
1876
+ T_ptr ( llunit_ty) ) ;
1813
1877
1814
- auto elt = body_cx. build. GEP ( p0, vec( C_int ( 0 ) , ix) ) ;
1815
- auto body_res = f( body_cx,
1816
- load_scalar_or_boxed( body_cx, elt, elt_ty) ,
1817
- elt_ty) ;
1818
- auto next_ix = body_res. bcx. build. Add ( ix, C_int ( 1 ) ) ;
1819
- auto next_scaled_ix = body_res. bcx. build. Add ( scaled_ix, unit_sz. val) ;
1820
-
1821
- cond_cx. build. AddIncomingToPhi ( ix, vec( next_ix) ,
1822
- vec( body_res. bcx. llbb) ) ;
1823
-
1824
- cond_cx. build. AddIncomingToPhi ( scaled_ix, vec( next_scaled_ix) ,
1825
- vec( body_res. bcx. llbb) ) ;
1826
-
1827
- body_res. bcx. build. Br ( cond_cx. llbb) ;
1828
- ret res( next_cx, C_nil ( ) ) ;
1878
+ ret iter_sequence_inner( cx, p0, p1, elt_ty, f) ;
1829
1879
}
1830
1880
1831
1881
alt ( t. struct ) {
0 commit comments