Skip to content

Commit 3f900dc

Browse files
committed
auto merge of #7055 : thestinger/rust/iterator, r=catamorphism
This was a lot more painful than just changing `x.each` to `x.iter().advance` . I ran into my old friend #5898 and had to add underscores to some method names as a temporary workaround. The borrow checker also had other ideas because rvalues aren't handled very well yet so temporary variables had to be added. However, storing the temporary in a variable led to dynamic `@mut` failures, so those had to be wrapped in blocks except where the scope ends immediately. Anyway, the ugliness will be fixed as the compiler issues are fixed and this change will amount to `for x.each |x|` becoming `for x.iter |x|` and making all the iterator adaptors available. I dropped the run-pass tests for `old_iter` because there's not much point in fixing a module that's on the way out in the next week or so.
2 parents 1175e94 + bbe3d4a commit 3f900dc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+485
-637
lines changed

Diff for: src/compiletest/procsrv.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// except according to those terms.
1010

1111
use core::prelude::*;
12+
use core::iterator::IteratorUtil;
1213

1314
use core::os;
1415
use core::run;
@@ -58,7 +59,7 @@ pub fn run(lib_path: &str,
5859
err_fd: None
5960
});
6061

61-
for input.each |input| {
62+
for input.iter().advance |input| {
6263
proc.input().write_str(*input);
6364
}
6465
let output = proc.finish_with_output();

Diff for: src/libextra/par.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ pub fn any<A:Copy + Owned>(
139139
fn_factory: &fn() -> ~fn(&A) -> bool) -> bool {
140140
let mapped = map_slices(xs, || {
141141
let f = fn_factory();
142-
let result: ~fn(uint, &[A]) -> bool = |_, slice| slice.iter().any(f);
142+
let result: ~fn(uint, &[A]) -> bool = |_, slice| slice.iter().any_(f);
143143
result
144144
});
145-
mapped.iter().any(|&x| x)
145+
mapped.iter().any_(|&x| x)
146146
}

Diff for: src/libextra/treemap.rs

+12-11
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ impl<T: TotalOrd> Set<T> for TreeSet<T> {
427427
b = y.next();
428428
}
429429
}
430-
return b.each(|&x| f(x)) && y.advance(f);
430+
b.iter().advance(|&x| f(x)) && y.advance(f)
431431
}
432432

433433
/// Visit the values (in-order) representing the intersection
@@ -485,7 +485,7 @@ impl<T: TotalOrd> Set<T> for TreeSet<T> {
485485
a = x.next();
486486
}
487487
}
488-
return b.each(|&x| f(x)) && y.advance(f);
488+
b.iter().advance(|&x| f(x)) && y.advance(f)
489489
}
490490
}
491491

@@ -527,14 +527,14 @@ impl<K: TotalOrd, V> TreeNode<K, V> {
527527

528528
fn each<'r, K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
529529
f: &fn(&'r K, &'r V) -> bool) -> bool {
530-
node.each(|x| each(&x.left, f) && f(&x.key, &x.value) &&
531-
each(&x.right, f))
530+
node.iter().advance(|x| each(&x.left, f) && f(&x.key, &x.value) &&
531+
each(&x.right, f))
532532
}
533533

534534
fn each_reverse<'r, K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
535535
f: &fn(&'r K, &'r V) -> bool) -> bool {
536-
node.each(|x| each_reverse(&x.right, f) && f(&x.key, &x.value) &&
537-
each_reverse(&x.left, f))
536+
node.iter().advance(|x| each_reverse(&x.right, f) && f(&x.key, &x.value) &&
537+
each_reverse(&x.left, f))
538538
}
539539

