diff options
| author | Patrick Walton <[email protected]> | 2010-09-08 15:38:07 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-09-08 15:38:39 -0700 |
| commit | 2172a3bcf44bbecfe9469451cdaed96b5beee71e (patch) | |
| tree | 58e7d09ae2b352733e56d0244d8aa0851e5737c7 /src/boot/driver/lib.ml | |
| parent | Cleaned up locking in the kernel. (diff) | |
| download | rust-2172a3bcf44bbecfe9469451cdaed96b5beee71e.tar.xz rust-2172a3bcf44bbecfe9469451cdaed96b5beee71e.zip | |
First lame stab at solving the diamond import problem
Diffstat (limited to 'src/boot/driver/lib.ml')
| -rw-r--r-- | src/boot/driver/lib.ml | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/boot/driver/lib.ml b/src/boot/driver/lib.ml index 40d79256..3b3ee72d 100644 --- a/src/boot/driver/lib.ml +++ b/src/boot/driver/lib.ml @@ -125,6 +125,7 @@ let get_mod (use_id:node_id) (nref:node_id ref) (oref:opaque_id ref) + (crate_item_cache:(crate_id, Ast.mod_items) Hashtbl.t) : (filename * Ast.mod_items) = let found = Queue.create () in let suffix = @@ -183,22 +184,24 @@ let get_mod (file_matches file) then begin - iflog sess - begin - fun _ -> - log sess "matched against library %s" file; - 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; - end; - Queue.add file found; + log sess "matched against library %s" file; + + let meta = get_meta sess file in + let crate_id = + match meta with + None -> Session.make_crate_id sess + | Some meta -> + iflog sess begin fun _ -> + Array.iter + (fun (k, v) -> log sess "%s = %S" k v) + meta + end; + htab_search_or_default + sess.Session.sess_crate_meta + meta + (fun () -> Session.make_crate_id sess) + in + Queue.add (file, crate_id) found; end; scan() with @@ -210,8 +213,11 @@ let get_mod match Queue.length found with 0 -> Common.err (Some use_id) "unsatisfied 'use' clause" | 1 -> - let filename = Queue.pop found in - let items = get_file_mod sess abi filename nref oref in + let (filename, crate_id) = Queue.pop found in + let items = + htab_search_or_default crate_item_cache crate_id + (fun () -> get_file_mod sess abi filename nref oref) + in (filename, items) | _ -> Common.err (Some use_id) "multiple crates match 'use' clause" ;; |