about summary refs log tree commit diff
path: root/src/boot
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2010-09-07 16:35:00 -0700
committerPatrick Walton <pcwalton@mimiga.net>2010-09-07 16:35:21 -0700
commitffdb5fc8582c77eef7b3a30859eaa216872525a4 (patch)
treef43afee8d7fcbad87aac197bc774b11e440edfad /src/boot
parentca1475382e592176884187877a80900578bcf72b (diff)
downloadrust-ffdb5fc8582c77eef7b3a30859eaa216872525a4.tar.gz
rust-ffdb5fc8582c77eef7b3a30859eaa216872525a4.zip
Initial support for a global crate metadata cache
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/driver/lib.ml6
-rw-r--r--src/boot/driver/main.ml2
-rw-r--r--src/boot/driver/session.ml10
-rw-r--r--src/boot/fe/ast.ml6
-rw-r--r--src/boot/fe/item.ml2
-rw-r--r--src/boot/util/common.ml2
6 files changed, 22 insertions, 6 deletions
diff --git a/src/boot/driver/lib.ml b/src/boot/driver/lib.ml
index 71b310b0bc2..40d79256754 100644
--- a/src/boot/driver/lib.ml
+++ b/src/boot/driver/lib.ml
@@ -59,7 +59,7 @@ let get_sects
 let get_meta
     (sess:Session.sess)
     (filename:filename)
-    : Ast.meta option =
+    : Session.meta option =
   htab_search_or_add meta_cache filename
     begin
       fun _ ->
@@ -190,6 +190,10 @@ let get_mod
                           match get_meta sess file with
                               None -> ()
                             | Some meta ->
+                                if not (Hashtbl.mem
+                                    sess.Session.sess_crate_meta meta) then
+                                  Hashtbl.add sess.Session.sess_crate_meta
+                                    meta (Session.make_crate_id sess);
                                 Array.iter
                                   (fun (k,v) -> log sess "%s = %S" k v)
                                   meta;
diff --git a/src/boot/driver/main.ml b/src/boot/driver/main.ml
index 9049546cca7..199a372954d 100644
--- a/src/boot/driver/main.ml
+++ b/src/boot/driver/main.ml
@@ -58,8 +58,10 @@ let (sess:Session.sess) =
     Session.sess_report_timing = false;
     Session.sess_report_gc = false;
     Session.sess_report_deps = false;
+    Session.sess_next_crate_id = 0;
     Session.sess_timings = Hashtbl.create 0;
     Session.sess_lib_dirs = Queue.create ();
+    Session.sess_crate_meta = Hashtbl.create 0;
   }
 ;;
 
diff --git a/src/boot/driver/session.ml b/src/boot/driver/session.ml
index 21faed0b744..ce5a18fb9f0 100644
--- a/src/boot/driver/session.ml
+++ b/src/boot/driver/session.ml
@@ -5,6 +5,8 @@
 
 open Common;;
 
+type meta = (string * string) array;;
+
 type sess =
 {
   mutable sess_in: filename option;
@@ -41,9 +43,11 @@ type sess =
   mutable sess_report_timing: bool;
   mutable sess_report_gc: bool;
   mutable sess_report_deps: bool;
+  mutable sess_next_crate_id: int;
   sess_timings: (string, float) Hashtbl.t;
   sess_spans: (node_id,span) Hashtbl.t;
   sess_lib_dirs: filename Queue.t;
+  sess_crate_meta: (meta, crate_id) Hashtbl.t;
 }
 ;;
 
@@ -115,6 +119,12 @@ let report_err sess ido str =
             (string_of_span span) str
 ;;
 
+let make_crate_id (sess:sess) : crate_id =
+  let crate_id = Crate sess.sess_next_crate_id in
+  sess.sess_next_crate_id <- sess.sess_next_crate_id + 1;
+  crate_id
+;;
+
 (*
  * Local Variables:
  * fill-column: 78;
diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml
index 79ff2c7c4b6..3ea8917196d 100644
--- a/src/boot/fe/ast.ml
+++ b/src/boot/fe/ast.ml
@@ -452,14 +452,12 @@ and mod_view =
       view_exports: (export, unit) Hashtbl.t;
     }
 
-and meta = (ident * string) array
-
-and meta_pat = (ident * string option) array
+and meta_pat = (string * string option) array
 
 and crate' =
     {
       crate_items: (mod_view * mod_items);
-      crate_meta: meta;
+      crate_meta: Session.meta;
       crate_auth: (name, effect) Hashtbl.t;
       crate_required: (node_id, (required_lib * nabi_conv)) Hashtbl.t;
       crate_required_syms: (node_id, string) Hashtbl.t;
diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml
index a47fca5acf0..287fbb41475 100644
--- a/src/boot/fe/item.ml
+++ b/src/boot/fe/item.ml
@@ -758,7 +758,7 @@ and parse_meta_pat (ps:pstate) : Ast.meta_pat =
   bracketed_zero_or_more LPAREN RPAREN
     (Some COMMA) parse_meta_input ps
 
-and parse_meta (ps:pstate) : Ast.meta =
+and parse_meta (ps:pstate) : Session.meta =
   Array.map
     begin
       fun (id,v) ->
diff --git a/src/boot/util/common.ml b/src/boot/util/common.ml
index d9b9185669c..f51d818ec44 100644
--- a/src/boot/util/common.ml
+++ b/src/boot/util/common.ml
@@ -13,11 +13,13 @@ type node_id = Node of int
 type temp_id = Temp of int
 type opaque_id = Opaque of int
 type constr_id = Constr of int
+type crate_id = Crate of int
 
 let int_of_node (Node i) = i
 let int_of_temp (Temp i) = i
 let int_of_opaque (Opaque i) = i
 let int_of_constr (Constr i) = i
+let int_of_common (Crate i) = i
 
 type 'a identified = { node: 'a; id: node_id }
 ;;