Skip to content

Commit e2d6475

Browse files
committed
rustc: Store cached crate metadata in the session
1 parent 9ca7acb commit e2d6475

File tree

6 files changed

+37
-35
lines changed

6 files changed

+37
-35
lines changed

src/comp/driver/session.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ obj session(cfg targ, map.hashmap[int, crate_metadata] crates) {
7777
fn set_external_crate(int num, &crate_metadata metadata) {
7878
crates.insert(num, metadata);
7979
}
80+
81+
fn has_external_crate(int num) -> bool {
82+
ret crates.contains_key(num);
83+
}
8084
}
8185

8286

src/comp/front/ast.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ type ty_param = rec(ident ident, def_id id);
2121
// Annotations added during successive passes.
2222
tag ann {
2323
ann_none;
24-
ann_crate(@external_crate_info);
2524
ann_type(@middle.ty.t, option.t[vec[@middle.ty.t]] /* ty param substs */);
2625
}
2726

@@ -359,7 +358,7 @@ type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
359358
360359
type view_item = spanned[view_item_];
361360
tag view_item_ {
362-
view_item_use(ident, vec[@meta_item], def_id, ann);
361+
view_item_use(ident, vec[@meta_item], def_id, option.t[int]);
363362
view_item_import(ident, vec[ident], def_id, option.t[def]);
364363
view_item_export(ident);
365364
}
@@ -382,8 +381,6 @@ tag native_item_ {
382381
fn_decl, vec[ty_param], def_id, ann);
383382
}
384383
385-
type external_crate_info = rec(vec[u8] data);
386-
387384
fn index_view_item(mod_index index, @view_item it) {
388385
alt (it.node) {
389386
case(ast.view_item_use(?id, _, _, _)) {

src/comp/front/creader.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ import std._str;
1717
import std._vec;
1818
import std.fs;
1919
import std.option;
20+
import std.option.some;
2021
import std.os;
2122
import std.map.hashmap;
2223

2324
// TODO: map to a real type here.
2425
type env = @rec(
2526
session.session sess,
26-
@hashmap[str, @ast.external_crate_info] crate_cache,
27-
vec[str] library_search_paths
27+
@hashmap[str, int] crate_cache,
28+
vec[str] library_search_paths,
29+
mutable int next_crate_num
2830
);
2931

3032
// Type decoding
@@ -215,7 +217,7 @@ impure fn parse_ty_fn(@pstate st, str_def sd) -> tup(vec[ty.arg], @ty.t) {
215217

216218
fn load_crate(session.session sess,
217219
ast.ident ident,
218-
vec[str] library_search_paths) -> @ast.external_crate_info {
220+
vec[str] library_search_paths) {
219221
auto filename = parser.default_native_name(sess, ident);
220222
for (str library_search_path in library_search_paths) {
221223
auto path = fs.connect(library_search_path, filename);
@@ -232,8 +234,9 @@ fn load_crate(session.session sess,
232234
auto cbuf = llvmext.LLVMGetSectionContents(si.llsi);
233235
auto csz = llvmext.LLVMGetSectionSize(si.llsi);
234236
auto cvbuf = cbuf as _vec.vbuf;
235-
ret @rec(data=_vec.vec_from_vbuf[u8](cvbuf, csz));
237+
ret;
236238
}
239+
llvmext.LLVMMoveToNextSection(si.llsi);
237240
}
238241
}
239242
}
@@ -244,18 +247,19 @@ fn load_crate(session.session sess,
244247
}
245248

246249
fn fold_view_item_use(&env e, &span sp, ast.ident ident,
247-
vec[@ast.meta_item] meta_items, ast.def_id id, ast.ann orig_ann)
250+
vec[@ast.meta_item] meta_items, ast.def_id id, option.t[int] cnum_opt)
248251
-> @ast.view_item {
249-
auto external_crate;
252+
auto cnum;
250253
if (!e.crate_cache.contains_key(ident)) {
251-
external_crate = load_crate(e.sess, ident, e.library_search_paths);
252-
e.crate_cache.insert(ident, external_crate);
254+
load_crate(e.sess, ident, e.library_search_paths);
255+
cnum = e.next_crate_num;
256+
e.crate_cache.insert(ident, e.next_crate_num);
257+
e.next_crate_num += 1;
253258
} else {
254-
external_crate = e.crate_cache.get(ident);
259+
cnum = e.crate_cache.get(ident);
255260
}
256261

257-
auto ann = ast.ann_crate(external_crate);
258-
auto viu = ast.view_item_use(ident, meta_items, id, ann);
262+
auto viu = ast.view_item_use(ident, meta_items, id, some[int](cnum));
259263
ret @fold.respan[ast.view_item_](sp, viu);
260264
}
261265

@@ -265,18 +269,18 @@ fn read_crates(session.session sess,
265269
vec[str] library_search_paths) -> @ast.crate {
266270
auto e = @rec(
267271
sess=sess,
268-
crate_cache=@common.new_str_hash[@ast.external_crate_info](),
269-
library_search_paths=library_search_paths
272+
crate_cache=@common.new_str_hash[int](),
273+
library_search_paths=library_search_paths,
274+
mutable next_crate_num=1
270275
);
271276

272277
auto f = fold_view_item_use;
273278
auto fld = @rec(fold_view_item_use=f with *fold.new_identity_fold[env]());
274279
ret fold.fold_crate[env](e, fld, crate);
275280
}
276281

277-
fn lookup_def(&span sp,
278-
@ast.external_crate_info cinfo,
279-
vec[ast.ident] path) -> ast.def {
282+
fn lookup_def(session.session sess, &span sp, int cnum, vec[ast.ident] path)
283+
-> ast.def {
280284
// FIXME: fill in.
281285
fail;
282286
}

src/comp/front/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2204,7 +2204,7 @@ impure fn parse_use(parser p) -> @ast.view_item {
22042204
auto metadata = parse_optional_meta(p);
22052205
expect(p, token.SEMI);
22062206
auto use_decl = ast.view_item_use(ident, metadata, p.next_def_id(),
2207-
ast.ann_none);
2207+
none[int]);
22082208
ret @spanned(lo, hi, use_decl);
22092209
}
22102210

src/comp/middle/fold.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ type ast_fold[ENV] =
265265
// View Item folds.
266266
(fn(&ENV e, &span sp, ident ident,
267267
vec[@meta_item] meta_items,
268-
def_id id, ann a) -> @view_item) fold_view_item_use,
268+
def_id id, option.t[int]) -> @view_item) fold_view_item_use,
269269

