Skip to content

Commit ba462c2

Browse files
committed
Eliminate box indirection in resources. Fixes #40.
1 parent 35c833b commit ba462c2

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

src/codegen_runtime.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub unsafe fn handle_nif_init_call(function: Option<for<'a> fn(NifEnv<'a>, NifTe
6666
use std;
6767
use ::resource::align_alloced_mem_for_struct;
6868
pub unsafe fn handle_drop_resource_struct_handle<T: NifResourceTypeProvider>(_env: NIF_ENV, handle: MUTABLE_NIF_RESOURCE_HANDLE) {
69-
let aligned = align_alloced_mem_for_struct::<Box<T>>(handle);
70-
let res = aligned as *mut Box<T>;
69+
let aligned = align_alloced_mem_for_struct::<T>(handle);
70+
let res = aligned as *mut T;
7171
std::mem::drop(std::ptr::read(res));
7272
}

src/resource.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,18 @@ pub unsafe fn align_alloced_mem_for_struct<T>(ptr: *const c_void) -> *const c_vo
8484
/// resource instance on creation, and decrements when dropped.
8585
pub struct ResourceCell<T> where T: NifResourceTypeProvider + Sync {
8686
raw: *const c_void,
87-
inner: *mut Box<T>,
87+
inner: *mut T,
8888
}
8989

9090
impl<T> ResourceCell<T> where T: NifResourceTypeProvider + Sync {
9191
/// Makes a new ResourceCell from the given type. Note that the type must have
9292
/// NifResourceTypeProvider implemented for it. See module documentation for info on this.
9393
pub fn new(data: T) -> Self {
94-
let alloc_size = get_alloc_size_struct::<Box<T>>();
94+
let alloc_size = get_alloc_size_struct::<T>();
9595
let mem_raw = unsafe { ::wrapper::resource::alloc_resource(T::get_type().res, alloc_size) };
96-
let aligned_mem = unsafe { align_alloced_mem_for_struct::<Box<T>>(mem_raw) } as *mut Box<T>;
96+
let aligned_mem = unsafe { align_alloced_mem_for_struct::<T>(mem_raw) as *mut T };
9797

98-
unsafe { ptr::write(aligned_mem, Box::new(data)) };
98+
unsafe { ptr::write(aligned_mem, data) };
9999

100100
ResourceCell {
101101
raw: mem_raw,
@@ -109,7 +109,7 @@ impl<T> ResourceCell<T> where T: NifResourceTypeProvider + Sync {
109109
None => return Err(NifError::BadArg),
110110
};
111111
unsafe { ::wrapper::resource::keep_resource(res_resource); }
112-
let casted_ptr = unsafe { align_alloced_mem_for_struct::<Box<T>>(res_resource) } as *mut Box<T>;
112+
let casted_ptr = unsafe { align_alloced_mem_for_struct::<T>(res_resource) as *mut T };
113113
Ok(ResourceCell {
114114
raw: res_resource,
115115
inner: casted_ptr,

0 commit comments

Comments
 (0)