mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-15 01:17:27 +00:00
Fix realloc problem in allocating smaller amounts
This commit is contained in:
parent
d7f4c21950
commit
2272803330
2 changed files with 11 additions and 6 deletions
|
@ -183,6 +183,7 @@ fn allocator() {
|
|||
*ptr = 23;
|
||||
*ptr2 = 32;
|
||||
let ptr = __rust_realloc(ptr, 4, 1, 8);
|
||||
let ptr = __rust_realloc(ptr, 8, 1, 3);
|
||||
let ptr2 = ((ptr as usize) + 1) as *mut u8;
|
||||
*ptr + *ptr2
|
||||
};
|
||||
|
|
|
@ -144,14 +144,18 @@ impl Evaluator<'_> {
|
|||
let [ptr, old_size, align, new_size] = args else {
|
||||
return Err(MirEvalError::TypeError("rustc_allocator args are not provided"));
|
||||
};
|
||||
let ptr = Address::from_bytes(ptr.get(self)?)?;
|
||||
let old_size = from_bytes!(usize, old_size.get(self)?);
|
||||
let new_size = from_bytes!(usize, new_size.get(self)?);
|
||||
let align = from_bytes!(usize, align.get(self)?);
|
||||
let result = self.heap_allocate(new_size, align);
|
||||
Interval { addr: result, size: old_size }
|
||||
.write_from_interval(self, Interval { addr: ptr, size: old_size })?;
|
||||
destination.write_from_bytes(self, &result.to_bytes())?;
|
||||
if old_size >= new_size {
|
||||
destination.write_from_interval(self, ptr.interval)?;
|
||||
} else {
|
||||
let ptr = Address::from_bytes(ptr.get(self)?)?;
|
||||
let align = from_bytes!(usize, align.get(self)?);
|
||||
let result = self.heap_allocate(new_size, align);
|
||||
Interval { addr: result, size: old_size }
|
||||
.write_from_interval(self, Interval { addr: ptr, size: old_size })?;
|
||||
destination.write_from_bytes(self, &result.to_bytes())?;
|
||||
}
|
||||
}
|
||||
_ => not_supported!("unknown alloc function"),
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue