about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-03-03 17:57:36 -0800
committerPatrick Walton <pcwalton@mimiga.net>2011-03-03 18:15:17 -0800
commit629eba1d066ba4295baf4bfed41cae240c527af5 (patch)
treeefab0439808ceeb46e3a10a55b44862f2f6f6d31
parentb4a85c7b583b75eade31d698ad9862f5f98e8857 (diff)
downloadrust-629eba1d066ba4295baf4bfed41cae240c527af5.tar.gz
rust-629eba1d066ba4295baf4bfed41cae240c527af5.zip
rustc: Make tag discriminants per-tag-ID, not per-tag-ID-and-subtypes
-rw-r--r--src/comp/middle/trans.rs20
1 files changed, 6 insertions, 14 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 2af5359a399..5bee0e11684 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -60,10 +60,7 @@ type glue_fns = rec(ValueRef activate_glue,
                     ValueRef bzero_glue,
                     ValueRef vec_grow_glue);
 
-type tag_info = rec(
-    type_handle th,
-    mutable @hashmap[ast.def_id,ValueRef] lldiscrims
-);
+type tag_info = rec(type_handle th);
 
 state type crate_ctxt = rec(session.session sess,
                             ModuleRef llmod,
@@ -78,6 +75,7 @@ state type crate_ctxt = rec(session.session sess,
                             hashmap[ast.def_id,
                                     @ast.native_item] native_items,
                             hashmap[@ty.t, @tag_info] tags,
+                            hashmap[ast.def_id, ValueRef] discrims,
                             hashmap[ast.def_id, ValueRef] fn_pairs,
                             hashmap[ast.def_id, ValueRef] consts,
                             hashmap[ast.def_id,()] obj_methods,
@@ -2962,9 +2960,7 @@ fn trans_path(@block_ctxt cx, &ast.path p, &option.t[ast.def] dopt,
                     } else {
                         // Nullary variant.
                         auto tag_ty = node_ann_type(cx.fcx.ccx, ann);
-                        auto info = cx.fcx.ccx.tags.get(tag_ty);
-                        check (info.lldiscrims.contains_key(vid));
-                        auto lldiscrim_gv = info.lldiscrims.get(vid);
+                        auto lldiscrim_gv = cx.fcx.ccx.discrims.get(vid);
                         auto lldiscrim = cx.build.Load(lldiscrim_gv);
 
                         auto alloc_result = alloc_ty(cx, tag_ty);
@@ -4866,10 +4862,7 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt {
             auto vi = new_def_hash[uint]();
             auto navi = new_def_hash[uint]();
 
-            auto info = @rec(
-                th=mk_type_handle(),
-                mutable lldiscrims=@new_def_hash[ValueRef]()
-            );
+            auto info = @rec(th=mk_type_handle());
 
             cx.tags.insert(mk_plain_tag(tag_id), info);
             cx.items.insert(tag_id, i);
@@ -4980,8 +4973,6 @@ fn resolve_tag_types(@crate_ctxt cx, @ast.crate crate) {
 fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
     alt (it.node) {
         case (ast.item_tag(_, ?variants, _, ?tag_id)) {
-            auto info = cx.tags.get(mk_plain_tag(tag_id));
-
             auto i = 0u;
             auto n_variants = _vec.len[ast.variant](variants);
             while (i < n_variants) {
@@ -5000,7 +4991,7 @@ fn trans_constant(&@crate_ctxt cx, @ast.item it) -> @crate_ctxt {
                 llvm.LLVMSetLinkage(discrim_gvar, lib.llvm.LLVMPrivateLinkage
                                     as llvm.Linkage);
 
-                info.lldiscrims.insert(variant.id, discrim_gvar);
+                cx.discrims.insert(variant.id, discrim_gvar);
 
                 i += 1u;
             }
@@ -5445,6 +5436,7 @@ fn trans_crate(session.session sess, @ast.crate crate, str output,
                    items = new_def_hash[@ast.item](),
                    native_items = new_def_hash[@ast.native_item](),
                    tags = tags,
+                   discrims = new_def_hash[ValueRef](),
                    fn_pairs = new_def_hash[ValueRef](),
                    consts = new_def_hash[ValueRef](),
                    obj_methods = new_def_hash[()](),