diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index c5725f0e392..69bc88157f0 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -102,7 +102,7 @@ extern "C" CDECL void vec_reserve_shared(type_desc* ty, rust_vec** vp, size_t n_elts) { rust_task *task = rust_task_thread::get_task(); - reserve_vec(task, vp, n_elts * ty->size); + reserve_vec_exact(task, vp, n_elts * ty->size); } /** diff --git a/src/rt/rust_util.h b/src/rt/rust_util.h index 23c67422c39..07569db3ffa 100644 --- a/src/rt/rust_util.h +++ b/src/rt/rust_util.h @@ -178,15 +178,17 @@ inline size_t vec_size(size_t elems) { return sizeof(rust_vec) + sizeof(T) * elems; } -inline void reserve_vec(rust_task* task, rust_vec** vpp, size_t size) { +inline void reserve_vec_exact(rust_task* task, rust_vec** vpp, size_t size) { if (size > (*vpp)->alloc) { - size_t new_alloc = next_power_of_two(size); - *vpp = (rust_vec*)task->kernel->realloc(*vpp, new_alloc + - sizeof(rust_vec)); - (*vpp)->alloc = new_alloc; + *vpp = (rust_vec*)task->kernel->realloc(*vpp, size + sizeof(rust_vec)); + (*vpp)->alloc = size; } } +inline void reserve_vec(rust_task* task, rust_vec** vpp, size_t size) { + reserve_vec_exact(task, vpp, next_power_of_two(size)); +} + typedef rust_vec rust_str; inline rust_str *