@@ -21,6 +21,7 @@ use metadata::cstore;
21
21
use metadata:: decoder;
22
22
use metadata:: loader;
23
23
use metadata:: loader:: Os ;
24
+ use metadata:: loader:: CratePaths ;
24
25
25
26
use std:: cell:: RefCell ;
26
27
use std:: rc:: Rc ;
@@ -141,7 +142,7 @@ fn visit_view_item(e: &mut Env, i: &ast::ViewItem) {
141
142
142
143
match extract_crate_info ( e, i) {
143
144
Some ( info) => {
144
- let cnum = resolve_crate ( e, None , info. ident , & info. crate_id , None ,
145
+ let cnum = resolve_crate ( e, & None , info. ident , & info. crate_id , None ,
145
146
i. span ) ;
146
147
e. sess . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
147
148
}
@@ -278,13 +279,13 @@ fn existing_match(e: &Env, crate_id: &CrateId,
278
279
None
279
280
}
280
281
281
- fn resolve_crate ( e : & mut Env ,
282
- root_ident : Option < & str > ,
283
- ident : & str ,
284
- crate_id : & CrateId ,
285
- hash : Option < & Svh > ,
286
- span : Span )
287
- -> ast:: CrateNum {
282
+ fn resolve_crate < ' a > ( e : & mut Env ,
283
+ root : & Option < CratePaths > ,
284
+ ident : & str ,
285
+ crate_id : & CrateId ,
286
+ hash : Option < & Svh > ,
287
+ span : Span )
288
+ -> ast:: CrateNum {
288
289
match existing_match ( e, crate_id, hash) {
289
290
None => {
290
291
let id_hash = link:: crate_id_hash ( crate_id) ;
@@ -297,11 +298,11 @@ fn resolve_crate(e: &mut Env,
297
298
hash : hash. map ( |a| & * a) ,
298
299
os : e. os ,
299
300
intr : e. intr . clone ( ) ,
300
- rejected_via_hash : false ,
301
+ rejected_via_hash : None ,
301
302
} ;
302
303
let loader:: Library {
303
304
dylib, rlib, metadata
304
- } = load_ctxt. load_library_crate ( root_ident ) ;
305
+ } = load_ctxt. load_library_crate ( root ) ;
305
306
306
307
let crate_id = decoder:: get_crate_id ( metadata. as_slice ( ) ) ;
307
308
let hash = decoder:: get_crate_hash ( metadata. as_slice ( ) ) ;
@@ -316,15 +317,22 @@ fn resolve_crate(e: &mut Env,
316
317
} ) ;
317
318
e. next_crate_num += 1 ;
318
319
319
- // Maintain a reference to the top most crate.
320
- let root_crate = match root_ident {
321
- Some ( c) => c,
322
- None => load_ctxt. ident . clone ( )
320
+ // Stash paths for top-most crate locally if necessary.
321
+ let crate_paths = if root. is_none ( ) {
322
+ Some ( CratePaths {
323
+ ident : load_ctxt. ident . to_owned ( ) ,
324
+ dylib : dylib. clone ( ) ,
325
+ rlib : rlib. clone ( ) ,
326
+ } )
327
+ } else {
328
+ None
323
329
} ;
330
+ // Maintain a reference to the top most crate.
331
+ let root = if root. is_some ( ) { root } else { & crate_paths } ;
324
332
325
333
// Now resolve the crates referenced by this crate
326
334
let cnum_map = resolve_crate_deps ( e,
327
- Some ( root_crate ) ,
335
+ root ,
328
336
metadata. as_slice ( ) ,
329
337
span) ;
330
338
@@ -349,7 +357,7 @@ fn resolve_crate(e: &mut Env,
349
357
350
358
// Go through the crate metadata and load any crates that it references
351
359
fn resolve_crate_deps ( e : & mut Env ,
352
- root_ident : Option < & str > ,
360
+ root : & Option < CratePaths > ,
353
361
cdata : & [ u8 ] , span : Span )
354
362
-> cstore:: cnum_map {
355
363
debug ! ( "resolving deps of external crate" ) ;
@@ -360,7 +368,7 @@ fn resolve_crate_deps(e: &mut Env,
360
368
for dep in r. iter ( ) {
361
369
let extrn_cnum = dep. cnum ;
362
370
debug ! ( "resolving dep crate {} hash: `{}`" , dep. crate_id, dep. hash) ;
363
- let local_cnum = resolve_crate ( e, root_ident ,
371
+ let local_cnum = resolve_crate ( e, root ,
364
372
dep. crate_id . name . as_slice ( ) ,
365
373
& dep. crate_id ,
366
374
Some ( & dep. hash ) ,
@@ -393,7 +401,7 @@ impl<'a> Loader<'a> {
393
401
impl < ' a > CrateLoader for Loader < ' a > {
394
402
fn load_crate ( & mut self , krate : & ast:: ViewItem ) -> MacroCrate {
395
403
let info = extract_crate_info ( & self . env , krate) . unwrap ( ) ;
396
- let cnum = resolve_crate ( & mut self . env , None , info. ident ,
404
+ let cnum = resolve_crate ( & mut self . env , & None , info. ident ,
397
405
& info. crate_id , None , krate. span ) ;
398
406
let library = self . env . sess . cstore . get_used_crate_source ( cnum) . unwrap ( ) ;
399
407
MacroCrate {
0 commit comments