@@ -7,11 +7,11 @@ use rustc::ty;
77use rustc:: ty:: layout:: { LayoutOf , Primitive , Size } ;
88use rustc:: mir:: BinOp ;
99use rustc:: mir:: interpret:: {
10- InterpResult , InterpError , Scalar ,
10+ InterpResult , InterpError , Scalar , GlobalId ,
1111} ;
1212
1313use super :: {
14- Machine , PlaceTy , OpTy , InterpretCx , Immediate ,
14+ Machine , PlaceTy , OpTy , InterpretCx ,
1515} ;
1616
1717mod type_name;
@@ -51,41 +51,18 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpretCx<'mir, 'tcx, M> {
5151
5252 let intrinsic_name = & self . tcx . item_name ( instance. def_id ( ) ) . as_str ( ) [ ..] ;
5353 match intrinsic_name {
54- "min_align_of" => {
55- let elem_ty = substs. type_at ( 0 ) ;
56- let elem_align = self . layout_of ( elem_ty) ?. align . abi . bytes ( ) ;
57- let align_val = Scalar :: from_uint ( elem_align, dest. layout . size ) ;
58- self . write_scalar ( align_val, dest) ?;
59- }
60-
61- "needs_drop" => {
62- let ty = substs. type_at ( 0 ) ;
63- let ty_needs_drop = ty. needs_drop ( self . tcx . tcx , self . param_env ) ;
64- let val = Scalar :: from_bool ( ty_needs_drop) ;
65- self . write_scalar ( val, dest) ?;
66- }
67-
68- "size_of" => {
69- let ty = substs. type_at ( 0 ) ;
70- let size = self . layout_of ( ty) ?. size . bytes ( ) as u128 ;
71- let size_val = Scalar :: from_uint ( size, dest. layout . size ) ;
72- self . write_scalar ( size_val, dest) ?;
73- }
74-
75- "type_id" => {
76- let ty = substs. type_at ( 0 ) ;
77- let type_id = self . tcx . type_id_hash ( ty) as u128 ;
78- let id_val = Scalar :: from_uint ( type_id, dest. layout . size ) ;
79- self . write_scalar ( id_val, dest) ?;
80- }
81-
54+ "min_align_of" |
55+ "needs_drop" |
56+ "size_of" |
57+ "type_id" |
8258 "type_name" => {
83- let alloc = alloc_type_name ( self . tcx . tcx , substs. type_at ( 0 ) ) ;
84- let name_id = self . tcx . alloc_map . lock ( ) . create_memory_alloc ( alloc) ;
85- let id_ptr = self . memory . tag_static_base_pointer ( name_id. into ( ) ) ;
86- let alloc_len = alloc. bytes . len ( ) as u64 ;
87- let name_val = Immediate :: new_slice ( Scalar :: Ptr ( id_ptr) , alloc_len, self ) ;
88- self . write_immediate ( name_val, dest) ?;
59+ let gid = GlobalId {
60+ instance,
61+ promoted : None ,
62+ } ;
63+ let val = self . tcx . const_eval ( ty:: ParamEnv :: reveal_all ( ) . and ( gid) ) ?;
64+ let val = self . eval_const_to_op ( val, None ) ?;
65+ self . copy_op ( val, dest) ?;
8966 }
9067
9168 | "ctpop"
0 commit comments