diff --git a/hlua/src/functions_write.rs b/hlua/src/functions_write.rs index c7e6af9..561edd6 100644 --- a/hlua/src/functions_write.rs +++ b/hlua/src/functions_write.rs @@ -170,6 +170,16 @@ pub trait FunctionExt

{ fn call_mut(&mut self, params: P) -> Self::Output; } +// Called when an object inside Lua is being dropped. +#[inline] +extern "C" fn closure_destructor_wrapper(lua: *mut ffi::lua_State) -> libc::c_int { + unsafe { + let obj = ffi::lua_touserdata(lua, -1); + ptr::drop_in_place((obj as *mut u8) as *mut T); + 0 + } +} + macro_rules! impl_function_ext { () => ( impl FunctionExt<()> for Function where Z: FnMut() -> R { @@ -214,7 +224,7 @@ macro_rules! impl_function_ext { Err(_) => unreachable!(), }; - ffi::lua_pushcfunction(lua.as_mut_lua().0, ::userdata::destructor_wrapper::); + ffi::lua_pushcfunction(lua.as_mut_lua().0, closure_destructor_wrapper::); ffi::lua_settable(lua.as_mut_lua().0, -3); } ffi::lua_setmetatable(lua_raw.0, -2); @@ -281,7 +291,7 @@ macro_rules! impl_function_ext { Err(_) => unreachable!(), }; - ffi::lua_pushcfunction(lua.as_mut_lua().0, ::userdata::destructor_wrapper::); + ffi::lua_pushcfunction(lua.as_mut_lua().0, closure_destructor_wrapper::); ffi::lua_settable(lua.as_mut_lua().0, -3); } ffi::lua_setmetatable(lua_raw.0, -2); @@ -552,7 +562,7 @@ mod tests { } } { - let foo = Foo { }; + let foo = ::std::rc::Rc::new(Foo { }); { let mut lua = Lua::new(); diff --git a/hlua/src/userdata.rs b/hlua/src/userdata.rs index 0253899..799c889 100644 --- a/hlua/src/userdata.rs +++ b/hlua/src/userdata.rs @@ -18,7 +18,7 @@ use LuaTable; // Called when an object inside Lua is being dropped. #[inline] -pub extern "C" fn destructor_wrapper(lua: *mut ffi::lua_State) -> libc::c_int { +extern "C" fn destructor_wrapper(lua: *mut ffi::lua_State) -> libc::c_int { unsafe { let obj = ffi::lua_touserdata(lua, -1); ptr::drop_in_place(obj as *mut TypeId);