@@ -540,15 +540,15 @@ impl<'ctx> MirLowerCtx<'ctx> {
540
540
self . write_bytes_to_place (
541
541
then_target,
542
542
place. clone ( ) ,
543
- vec ! [ 1 ] ,
543
+ Box :: new ( [ 1 ] ) ,
544
544
TyBuilder :: bool ( ) ,
545
545
MirSpan :: Unknown ,
546
546
) ?;
547
547
if let Some ( else_target) = else_target {
548
548
self . write_bytes_to_place (
549
549
else_target,
550
550
place,
551
- vec ! [ 0 ] ,
551
+ Box :: new ( [ 0 ] ) ,
552
552
TyBuilder :: bool ( ) ,
553
553
MirSpan :: Unknown ,
554
554
) ?;
@@ -602,7 +602,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
602
602
generic_args,
603
603
)
604
604
. intern ( Interner ) ;
605
- let func = Operand :: from_bytes ( vec ! [ ] , ty) ;
605
+ let func = Operand :: from_bytes ( Box :: default ( ) , ty) ;
606
606
return self . lower_call_and_args (
607
607
func,
608
608
iter:: once ( * callee) . chain ( args. iter ( ) . copied ( ) ) ,
@@ -615,7 +615,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
615
615
let callee_ty = self . expr_ty_after_adjustments ( * callee) ;
616
616
match & callee_ty. kind ( Interner ) {
617
617
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 ( ) ) ;
619
619
self . lower_call_and_args (
620
620
func,
621
621
args. iter ( ) . copied ( ) ,
@@ -1113,7 +1113,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
1113
1113
Some ( "start" ) => lp. take ( ) ,
1114
1114
Some ( "end" ) => rp. take ( ) ,
1115
1115
Some ( "exhausted" ) => {
1116
- Some ( Operand :: from_bytes ( vec ! [ 0 ] , TyBuilder :: bool ( ) ) )
1116
+ Some ( Operand :: from_bytes ( Box :: new ( [ 0 ] ) , TyBuilder :: bool ( ) ) )
1117
1117
}
1118
1118
_ => None ,
1119
1119
} ;
@@ -1395,46 +1395,47 @@ impl<'ctx> MirLowerCtx<'ctx> {
1395
1395
}
1396
1396
1397
1397
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 {
1404
1405
hir_def:: hir:: Literal :: String ( b) => {
1405
1406
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 ( ) ) ;
1409
1410
let mut mm = MemoryMap :: default ( ) ;
1410
1411
mm. insert ( 0 , b. to_vec ( ) ) ;
1411
1412
return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
1412
1413
}
1413
1414
hir_def:: hir:: Literal :: CString ( b) => {
1414
1415
let bytes = b. iter ( ) . copied ( ) . chain ( iter:: once ( 0 ) ) . collect :: < Vec < _ > > ( ) ;
1415
1416
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 ( ) ) ;
1419
1420
let mut mm = MemoryMap :: default ( ) ;
1420
1421
mm. insert ( 0 , bytes) ;
1421
1422
return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
1422
1423
}
1423
1424
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 ( ) ) ;
1427
1428
let mut mm = MemoryMap :: default ( ) ;
1428
1429
mm. insert ( 0 , b. to_vec ( ) ) ;
1429
1430
return Ok ( Operand :: from_concrete_const ( data, mm, ty) ) ;
1430
1431
}
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 ( ) ) ,
1438
1439
_ => {
1439
1440
return Err ( MirLowerError :: TypeError ( "float with size other than 4 or 8 bytes" ) )
1440
1441
}
@@ -1483,7 +1484,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
1483
1484
& mut self ,
1484
1485
prev_block : BasicBlockId ,
1485
1486
place : Place ,
1486
- cv : Vec < u8 > ,
1487
+ cv : Box < [ u8 ] > ,
1487
1488
ty : Ty ,
1488
1489
span : MirSpan ,
1489
1490
) -> Result < ( ) > {
0 commit comments