Skip to content

Commit 062c6b9

Browse files
committed
rustc: Implement "for" over interior vectors
1 parent 23d6a6b commit 062c6b9

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

src/comp/middle/alias.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,11 @@ fn check_for(&ctx cx, &@ast::local local, &@ast::expr seq, &ast::block block,
335335
case (ty::ty_vec(?mt)) {
336336
if (mt.mut != ast::imm) { unsafe = [seq_t]; }
337337
}
338-
case (ty::ty_str) { }
338+
case (ty::ty_str) { /* no-op */ }
339+
case (ty::ty_ivec(?mt)) {
340+
if (mt.mut != ast::imm) { unsafe = [seq_t]; }
341+
}
342+
case (ty::ty_istr) { /* no-op */ }
339343
}
340344
auto new_sc =
341345
@rec(root_vars=root_def,

src/comp/middle/trans.rs

+28-11
Original file line numberDiff line numberDiff line change
@@ -2691,15 +2691,24 @@ fn iter_sequence_inner(&@block_ctxt cx, ValueRef src,
26912691
fn iter_sequence(@block_ctxt cx, ValueRef v, &ty::t t, &val_and_ty_fn f) ->
26922692
result {
26932693
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);
27032712
if (trailing_null) {
27042713
auto unit_sz = size_of(bcx, elt_ty);
27052714
bcx = unit_sz.bcx;
@@ -2709,13 +2718,21 @@ fn iter_sequence(@block_ctxt cx, ValueRef v, &ty::t t, &val_and_ty_fn f) ->
27092718
vi2p(bcx, bcx.build.Add(vp2i(bcx, p0), len), T_ptr(llunit_ty));
27102719
ret iter_sequence_inner(bcx, p0, p1, elt_ty, f);
27112720
}
2721+
27122722
alt (ty::struct(cx.fcx.lcx.ccx.tcx, t)) {
27132723
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);
27152725
}
27162726
case (ty::ty_str) {
27172727
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);
27192736
}
27202737
case (_) {
27212738
cx.fcx.lcx.ccx.sess.bug("unexpected type in " +

src/comp/middle/typeck.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1683,15 +1683,20 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
16831683
case (ast::expr_for(?decl, ?seq, ?body, ?id)) {
16841684
check_expr(fcx, seq);
16851685
auto elt_ty;
1686-
alt (structure_of(fcx, expr.span, expr_ty(fcx.ccx.tcx, seq))) {
1686+
auto ety = expr_ty(fcx.ccx.tcx, seq);
1687+
alt (structure_of(fcx, expr.span, ety)) {
16871688
case (ty::ty_vec(?vec_elt_ty)) { elt_ty = vec_elt_ty.ty; }
16881689
case (ty::ty_str) {
16891690
elt_ty = ty::mk_mach(fcx.ccx.tcx, util::common::ty_u8);
16901691
}
1692+
case (ty::ty_ivec(?vec_elt_ty)) { elt_ty = vec_elt_ty.ty; }
1693+
case (ty::ty_istr) {
1694+
elt_ty = ty::mk_mach(fcx.ccx.tcx, util::common::ty_u8);
1695+
}
16911696
case (_) {
16921697
fcx.ccx.tcx.sess.span_fatal(expr.span,
1693-
"type of for loop iterator \
1694-
is not a vector or string");
1698+
"mismatched types: expected vector or string but " +
1699+
"found " + ty_to_str(fcx.ccx.tcx, ety));
16951700
}
16961701
}
16971702
check_for_or_for_each(fcx, decl, elt_ty, body, id);

0 commit comments

Comments
 (0)