Skip to content

Commit 6c283b4

Browse files
committed
extended pre-leaking technique to other methods
1 parent 7caee44 commit 6c283b4

File tree

1 file changed

+9
-12
lines changed

1 file changed

+9
-12
lines changed

src/lib.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -164,16 +164,12 @@ impl<T: Default, N> GenericArray<T, N> where N: ArrayLength<T> {
164164
/// Function constructing an array filled with default values
165165
pub fn new() -> GenericArray<T, N> {
166166
unsafe {
167-
let mut res: GenericArray<T, N> = mem::uninitialized();
168-
if let Err(e) = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
169-
for r in res.iter_mut() {
170-
ptr::write(r, T::default())
171-
}
172-
})) {
173-
std::mem::forget(res);
174-
std::panic::resume_unwind(e);
175-
};
176-
res
167+
let mut res : NoDrop<GenericArray<T, N>> =
168+
NoDrop::new(std::mem::uninitialized());
169+
for r in res.iter_mut() {
170+
ptr::write(r, T::default())
171+
}
172+
res.into_inner()
177173
}
178174
}
179175

@@ -192,9 +188,10 @@ impl<T: Clone, N> GenericArray<T, N> where N: ArrayLength<T> {
192188
impl<T: Clone, N> Clone for GenericArray<T, N> where N: ArrayLength<T> {
193189
fn clone(&self) -> GenericArray<T, N> {
194190
unsafe {
195-
let mut res: GenericArray<T, N> = mem::uninitialized();
191+
let mut res : NoDrop<GenericArray<T, N>> =
192+
NoDrop::new(std::mem::uninitialized());
196193
for i in 0..N::to_usize() { ptr::write(&mut res[i], self[i].clone()) }
197-
res
194+
res.into_inner()
198195
}
199196
}
200197
}

0 commit comments

Comments
 (0)