@@ -2691,15 +2691,24 @@ fn iter_sequence_inner(&@block_ctxt cx, ValueRef src,
2691
2691
fn iter_sequence( @block_ctxt cx, ValueRef v, & ty:: t t, & val_and_ty_fn f) ->
2692
2692
result {
2693
2693
fn iter_sequence_body( @block_ctxt cx, ValueRef v, & ty:: t elt_ty,
2694
- & val_and_ty_fn f, bool trailing_null) -> result {
2695
- auto p0 = cx. build. GEP ( v, [ C_int ( 0 ) , C_int ( abi:: vec_elt_data) ] ) ;
2696
- auto lenptr = cx. build. GEP ( v, [ C_int ( 0 ) , C_int ( abi:: vec_elt_fill) ] ) ;
2697
- auto llunit_ty;
2698
- if ( ty:: type_has_dynamic_size( cx. fcx. lcx. ccx. tcx, elt_ty) ) {
2699
- llunit_ty = T_i8 ( ) ;
2700
- } else { llunit_ty = type_of( cx. fcx. lcx. ccx, cx. sp, elt_ty) ; }
2701
- auto bcx = cx;
2702
- auto len = bcx. build. Load ( lenptr) ;
2694
+ & val_and_ty_fn f, bool trailing_null, bool interior)
2695
+ -> result {
2696
+ auto p0;
2697
+ auto len;
2698
+ auto bcx;
2699
+ if ( !interior) {
2700
+ p0 = cx. build. GEP ( v, [ C_int ( 0 ) , C_int ( abi:: vec_elt_data) ] ) ;
2701
+ auto lp = cx. build. GEP ( v, [ C_int ( 0 ) , C_int ( abi:: vec_elt_fill) ] ) ;
2702
+ len = cx. build. Load ( lp) ;
2703
+ bcx = cx;
2704
+ } else {
2705
+ auto len_and_data_rslt = ivec:: get_len_and_data( cx, v, elt_ty) ;
2706
+ len = len_and_data_rslt. _0;
2707
+ p0 = len_and_data_rslt. _1;
2708
+ bcx = len_and_data_rslt. _2;
2709
+ }
2710
+
2711
+ auto llunit_ty = type_of_or_i8( cx, elt_ty) ;
2703
2712
if ( trailing_null) {
2704
2713
auto unit_sz = size_of( bcx, elt_ty) ;
2705
2714
bcx = unit_sz. bcx;
@@ -2709,13 +2718,21 @@ fn iter_sequence(@block_ctxt cx, ValueRef v, &ty::t t, &val_and_ty_fn f) ->
2709
2718
vi2p( bcx, bcx. build. Add ( vp2i( bcx, p0) , len) , T_ptr ( llunit_ty) ) ;
2710
2719
ret iter_sequence_inner( bcx, p0, p1, elt_ty, f) ;
2711
2720
}
2721
+
2712
2722
alt ( ty:: struct ( cx. fcx. lcx. ccx. tcx, t) ) {
2713
2723
case ( ty:: ty_vec( ?elt) ) {
2714
- ret iter_sequence_body( cx, v, elt. ty, f, false) ;
2724
+ ret iter_sequence_body( cx, v, elt. ty, f, false, false ) ;
2715
2725
}
2716
2726
case ( ty:: ty_str) {
2717
2727
auto et = ty:: mk_mach( cx. fcx. lcx. ccx. tcx, common:: ty_u8) ;
2718
- ret iter_sequence_body( cx, v, et, f, true) ;
2728
+ ret iter_sequence_body( cx, v, et, f, true, false) ;
2729
+ }
2730
+ case ( ty:: ty_ivec( ?elt) ) {
2731
+ ret iter_sequence_body( cx, v, elt. ty, f, false, true) ;
2732
+ }
2733
+ case ( ty:: ty_istr) {
2734
+ auto et = ty:: mk_mach( cx. fcx. lcx. ccx. tcx, common:: ty_u8) ;
2735
+ ret iter_sequence_body( cx, v, et, f, true, true) ;
2719
2736
}
2720
2737
case ( _) {
2721
2738
cx. fcx. lcx. ccx. sess. bug( "unexpected type in " +
0 commit comments