From 85535fc3e0c16a665e29516e81a900551196c6ab Mon Sep 17 00:00:00 2001
From: Brian Anderson <banderson@mozilla.com>
Date: Thu, 7 Jul 2011 21:37:56 -0700
Subject: [PATCH] Move crate_map from resolve to cstore

---
 src/comp/metadata/creader.rs | 101 +++++++++++++++++------------------
 src/comp/metadata/cstore.rs  |  12 +++++
 src/comp/middle/resolve.rs   |  11 ++--
 3 files changed, 66 insertions(+), 58 deletions(-)

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);