diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-10-21 12:21:27 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-10-21 12:21:27 +0200 |
| commit | 4ebbbe597e44dbed0da3027fbf4e564390e0daeb (patch) | |
| tree | 688153be857cd96a9ea940b0d697b25f1f71d384 /src | |
| parent | 9bb4595c534ffcd0731ed778beb62bb80d7f9217 (diff) | |
| download | rust-4ebbbe597e44dbed0da3027fbf4e564390e0daeb.tar.gz rust-4ebbbe597e44dbed0da3027fbf4e564390e0daeb.zip | |
Move hash table iteration over to block-taking functions
Issue #1056
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/metadata/cstore.rs | 8 | ||||
| -rw-r--r-- | src/comp/metadata/encoder.rs | 17 | ||||
| -rw-r--r-- | src/comp/middle/ast_map.rs | 34 | ||||
| -rw-r--r-- | src/comp/middle/resolve.rs | 28 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 14 | ||||
| -rw-r--r-- | src/comp/middle/trans_alt.rs | 12 | ||||
| -rw-r--r-- | src/comp/middle/tstate/auxiliary.rs | 14 | ||||
| -rw-r--r-- | src/comp/syntax/ext/simplext.rs | 16 | ||||
| -rw-r--r-- | src/lib/map.rs | 25 |
9 files changed, 82 insertions, 86 deletions
diff --git a/src/comp/metadata/cstore.rs b/src/comp/metadata/cstore.rs index ee80b11fb5b..f005b0bb991 100644 --- a/src/comp/metadata/cstore.rs +++ b/src/comp/metadata/cstore.rs @@ -72,12 +72,8 @@ fn have_crate_data(cstore: cstore, cnum: ast::crate_num) -> bool { ret p(cstore).metas.contains_key(cnum); } -iter iter_crate_data(cstore: cstore) -> - @{key: ast::crate_num, val: crate_metadata} { - for each kv: @{key: ast::crate_num, val: crate_metadata} in - p(cstore).metas.items() { - put kv; - } +fn iter_crate_data(cstore: cstore, i: block(ast::crate_num, crate_metadata)) { + p(cstore).metas.items {|k,v| i(k, v);}; } fn add_used_crate_file(cstore: cstore, lib: str) { diff --git a/src/comp/metadata/encoder.rs b/src/comp/metadata/encoder.rs index 3617005a400..f392d2367e4 100644 --- a/src/comp/metadata/encoder.rs +++ b/src/comp/metadata/encoder.rs @@ -371,20 +371,19 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer) -> [entry<int>] { let index: [entry<int>] = []; ebml::start_tag(ebml_w, tag_items_data); - for each kvp: @{key: node_id, val: middle::ast_map::ast_node} in - ecx.ccx.ast_map.items() { - alt kvp.val { + ecx.ccx.ast_map.items {|key, val| + alt val { middle::ast_map::node_item(i) { - index += [{val: kvp.key, pos: ebml_w.writer.tell()}]; + index += [{val: key, pos: ebml_w.writer.tell()}]; encode_info_for_item(ecx, ebml_w, i, index); } middle::ast_map::node_native_item(i) { - index += [{val: kvp.key, pos: ebml_w.writer.tell()}]; + index += [{val: key, pos: ebml_w.writer.tell()}]; encode_info_for_native_item(ecx, ebml_w, i); } _ { } } - } + }; ebml::end_tag(ebml_w); ret index; } @@ -544,9 +543,9 @@ fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) { // Pull the cnums and names out of cstore let pairs: [mutable numname] = [mutable]; - for each hashkv: hashkv in cstore::iter_crate_data(cstore) { - pairs += [mutable {crate: hashkv.key, ident: hashkv.val.name}]; - } + cstore::iter_crate_data(cstore) {|key, val| + pairs += [mutable {crate: key, ident: val.name}]; + }; // Sort by cnum fn lteq(kv1: numname, kv2: numname) -> bool { kv1.crate <= kv2.crate } diff --git a/src/comp/middle/ast_map.rs b/src/comp/middle/ast_map.rs index 9b89ec63331..d141a2a86e2 100644 --- a/src/comp/middle/ast_map.rs +++ b/src/comp/middle/ast_map.rs @@ -86,14 +86,13 @@ fn new_smallintmap_int_adapter<@V>() -> std::map::hashmap<int, V> { // the entire codebase adapting all the callsites to the different // interface. // FIXME: hashmap and smallintmap should support the same interface. -fn new_smallintmap_adapter<@K, - @V>(key_idx: fn(K) -> uint, idx_key: fn(uint) -> K) - -> std::map::hashmap<K, V> { +fn new_smallintmap_adapter<@K, @V>(key_idx: fn(K) -> uint, + idx_key: fn(uint) -> K) + -> std::map::hashmap<K, V> { - obj adapter<@K, - @V>(map: smallintmap::smallintmap<V>, - key_idx: fn(K) -> uint, - idx_key: fn(uint) -> K) { + obj adapter<@K, @V>(map: smallintmap::smallintmap<V>, + key_idx: fn(K) -> uint, + idx_key: fn(uint) -> K) { fn size() -> uint { fail } @@ -117,22 +116,29 @@ fn new_smallintmap_adapter<@K, fn rehash() { fail } - iter items() -> @{key: K, val: V} { + fn items(it: block(K, V)) { let idx = 0u; - for item: option::t<V> in map.v { + for item in map.v { alt item { option::some(elt) { - let value = elt; - let key = idx_key(idx); - put @{key: key, val: value}; + it(idx_key(idx), elt); } option::none. { } } idx += 1u; } } - iter keys() -> K { - for each p: @{key: K, val: V} in self.items() { put p.key; } + fn keys(it: block(K)) { + let idx = 0u; + for item in map.v { + if item != option::none { it(idx_key(idx)); } + idx += 1u; + } + } + fn values(it: block(V)) { + for item in map.v { + alt item { option::some(elt) { it(elt); } _ {} } + } } } diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 2d3fcb46406..1203a3e3419 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -48,12 +48,8 @@ type scopes = list<scope>; tag import_state { todo(ast::node_id, ast::ident, [ast::ident], codemap::span, scopes); resolving(span); - resolved(option::t<def>, - - /* value */ - option::t<def>, - - /* type */ + resolved(option::t<def>, /* value */ + option::t<def>, /* type */ option::t<def>); /* module */ } @@ -241,15 +237,14 @@ fn map_crate(e: @env, c: @ast::crate) { } fn resolve_imports(e: env) { - for each it: @{key: ast::node_id, val: import_state} in e.imports.items() - { - alt it.val { + e.imports.values {|v| + alt v { todo(node_id, name, path, span, scopes) { resolve_import(e, local_def(node_id), name, path, span, scopes); } resolved(_, _, _) { } } - } + }; e.sess.abort_if_errors(); } @@ -1188,12 +1183,9 @@ fn lookup_external(e: env, cnum: int, ids: [ident], ns: namespace) -> fn check_for_collisions(e: @env, c: ast::crate) { // Module indices make checking those relatively simple -- just check each // name for multiple entities in the same namespace. - for each m: @{key: ast::node_id, val: @indexed_mod} in e.mod_map.items() { - for each name: @{key: ident, val: list<mod_index_entry>} in - m.val.index.items() { - check_mod_name(*e, name.key, name.val); - } - } + e.mod_map.values {|val| + val.index.items {|k, v| check_mod_name(*e, k, v); }; + }; // Other scopes have to be checked the hard way. let v = @{visit_item: bind check_item(e, _, _, _), @@ -1426,7 +1418,7 @@ fn check_bad_exports(e: @env) { ns_type, inside)); } - for each @{val: val, _} in e.mod_map.items() { + e.mod_map.values {|val| alt val.m { some(m) { for vi in m.view_items { @@ -1447,7 +1439,7 @@ fn check_bad_exports(e: @env) { } none. { } } - } + }; } // Local Variables: diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index de5c3cb5398..87ddd1df145 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1249,10 +1249,10 @@ fn make_generic_glue(cx: @local_ctxt, sp: span, t: ty::t, llfn: ValueRef, } fn emit_tydescs(ccx: @crate_ctxt) { - for each pair: @{key: ty::t, val: @tydesc_info} in ccx.tydescs.items() { + ccx.tydescs.items {|key, val| let glue_fn_ty = T_ptr(T_glue_fn(*ccx)); let cmp_fn_ty = T_ptr(T_cmp_glue_fn(*ccx)); - let ti = pair.val; + let ti = val; let take_glue = alt ti.take_glue { none. { ccx.stats.n_null_glues += 1u; C_null(glue_fn_ty) } @@ -1274,7 +1274,7 @@ fn emit_tydescs(ccx: @crate_ctxt) { some(v) { ccx.stats.n_real_glues += 1u; v } }; - let shape = shape::shape_of(ccx, pair.key, ti.ty_params, + let shape = shape::shape_of(ccx, key, ti.ty_params, ti.is_obj_body); let shape_tables = llvm::LLVMConstPointerCast(ccx.shape_cx.llshapetables, @@ -1303,7 +1303,7 @@ fn emit_tydescs(ccx: @crate_ctxt) { llvm::LLVMSetGlobalConstant(gvar, True); llvm::LLVMSetLinkage(gvar, lib::llvm::LLVMInternalLinkage as llvm::Linkage); - } + }; } fn make_take_glue(cx: @block_ctxt, v: ValueRef, t: ty::t) { @@ -6144,10 +6144,10 @@ fn create_module_map(ccx: @crate_ctxt) -> ValueRef { llvm::LLVMSetLinkage(map, lib::llvm::LLVMInternalLinkage as llvm::Linkage); let elts: [ValueRef] = []; - for each item: @{key: str, val: ValueRef} in ccx.module_data.items() { - let elt = C_struct([p2i(C_cstr(ccx, item.key)), p2i(item.val)]); + ccx.module_data.items {|key, val| + let elt = C_struct([p2i(C_cstr(ccx, key)), p2i(val)]); elts += [elt]; - } + }; let term = C_struct([C_int(0), C_int(0)]); elts += [term]; llvm::LLVMSetInitializer(map, C_array(elttype, elts)); diff --git a/src/comp/middle/trans_alt.rs b/src/comp/middle/trans_alt.rs index 814a287bbc6..c6d59a72831 100644 --- a/src/comp/middle/trans_alt.rs +++ b/src/comp/middle/trans_alt.rs @@ -356,10 +356,10 @@ fn compile_submatch(bcx: @block_ctxt, m: match, vals: [ValueRef], f: mk_fail, Br(bcx, guard_cx.llbb); // Temporarily set bindings. They'll be rewritten to PHI nodes for // the actual arm block. - for each @{key: key, val: val} in data.id_map.items() { + data.id_map.items {|key, val| let local = local_mem(option::get(assoc(key, m[0].bound))); bcx.fcx.lllocals.insert(val, local); - } + }; let {bcx: guard_bcx, val: guard_val} = trans::trans_temp_expr(guard_cx, e); guard_bcx = trans::trans_block_cleanups(guard_bcx, guard_cx); @@ -582,7 +582,7 @@ fn make_phi_bindings(bcx: @block_ctxt, map: [exit_node], ids: ast_util::pat_id_map) -> bool { let our_block = bcx.llbb as uint; let success = true; - for each @{key: name, val: node_id} in ids.items() { + ids.items {|name, node_id| let llbbs = []; let vals = []; for ex: exit_node in map { @@ -597,10 +597,10 @@ fn make_phi_bindings(bcx: @block_ctxt, map: [exit_node], let local = Phi(bcx, val_ty(vals[0]), vals, llbbs); bcx.fcx.lllocals.insert(node_id, local_mem(local)); } else { success = false; } - } + }; if success { // Copy references that the alias analysis considered unsafe - for each @{val: node_id, _} in ids.items() { + ids.values {|node_id| if bcx_ccx(bcx).copy_map.contains_key(node_id) { let local = alt bcx.fcx.lllocals.get(node_id) { local_mem(x) { x } @@ -613,7 +613,7 @@ fn make_phi_bindings(bcx: @block_ctxt, map: [exit_node], add_clean(bcx, alloc, e_ty); bcx.fcx.lllocals.insert(node_id, local_mem(alloc)); } - } + }; } else { Unreachable(bcx); } diff --git a/src/comp/middle/tstate/auxiliary.rs b/src/comp/middle/tstate/auxiliary.rs index 99d3252a2dc..af4bb26a08a 100644 --- a/src/comp/middle/tstate/auxiliary.rs +++ b/src/comp/middle/tstate/auxiliary.rs @@ -539,10 +539,9 @@ fn norm_a_constraint(id: def_id, c: constraint) -> [norm_constraint] { // non-exhaustive match in trans. fn constraints(fcx: fn_ctxt) -> [norm_constraint] { let rslt: [norm_constraint] = []; - for each p: @{key: def_id, val: constraint} in - fcx.enclosing.constrs.items() { - rslt += norm_a_constraint(p.key, p.val); - } + fcx.enclosing.constrs.items {|key, val| + rslt += norm_a_constraint(key, val); + }; ret rslt; } @@ -861,17 +860,16 @@ fn copy_in_poststate_two(fcx: fn_ctxt, src_post: poststate, } - for each p: @{key: def_id, val: constraint} in - fcx.enclosing.constrs.items() { + fcx.enclosing.constrs.values {|val| // replace any occurrences of the src def_id with the // dest def_id - let insts = find_instances(fcx, subst, p.val); + let insts = find_instances(fcx, subst, val); for p: {from: uint, to: uint} in insts { if promises_(p.from, src_post) { set_in_poststate_(p.to, target_post); } } - } + }; } diff --git a/src/comp/syntax/ext/simplext.rs b/src/comp/syntax/ext/simplext.rs index d7b4214f2d0..d766ff11579 100644 --- a/src/comp/syntax/ext/simplext.rs +++ b/src/comp/syntax/ext/simplext.rs @@ -172,12 +172,12 @@ fn use_selectors_to_bind(b: binders, e: @expr) -> option::t<bindings> { alt sel(match_expr(e)) { none. { ret none; } _ { } } } let never_mind: bool = false; - for each pair: @{key: ident, val: selector} in b.real_binders.items() { - alt pair.val(match_expr(e)) { + b.real_binders.items {|key, val| + alt val(match_expr(e)) { none. { never_mind = true; } - some(mtc) { res.insert(pair.key, mtc); } + some(mtc) { res.insert(key, mtc); } } - } + }; //HACK: `ret` doesn't work in `for each` if never_mind { ret none; } ret some(res); @@ -243,7 +243,7 @@ fn follow_for_trans(cx: ext_ctxt, mmaybe: option::t<arb_depth<matchable>>, } /* helper for transcribe_exprs: what vars from `b` occur in `e`? */ -iter free_vars(b: bindings, e: @expr) -> ident { +fn free_vars(b: bindings, e: @expr, it: block(ident)) { let idents: hashmap<ident, ()> = new_str_hash::<()>(); fn mark_ident(&&i: ident, _fld: ast_fold, b: bindings, idents: hashmap<ident, ()>) -> ident { @@ -257,7 +257,7 @@ iter free_vars(b: bindings, e: @expr) -> ident { with *default_ast_fold()}; let f = make_fold(f_pre); f.fold_expr(e); // ignore result - for each id: ident in idents.keys() { put id; } + idents.keys {|x| it(x); }; } @@ -273,7 +273,7 @@ fn transcribe_exprs(cx: ext_ctxt, b: bindings, idx_path: @mutable [uint], let repeat: option::t<{rep_count: uint, name: ident}> = none; /* we need to walk over all the free vars in lockstep, except for the leaves, which are just duplicated */ - for each fv: ident in free_vars(b, repeat_me) { + free_vars(b, repeat_me) {|fv| let cur_pos = follow(b.get(fv), idx_path); alt cur_pos { leaf(_) { } @@ -295,7 +295,7 @@ fn transcribe_exprs(cx: ext_ctxt, b: bindings, idx_path: @mutable [uint], } } } - } + }; alt repeat { none. { cx.span_fatal(repeat_me.span, diff --git a/src/lib/map.rs b/src/lib/map.rs index 3445f4b6c82..ef5e8acae46 100644 --- a/src/lib/map.rs +++ b/src/lib/map.rs @@ -14,8 +14,9 @@ type hashmap<K, V> = fn find(K) -> option::t<V>; fn remove(K) -> option::t<V>; fn rehash(); - iter items() -> @{key: K, val: V}; - iter keys() -> K; + fn items(block(K, V)); + fn keys(block(K)); + fn values(block(V)); }; type hashset<K> = hashmap<K, ()>; @@ -111,8 +112,7 @@ fn mk_hashmap<@K, @V>(hasher: hashfn<K>, eqer: eqfn<K>) -> hashmap<K, V> { } } } - obj hashmap<@K, - @V>(hasher: hashfn<K>, + obj hashmap<@K, @V>(hasher: hashfn<K>, eqer: eqfn<K>, mutable bkts: [mutable bucket<K, V>], mutable nbkts: uint, @@ -177,14 +177,19 @@ fn mk_hashmap<@K, @V>(hasher: hashfn<K>, eqer: eqfn<K>) -> hashmap<K, V> { rehash(hasher, eqer, bkts, nbkts, newbkts, nbkts); bkts = newbkts; } - iter items() -> @{key: K, val: V} { - for b: bucket<K, V> in bkts { - alt b { some(k, v) { put @{key: k, val: v}; } _ { } } + fn items(it: block(K, V)) { + for b in bkts { + alt b { some(k, v) { it(copy k, copy v); } _ { } } } } - iter keys() -> K { - for b: bucket<K, V> in bkts { - alt b { some(k, _) { put k; } _ { } } + fn keys(it: block(K)) { + for b in bkts { + alt b { some(k, _) { it(copy k); } _ { } } + } + } + fn values(it: block(V)) { + for b in bkts { + alt b { some(_, v) { it(copy v); } _ { } } } } } |