270270
(fn(&ENV e, &span sp, ident i, vec[ident] idents,
271271
def_id id, option.t[def]) -> @view_item) fold_view_item_import,
@@ -883,9 +883,9 @@ fn fold_view_item[ENV](&ENV env, ast_fold[ENV] fld, @view_item vi)
883883
}
884884

885885
alt (vi.node) {
886-
case (ast.view_item_use(?ident, ?meta_items, ?def_id, ?ann)) {
886+
case (ast.view_item_use(?ident, ?meta_items, ?def_id, ?cnum)) {
887887
ret fld.fold_view_item_use(env_, vi.span, ident, meta_items,
888-
def_id, ann);
888+
def_id, cnum);
889889
}
890890
case (ast.view_item_import(?def_ident, ?idents, ?def_id,
891891
?target_def)) {
@@ -1400,8 +1400,9 @@ fn identity_fold_item_obj[ENV](&ENV e, &span sp, ident i,
14001400

14011401
fn identity_fold_view_item_use[ENV](&ENV e, &span sp, ident i,
14021402
vec[@meta_item] meta_items,
1403-
def_id id, ann a) -> @view_item {
1404-
ret @respan(sp, ast.view_item_use(i, meta_items, id, a));
1403+
def_id id, option.t[int] cnum)
1404+
-> @view_item {
1405+
ret @respan(sp, ast.view_item_use(i, meta_items, id, cnum));
14051406
}
14061407

14071408
fn identity_fold_view_item_import[ENV](&ENV e, &span sp, ident i,

src/comp/middle/resolve.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,10 @@ fn find_final_def(&env e, import_map index,
137137
}
138138

139139
fn found_crate(&env e, &import_map index, &span sp,
140-
vec[ident] idents,
141-
@ast.external_crate_info cinfo) -> def_wrap {
140+
vec[ident] idents, int cnum) -> def_wrap {
142141
auto len = _vec.len[ident](idents);
143142
auto rest_idents = _vec.slice[ident](idents, 1u, len);
144-
auto def = creader.lookup_def(sp, cinfo, rest_idents);
143+
auto def = creader.lookup_def(e.sess, sp, cnum, rest_idents);
145144
ret def_wrap_other(def);
146145
}
147146

@@ -171,12 +170,9 @@ fn find_final_def(&env e, import_map index,
171170
}
172171
case (def_wrap_use(?vi)) {
173172
alt (vi.node) {
174-
case (ast.view_item_use(_, _, _, ?ann)) {
175-
alt (ann) {
176-
case (ast.ann_crate(?cinfo)) {
177-
ret found_crate(e, index, sp, idents, cinfo);
178-
}
179-
}
173+
case (ast.view_item_use(_, _, _, ?cnum_opt)) {
174+
auto cnum = option.get[int](cnum_opt);
175+
ret found_crate(e, index, sp, idents, cnum);
180176
}
181177
}
182178
}

0 commit comments

Comments
 (0)