Optimize non-wrapped userdata method calls

This commit is contained in:
Alex Orlenko 2021-06-20 12:38:47 +01:00
parent 14d5c2c887
commit 42b396d0d1
No known key found for this signature in database
GPG Key ID: 4C150C250863B96D
1 changed files with 8 additions and 4 deletions

View File

@ -2694,11 +2694,15 @@ impl<'lua, T: 'static + UserData> StaticUserDataMethods<'lua, T> {
Box::new(move |lua, mut args| { Box::new(move |lua, mut args| {
if let Some(front) = args.pop_front() { if let Some(front) = args.pop_front() {
let userdata = AnyUserData::from_lua(front, lua)?; let userdata = AnyUserData::from_lua(front, lua)?;
match userdata.type_id()? { // Try normal userdata first
id if id == TypeId::of::<T>() => { let err = match userdata.borrow::<T>() {
let ud = userdata.borrow::<T>()?; Ok(ud) => {
method(lua, &ud, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua) return method(lua, &ud, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua)
} }
Err(err) => err,
};
match userdata.type_id()? {
id if id == TypeId::of::<T>() => Err(err),
#[cfg(not(feature = "send"))] #[cfg(not(feature = "send"))]
id if id == TypeId::of::<Rc<RefCell<T>>>() => { id if id == TypeId::of::<Rc<RefCell<T>>>() => {
let ud = userdata.borrow::<Rc<RefCell<T>>>()?; let ud = userdata.borrow::<Rc<RefCell<T>>>()?;