@@ -1935,25 +1935,37 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
19351935 Ok ( Interval :: new ( addr, 4 ) )
19361936 }
19371937 TyKind :: Int ( int_ty) => {
1938- let size = int_ty. bit_width ( ) . unwrap_or ( self . ptr_size ( ) as u64 ) ;
1939- let value = valtree. inner ( ) . to_leaf ( ) . to_int ( Size :: from_bytes ( size) ) ;
1940- let addr = self . heap_allocate ( size as usize , size as usize ) ?;
1941- self . write_memory ( addr, & value. to_le_bytes ( ) [ ..size as usize ] ) ?;
1942- Ok ( Interval :: new ( addr, size as usize ) )
1938+ let size = int_ty
1939+ . bit_width ( )
1940+ . map ( Size :: from_bits)
1941+ . unwrap_or_else ( || Size :: from_bytes ( self . ptr_size ( ) as u64 ) ) ;
1942+ let bytes = size. bytes_usize ( ) ;
1943+
1944+ let value = valtree. inner ( ) . to_leaf ( ) . to_int ( size) ;
1945+ let addr = self . heap_allocate ( bytes, bytes) ?;
1946+ self . write_memory ( addr, & value. to_le_bytes ( ) [ ..bytes] ) ?;
1947+ Ok ( Interval :: new ( addr, bytes) )
19431948 }
19441949 TyKind :: Uint ( uint_ty) => {
1945- let size = uint_ty. bit_width ( ) . unwrap_or ( self . ptr_size ( ) as u64 ) ;
1946- let value = valtree. inner ( ) . to_leaf ( ) . to_uint ( Size :: from_bytes ( size) ) ;
1947- let addr = self . heap_allocate ( size as usize , size as usize ) ?;
1948- self . write_memory ( addr, & value. to_le_bytes ( ) [ ..size as usize ] ) ?;
1949- Ok ( Interval :: new ( addr, size as usize ) )
1950+ let size = uint_ty
1951+ . bit_width ( )
1952+ . map ( Size :: from_bits)
1953+ . unwrap_or_else ( || Size :: from_bytes ( self . ptr_size ( ) as u64 ) ) ;
1954+ let bytes = size. bytes_usize ( ) ;
1955+
1956+ let value = valtree. inner ( ) . to_leaf ( ) . to_uint ( size) ;
1957+ let addr = self . heap_allocate ( bytes, bytes) ?;
1958+ self . write_memory ( addr, & value. to_le_bytes ( ) [ ..bytes] ) ?;
1959+ Ok ( Interval :: new ( addr, bytes) )
19501960 }
19511961 TyKind :: Float ( float_ty) => {
1952- let size = float_ty. bit_width ( ) ;
1953- let value = valtree. inner ( ) . to_leaf ( ) . to_uint ( Size :: from_bytes ( size) ) ;
1954- let addr = self . heap_allocate ( size as usize , size as usize ) ?;
1955- self . write_memory ( addr, & value. to_le_bytes ( ) [ ..size as usize ] ) ?;
1956- Ok ( Interval :: new ( addr, size as usize ) )
1962+ let size = Size :: from_bits ( float_ty. bit_width ( ) ) ;
1963+ let bytes = size. bytes_usize ( ) ;
1964+
1965+ let value = valtree. inner ( ) . to_leaf ( ) . to_uint ( size) ;
1966+ let addr = self . heap_allocate ( bytes, bytes) ?;
1967+ self . write_memory ( addr, & value. to_le_bytes ( ) [ ..bytes] ) ?;
1968+ Ok ( Interval :: new ( addr, bytes) )
19571969 }
19581970 TyKind :: RawPtr ( ..) => {
19591971 let size = self . ptr_size ( ) ;
@@ -1995,15 +2007,13 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
19952007 _ => not_supported ! ( "unsupported const" ) ,
19962008 } )
19972009 . collect :: < Result < ' _ , Vec < _ > > > ( ) ?;
2010+ let item_size = item_layout. size . bytes_usize ( ) ;
19982011 let items_addr = self . heap_allocate (
1999- items. len ( ) * ( item_layout . size . bits ( ) as usize ) ,
2000- item_layout. align . bits_usize ( ) ,
2012+ items. len ( ) * item_size ,
2013+ item_layout. align . bytes ( ) as usize ,
20012014 ) ?;
20022015 for ( i, item) in items. iter ( ) . enumerate ( ) {
2003- self . copy_from_interval (
2004- items_addr. offset ( i * ( item_layout. size . bits ( ) as usize ) ) ,
2005- * item,
2006- ) ?;
2016+ self . copy_from_interval ( items_addr. offset ( i * item_size) , * item) ?;
20072017 }
20082018 let ref_addr = self . heap_allocate ( self . ptr_size ( ) * 2 , self . ptr_size ( ) ) ?;
20092019 self . write_memory ( ref_addr, & items_addr. to_bytes ( ) ) ?;
0 commit comments