@@ -540,15 +540,15 @@ impl<'ctx> MirLowerCtx<'ctx> {
540540 self . write_bytes_to_place (
541541 then_target,
542542 place. clone ( ) ,
543- vec ! [ 1 ] ,
543+ Box :: new ( [ 1 ] ) ,
544544 TyBuilder :: bool ( ) ,
545545 MirSpan :: Unknown ,
546546 ) ?;
547547 if let Some ( else_target) = else_target {
548548 self . write_bytes_to_place (
549549 else_target,
550550 place,
551- vec ! [ 0 ] ,
551+ Box :: new ( [ 0 ] ) ,
552552 TyBuilder :: bool ( ) ,
553553 MirSpan :: Unknown ,
554554 ) ?;
@@ -602,7 +602,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
602602 generic_args,
603603 )
604604 . intern ( Interner ) ;
605- let func = Operand :: from_bytes ( vec ! [ ] , ty) ;
605+ let func = Operand :: from_bytes ( Box :: default ( ) , ty) ;
606606 return self . lower_call_and_args (
607607 func,
608608 iter:: once ( * callee) . chain ( args. iter ( ) . copied ( ) ) ,
@@ -615,7 +615,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
615615 let callee_ty = self . expr_ty_after_adjustments ( * callee) ;
616616 match & callee_ty. kind ( Interner ) {
617617 chalk_ir:: TyKind :: FnDef ( ..) => {
618- let func = Operand :: from_bytes ( vec ! [ ] , callee_ty. clone ( ) ) ;
618+ let func = Operand :: from_bytes ( Box :: default ( ) , callee_ty. clone ( ) ) ;
619619 self . lower_call_and_args (
620620 func,
621621 args. iter ( ) . copied ( ) ,
@@ -1113,7 +1113,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
11131113 Some ( "start" ) => lp. take ( ) ,
11141114 Some ( "end" ) => rp. take ( ) ,
11151115 Some ( "exhausted" ) => {
1116- Some ( Operand :: from_bytes ( vec ! [ 0 ] , TyBuilder :: bool ( ) ) )
1116+ Some ( Operand :: from_bytes ( Box :: new ( [ 0 ] ) , TyBuilder :: bool ( ) ) )
11171117 }
11181118 _ => None ,
11191119 } ;
@@ -1395,46 +1395,47 @@ impl<'ctx> MirLowerCtx<'ctx> {
13951395 }
13961396
13971397 fn lower_literal_to_operand ( & mut self , ty : Ty , l : & Literal ) -> Result < Operand > {
1398- let size = self
1399- . db
1400- . layout_of_ty ( ty. clone ( ) , self . db . trait_environment_for_body ( self . owner ) ) ?
1401- . size
1402- . bytes_usize ( ) ;
1403- let bytes = match l {
1398+ let size = || {
1399+ self . db
1400+ . layout_of_ty ( ty. clone ( ) , self . db . trait_environment_for_body ( self . owner ) )
1401+ . map ( |it| it. size . bytes_usize ( ) )
1402+ } ;
1403+ const USIZE_SIZE : usize = mem:: size_of :: < usize > ( ) ;
1404+ let bytes: Box < [ _ ] > = match l {
14041405 hir_def:: hir:: Literal :: String ( b) => {
14051406 let b = b. as_bytes ( ) ;
1406- let mut data = Vec :: with_capacity ( mem :: size_of :: < usize > ( ) * 2 ) ;
1407- data. extend ( 0usize . to_le_bytes ( ) ) ;
1408- data. extend ( b. len ( ) . to_le_bytes ( ) ) ;
1407+ let mut data = Box :: new ( [ 0 ; { 2 * USIZE_SIZE } ] ) ;
1408+ data[ .. USIZE_SIZE ] . copy_from_slice ( & 0usize . to_le_bytes ( ) ) ;
1409+ data[ USIZE_SIZE .. ] . copy_from_slice ( & b. len ( ) . to_le_bytes ( ) ) ;
14091410 let mut mm = MemoryMap :: default ( ) ;
14101411 mm. insert ( 0 , b. to_vec ( ) ) ;
14111412 return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
14121413 }
14131414 hir_def:: hir:: Literal :: CString ( b) => {
14141415 let bytes = b. iter ( ) . copied ( ) . chain ( iter:: once ( 0 ) ) . collect :: < Vec < _ > > ( ) ;
14151416
1416- let mut data = Vec :: with_capacity ( mem :: size_of :: < usize > ( ) * 2 ) ;
1417- data. extend ( 0usize . to_le_bytes ( ) ) ;
1418- data. extend ( bytes. len ( ) . to_le_bytes ( ) ) ;
1417+ let mut data = Box :: new ( [ 0 ; { 2 * USIZE_SIZE } ] ) ;
1418+ data[ .. USIZE_SIZE ] . copy_from_slice ( & 0usize . to_le_bytes ( ) ) ;
1419+ data[ USIZE_SIZE .. ] . copy_from_slice ( & bytes. len ( ) . to_le_bytes ( ) ) ;
14191420 let mut mm = MemoryMap :: default ( ) ;
14201421 mm. insert ( 0 , bytes) ;
14211422 return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
14221423 }
14231424 hir_def:: hir:: Literal :: ByteString ( b) => {
1424- let mut data = Vec :: with_capacity ( mem :: size_of :: < usize > ( ) * 2 ) ;
1425- data. extend ( 0usize . to_le_bytes ( ) ) ;
1426- data. extend ( b. len ( ) . to_le_bytes ( ) ) ;
1425+ let mut data = Box :: new ( [ 0 ; { 2 * USIZE_SIZE } ] ) ;
1426+ data[ .. USIZE_SIZE ] . copy_from_slice ( & 0usize . to_le_bytes ( ) ) ;
1427+ data[ USIZE_SIZE .. ] . copy_from_slice ( & b. len ( ) . to_le_bytes ( ) ) ;
14271428 let mut mm = MemoryMap :: default ( ) ;
14281429 mm. insert ( 0 , b. to_vec ( ) ) ;
14291430 return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
14301431 }
1431- hir_def:: hir:: Literal :: Char ( c) => u32:: from ( * c) . to_le_bytes ( ) . into ( ) ,
1432- hir_def:: hir:: Literal :: Bool ( b) => vec ! [ * b as u8 ] ,
1433- hir_def:: hir:: Literal :: Int ( it, _) => it. to_le_bytes ( ) [ 0 ..size] . into ( ) ,
1434- hir_def:: hir:: Literal :: Uint ( it, _) => it. to_le_bytes ( ) [ 0 ..size] . into ( ) ,
1435- hir_def:: hir:: Literal :: Float ( f, _) => match size {
1436- 8 => f. into_f64 ( ) . to_le_bytes ( ) . into ( ) ,
1437- 4 => f. into_f32 ( ) . to_le_bytes ( ) . into ( ) ,
1432+ hir_def:: hir:: Literal :: Char ( c) => Box :: new ( u32:: from ( * c) . to_le_bytes ( ) ) ,
1433+ hir_def:: hir:: Literal :: Bool ( b) => Box :: new ( [ * b as u8 ] ) ,
1434+ hir_def:: hir:: Literal :: Int ( it, _) => Box :: from ( & it. to_le_bytes ( ) [ 0 ..size ( ) ? ] ) ,
1435+ hir_def:: hir:: Literal :: Uint ( it, _) => Box :: from ( & it. to_le_bytes ( ) [ 0 ..size ( ) ? ] ) ,
1436+ hir_def:: hir:: Literal :: Float ( f, _) => match size ( ) ? {
1437+ 8 => Box :: new ( f. into_f64 ( ) . to_le_bytes ( ) ) ,
1438+ 4 => Box :: new ( f. into_f32 ( ) . to_le_bytes ( ) ) ,
14381439 _ => {
14391440 return Err ( MirLowerError :: TypeError ( "float with size other than 4 or 8 bytes" ) )
14401441 }
@@ -1483,7 +1484,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
14831484 & mut self ,
14841485 prev_block : BasicBlockId ,
14851486 place : Place ,
1486- cv : Vec < u8 > ,
1487+ cv : Box < [ u8 ] > ,
14871488 ty : Ty ,
14881489 span : MirSpan ,
14891490 ) -> Result < ( ) > {
0 commit comments