Skip to content

Commit 2172a3b

Browse files
committed
First lame stab at solving the diamond import problem
1 parent 388f8ce commit 2172a3b

File tree

5 files changed

+53
-25
lines changed

5 files changed

+53
-25
lines changed

src/boot/driver/lib.ml

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ let get_mod
125125
(use_id:node_id)
126126
(nref:node_id ref)
127127
(oref:opaque_id ref)
128+
(crate_item_cache:(crate_id, Ast.mod_items) Hashtbl.t)
128129
: (filename * Ast.mod_items) =
129130
let found = Queue.create () in
130131
let suffix =
@@ -183,22 +184,24 @@ let get_mod
183184
(file_matches file)
184185
then
185186
begin
186-
iflog sess
187-
begin
188-
fun _ ->
189-
log sess "matched against library %s" file;
190-
match get_meta sess file with
191-
None -> ()
192-
| Some meta ->
193-
if not (Hashtbl.mem
194-
sess.Session.sess_crate_meta meta) then
195-
Hashtbl.add sess.Session.sess_crate_meta
196-
meta (Session.make_crate_id sess);
197-
Array.iter
198-
(fun (k,v) -> log sess "%s = %S" k v)
199-
meta;
200-
end;
201-
Queue.add file found;
187+
log sess "matched against library %s" file;
188+
189+
let meta = get_meta sess file in
190+
let crate_id =
191+
match meta with
192+
None -> Session.make_crate_id sess
193+
| Some meta ->
194+
iflog sess begin fun _ ->
195+
Array.iter
196+
(fun (k, v) -> log sess "%s = %S" k v)
197+
meta
198+
end;
199+
htab_search_or_default
200+
sess.Session.sess_crate_meta
201+
meta
202+
(fun () -> Session.make_crate_id sess)
203+
in
204+
Queue.add (file, crate_id) found;
202205
end;
203206
scan()
204207
with
@@ -210,8 +213,11 @@ let get_mod
210213
match Queue.length found with
211214
0 -> Common.err (Some use_id) "unsatisfied 'use' clause"
212215
| 1 ->
213-
let filename = Queue.pop found in
214-
let items = get_file_mod sess abi filename nref oref in
216+
let (filename, crate_id) = Queue.pop found in
217+
let items =
218+
htab_search_or_default crate_item_cache crate_id
219+
(fun () -> get_file_mod sess abi filename nref oref)
220+
in
215221
(filename, items)
216222
| _ -> Common.err (Some use_id) "multiple crates match 'use' clause"
217223
;;

src/boot/driver/main.ml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,9 @@ let _ =
239239
;;
240240

241241

242-
let parse_input_crate _ : Ast.crate =
242+
let parse_input_crate
243+
(crate_cache:(crate_id, Ast.mod_items) Hashtbl.t)
244+
: Ast.crate =
243245
Session.time_inner "parse" sess
244246
begin
245247
fun _ ->
@@ -250,12 +252,14 @@ let parse_input_crate _ : Ast.crate =
250252
Cexp.parse_crate_file sess
251253
(Lib.get_mod sess abi)
252254
(Lib.infer_lib_name sess)
255+
crate_cache
253256
else
254257
if Filename.check_suffix infile ".rs"
255258
then
256259
Cexp.parse_src_file sess
257260
(Lib.get_mod sess abi)
258261
(Lib.infer_lib_name sess)
262+
crate_cache
259263
else
260264
begin
261265
Printf.fprintf stderr
@@ -295,7 +299,8 @@ let parse_input_crate _ : Ast.crate =
295299

296300
let (crate:Ast.crate) =
297301
try
298-
parse_input_crate()
302+
let crate_cache = Hashtbl.create 1 in
303+
parse_input_crate crate_cache
299304
with
300305
Not_implemented (ido, str) ->
301306
Session.report_err sess ido str;

