From cb64552c1f9e8a3d39f06143fcd2481c06c8ca13 Mon Sep 17 00:00:00 2001 From: Matthijs van Duin Date: Fri, 13 Oct 2023 23:59:22 +0200 Subject: [PATCH] use Vec's try_reserve_exact method (#3656) --- Cargo.toml | 2 +- src/externref.rs | 22 ++-------------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa4fe5e6e05..20fff4a690e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ description = """ Easy support for interacting between JS and Rust. """ edition = "2018" -rust-version = "1.56" +rust-version = "1.57" [package.metadata.docs.rs] features = ["serde-serialize"] diff --git a/src/externref.rs b/src/externref.rs index 340fdcbeb67..7eeb7237904 100644 --- a/src/externref.rs +++ b/src/externref.rs @@ -1,8 +1,5 @@ use crate::JsValue; -use std::alloc::{self, Layout}; use std::cell::Cell; -use std::mem; -use std::ptr; use std::slice; use std::vec::Vec; use std::cmp::max; @@ -46,23 +43,8 @@ impl Slab { internal_error("someone else allocated table entries?") } - // poor man's `try_reserve_exact` until that's stable - unsafe { - let new_cap = self.data.capacity() + extra; - let size = mem::size_of::() * new_cap; - let align = mem::align_of::(); - let layout = match Layout::from_size_align(size, align) { - Ok(l) => l, - Err(_) => internal_error("size/align layout failure"), - }; - let ptr = alloc::alloc(layout) as *mut usize; - if ptr.is_null() { - internal_error("allocation failure"); - } - ptr::copy_nonoverlapping(self.data.as_ptr(), ptr, self.data.len()); - let new_vec = Vec::from_raw_parts(ptr, self.data.len(), new_cap); - let mut old = mem::replace(&mut self.data, new_vec); - old.set_len(0); + if self.data.try_reserve_exact(extra).is_err() { + internal_error("allocation failure"); } }