Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/lower.rs')
-rw-r--r--crates/hir-ty/src/mir/lower.rs77
1 files changed, 37 insertions, 40 deletions
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index c27c1ff7a2..947fa3c21d 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -540,7 +540,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.write_bytes_to_place(
then_target,
place.clone(),
- vec![1],
+ Box::new([1]),
TyBuilder::bool(),
MirSpan::Unknown,
)?;
@@ -548,7 +548,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
self.write_bytes_to_place(
else_target,
place,
- vec![0],
+ Box::new([0]),
TyBuilder::bool(),
MirSpan::Unknown,
)?;
@@ -602,7 +602,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
generic_args,
)
.intern(Interner);
- let func = Operand::from_bytes(vec![], ty);
+ let func = Operand::from_bytes(Box::default(), ty);
return self.lower_call_and_args(
func,
iter::once(*callee).chain(args.iter().copied()),
@@ -615,7 +615,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
let callee_ty = self.expr_ty_after_adjustments(*callee);
match &callee_ty.kind(Interner) {
chalk_ir::TyKind::FnDef(..) => {
- let func = Operand::from_bytes(vec![], callee_ty.clone());
+ let func = Operand::from_bytes(Box::default(), callee_ty.clone());
self.lower_call_and_args(
func,
args.iter().copied(),
@@ -1113,7 +1113,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
Some("start") => lp.take(),
Some("end") => rp.take(),
Some("exhausted") => {
- Some(Operand::from_bytes(vec![0], TyBuilder::bool()))
+ Some(Operand::from_bytes(Box::new([0]), TyBuilder::bool()))
}
_ => None,
};
@@ -1395,46 +1395,43 @@ impl<'ctx> MirLowerCtx<'ctx> {
}
fn lower_literal_to_operand(&mut self, ty: Ty, l: &Literal) -> Result<Operand> {
- let size = self
- .db
- .layout_of_ty(ty.clone(), self.db.trait_environment_for_body(self.owner))?
- .size
- .bytes_usize();
- let bytes = match l {
+ let size = || {
+ self.db
+ .layout_of_ty(ty.clone(), self.db.trait_environment_for_body(self.owner))
+ .map(|it| it.size.bytes_usize())
+ };
+ const USIZE_SIZE: usize = mem::size_of::<usize>();
+ let bytes: Box<[_]> = match l {
hir_def::hir::Literal::String(b) => {
- let b = b.as_bytes();
- let mut data = Vec::with_capacity(mem::size_of::<usize>() * 2);
- data.extend(0usize.to_le_bytes());
- data.extend(b.len().to_le_bytes());
- let mut mm = MemoryMap::default();
- mm.insert(0, b.to_vec());
- return Ok(Operand::from_concrete_const(data, mm, ty));
+ let mut data = [0; { 2 * USIZE_SIZE }];
+ data[..USIZE_SIZE].copy_from_slice(&0usize.to_le_bytes());
+ data[USIZE_SIZE..].copy_from_slice(&b.len().to_le_bytes());
+ let mm = MemoryMap::simple(b.as_bytes().into());
+ return Ok(Operand::from_concrete_const(Box::new(data), mm, ty));
}
hir_def::hir::Literal::CString(b) => {
- let bytes = b.iter().copied().chain(iter::once(0)).collect::<Vec<_>>();
-
- let mut data = Vec::with_capacity(mem::size_of::<usize>() * 2);
- data.extend(0usize.to_le_bytes());
- data.extend(bytes.len().to_le_bytes());
- let mut mm = MemoryMap::default();
- mm.insert(0, bytes);
- return Ok(Operand::from_concrete_const(data, mm, ty));
+ let bytes = b.iter().copied().chain(iter::once(0)).collect::<Box<_>>();
+
+ let mut data = [0; { 2 * USIZE_SIZE }];
+ data[..USIZE_SIZE].copy_from_slice(&0usize.to_le_bytes());
+ data[USIZE_SIZE..].copy_from_slice(&bytes.len().to_le_bytes());
+ let mm = MemoryMap::simple(bytes);
+ return Ok(Operand::from_concrete_const(Box::new(data), mm, ty));
}
hir_def::hir::Literal::ByteString(b) => {
- let mut data = Vec::with_capacity(mem::size_of::<usize>() * 2);
- data.extend(0usize.to_le_bytes());
- data.extend(b.len().to_le_bytes());
- let mut mm = MemoryMap::default();
- mm.insert(0, b.to_vec());
- return Ok(Operand::from_concrete_const(data, mm, ty));
+ let mut data = [0; { 2 * USIZE_SIZE }];
+ data[..USIZE_SIZE].copy_from_slice(&0usize.to_le_bytes());
+ data[USIZE_SIZE..].copy_from_slice(&b.len().to_le_bytes());
+ let mm = MemoryMap::simple(b.clone());
+ return Ok(Operand::from_concrete_const(Box::new(data), mm, ty));
}
- hir_def::hir::Literal::Char(c) => u32::from(*c).to_le_bytes().into(),
- hir_def::hir::Literal::Bool(b) => vec![*b as u8],
- hir_def::hir::Literal::Int(it, _) => it.to_le_bytes()[0..size].into(),
- hir_def::hir::Literal::Uint(it, _) => it.to_le_bytes()[0..size].into(),
- hir_def::hir::Literal::Float(f, _) => match size {
- 8 => f.into_f64().to_le_bytes().into(),
- 4 => f.into_f32().to_le_bytes().into(),
+ hir_def::hir::Literal::Char(c) => Box::new(u32::from(*c).to_le_bytes()),
+ hir_def::hir::Literal::Bool(b) => Box::new([*b as u8]),
+ hir_def::hir::Literal::Int(it, _) => Box::from(&it.to_le_bytes()[0..size()?]),
+ hir_def::hir::Literal::Uint(it, _) => Box::from(&it.to_le_bytes()[0..size()?]),
+ hir_def::hir::Literal::Float(f, _) => match size()? {
+ 8 => Box::new(f.into_f64().to_le_bytes()),
+ 4 => Box::new(f.into_f32().to_le_bytes()),
_ => {
return Err(MirLowerError::TypeError("float with size other than 4 or 8 bytes"))
}
@@ -1483,7 +1480,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
&mut self,
prev_block: BasicBlockId,
place: Place,
- cv: Vec<u8>,
+ cv: Box<[u8]>,
ty: Ty,
span: MirSpan,
) -> Result<()> {