Skip to content

Commit fe32194

Browse files
committed
---
yaml --- r: 1971 b: refs/heads/master c: 6dc4523 h: refs/heads/master i: 1969: c9d191e 1967: 0a27f31 v: v3
1 parent c74f13e commit fe32194

File tree

5 files changed

+79
-17
lines changed

5 files changed

+79
-17
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: ec9d7abf8ce7f8c62894b772928303e5ee71970f
2+
refs/heads/master: 6dc452335a410e139220c4ecadbbda9dd15fe8e2

trunk/src/comp/front/creader.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import lib.llvm.mk_object_file;
88
import lib.llvm.mk_section_iter;
99
import middle.fold;
1010
import middle.metadata;
11+
import middle.trans;
1112
import middle.ty;
1213
import back.x86;
1314
import util.common;
@@ -324,7 +325,8 @@ impure fn move_to_item(&ebml.reader ebml_r, int item_id) {
324325
auto eqer = bind eq_item(_, item_id);
325326
auto hash = metadata.hash_def_num(item_id);
326327
ebml.move_to_sibling_with_id(ebml_r, metadata.tag_items);
327-
lookup_hash_entry(ebml_r, eqer, hash);
328+
auto found = lookup_hash_entry(ebml_r, eqer, hash);
329+
check (found);
328330
}
329331

330332
// Looks up an item in the given metadata and returns an EBML reader pointing
@@ -409,17 +411,17 @@ impure fn get_item_type(&ebml.reader ebml_r, int this_cnum) -> @ty.t {
409411
ret get_item_generic[@ty.t](ebml_r, metadata.tag_items_data_item_type, f);
410412
}
411413