540540
fn mutate_values<'r, K: TotalOrd, V>(node: &'r mut Option<~TreeNode<K, V>>,
@@ -625,7 +625,7 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
625625
fn heir_swap<K: TotalOrd, V>(node: &mut ~TreeNode<K, V>,
626626
child: &mut Option<~TreeNode<K, V>>) {
627627
// *could* be done without recursion, but it won't borrow check
628-
for child.each_mut |x| {
628+
for child.mut_iter().advance |x| {
629629
if x.right.is_some() {
630630
heir_swap(node, &mut x.right);
631631
} else {
@@ -680,18 +680,18 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
680680
save.level -= 1;
681681

682682
if right_level > save.level {
683-
for save.right.each_mut |x| { x.level = save.level }
683+
for save.right.mut_iter().advance |x| { x.level = save.level }
684684
}
685685

686686
skew(save);
687687

688-
for save.right.each_mut |right| {
688+
for save.right.mut_iter().advance |right| {
689689
skew(right);
690-
for right.right.each_mut |x| { skew(x) }
690+
for right.right.mut_iter().advance |x| { skew(x) }
691691
}
692692

693693
split(save);
694-
for save.right.each_mut |x| { split(x) }
694+
for save.right.mut_iter().advance |x| { split(x) }
695695
}
696696

697697
return ret;
@@ -1111,6 +1111,7 @@ mod test_set {
11111111

11121112
let mut n = 0;
11131113
for m.each |x| {
1114+
println(fmt!("%?", x));
11141115
assert_eq!(*x, n);
11151116
n += 1
11161117
}

Diff for: src/librust/rust.rc

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ extern mod rusti;
3030
extern mod rustc;
3131

3232
use core::prelude::*;
33+
use core::iterator::IteratorUtil;
3334

3435
use core::io;
3536
use core::os;
@@ -242,7 +243,8 @@ pub fn main() {
242243
let args = os_args.tail();
243244

244245
if !args.is_empty() {
245-
for find_cmd(*args.head()).each |command| {
246+
let r = find_cmd(*args.head());
247+
for r.iter().advance |command| {
246248
let result = do_command(command, args.tail());
247249
match result {
248250
Valid(exit_code) => unsafe { exit(exit_code.to_i32()) },

Diff for: src/librustc/metadata/encoder.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use middle::ty;
2222
use middle;
2323
use util::ppaux::ty_to_str;
2424

25+
use core::iterator::IteratorUtil;
2526
use core::hash::HashUtil;
2627
use core::hashmap::HashMap;
2728
use core::int;
@@ -120,7 +121,7 @@ fn encode_region_param(ecx: @EncodeContext,
120121
ebml_w: &mut writer::Encoder,
121122
it: @ast::item) {
122123
let opt_rp = ecx.tcx.region_paramd_items.find(&it.id);
123-
for opt_rp.each |rp| {
124+
for opt_rp.iter().advance |rp| {
124125
ebml_w.start_tag(tag_region_param);
125126
rp.encode(ebml_w);
126127
ebml_w.end_tag();
@@ -240,7 +241,7 @@ fn encode_type(ecx: @EncodeContext,
240241
fn encode_transformed_self_ty(ecx: @EncodeContext,
241242
ebml_w: &mut writer::Encoder,
242243
opt_typ: Option<ty::t>) {
243-
for opt_typ.each |&typ| {
244+
for opt_typ.iter().advance |&typ| {
244245
ebml_w.start_tag(tag_item_method_transformed_self_ty);
245246
write_type(ecx, ebml_w, typ);
246247
ebml_w.end_tag();
@@ -956,7 +957,7 @@ fn encode_info_for_item(ecx: @EncodeContext,
956957
ebml_w.writer.write(str::to_bytes(def_to_str(method_def_id)));
957958
ebml_w.end_tag();
958959
}
959-
for opt_trait.each |ast_trait_ref| {
960+
for opt_trait.iter().advance |ast_trait_ref| {
960961
let trait_ref = ty::node_id_to_trait_ref(ecx.tcx, ast_trait_ref.ref_id);
961962
encode_trait_ref(ebml_w, ecx, trait_ref, tag_item_trait_ref);
962963
}

Diff for: src/librustc/middle/astencode.rs

+83-52
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use middle::{ty, typeck, moves};
2525
use middle;
2626
use util::ppaux::ty_to_str;
2727

28+
use core::iterator::IteratorUtil;
2829
use core::at_vec;
2930
use core::uint;
3031
use extra::ebml::reader;
@@ -826,86 +827,113 @@ fn encode_side_tables_for_id(ecx: @e::EncodeContext,
826827

827828
debug!("Encoding side tables for id %d", id);
828829

829-
for tcx.def_map.find(&id).each |def| {
830-
do ebml_w.tag(c::tag_table_def) |ebml_w| {
831-
ebml_w.id(id);
832-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
833-
(*def).encode(ebml_w)
830+
{
831+
let r = tcx.def_map.find(&id);
832+
for r.iter().advance |def| {
833+
do ebml_w.tag(c::tag_table_def) |ebml_w| {
834+
ebml_w.id(id);
835+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
836+
(*def).encode(ebml_w)
837+
}
834838
}
835839
}
836840
}
837841

838-
for tcx.node_types.find(&(id as uint)).each |&ty| {
839-
do ebml_w.tag(c::tag_table_node_type) |ebml_w| {
840-
ebml_w.id(id);
841-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
842-
ebml_w.emit_ty(ecx, *ty);
842+
{
843+
let r = tcx.node_types.find(&(id as uint));
844+
for r.iter().advance |&ty| {
845+
do ebml_w.tag(c::tag_table_node_type) |ebml_w| {
846+
ebml_w.id(id);
847+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
848+
ebml_w.emit_ty(ecx, *ty);
849+
}
843850
}
844851
}
845852
}
846853

847-
for tcx.node_type_substs.find(&id).each |tys| {
848-
do ebml_w.tag(c::tag_table_node_type_subst) |ebml_w| {
849-
ebml_w.id(id);
850-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
851-
ebml_w.emit_tys(ecx, **tys)
854+
{
855+
let r = tcx.node_type_substs.find(&id);
856+
for r.iter().advance |tys| {
857+
do ebml_w.tag(c::tag_table_node_type_subst) |ebml_w| {
858+
ebml_w.id(id);
859+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
860+
ebml_w.emit_tys(ecx, **tys)
861+
}
852862
}
853863
}
854864
}
855865

856-
for tcx.freevars.find(&id).each |&fv| {
857-
do ebml_w.tag(c::tag_table_freevars) |ebml_w| {
858-
ebml_w.id(id);
859-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
860-
do ebml_w.emit_from_vec(**fv) |ebml_w, fv_entry| {
861-
encode_freevar_entry(ebml_w, *fv_entry)
866+
{
867+
let r = tcx.freevars.find(&id);
868+
for r.iter().advance |&fv| {
869+
do ebml_w.tag(c::tag_table_freevars) |ebml_w| {
870+
ebml_w.id(id);
871+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
872+
do ebml_w.emit_from_vec(**fv) |ebml_w, fv_entry| {
873+
encode_freevar_entry(ebml_w, *fv_entry)
874+
}
862875
}
863876
}
864877
}
865878
}
866879

867880
let lid = ast::def_id { crate: ast::local_crate, node: id };
868-
for tcx.tcache.find(&lid).each |&tpbt| {
869-
do ebml_w.tag(c::tag_table_tcache) |ebml_w| {
870-
ebml_w.id(id);
871-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
872-
ebml_w.emit_tpbt(ecx, *tpbt);
881+
{
882+
let r = tcx.tcache.find(&lid);
883+
for r.iter().advance |&tpbt| {
884+
do ebml_w.tag(c::tag_table_tcache) |ebml_w| {
885+
ebml_w.id(id);
886+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
887+
ebml_w.emit_tpbt(ecx, *tpbt);
888+
}
873889
}
874890
}
875891
}
876892

877-
for tcx.ty_param_defs.find(&id).each |&type_param_def| {
878-
do ebml_w.tag(c::tag_table_param_defs) |ebml_w| {
879-
ebml_w.id(id);
880-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
881-
ebml_w.emit_type_param_def(ecx, type_param_def)
893+
{
894+
let r = tcx.ty_param_defs.find(&id);
895+
for r.iter().advance |&type_param_def| {
896+
do ebml_w.tag(c::tag_table_param_defs) |ebml_w| {
897+
ebml_w.id(id);
898+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
899+
ebml_w.emit_type_param_def(ecx, type_param_def)
900+
}
882901
}
883902
}
884903
}
885904

886-
for maps.method_map.find(&id).each |&mme| {
887-
do ebml_w.tag(c::tag_table_method_map) |ebml_w| {
888-
ebml_w.id(id);
889-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
890-
encode_method_map_entry(ecx, ebml_w, *mme)
905+
{
906+
let r = maps.method_map.find(&id);
907+
for r.iter().advance |&mme| {
908+
do ebml_w.tag(c::tag_table_method_map) |ebml_w| {
909+
ebml_w.id(id);
910+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
911+
encode_method_map_entry(ecx, ebml_w, *mme)
912+
}
891913
}
892914
}
893915
}
894916

895-
for maps.vtable_map.find(&id).each |&dr| {
896-
do ebml_w.tag(c::tag_table_vtable_map) |ebml_w| {
897-
ebml_w.id(id);
898-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
899-
encode_vtable_res(ecx, ebml_w, *dr);
917+
{
918+
let r = maps.vtable_map.find(&id);
919+
for r.iter().advance |&dr| {
920+
do ebml_w.tag(c::tag_table_vtable_map) |ebml_w| {
921+
ebml_w.id(id);
922+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
923+
encode_vtable_res(ecx, ebml_w, *dr);
924+
}
900925
}
901926
}
902927
}
903928

904-
for tcx.adjustments.find(&id).each |adj| {
905-
do ebml_w.tag(c::tag_table_adjustments) |ebml_w| {
906-
ebml_w.id(id);
907-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
908-
(**adj).encode(ebml_w)
929+
{
930+
let r = tcx.adjustments.find(&id);
931+
for r.iter().advance |adj| {
932+
do ebml_w.tag(c::tag_table_adjustments) |ebml_w| {
933+
ebml_w.id(id);
934+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
935+
(**adj).encode(ebml_w)
936+
}
909937
}
910938
}
911939
}
@@ -916,12 +944,15 @@ fn encode_side_tables_for_id(ecx: @e::EncodeContext,
916944
}
917945
}
918946

919-
for maps.capture_map.find(&id).each |&cap_vars| {
920-
do ebml_w.tag(c::tag_table_capture_map) |ebml_w| {
921-
ebml_w.id(id);
922-
do ebml_w.tag(c::tag_table_val) |ebml_w| {
923-
do ebml_w.emit_from_vec(*cap_vars) |ebml_w, cap_var| {
924-
cap_var.encode(ebml_w);
947+
{
948+
let r = maps.capture_map.find(&id);
949+
for r.iter().advance |&cap_vars| {
950+
do ebml_w.tag(c::tag_table_capture_map) |ebml_w| {
951+
ebml_w.id(id);
952+
do ebml_w.tag(c::tag_table_val) |ebml_w| {
953+
do ebml_w.emit_from_vec(*cap_vars) |ebml_w, cap_var| {
954+
cap_var.encode(ebml_w);
955+
}
925956
}
926957
}
927958
}

Diff for: src/librustc/middle/borrowck/check_loans.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
// 4. moves do not affect things loaned out in any way
1919

2020
use core::prelude::*;
21+
use core::iterator::IteratorUtil;
2122

2223
use core::hashmap::HashSet;
2324
use core::uint;
@@ -581,14 +582,15 @@ impl<'self> CheckLoanCtxt<'self> {
581582
// FIXME(#4384) inadequare if/when we permit `move a.b`
582583

583584
// check for a conflicting loan:
584-
for opt_loan_path(cmt).each |&lp| {
585+
let r = opt_loan_path(cmt);
586+
for r.iter().advance |&lp| {
585587
for self.each_in_scope_restriction(cmt.id, lp) |loan, _| {
586588
// Any restriction prevents moves.
587589
return MoveWhileBorrowed(lp, loan.loan_path, loan.span);
588590
}
589591
}
590592

591-
return MoveOk;
593+
MoveOk
592594
}
593595

594596
pub fn check_call(&mut self,
@@ -700,9 +702,9 @@ fn check_loans_in_expr<'a>(expr: @ast::expr,
700702
if !this.move_data.is_assignee(expr.id) {
701703
let cmt = this.bccx.cat_expr_unadjusted(expr);
702704
debug!("path cmt=%s", cmt.repr(this.tcx()));
703-
for opt_loan_path(cmt).each |&lp| {
704-
this.check_if_path_is_moved(expr.id, expr.span,
705-
MovedInUse, lp);
705+
let r = opt_loan_path(cmt);
706+
for r.iter().advance |&lp| {
707+
this.check_if_path_is_moved(expr.id, expr.span, MovedInUse, lp);
706708
}
707709
}
708710
}

0 commit comments

Comments
 (0)