about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJed Davis <jld@panix.com>2012-12-30 20:29:17 -0800
committerJed Davis <jld@panix.com>2013-01-11 23:42:51 -0800
commit452642422dda045b89cbcb2b7d011c85c5202d5d (patch)
tree60f9d8f7b6964af6748fca8e75ad656c2f5b4def
parentf38e9724e6fbc99668b523f30c7e6ca25c20645b (diff)
downloadrust-452642422dda045b89cbcb2b7d011c85c5202d5d.tar.gz
rust-452642422dda045b89cbcb2b7d011c85c5202d5d.zip
Factor out base::get_discrim_val from const translation
-rw-r--r--src/librustc/middle/trans/base.rs24
-rw-r--r--src/librustc/middle/trans/consts.rs27
2 files changed, 27 insertions, 24 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index 0134e1a7285..a02b8314ff3 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -779,6 +779,30 @@ fn trans_external_path(ccx: @crate_ctxt, did: ast::def_id, t: ty::t)
     };
 }
 
+fn get_discrim_val(cx: @crate_ctxt, span: span, enum_did: ast::def_id,
+                   variant_did: ast::def_id) -> ValueRef {
+    // Can't use `discrims` from the crate context here because
+    // those discriminants have an extra level of indirection,
+    // and there's no LLVM constant load instruction.
+    let mut lldiscrim_opt = None;
+    for ty::enum_variants(cx.tcx, enum_did).each |variant_info| {
+        if variant_info.id == variant_did {
+            lldiscrim_opt = Some(C_int(cx,
+                                       variant_info.disr_val));
+            break;
+        }
+    }
+
+    match lldiscrim_opt {
+        None => {
+            cx.tcx.sess.span_bug(span, ~"didn't find discriminant?!");
+        }
+        Some(found_lldiscrim) => {
+            found_lldiscrim
+        }
+    }
+}
+
 fn lookup_discriminant(ccx: @crate_ctxt, vid: ast::def_id) -> ValueRef {
     unsafe {
         let _icx = ccx.insn_ctxt("lookup_discriminant");
diff --git a/src/librustc/middle/trans/consts.rs b/src/librustc/middle/trans/consts.rs
index 588a64229f9..421d1981c41 100644
--- a/src/librustc/middle/trans/consts.rs
+++ b/src/librustc/middle/trans/consts.rs
@@ -416,31 +416,10 @@ fn const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef {
                     // variants.
                     let ety = ty::expr_ty(cx.tcx, e);
                     let llty = type_of::type_of(cx, ety);
+                    let lldiscrim = base::get_discrim_val(cx, e.span,
+                                                          enum_did,
+                                                          variant_did);
 
-                    // Can't use `discrims` from the crate context here
-                    // because those discriminants have an extra level of
-                    // indirection, and there's no LLVM constant load
-                    // instruction.
-                    let mut lldiscrim_opt = None;
-                    for ty::enum_variants(cx.tcx, enum_did).each
-                            |variant_info| {
-                        if variant_info.id == variant_did {
-                            lldiscrim_opt = Some(C_int(cx,
-                                variant_info.disr_val));
-                            break;
-                        }
-                    }
-
-                    let lldiscrim;
-                    match lldiscrim_opt {
-                        None => {
-                            cx.tcx.sess.span_bug(e.span,
-                                ~"didn't find discriminant?!");
-                        }
-                        Some(found_lldiscrim) => {
-                            lldiscrim = found_lldiscrim;
-                        }
-                    }
                     let fields = if ty::enum_is_univariant(cx.tcx, enum_did) {
                         ~[lldiscrim]
                     } else {