@@ -13,6 +13,7 @@ import std::map::{hashmap, int_hash};
13
13
import syntax:: print:: pprust;
14
14
import filesearch:: filesearch;
15
15
import common:: * ;
16
+ import dvec:: { dvec, extensions} ;
16
17
17
18
export read_crates;
18
19
@@ -26,7 +27,7 @@ fn read_crates(diag: span_handler, crate: ast::crate,
26
27
cstore: cstore,
27
28
os: os,
28
29
static : static ,
29
- mut crate_cache: [ ] ,
30
+ crate_cache: dvec ( ) ,
30
31
mut next_crate_num: 1 } ;
31
32
let v =
32
33
visit:: mk_simple_visitor ( @{ visit_view_item:
@@ -35,7 +36,7 @@ fn read_crates(diag: span_handler, crate: ast::crate,
35
36
with * visit:: default_simple_visitor ( ) } ) ;
36
37
visit:: visit_crate ( crate , ( ) , v) ;
37
38
dump_crates ( e. crate_cache ) ;
38
- warn_if_multiple_versions ( diag, copy e. crate_cache ) ;
39
+ warn_if_multiple_versions ( diag, e. crate_cache . get ( ) ) ;
39
40
}
40
41
41
42
type cache_entry = {
@@ -45,7 +46,7 @@ type cache_entry = {
45
46
metas : @[ @ast:: meta_item ]
46
47
} ;
47
48
48
- fn dump_crates( crate_cache : [ cache_entry ] ) {
49
+ fn dump_crates( crate_cache : dvec < cache_entry > ) {
49
50
#debug ( "resolved crates:" ) ;
50
51
for crate_cache. each { |entry|
51
52
#debug( "cnum: %?" , entry. cnum) ;
@@ -64,10 +65,10 @@ fn warn_if_multiple_versions(diag: span_handler,
64
65
crate_cache: [ cache_entry] ) {
65
66
import either:: * ;
66
67
67
- if crate_cache. is_not_empty ( ) {
68
+ if crate_cache. len ( ) != 0 u {
68
69
let name = loader : : crate_name_from_metas( * crate_cache. last( ) . metas) ;
69
70
let { lefts: matches, rights : non_matches} =
70
- partition( crate_cache. map { |entry|
71
+ partition( crate_cache. map_to_vec { |entry|
71
72
let othername = loader:: crate_name_from_metas( * entry. metas) ;
72
73
if name == othername {
73
74
left( entry)
@@ -99,7 +100,7 @@ type env = @{diag: span_handler,
99
100
cstore: cstore:: cstore,
100
101
os: loader:: os,
101
102
static : bool,
102
- mut crate_cache: [ cache_entry] ,
103
+ crate_cache: dvec < cache_entry > ,
103
104
mut next_crate_num: ast:: crate_num} ;
104
105
105
106
fn visit_view_item( e: env, i: @ast:: view_item) {
@@ -176,12 +177,14 @@ fn metas_with_ident(ident: ast::ident,
176
177
177
178
fn existing_match( e: env, metas: [ @ast:: meta_item] , hash: str ) ->
178
179
option < int > {
179
- let maybe_entry = e. crate_cache. find { |c|
180
- loader:: metadata_matches( * c. metas, metas) &&
181
- ( hash. is_empty( ) || c. hash == hash)
182
- } ;
183
180
184
- maybe_entry. map { |c| c. cnum }
181
+ for e. crate_cache. each { |c|
182
+ if loader:: metadata_matches( * c. metas, metas)
183
+ && ( hash. is_empty( ) || c. hash == hash) {
184
+ ret some( c. cnum) ;
185
+ }
186
+ }
187
+ ret none;
185
188
}
186
189
187
190
fn resolve_crate( e: env, ident: ast:: ident, metas: [ @ast:: meta_item] ,
@@ -211,8 +214,8 @@ fn resolve_crate(e: env, ident: ast::ident, metas: [@ast::meta_item],
211
214
212
215
// Claim this crate number and cache it
213
216
let cnum = e. next_crate_num;
214
- e. crate_cache += [ { cnum: cnum, span: span,
215
- hash: hash, metas: @linkage_metas} ] ;
217
+ e. crate_cache. push ( { cnum : cnum, span : span,
218
+ hash : hash, metas : @linkage_metas} ) ;
216
219
e. next_crate_num += 1 ;
217
220
218
221
// Now resolve the crates referenced by this crate
0 commit comments