aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front/creader.rs
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-04-01 13:02:44 -0700
committerPatrick Walton <[email protected]>2011-04-01 13:02:44 -0700
commit6dc452335a410e139220c4ecadbbda9dd15fe8e2 (patch)
tree96d3fe1107c175f3792eb960cf3d9b9cc87731b7 /src/comp/front/creader.rs
parentrustc: Have tag_variants() return a new variant_info structure instead of an ... (diff)
downloadrust-6dc452335a410e139220c4ecadbbda9dd15fe8e2.tar.xz
rust-6dc452335a410e139220c4ecadbbda9dd15fe8e2.zip
rustc: Get tag variants from the crate metadata
Diffstat (limited to 'src/comp/front/creader.rs')
-rw-r--r--src/comp/front/creader.rs55
1 files changed, 49 insertions, 6 deletions
diff --git a/src/comp/front/creader.rs b/src/comp/front/creader.rs
index 22c38c31..151411c6 100644
--- a/src/comp/front/creader.rs
+++ b/src/comp/front/creader.rs
@@ -8,6 +8,7 @@ import lib.llvm.mk_object_file;
import lib.llvm.mk_section_iter;
import middle.fold;
import middle.metadata;
+import middle.trans;
import middle.ty;
import back.x86;
import util.common;
@@ -324,7 +325,8 @@ impure fn move_to_item(&ebml.reader ebml_r, int item_id) {
auto eqer = bind eq_item(_, item_id);
auto hash = metadata.hash_def_num(item_id);
ebml.move_to_sibling_with_id(ebml_r, metadata.tag_items);
- lookup_hash_entry(ebml_r, eqer, hash);
+ auto found = lookup_hash_entry(ebml_r, eqer, hash);
+ check (found);
}
// 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 {
ret get_item_generic[@ty.t](ebml_r, metadata.tag_items_data_item_type, f);
}
-impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
+impure fn collect_def_ids(&ebml.reader ebml_r, int this_cnum, uint tag_id)
-> vec[ast.def_id] {
- let vec[ast.def_id] tps = vec();
+ let vec[ast.def_id] def_ids = vec();
while (ebml.bytes_left(ebml_r) > 0u) {
auto ebml_tag = ebml.peek(ebml_r);
- if (ebml_tag.id == metadata.tag_items_data_item_ty_param) {
+ if (ebml_tag.id == tag_id) {
ebml.move_to_first_child(ebml_r);
auto data = ebml.read_data(ebml_r);
auto external_def_id = parse_def_id(data);
- tps += vec(tup(this_cnum, external_def_id._1));
+ def_ids += vec(tup(this_cnum, external_def_id._1));
ebml.move_to_parent(ebml_r);
}
@@ -430,7 +432,19 @@ impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
ebml.move_to_parent(ebml_r);
ebml.move_to_first_child(ebml_r);
- ret tps;
+ ret def_ids;
+}
+
+impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
+ -> vec[ast.def_id] {
+ ret collect_def_ids(ebml_r, this_cnum,
+ metadata.tag_items_data_item_ty_param);
+}
+
+impure fn collect_tag_variant_ids(&ebml.reader ebml_r, int this_cnum)
+ -> vec[ast.def_id] {
+ ret collect_def_ids(ebml_r, this_cnum,
+ metadata.tag_items_data_item_variant);
}
@@ -590,6 +604,35 @@ fn get_symbol(session.session sess, ast.def_id def) -> str {
ret get_item_symbol(ebml_r);
}
+fn get_tag_variants(session.session sess, ast.def_id def)
+ -> vec[trans.variant_info] {
+ auto external_crate_id = def._0;
+ auto data = sess.get_external_crate(external_crate_id);
+ auto ebml_r = lookup_item(def._1, data);
+
+ let vec[trans.variant_info] infos = vec();
+ auto variant_ids = collect_tag_variant_ids(ebml_r, external_crate_id);
+ for (ast.def_id did in variant_ids) {
+ ebml.reset_reader(ebml_r, 0u);
+ move_to_item(ebml_r, did._1);
+ auto ctor_ty = get_item_type(ebml_r, external_crate_id);
+ let vec[@ty.t] arg_tys = vec();
+ alt (ctor_ty.struct) {
+ case (ty.ty_fn(_, ?args, _)) {
+ for (ty.arg a in args) {
+ arg_tys += vec(a.ty);
+ }
+ }
+ case (_) {
+ // Nullary tag variant.
+ }
+ }
+ infos += vec(rec(args=arg_tys, ctor_ty=ctor_ty, id=did));
+ }
+
+ ret infos;
+}
+
// Local Variables:
// mode: rust
// fill-column: 78;