diff --git a/src/comp/metadata/creader.rs b/src/comp/metadata/creader.rs index 21b70fd468f..f5757f56bee 100644 --- a/src/comp/metadata/creader.rs +++ b/src/comp/metadata/creader.rs @@ -30,11 +30,10 @@ export list_file_metadata; // Traverses an AST, reading all the information about use'd crates and native // libraries necessary for later resolving, typechecking, linking, etc. -fn read_crates(session::session sess, resolve::crate_map crate_map, +fn read_crates(session::session sess, &ast::crate crate) { auto e = @rec(sess=sess, - crate_map=crate_map, crate_cache=@std::map::new_str_hash[int](), library_search_paths=sess.get_opts().library_search_paths, mutable next_crate_num=1); @@ -45,6 +44,55 @@ fn read_crates(session::session sess, resolve::crate_map crate_map, walk::walk_crate(v, crate); } +type env = + @rec(session::session sess, + @hashmap[str, int] crate_cache, + vec[str] library_search_paths, + mutable int next_crate_num); + +fn visit_view_item(env e, &@ast::view_item i) { + alt (i.node) { + case (ast::view_item_use(?ident, ?meta_items, ?id)) { + auto cnum; + if (!e.crate_cache.contains_key(ident)) { + cnum = e.next_crate_num; + load_library_crate(e.sess, i.span, cnum, ident, + meta_items, e.library_search_paths); + e.crate_cache.insert(ident, e.next_crate_num); + e.next_crate_num += 1; + } else { cnum = e.crate_cache.get(ident); } + cstore::add_use_stmt_cnum(e.sess.get_cstore(), id, cnum); + } + case (_) { } + } +} + +fn visit_item(env e, &@ast::item i) { + alt (i.node) { + case (ast::item_native_mod(?m)) { + if (m.abi != ast::native_abi_rust && + m.abi != ast::native_abi_cdecl) { + ret; + } + auto cstore = e.sess.get_cstore(); + if (!cstore::add_used_library(cstore, m.native_name)) { + ret; + } + for (ast::attribute a in + attr::find_attrs_by_name(i.attrs, "link_args")) { + alt (attr::get_meta_item_value_str(attr::attr_meta(a))) { + case (some(?linkarg)) { + cstore::add_used_link_args(cstore, linkarg); + } + case (none) { /* fallthrough */ } + } + } + } + case (_) { + } + } +} + // A diagnostic function for dumping crate metadata to an output stream fn list_file_metadata(str path, io::writer out) { alt (get_metadata_section(path)) { @@ -178,55 +226,6 @@ fn load_library_crate(&session::session sess, span span, int cnum, sess.span_fatal(span, #fmt("can't find crate for '%s'", ident)); } -type env = - @rec(session::session sess, - resolve::crate_map crate_map, - @hashmap[str, int] crate_cache, - vec[str] library_search_paths, - mutable int next_crate_num); - -fn visit_view_item(env e, &@ast::view_item i) { - alt (i.node) { - case (ast::view_item_use(?ident, ?meta_items, ?id)) { - auto cnum; - if (!e.crate_cache.contains_key(ident)) { - cnum = e.next_crate_num; - load_library_crate(e.sess, i.span, cnum, ident, - meta_items, e.library_search_paths); - e.crate_cache.insert(ident, e.next_crate_num); - e.next_crate_num += 1; - } else { cnum = e.crate_cache.get(ident); } - e.crate_map.insert(id, cnum); - } - case (_) { } - } -} - -fn visit_item(env e, &@ast::item i) { - alt (i.node) { - case (ast::item_native_mod(?m)) { - if (m.abi != ast::native_abi_rust && - m.abi != ast::native_abi_cdecl) { - ret; - } - auto cstore = e.sess.get_cstore(); - if (!cstore::add_used_library(cstore, m.native_name)) { - ret; - } - for (ast::attribute a in - attr::find_attrs_by_name(i.attrs, "link_args")) { - alt (attr::get_meta_item_value_str(attr::attr_meta(a))) { - case (some(?linkarg)) { - cstore::add_used_link_args(cstore, linkarg); - } - case (none) { /* fallthrough */ } - } - } - } - case (_) { - } - } -} // Local Variables: diff --git a/src/comp/metadata/cstore.rs b/src/comp/metadata/cstore.rs index 3983eee49e3..80690a46263 100644 --- a/src/comp/metadata/cstore.rs +++ b/src/comp/metadata/cstore.rs @@ -4,17 +4,24 @@ import std::map; import std::vec; import std::str; +import syntax::ast; type crate_metadata = rec(str name, vec[u8] data); +// Map from node_id's of local use statements to crate numbers +type use_crate_map = map::hashmap[ast::node_id, ast::crate_num]; + type cstore = @rec(map::hashmap[int, crate_metadata] metas, + use_crate_map use_crate_map, mutable vec[str] used_crate_files, mutable vec[str] used_libraries, mutable vec[str] used_link_args); fn mk_cstore() -> cstore { auto meta_cache = map::new_int_hash[crate_metadata](); + auto crate_map = map::new_int_hash[ast::crate_num](); ret @rec(metas = meta_cache, + use_crate_map = crate_map, mutable used_crate_files = [], mutable used_libraries = [], mutable used_link_args = []); @@ -65,6 +72,11 @@ fn get_used_link_args(&cstore cstore) -> vec[str] { ret cstore.used_link_args; } +fn add_use_stmt_cnum(&cstore cstore, ast::node_id use_id, int cnum) { + cstore.use_crate_map.insert(use_id, cnum); +} + + // Local Variables: // mode: rust // fill-column: 78; diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index b666532d445..c01cf90ed93 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -9,6 +9,7 @@ import ast::local_def; import metadata::creader; import metadata::decoder; +import metadata::cstore; import driver::session::session; import util::common::new_def_hash; import std::map::new_int_hash; @@ -32,7 +33,6 @@ import std::vec; export resolve_crate; export def_map; -export crate_map; // Resolving happens in two passes. The first pass collects defids of all // (internal) imports and modules, so that they can be looked up when needed, @@ -103,13 +103,10 @@ type indexed_mod = /* native modules can't contain tags, and we don't store their ASTs because we only need to look at them to determine exports, which they can't control.*/ -// It should be safe to use index to memoize lookups of globbed names. -type crate_map = hashmap[node_id, ast::crate_num]; - type def_map = hashmap[node_id, def]; type env = - rec(crate_map crate_map, + rec(cstore::use_crate_map crate_map, def_map def_map, constr_table fn_constrs, ast_map::map ast_map, @@ -128,8 +125,9 @@ tag namespace { ns_value; ns_type; ns_module; } fn resolve_crate(session sess, &ast_map::map amap, @ast::crate crate) -> tup(def_map, constr_table) { + creader::read_crates(sess, *crate); auto e = - @rec(crate_map=new_int_hash[ast::crate_num](), + @rec(crate_map=sess.get_cstore().use_crate_map, def_map=new_int_hash[def](), fn_constrs = new_int_hash[ty::constr_def[]](), ast_map=amap, @@ -138,7 +136,6 @@ fn resolve_crate(session sess, &ast_map::map amap, @ast::crate crate) -> ext_map=new_def_hash[vec[ident]](), ext_cache=new_ext_hash(), sess=sess); - creader::read_crates(sess, e.crate_map, *crate); map_crate(e, crate); resolve_imports(*e); check_for_collisions(e, *crate);