Compare commits
2 Commits
73b7b50c43
...
01c603f483
Author | SHA1 | Date | |
---|---|---|---|
01c603f483 | |||
d4b9fd1615 |
@ -1,4 +1,4 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::{hash_map::Entry,HashMap};
|
||||||
|
|
||||||
use mlua::{IntoLua,IntoLuaMulti};
|
use mlua::{IntoLua,IntoLuaMulti};
|
||||||
use rbx_types::Ref;
|
use rbx_types::Ref;
|
||||||
@ -264,40 +264,42 @@ impl mlua::UserData for Instance{
|
|||||||
//find a function with a matching name
|
//find a function with a matching name
|
||||||
if let Some(ret)=class_functions_mut(lua,|cf|{
|
if let Some(ret)=class_functions_mut(lua,|cf|{
|
||||||
let class_str=instance.class.as_str();
|
let class_str=instance.class.as_str();
|
||||||
Ok(match cf.classes.entry(class_str){
|
let f=match CLASS_FUNCTION_DATABASE.get_entry(class_str){
|
||||||
std::collections::hash_map::Entry::Occupied(occupied_entry)=>{
|
Some((&static_class_str,class_functions))=>{
|
||||||
match occupied_entry.get().entry(index_str){
|
match cf.classes.entry(static_class_str){
|
||||||
std::collections::hash_map::Entry::Occupied(occupied_entry)=>{
|
Entry::Occupied(mut occupied_entry)=>{
|
||||||
Some(occupied_entry.get())
|
match class_functions.get_entry(index_str){
|
||||||
|
Some((&static_index_str,function_pointer))=>{
|
||||||
|
match occupied_entry.get_mut().entry(static_index_str){
|
||||||
|
Entry::Occupied(occupied_entry)=>{
|
||||||
|
Some(occupied_entry.get().clone())
|
||||||
|
},
|
||||||
|
Entry::Vacant(vacant_entry)=>{
|
||||||
|
Some(vacant_entry.insert(unsafe{core::mem::transmute(lua.create_function(function_pointer)?)}).clone())
|
||||||
|
},
|
||||||
|
}
|
||||||
},
|
},
|
||||||
std::collections::hash_map::Entry::Vacant(vacant_entry)=>{
|
|
||||||
match CLASS_FUNCTION_DATABASE.get(class_str)
|
|
||||||
.and_then(|class_functions|
|
|
||||||
class_functions.get(index_str)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Some(f_pointer)=>Some(&*vacant_entry.insert(lua.create_function(f_pointer)?)),
|
|
||||||
None=>None,
|
None=>None,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
Entry::Vacant(vacant_entry)=>{
|
||||||
},
|
match class_functions.get_entry(index_str){
|
||||||
std::collections::hash_map::Entry::Vacant(vacant_entry)=>{
|
Some((&static_index_str,function_pointer))=>{
|
||||||
match CLASS_FUNCTION_DATABASE.get(class_str)
|
|
||||||
.and_then(|class_functions|
|
|
||||||
class_functions.get(index_str)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Some(f_pointer)=>{
|
|
||||||
let mut h=HashMap::new();
|
let mut h=HashMap::new();
|
||||||
let lua_f=h.entry(index_str).or_insert(lua.create_function(f_pointer)?);
|
h.entry(static_index_str).or_insert(unsafe{core::mem::transmute(lua.create_function(function_pointer)?)});
|
||||||
vacant_entry.insert(h);
|
vacant_entry.insert(h).get(static_index_str).map(|f|f.clone())
|
||||||
Some(&*lua_f)
|
|
||||||
},
|
},
|
||||||
None=>None,
|
None=>None,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
}
|
||||||
|
},
|
||||||
|
None=>None,
|
||||||
|
};
|
||||||
|
Ok(f.map(|f|{
|
||||||
|
let f_static:mlua::Function::<'static>=unsafe{core::mem::transmute(f)};
|
||||||
|
f_static
|
||||||
|
}))
|
||||||
})?{
|
})?{
|
||||||
return Ok(ret.into_lua(lua));
|
return Ok(ret.into_lua(lua));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user