From 5127903c381d93f539f3ffd82f707fb1dba5df23 Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Sat, 8 Jul 2023 16:56:55 +0100 Subject: [PATCH] Remove generic type parameter from init_userdata_metatable --- src/lua.rs | 11 ++++++++++- src/scope.rs | 17 +++++++++++++---- src/util/mod.rs | 10 +++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/lua.rs b/src/lua.rs index 02c3fbd..21b8012 100644 --- a/src/lua.rs +++ b/src/lua.rs @@ -2631,12 +2631,21 @@ impl Lua { } } - init_userdata_metatable::>( + #[cfg(feature = "luau")] + let extra_init = None; + #[cfg(not(feature = "luau"))] + let extra_init: Option<&dyn Fn(*mut ffi::lua_State) -> Result<()>> = Some(&|state| { + ffi::lua_pushcfunction(state, util::userdata_destructor::>); + rawset_field(state, -2, "__gc") + }); + + init_userdata_metatable( state, metatable_index, field_getters_index, field_setters_index, methods_index, + extra_init, )?; // Pop extra tables to get metatable on top of the stack diff --git a/src/scope.rs b/src/scope.rs index a6f8b48..02fd5b6 100644 --- a/src/scope.rs +++ b/src/scope.rs @@ -16,8 +16,8 @@ use crate::userdata::{ }; use crate::userdata_impl::UserDataRegistrar; use crate::util::{ - assert_stack, check_stack, get_userdata, init_userdata_metatable, push_table, rawset_field, - take_userdata, StackGuard, + self, assert_stack, check_stack, get_userdata, init_userdata_metatable, push_table, + rawset_field, take_userdata, StackGuard, }; use crate::value::{FromLua, FromLuaMulti, IntoLua, IntoLuaMulti, MultiValue, Value}; @@ -384,7 +384,7 @@ impl<'lua, 'scope> Scope<'lua, 'scope> { })?; #[cfg(feature = "luau")] let ud_ptr = { - crate::util::push_userdata(state, UserDataCell::new(data), true)?; + util::push_userdata(state, UserDataCell::new(data), true)?; ffi::lua_touserdata(state, -1) as *const UserDataCell }; @@ -436,12 +436,21 @@ impl<'lua, 'scope> Scope<'lua, 'scope> { methods_index = Some(ffi::lua_absindex(state, -1)); } - init_userdata_metatable::>( + #[cfg(feature = "luau")] + let extra_init = None; + #[cfg(not(feature = "luau"))] + let extra_init: Option<&dyn Fn(*mut ffi::lua_State) -> Result<()>> = Some(&|state| { + ffi::lua_pushcfunction(state, util::userdata_destructor::>); + rawset_field(state, -2, "__gc") + }); + + init_userdata_metatable( state, metatable_index, field_getters_index, field_setters_index, methods_index, + extra_init, )?; let count = field_getters_index.map(|_| 1).unwrap_or(0) diff --git a/src/util/mod.rs b/src/util/mod.rs index b497032..570c332 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -544,12 +544,13 @@ pub unsafe fn init_userdata_metatable_newindex(state: *mut ffi::lua_State) -> Re // captured `__index` if no matches found. // The same is also applicable for `__newindex` metamethod and `field_setters` table. // Internally uses 9 stack spaces and does not call checkstack. -pub unsafe fn init_userdata_metatable( +pub unsafe fn init_userdata_metatable( state: *mut ffi::lua_State, metatable: c_int, field_getters: Option, field_setters: Option, methods: Option, + extra_init: Option<&dyn Fn(*mut ffi::lua_State) -> Result<()>>, ) -> Result<()> { ffi::lua_pushvalue(state, metatable); @@ -596,10 +597,9 @@ pub unsafe fn init_userdata_metatable( rawset_field(state, -2, "__newindex")?; } - #[cfg(not(feature = "luau"))] - { - ffi::lua_pushcfunction(state, userdata_destructor::); - rawset_field(state, -2, "__gc")?; + // Additional initialization + if let Some(extra_init) = extra_init { + extra_init(state)?; } ffi::lua_pushboolean(state, 0);