diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2020-06-29 19:08:47 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2020-06-30 14:38:57 +1000 |
| commit | 3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8 (patch) | |
| tree | 78c4a790294b76756da802a039b0582c3f4d14ef | |
| parent | c977b8775dd72d191ff1d8e8dceaf4b4cd5db86c (diff) | |
| download | rust-3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8.tar.gz rust-3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8.zip | |
Avoid `unwrap_or_else` in `RawVec::allocate_in`.
This reduces the amount of LLVM IR generated by up to 1 or 2%.
| -rw-r--r-- | src/liballoc/raw_vec.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index 67ebdcc9f33..bcd7445ecf9 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -172,10 +172,21 @@ impl<T, A: AllocRef> RawVec<T, A> { if mem::size_of::<T>() == 0 { Self::new_in(alloc) } else { - let layout = Layout::array::<T>(capacity).unwrap_or_else(|_| capacity_overflow()); - alloc_guard(layout.size()).unwrap_or_else(|_| capacity_overflow()); + // We avoid `unwrap_or_else` here because it bloats the amount of + // LLVM IR generated. + let layout = match Layout::array::<T>(capacity) { + Ok(layout) => layout, + Err(_) => capacity_overflow(), + }; + match alloc_guard(layout.size()) { + Ok(_) => {} + Err(_) => capacity_overflow(), + } + let memory = match alloc.alloc(layout, init) { + Ok(memory) => memory, + Err(_) => handle_alloc_error(layout), + }; - let memory = alloc.alloc(layout, init).unwrap_or_else(|_| handle_alloc_error(layout)); Self { ptr: unsafe { Unique::new_unchecked(memory.ptr.cast().as_ptr()) }, cap: Self::capacity_from_bytes(memory.size), |
