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);