diff options
| author | Jed Davis <jld@panix.com> | 2012-12-30 20:29:17 -0800 |
|---|---|---|
| committer | Jed Davis <jld@panix.com> | 2013-01-11 23:42:51 -0800 |
| commit | 452642422dda045b89cbcb2b7d011c85c5202d5d (patch) | |
| tree | 60f9d8f7b6964af6748fca8e75ad656c2f5b4def | |
| parent | f38e9724e6fbc99668b523f30c7e6ca25c20645b (diff) | |
| download | rust-452642422dda045b89cbcb2b7d011c85c5202d5d.tar.gz rust-452642422dda045b89cbcb2b7d011c85c5202d5d.zip | |
Factor out base::get_discrim_val from const translation
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 24 | ||||
| -rw-r--r-- | src/librustc/middle/trans/consts.rs | 27 |
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 { |