412-
impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
414+
impure fn collect_def_ids(&ebml.reader ebml_r, int this_cnum, uint tag_id)
413415
-> vec[ast.def_id] {
414-
let vec[ast.def_id] tps = vec();
416+
let vec[ast.def_id] def_ids = vec();
415417
while (ebml.bytes_left(ebml_r) > 0u) {
416418
auto ebml_tag = ebml.peek(ebml_r);
417-
if (ebml_tag.id == metadata.tag_items_data_item_ty_param) {
419+
if (ebml_tag.id == tag_id) {
418420
ebml.move_to_first_child(ebml_r);
419421

420422
auto data = ebml.read_data(ebml_r);
421423
auto external_def_id = parse_def_id(data);
422-
tps += vec(tup(this_cnum, external_def_id._1));
424+
def_ids += vec(tup(this_cnum, external_def_id._1));
423425

424426
ebml.move_to_parent(ebml_r);
425427
}
@@ -430,7 +432,19 @@ impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
430432
ebml.move_to_parent(ebml_r);
431433
ebml.move_to_first_child(ebml_r);
432434

433-
ret tps;
435+
ret def_ids;
436+
}
437+
438+
impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
439+
-> vec[ast.def_id] {
440+
ret collect_def_ids(ebml_r, this_cnum,
441+
metadata.tag_items_data_item_ty_param);
442+
}
443+
444+
impure fn collect_tag_variant_ids(&ebml.reader ebml_r, int this_cnum)
445+
-> vec[ast.def_id] {
446+
ret collect_def_ids(ebml_r, this_cnum,
447+
metadata.tag_items_data_item_variant);
434448
}
435449

436450

@@ -590,6 +604,35 @@ fn get_symbol(session.session sess, ast.def_id def) -> str {
590604
ret get_item_symbol(ebml_r);
591605
}
592606

607+
fn get_tag_variants(session.session sess, ast.def_id def)
608+
-> vec[trans.variant_info] {
609+
auto external_crate_id = def._0;
610+
auto data = sess.get_external_crate(external_crate_id);
611+
auto ebml_r = lookup_item(def._1, data);
612+
613+
let vec[trans.variant_info] infos = vec();
614+
auto variant_ids = collect_tag_variant_ids(ebml_r, external_crate_id);
615+
for (ast.def_id did in variant_ids) {
616+
ebml.reset_reader(ebml_r, 0u);
617+
move_to_item(ebml_r, did._1);
618+
auto ctor_ty = get_item_type(ebml_r, external_crate_id);
619+
let vec[@ty.t] arg_tys = vec();
620+
alt (ctor_ty.struct) {
621+
case (ty.ty_fn(_, ?args, _)) {
622+
for (ty.arg a in args) {
623+
arg_tys += vec(a.ty);
624+
}
625+
}
626+
case (_) {
627+
// Nullary tag variant.
628+
}
629+
}
630+
infos += vec(rec(args=arg_tys, ctor_ty=ctor_ty, id=did));
631+
}
632+
633+
ret infos;
634+
}
635+
593636
// Local Variables:
594637
// mode: rust
595638
// fill-column: 78;

trunk/src/comp/middle/metadata.rs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,12 @@ fn encode_def_id(&ebml.writer ebml_w, &ast.def_id id) {
176176
ebml.end_tag(ebml_w);
177177
}
178178

179-
fn encode_tag_variant_paths(&ebml.writer ebml_w, vec[ast.variant] variants) {
179+
fn encode_tag_variant_paths(&ebml.writer ebml_w,
180+
vec[ast.variant] variants,
181+
vec[str] path,
182+
&mutable vec[tup(str, uint)] index) {
180183
for (ast.variant variant in variants) {
184+
add_to_index(ebml_w, path, index, variant.node.name);
181185
ebml.start_tag(ebml_w, tag_paths_data_item);
182186
encode_name(ebml_w, variant.node.name);
183187
encode_def_id(ebml_w, variant.node.id);
@@ -266,9 +270,10 @@ fn encode_module_item_paths(&ebml.writer ebml_w,
266270
add_to_index(ebml_w, path, index, id);
267271
ebml.start_tag(ebml_w, tag_paths_data_item);
268272
encode_name(ebml_w, id);
269-
encode_tag_variant_paths(ebml_w, variants);
270273
encode_def_id(ebml_w, did);
271274
ebml.end_tag(ebml_w);
275+
276+
encode_tag_variant_paths(ebml_w, variants, path, index);
272277
}
273278
case (ast.item_obj(?id, _, ?tps, ?odid, ?ann)) {
274279
add_to_index(ebml_w, path, index, id);
@@ -314,6 +319,12 @@ fn encode_type_params(&ebml.writer ebml_w, vec[ast.ty_param] tps) {
314319
}
315320
}
316321

322+
fn encode_variant_id(&ebml.writer ebml_w, ast.def_id vid) {
323+
ebml.start_tag(ebml_w, tag_items_data_item_variant);
324+
ebml_w.writer.write(_str.bytes(def_to_str(vid)));
325+
ebml.end_tag(ebml_w);
326+
}
327+
317328
fn encode_type(&ebml.writer ebml_w, @ty.t typ) {
318329
ebml.start_tag(ebml_w, tag_items_data_item_type);
319330
auto f = def_to_str;
@@ -348,23 +359,24 @@ fn encode_obj_type_id(&ebml.writer ebml_w, &ast.def_id id) {
348359

349360

350361
fn encode_tag_variant_info(@trans.crate_ctxt cx, &ebml.writer ebml_w,
351-
ast.def_id did, vec[ast.variant] variants) {
362+
ast.def_id did, vec[ast.variant] variants,
363+
&mutable vec[tup(int, uint)] index) {
352364
for (ast.variant variant in variants) {
365+
index += vec(tup(variant.node.id._1, ebml_w.writer.tell()));
366+
353367
ebml.start_tag(ebml_w, tag_items_data_item);
354368
encode_def_id(ebml_w, variant.node.id);
355369
encode_kind(ebml_w, 'v' as u8);
356370
encode_tag_id(ebml_w, did);
357371
encode_type(ebml_w, trans.node_ann_type(cx, variant.node.ann));
358-
if (_vec.len[ast.variant_arg](variant.node.args) > 0u) {
359-
encode_symbol(cx, ebml_w, variant.node.id);
360-
}
372+
encode_symbol(cx, ebml_w, variant.node.id);
361373
encode_discriminant(cx, ebml_w, variant.node.id);
362374
ebml.end_tag(ebml_w);
363375
}
364376
}
365377

366378
fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
367-
@ast.item item) {
379+
@ast.item item, &mutable vec[tup(int, uint)] index) {
368380
alt (item.node) {
369381
case (ast.item_const(_, _, _, ?did, ?ann)) {
370382
ebml.start_tag(ebml_w, tag_items_data_item);
@@ -409,9 +421,12 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
409421
encode_kind(ebml_w, 't' as u8);
410422
encode_type_params(ebml_w, tps);
411423
encode_type(ebml_w, trans.node_ann_type(cx, ann));
424+
for (ast.variant v in variants) {
425+
encode_variant_id(ebml_w, v.node.id);
426+
}
412427
ebml.end_tag(ebml_w);
413428

414-
encode_tag_variant_info(cx, ebml_w, did, variants);
429+
encode_tag_variant_info(cx, ebml_w, did, variants, index);
415430
}
416431
case (ast.item_obj(?id, _, ?tps, ?odid, ?ann)) {
417432
ebml.start_tag(ebml_w, tag_items_data_item);
@@ -458,7 +473,7 @@ fn encode_info_for_items(@trans.crate_ctxt cx, &ebml.writer ebml_w)
458473
ebml.start_tag(ebml_w, tag_items_data);
459474
for each (@tup(ast.def_id, @ast.item) kvp in cx.items.items()) {
460475
index += vec(tup(kvp._0._1, ebml_w.writer.tell()));
461-
encode_info_for_item(cx, ebml_w, kvp._1);
476+
encode_info_for_item(cx, ebml_w, kvp._1, index);
462477
}
463478
for each (@tup(ast.def_id, @ast.native_item) kvp in
464479
cx.native_items.items()) {

trunk/src/comp/middle/trans.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1911,7 +1911,10 @@ type variant_info = rec(vec[@ty.t] args, @ty.t ctor_ty, ast.def_id id);
19111911

19121912
// Returns information about the variants in a tag.
19131913
fn tag_variants(@crate_ctxt cx, ast.def_id id) -> vec[variant_info] {
1914-
// FIXME: This doesn't work for external variants.
1914+
if (cx.sess.get_targ_crate_num() != id._0) {
1915+
ret creader.get_tag_variants(cx.sess, id);
1916+
}
1917+
19151918
check (cx.items.contains_key(id));
19161919
alt (cx.items.get(id).node) {
19171920
case (ast.item_tag(_, ?variants, _, _, _)) {

trunk/src/comp/rustc.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ auth front.creader.load_crate = unsafe;
4747
auth front.creader.lookup_def = impure;
4848
auth front.creader.get_type = impure;
4949
auth front.creader.get_symbol = impure;
50+
auth front.creader.get_tag_variants = impure;
5051
auth front.creader.impure_no_op = impure;
5152
auth middle.metadata = unsafe;
5253
auth middle.metadata.encode_index = impure;

0 commit comments

Comments
 (0)