}
fn trans_operand<'a, 'tcx>(fx: &mut FunctionCx<'a, 'tcx>, operand: &Operand<'tcx>) -> CValue<'tcx> {
- use rustc::mir::interpret::{Scalar, ConstValue, GlobalId};
-
match operand {
Operand::Move(place) |
Operand::Copy(place) => {
cplace.to_cvalue(fx)
},
Operand::Constant(const_) => {
- let value = match const_.literal {
- Literal::Value { value } => value,
- Literal::Promoted { index } => fx
- .tcx
- .const_eval(ParamEnv::reveal_all().and(GlobalId {
- instance: fx.instance,
- promoted: Some(index),
- }))
- .unwrap(),
- };
-
- let layout = fx.layout_of(const_.ty);
- match const_.ty.sty {
- TypeVariants::TyBool => {
- let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
- CValue::const_val(fx, const_.ty, bits as u64 as i64)
- }
- TypeVariants::TyUint(_) => {
- let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
- CValue::const_val(fx, const_.ty, bits as u64 as i64)
- }
- TypeVariants::TyInt(_) => {
- let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
- CValue::const_val(fx, const_.ty, bits as i128 as i64)
- }
- TypeVariants::TyFnDef(def_id, substs) => {
- let func_ref = fx.get_function_ref(Instance::new(def_id, substs));
- CValue::Func(func_ref, fx.layout_of(const_.ty))
- }
- _ => unimplemented!("value {:?} ty {:?}", value, const_.ty),
- }
+ ::constant::trans_constant(fx, const_)
}
}
}
--- /dev/null
+use prelude::*;
+
+pub fn trans_constant<'a, 'tcx: 'a>(fx: &mut FunctionCx<'a, 'tcx>, const_: &Constant<'tcx>) -> CValue<'tcx> {
+ use rustc::mir::interpret::{Scalar, ConstValue, GlobalId};
+
+ let value = match const_.literal {
+ Literal::Value { value } => value,
+ Literal::Promoted { index } => fx
+ .tcx
+ .const_eval(ParamEnv::reveal_all().and(GlobalId {
+ instance: fx.instance,
+ promoted: Some(index),
+ }))
+ .unwrap(),
+ };
+
+ let layout = fx.layout_of(const_.ty);
+ match const_.ty.sty {
+ TypeVariants::TyBool => {
+ let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
+ CValue::const_val(fx, const_.ty, bits as u64 as i64)
+ }
+ TypeVariants::TyUint(_) => {
+ let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
+ CValue::const_val(fx, const_.ty, bits as u64 as i64)
+ }
+ TypeVariants::TyInt(_) => {
+ let bits = value.to_scalar().unwrap().to_bits(layout.size).unwrap();
+ CValue::const_val(fx, const_.ty, bits as i128 as i64)
+ }
+ TypeVariants::TyFnDef(def_id, substs) => {
+ let func_ref = fx.get_function_ref(Instance::new(def_id, substs));
+ CValue::Func(func_ref, fx.layout_of(const_.ty))
+ }
+ _ => unimplemented!("value {:?} ty {:?}", value, const_.ty),
+ }
+}
\ No newline at end of file