shave this yak some more, make `Callback` type alias have two lifetimes
This commit is contained in:
parent
da1e1625b3
commit
ce7e8e61fd
15
src/lua.rs
15
src/lua.rs
|
@ -973,7 +973,7 @@ impl Lua {
|
||||||
|
|
||||||
fn create_callback_function<'lua, 'callback>(
|
fn create_callback_function<'lua, 'callback>(
|
||||||
&'lua self,
|
&'lua self,
|
||||||
func: Callback<'callback>,
|
func: Callback<'callback, 'static>,
|
||||||
) -> Result<Function<'lua>> {
|
) -> Result<Function<'lua>> {
|
||||||
unsafe extern "C" fn callback_call_impl(state: *mut ffi::lua_State) -> c_int {
|
unsafe extern "C" fn callback_call_impl(state: *mut ffi::lua_State) -> c_int {
|
||||||
callback_error(state, || {
|
callback_error(state, || {
|
||||||
|
@ -1066,16 +1066,11 @@ impl<'lua, 'scope> Scope<'lua, 'scope> {
|
||||||
R: ToLuaMulti<'callback>,
|
R: ToLuaMulti<'callback>,
|
||||||
F: 'scope + Fn(&'callback Lua, A) -> Result<R>,
|
F: 'scope + Fn(&'callback Lua, A) -> Result<R>,
|
||||||
{
|
{
|
||||||
let f: Box<
|
|
||||||
Fn(&'callback Lua, MultiValue<'callback>) -> Result<MultiValue<'callback>> + 'scope,
|
|
||||||
> = Box::new(move |lua, args| func(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua));
|
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// SCARY, we are transmuting the 'scope lifetime to 'static.
|
let f = Box::new(move |lua, args| {
|
||||||
let f: Box<
|
func(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua)
|
||||||
Fn(&'callback Lua, MultiValue<'callback>) -> Result<MultiValue<'callback>>,
|
});
|
||||||
> = mem::transmute(f);
|
let f = mem::transmute::<Callback<'callback, 'scope>, Callback<'callback, 'static>>(f);
|
||||||
|
|
||||||
let mut f = self.lua.create_callback_function(f)?;
|
let mut f = self.lua.create_callback_function(f)?;
|
||||||
|
|
||||||
f.0.drop_unref = false;
|
f.0.drop_unref = false;
|
||||||
|
|
|
@ -44,7 +44,8 @@ impl Drop for RegistryKey {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) type Callback<'lua> = Box<Fn(&'lua Lua, MultiValue<'lua>) -> Result<MultiValue<'lua>>>;
|
pub(crate) type Callback<'lua, 'a> =
|
||||||
|
Box<Fn(&'lua Lua, MultiValue<'lua>) -> Result<MultiValue<'lua>> + 'a>;
|
||||||
|
|
||||||
pub(crate) struct LuaRef<'lua> {
|
pub(crate) struct LuaRef<'lua> {
|
||||||
pub lua: &'lua Lua,
|
pub lua: &'lua Lua,
|
||||||
|
|
|
@ -72,8 +72,8 @@ pub enum MetaMethod {
|
||||||
///
|
///
|
||||||
/// [`UserData`]: trait.UserData.html
|
/// [`UserData`]: trait.UserData.html
|
||||||
pub struct UserDataMethods<'lua, T> {
|
pub struct UserDataMethods<'lua, T> {
|
||||||
pub(crate) methods: HashMap<StdString, Callback<'lua>>,
|
pub(crate) methods: HashMap<StdString, Callback<'lua, 'static>>,
|
||||||
pub(crate) meta_methods: HashMap<MetaMethod, Callback<'lua>>,
|
pub(crate) meta_methods: HashMap<MetaMethod, Callback<'lua, 'static>>,
|
||||||
pub(crate) _type: PhantomData<T>,
|
pub(crate) _type: PhantomData<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
self.meta_methods.insert(meta, Self::box_function(function));
|
self.meta_methods.insert(meta, Self::box_function(function));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_function<A, R, F>(function: F) -> Callback<'lua>
|
fn box_function<A, R, F>(function: F) -> Callback<'lua, 'static>
|
||||||
where
|
where
|
||||||
A: FromLuaMulti<'lua>,
|
A: FromLuaMulti<'lua>,
|
||||||
R: ToLuaMulti<'lua>,
|
R: ToLuaMulti<'lua>,
|
||||||
|
@ -184,7 +184,7 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
Box::new(move |lua, args| function(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua))
|
Box::new(move |lua, args| function(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_method<A, R, M>(method: M) -> Callback<'lua>
|
fn box_method<A, R, M>(method: M) -> Callback<'lua, 'static>
|
||||||
where
|
where
|
||||||
A: FromLuaMulti<'lua>,
|
A: FromLuaMulti<'lua>,
|
||||||
R: ToLuaMulti<'lua>,
|
R: ToLuaMulti<'lua>,
|
||||||
|
@ -205,7 +205,7 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn box_method_mut<A, R, M>(method: M) -> Callback<'lua>
|
fn box_method_mut<A, R, M>(method: M) -> Callback<'lua, 'static>
|
||||||
where
|
where
|
||||||
A: FromLuaMulti<'lua>,
|
A: FromLuaMulti<'lua>,
|
||||||
R: ToLuaMulti<'lua>,
|
R: ToLuaMulti<'lua>,
|
||||||
|
|
Loading…
Reference in New Issue