Skip to content

Commit 2b0e6d2

Browse files
committed
Auto merge of #67003 - cjgillot:corrida, r=Mark-Simulacrum
Fix TypedArena returning wrong pointers for recursive allocations Closes #67001
2 parents 14195e1 + d84eb50 commit 2b0e6d2

File tree

1 file changed

+12
-47
lines changed

1 file changed

+12
-47
lines changed

src/libarena/lib.rs

+12-47
Original file line numberDiff line numberDiff line change
@@ -202,53 +202,18 @@ impl<T> TypedArena<T> {
202202
#[inline]
203203
pub fn alloc_from_iter<I: IntoIterator<Item = T>>(&self, iter: I) -> &mut [T] {
204204
assert!(mem::size_of::<T>() != 0);
205-
let mut iter = iter.into_iter();
206-
let size_hint = iter.size_hint();
207-
208-
match size_hint {
209-
(min, Some(max)) if min == max => {
210-
// We know the exact number of elements the iterator will produce here
211-
let len = min;
212-
213-
if len == 0 {
214-
return &mut [];
215-
}
216-
217-
self.ensure_capacity(len);
218-
219-
let slice = self.ptr.get();
220-
221-
unsafe {
222-
let mut ptr = self.ptr.get();
223-
for _ in 0..len {
224-
// Write into uninitialized memory.
225-
ptr::write(ptr, iter.next().unwrap());
226-
// Advance the pointer.
227-
ptr = ptr.offset(1);
228-
// Update the pointer per iteration so if `iter.next()` panics
229-
// we destroy the correct amount
230-
self.ptr.set(ptr);
231-
}
232-
slice::from_raw_parts_mut(slice, len)
233-
}
234-
}
235-
_ => {
236-
cold_path(move || -> &mut [T] {
237-
let mut vec: SmallVec<[_; 8]> = iter.collect();
238-
if vec.is_empty() {
239-
return &mut [];
240-
}
241-
// Move the content to the arena by copying it and then forgetting
242-
// the content of the SmallVec
243-
unsafe {
244-
let len = vec.len();
245-
let start_ptr = self.alloc_raw_slice(len);
246-
vec.as_ptr().copy_to_nonoverlapping(start_ptr, len);
247-
vec.set_len(0);
248-
slice::from_raw_parts_mut(start_ptr, len)
249-
}
250-
})
251-
}
205+
let mut vec: SmallVec<[_; 8]> = iter.into_iter().collect();
206+
if vec.is_empty() {
207+
return &mut [];
208+
}
209+
// Move the content to the arena by copying it and then forgetting
210+
// the content of the SmallVec
211+
unsafe {
212+
let len = vec.len();
213+
let start_ptr = self.alloc_raw_slice(len);
214+
vec.as_ptr().copy_to_nonoverlapping(start_ptr, len);
215+
vec.set_len(0);
216+
slice::from_raw_parts_mut(start_ptr, len)
252217
}
253218
}
254219

0 commit comments

Comments
 (0)