src/boot/fe/cexp.ml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ and eval_cexp (env:env) (exp:cexp) : cdir array =
380380
ps.pstate_temp_id
381381
ps.pstate_node_id
382382
ps.pstate_opaque_id
383+
ps.pstate_crate_cache
383384
ps.pstate_sess
384385
ps.pstate_get_mod
385386
ps.pstate_get_cenv_tok
@@ -427,7 +428,12 @@ and eval_cexp (env:env) (exp:cexp) : cdir array =
427428
end
428429
u.use_meta
429430
in
430-
ps.pstate_get_mod meta_pat id ps.pstate_node_id ps.pstate_opaque_id
431+
ps.pstate_get_mod
432+
meta_pat
433+
id
434+
ps.pstate_node_id
435+
ps.pstate_opaque_id
436+
ps.pstate_crate_cache
431437
in
432438
iflog ps
433439
begin
@@ -618,6 +624,7 @@ let parse_crate_file
618624
(sess:Session.sess)
619625
(get_mod:get_mod_fn)
620626
(infer_lib_name:(Ast.ident -> filename))
627+
(crate_cache:(crate_id, Ast.mod_items) Hashtbl.t)
621628
: Ast.crate =
622629
let fname = Session.filename_of sess.Session.sess_in in
623630
let tref = ref (Temp 0) in
@@ -659,7 +666,7 @@ let parse_crate_file
659666
| Some (PVAL_num n) -> LIT_INT n
660667
in
661668
let ps =
662-
make_parser tref nref oref sess get_mod get_cenv_tok
669+
make_parser tref nref oref crate_cache sess get_mod get_cenv_tok
663670
infer_lib_name required required_syms fname
664671
in
665672
let env = { env_bindings = bindings;
@@ -723,6 +730,7 @@ let parse_src_file
723730
(sess:Session.sess)
724731
(get_mod:get_mod_fn)
725732
(infer_lib_name:(Ast.ident -> filename))
733+
(crate_cache:(crate_id, Ast.mod_items) Hashtbl.t)
726734
: Ast.crate =
727735
let fname = Session.filename_of sess.Session.sess_in in
728736
let tref = ref (Temp 0) in
@@ -735,7 +743,7 @@ let parse_src_file
735743
ident) ps)
736744
in
737745
let ps =
738-
make_parser tref nref oref sess get_mod get_cenv_tok
746+
make_parser tref nref oref crate_cache sess get_mod get_cenv_tok
739747
infer_lib_name required required_syms fname
740748
in
741749
with_err_handling sess

src/boot/fe/item.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,12 @@ and parse_use
11591159
let bpos = lexpos ps in
11601160
let id = (span ps apos bpos ()).id in
11611161
let (path, items) =
1162-
ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
1162+
ps.pstate_get_mod
1163+
meta
1164+
id
1165+
ps.pstate_node_id
1166+
ps.pstate_opaque_id
1167+
ps.pstate_crate_cache
11631168
in
11641169
let bpos = lexpos ps in
11651170
expect ps SEMI;

src/boot/fe/parser.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ type get_mod_fn = (Ast.meta_pat
88
-> node_id
99
-> (node_id ref)
1010
-> (opaque_id ref)
11-
-> (filename * Ast.mod_items))
11+
-> (crate_id, Ast.mod_items) Hashtbl.t
12+
-> (filename * Ast.mod_items))
1213
;;
1314

1415
type pstate =
@@ -22,6 +23,7 @@ type pstate =
2223
pstate_temp_id : temp_id ref;
2324
pstate_node_id : node_id ref;
2425
pstate_opaque_id : opaque_id ref;
26+
pstate_crate_cache : (crate_id, Ast.mod_items) Hashtbl.t;
2527
pstate_get_mod : get_mod_fn;
2628
pstate_get_cenv_tok : pstate -> Ast.ident -> token;
2729
pstate_infer_lib_name : (Ast.ident -> filename);
@@ -44,6 +46,7 @@ let make_parser
4446
(tref:temp_id ref)
4547
(nref:node_id ref)
4648
(oref:opaque_id ref)
49+
(crate_cache:(crate_id, Ast.mod_items) Hashtbl.t)
4750
(sess:Session.sess)
4851
(get_mod:get_mod_fn)
4952
(get_cenv_tok:pstate -> Ast.ident -> token)
@@ -69,6 +72,7 @@ let make_parser
6972
pstate_temp_id = tref;
7073
pstate_node_id = nref;
7174
pstate_opaque_id = oref;
75+
pstate_crate_cache = crate_cache;
7276
pstate_get_mod = get_mod;
7377
pstate_get_cenv_tok = get_cenv_tok;
7478
pstate_infer_lib_name = infer_lib_name;

0 commit comments

Comments
 (0)