@@ -23,7 +23,8 @@ use stable_mir::mir::Body;
2323use stable_mir:: target:: { MachineInfo , MachineSize } ;
2424use stable_mir:: ty:: {
2525 AdtDef , AdtKind , Allocation , ClosureDef , ClosureKind , Const , FieldDef , FnDef , ForeignDef ,
26- ForeignItemKind , GenericArgs , LineInfo , PolyFnSig , RigidTy , Span , Ty , TyKind , VariantDef ,
26+ ForeignItemKind , GenericArgs , LineInfo , PolyFnSig , RigidTy , Span , Ty , TyKind , UintTy ,
27+ VariantDef ,
2728} ;
2829use stable_mir:: { Crate , CrateDef , CrateItem , CrateNum , DefId , Error , Filename , ItemKind , Symbol } ;
2930use std:: cell:: RefCell ;
@@ -341,15 +342,56 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
341342 . ok_or_else ( || Error :: new ( format ! ( "Const `{cnst:?}` cannot be encoded as u64" ) ) )
342343 }
343344
344- fn usize_to_const ( & self , val : u64 ) -> Result < Const , Error > {
345+ fn try_new_const_zst ( & self , ty : Ty ) -> Result < Const , Error > {
345346 let mut tables = self . 0 . borrow_mut ( ) ;
346- let ty = tables. tcx . types . usize ;
347+ let tcx = tables. tcx ;
348+ let ty_internal = ty. internal ( & mut * tables, tcx) ;
349+ let size = tables
350+ . tcx
351+ . layout_of ( ParamEnv :: empty ( ) . and ( ty_internal) )
352+ . map_err ( |err| {
353+ Error :: new ( format ! (
354+ "Cannot create a zero-sized constant for type `{ty_internal}`: {err}"
355+ ) )
356+ } ) ?
357+ . size ;
358+ if size. bytes ( ) != 0 {
359+ return Err ( Error :: new ( format ! (
360+ "Cannot create a zero-sized constant for type `{ty_internal}`: \
361+ Type `{ty_internal}` has {} bytes",
362+ size. bytes( )
363+ ) ) ) ;
364+ }
365+
366+ Ok ( ty:: Const :: zero_sized ( tables. tcx , ty_internal) . stable ( & mut * tables) )
367+ }
368+
369+ fn new_const_str ( & self , value : & str ) -> Const {
370+ let mut tables = self . 0 . borrow_mut ( ) ;
371+ let tcx = tables. tcx ;
372+ let ty = ty:: Ty :: new_static_str ( tcx) ;
373+ let bytes = value. as_bytes ( ) ;
374+ let val_tree = ty:: ValTree :: from_raw_bytes ( tcx, bytes) ;
375+
376+ ty:: Const :: new_value ( tcx, val_tree, ty) . stable ( & mut * tables)
377+ }
378+
379+ fn new_const_bool ( & self , value : bool ) -> Const {
380+ let mut tables = self . 0 . borrow_mut ( ) ;
381+ ty:: Const :: from_bool ( tables. tcx , value) . stable ( & mut * tables)
382+ }
383+
384+ fn try_new_const_uint ( & self , value : u128 , uint_ty : UintTy ) -> Result < Const , Error > {
385+ let mut tables = self . 0 . borrow_mut ( ) ;
386+ let tcx = tables. tcx ;
387+ let ty = ty:: Ty :: new_uint ( tcx, uint_ty. internal ( & mut * tables, tcx) ) ;
347388 let size = tables. tcx . layout_of ( ParamEnv :: empty ( ) . and ( ty) ) . unwrap ( ) . size ;
348389
349- let scalar = ScalarInt :: try_from_uint ( val, size) . ok_or_else ( || {
350- Error :: new ( format ! ( "Value overflow: cannot convert `{val}` to usize." ) )
390+ // We don't use Const::from_bits since it doesn't have any error checking.
391+ let scalar = ScalarInt :: try_from_uint ( value, size) . ok_or_else ( || {
392+ Error :: new ( format ! ( "Value overflow: cannot convert `{value}` to `{ty}`." ) )
351393 } ) ?;
352- Ok ( rustc_middle :: ty:: Const :: new_value ( tables. tcx , ValTree :: from_scalar_int ( scalar) , ty)
394+ Ok ( ty:: Const :: new_value ( tables. tcx , ValTree :: from_scalar_int ( scalar) , ty)
353395 . stable ( & mut * tables) )
354396 }
355397
@@ -556,7 +598,9 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
556598 global_alloc : & GlobalAlloc ,
557599 ) -> Option < stable_mir:: mir:: alloc:: AllocId > {
558600 let mut tables = self . 0 . borrow_mut ( ) ;
559- let GlobalAlloc :: VTable ( ty, trait_ref) = global_alloc else { return None } ;
601+ let GlobalAlloc :: VTable ( ty, trait_ref) = global_alloc else {
602+ return None ;
603+ } ;
560604 let tcx = tables. tcx ;
561605 let alloc_id = tables. tcx . vtable_allocation ( (
562606 ty. internal ( & mut * tables, tcx) ,
0 commit comments