From ddda5fab587a2f1a5fb0baca5f12ae3db195cfb8 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Mon, 5 Aug 2024 19:17:38 +0200 Subject: [PATCH] Use single implementation for resource type open --- rustler/src/resource/registration.rs | 35 ++++++++++------------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/rustler/src/resource/registration.rs b/rustler/src/resource/registration.rs index bca8533a..ab45bd6f 100644 --- a/rustler/src/resource/registration.rs +++ b/rustler/src/resource/registration.rs @@ -198,7 +198,6 @@ unsafe extern "C" fn resource_dyncall( res.dyncall(env, call_data); } -#[cfg(not(feature = "nif_version_2_16"))] pub unsafe fn open_resource_type( env: *mut ErlNifEnv, name: &[u8], @@ -212,7 +211,7 @@ pub unsafe fn open_resource_type( let res = { let mut tried = MaybeUninit::uninit(); - rustler_sys::enif_open_resource_type_x(env, name_p, &init, flags, tried.as_mut_ptr()) + OPEN_RESOURCE_TYPE(env, name_p, &init, flags, tried.as_mut_ptr()) }; if res.is_null() { @@ -222,29 +221,19 @@ pub unsafe fn open_resource_type( } } -#[cfg(feature = "nif_version_2_16")] -pub unsafe fn open_resource_type( - env: *mut ErlNifEnv, - name: &[u8], - init: ErlNifResourceTypeInit, - flags: ErlNifResourceFlags, -) -> Option<*const ErlNifResourceType> { - // Panic if name is not null-terminated. - assert_eq!(name.last().cloned(), Some(0u8)); - - let name_p = name.as_ptr() as *const c_char; +type OpenResourceTypeFn = unsafe extern "C" fn( + *mut ErlNifEnv, + *const c_char, + *const ErlNifResourceTypeInit, + ErlNifResourceFlags, + *mut ErlNifResourceFlags, +) -> *const ErlNifResourceType; - let res = { - let mut tried = MaybeUninit::uninit(); - rustler_sys::enif_init_resource_type(env, name_p, &init, flags, tried.as_mut_ptr()) - }; +#[cfg(feature = "nif_version_2_16")] +static OPEN_RESOURCE_TYPE: OpenResourceTypeFn = rustler_sys::enif_init_resource_type; - if res.is_null() { - None - } else { - Some(res) - } -} +#[cfg(not(feature = "nif_version_2_16"))] +static OPEN_RESOURCE_TYPE: OpenResourceTypeFn = rustler_sys::enif_open_resource_type_x; const fn max(i: i32, j: i32) -> i32 { if i > j {