diff --git a/Cargo.lock b/Cargo.lock index c11a571..66bdc16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,6 +32,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "blake3" version = "1.5.4" @@ -121,6 +127,16 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "luau0-src" version = "0.10.3+luau640" @@ -138,15 +154,15 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mlua" -version = "0.9.9" +version = "0.10.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d111deb18a9c9bd33e1541309f4742523bfab01d276bfa9a27519f6de9c11dc7" +checksum = "200dd4c8e5f81416d43a023b9921c3cbf01d828094b23a90b26826c3840ba4f3" dependencies = [ "bstr", "libloading", "mlua-sys", "num-traits", - "once_cell", + "parking_lot", "rustc-hash", ] @@ -172,10 +188,27 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "parking_lot" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] [[package]] name = "paste" @@ -328,7 +361,7 @@ source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" checksum = "d7a390c44034fa448c53bd0983dfc2d70d8d6b2f65be4f164d4bec8b6a2a2d09" dependencies = [ "base64", - "bitflags", + "bitflags 1.3.2", "blake3", "lazy_static", "rand", @@ -336,6 +369,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "rmp" version = "0.8.14" @@ -377,6 +419,12 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.210" @@ -409,6 +457,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + [[package]] name = "syn" version = "2.0.77" diff --git a/Cargo.toml b/Cargo.toml index 498cf3c..cfbf04d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ authors = ["Rhys Lloyd "] [dependencies] glam = "0.29.0" -mlua = { version = "0.9.9", features = ["luau"] } +mlua = { version = "0.10.0-beta", features = ["luau"] } phf = { version = "0.11.2", features = ["macros"] } rbx_dom_weak = { version = "2.7.0", registry = "strafesnet" } rbx_reflection = { version = "4.7.0", registry = "strafesnet" } diff --git a/src/runner/cframe.rs b/src/runner/cframe.rs index c1f60fa..e9f77c2 100644 --- a/src/runner/cframe.rs +++ b/src/runner/cframe.rs @@ -59,7 +59,7 @@ impl From for CFrame{ } } -pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ +pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ let cframe_table=lua.create_table()?; //CFrame.new @@ -126,12 +126,12 @@ pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Err } impl mlua::UserData for CFrame{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(fields:&mut F){ + fn add_fields>(fields:&mut F){ //CFrame.p fields.add_field_method_get("p",|_,this|Ok(Vector3(this.0.translation))); } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ + fn add_methods>(methods:&mut M){ methods.add_method("components",|_,this,()|Ok(( this.0.translation.x, this.0.translation.y, diff --git a/src/runner/color3.rs b/src/runner/color3.rs index 7952a89..93b8c68 100644 --- a/src/runner/color3.rs +++ b/src/runner/color3.rs @@ -15,7 +15,7 @@ impl Into for Color3{ } } -pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ +pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ let color3_table=lua.create_table()?; color3_table.raw_set("new", @@ -38,7 +38,7 @@ fn lerp(lhs:f32,rhs:f32,t:f32)->f32{ } impl mlua::UserData for Color3{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(fields:&mut F){ + fn add_fields>(fields:&mut F){ fields.add_field_method_get("r",|_,this|Ok(this.r)); fields.add_field_method_set("r",|_,this,val|{ this.r=val; @@ -55,7 +55,7 @@ impl mlua::UserData for Color3{ Ok(()) }); } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ + fn add_methods>(methods:&mut M){ methods.add_method("Lerp",|_,this,(other,t):(Self,f32)| Ok(Color3::new( lerp(this.r,other.r,t), diff --git a/src/runner/enum.rs b/src/runner/enum.rs index 27f2df0..29d500b 100644 --- a/src/runner/enum.rs +++ b/src/runner/enum.rs @@ -19,16 +19,16 @@ impl<'a> EnumItem<'a>{ } } -pub fn set_globals(_lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ +pub fn set_globals(_lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ globals.set("Enum",EnumItems) } impl mlua::UserData for EnumItem<'_>{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ + fn add_fields>(_fields:&mut F){ } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ - methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItem<'lua>,mlua::String)|{ - match this.ed.items.get(val.to_str()?){ + fn add_methods>(methods:&mut M){ + methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,val):(EnumItem<'_>,mlua::String)|{ + match this.ed.items.get(&*val.to_str()?){ Some(&id)=>Enum(id).into_lua(lua), None=>mlua::Value::Nil.into_lua(lua), } @@ -38,12 +38,12 @@ impl mlua::UserData for EnumItem<'_>{ type_from_lua_userdata_lua_lifetime!(EnumItem); impl mlua::UserData for EnumItems{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ + fn add_fields>(_fields:&mut F){ } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ + fn add_methods>(methods:&mut M){ methods.add_meta_function(mlua::MetaMethod::Index,|lua,(_,val):(Self,mlua::String)|{ let db=rbx_reflection_database::get(); - match db.enums.get(val.to_str()?){ + match db.enums.get(&*val.to_str()?){ Some(ed)=>EnumItem::new(ed).into_lua(lua), None=>mlua::Value::Nil.into_lua(lua), } @@ -53,9 +53,9 @@ impl mlua::UserData for EnumItems{ type_from_lua_userdata!(EnumItems); impl mlua::UserData for Enum{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(_fields:&mut F){ + fn add_fields>(_fields:&mut F){ } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(_methods:&mut M){ + fn add_methods>(_methods:&mut M){ } } type_from_lua_userdata!(Enum); diff --git a/src/runner/instance.rs b/src/runner/instance.rs index 9b44206..a99f56e 100644 --- a/src/runner/instance.rs +++ b/src/runner/instance.rs @@ -9,34 +9,34 @@ use super::vector3::Vector3; /// A store of created functions for each Roblox class. /// Functions are created the first time they are accessed and stored in this data structure. #[derive(Default)] -struct ClassFunctions<'a>{ +struct ClassFunctions{ classes:HashMap<&'static str,//ClassName HashMap<&'static str,//Function name - mlua::Function<'a> + mlua::Function > > } -fn place_id<'lua>(lua:&'lua mlua::Lua,tuple:mlua::MultiValue<'lua>)->mlua::Result>{ +fn place_id(lua:&mlua::Lua,tuple:mlua::MultiValue)->mlua::Result{ 0.into_lua_multi(lua) } -type FPointer=for<'lua> fn(&'lua mlua::Lua,mlua::MultiValue<'lua>)->mlua::Result>; +type FPointer=fn(&mlua::Lua,mlua::MultiValue)->mlua::Result; static CLASS_FUNCTION_DATABASE:phf::Map<&str,phf::Map<&str,FPointer>>=phf::phf_map!{ "DataModel"=>phf::phf_map!{ "GetService"=>place_id as FPointer, } }; -pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ +pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ //class functions store - lua.set_app_data::>(ClassFunctions::default()); + lua.set_app_data(ClassFunctions::default()); let instance_table=lua.create_table()?; //Instance.new instance_table.raw_set("new", lua.create_function(|lua,(class_name,parent):(mlua::String,Option)|{ - let class_name_str=class_name.to_str()?; + let class_name_str=&*class_name.to_str()?; let parent=parent.ok_or(mlua::Error::runtime("Nil Parent not yet supported"))?; dom_mut(lua,|dom|{ //TODO: Nil instances @@ -55,9 +55,9 @@ fn dom_mut(lua:&mlua::Lua,mut f:impl FnMut(&mut WeakDom)->mlua::Result)->m let mut dom=lua.app_data_mut::<&'static mut WeakDom>().ok_or(mlua::Error::runtime("DataModel missing"))?; f(&mut *dom) } -fn class_functions_mut(lua:&mlua::Lua,mut f:impl FnMut(&mut ClassFunctions<'_>)->mlua::Result)->mlua::Result{ - let mut dom=lua.app_data_mut::>().ok_or(mlua::Error::runtime("ClassFunctions missing"))?; - f(&mut *dom) +fn class_functions_mut(lua:&mlua::Lua,mut f:impl FnMut(&mut ClassFunctions)->mlua::Result)->mlua::Result{ + let mut cf=lua.app_data_mut::().ok_or(mlua::Error::runtime("ClassFunctions missing"))?; + f(&mut *cf) } fn coerce_float32(value:&mlua::Value)->Option{ @@ -141,7 +141,7 @@ impl<'a> Iterator for SuperClassIter<'a> { } impl mlua::UserData for Instance{ - fn add_fields<'lua,F:mlua::UserDataFields<'lua,Self>>(fields:&mut F){ + fn add_fields>(fields:&mut F){ fields.add_field_method_get("Parent",|lua,this|{ dom_mut(lua,|dom|{ let instance=this.get(dom)?; @@ -176,7 +176,7 @@ impl mlua::UserData for Instance{ }) }); } - fn add_methods<'lua,M:mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ + fn add_methods>(methods:&mut M){ methods.add_method("GetChildren",|lua,this,_:()| dom_mut(lua,|dom|{ let instance=this.get(dom)?; @@ -189,8 +189,8 @@ impl mlua::UserData for Instance{ Ok(children) }) ); - let ffc=|lua,this:&Self,(name,search_descendants):(mlua::String,Option)|{ - let name_str=name.to_str()?; + fn ffc(lua:&mlua::Lua,this:&Instance,(name,search_descendants):(mlua::String,Option))->mlua::Result>{ + let name_str=&*name.to_str()?; dom_mut(lua,|dom|{ let instance=this.get(dom)?; Ok( @@ -203,11 +203,11 @@ impl mlua::UserData for Instance{ ) ) }) - }; + } methods.add_method("FindFirstChild",ffc); methods.add_method("WaitForChild",ffc); methods.add_method("FindFirstChildOfClass",|lua,this,(class,search_descendants):(mlua::String,Option)|{ - let class_str=class.to_str()?; + let class_str=&*class.to_str()?; dom_mut(lua,|dom|{ Ok( match search_descendants.unwrap_or(false){ @@ -234,7 +234,7 @@ impl mlua::UserData for Instance{ methods.add_method("IsA",|lua,this,classname:mlua::String| dom_mut(lua,|dom|{ let instance=this.get(dom)?; - Ok(crate::context::class_is_a(instance.class.as_str(),classname.to_str()?)) + Ok(crate::context::class_is_a(instance.class.as_str(),&*classname.to_str()?)) }) ); methods.add_method("Destroy",|lua,this,()| @@ -244,7 +244,7 @@ impl mlua::UserData for Instance{ }) ); methods.add_meta_function(mlua::MetaMethod::Index,|lua,(this,index):(Instance,mlua::String)|{ - let index_str=index.to_str()?; + let index_str=&*index.to_str()?; dom_mut(lua,|dom|{ let instance=this.get(dom)?; //Find existing property @@ -275,7 +275,7 @@ impl mlua::UserData for Instance{ Some(occupied_entry.get().clone()) }, Entry::Vacant(vacant_entry)=>{ - Some(vacant_entry.insert(unsafe{core::mem::transmute(lua.create_function(function_pointer)?)}).clone()) + Some(vacant_entry.insert(lua.create_function(function_pointer)?).clone()) }, } }, @@ -286,7 +286,7 @@ impl mlua::UserData for Instance{ match class_functions.get_entry(index_str){ Some((&static_index_str,function_pointer))=>{ let mut h=HashMap::new(); - h.entry(static_index_str).or_insert(unsafe{core::mem::transmute(lua.create_function(function_pointer)?)}); + h.entry(static_index_str).or_insert(lua.create_function(function_pointer)?); vacant_entry.insert(h).get(static_index_str).map(|f|f.clone()) }, None=>None, @@ -296,10 +296,7 @@ impl mlua::UserData for Instance{ }, None=>None, }; - Ok(f.map(|f|{ - let f_static:mlua::Function::<'static>=unsafe{core::mem::transmute(f)}; - f_static - })) + Ok(f) })?{ return Ok(ret.into_lua(lua)); } @@ -315,7 +312,7 @@ impl mlua::UserData for Instance{ dom_mut(lua,|dom|{ let instance=this.get_mut(dom)?; //println!("__newindex t={} i={index:?} v={value:?}",instance.name); - let index_str=index.to_str()?; + let index_str=&*index.to_str()?; let db=rbx_reflection_database::get(); let class=db.classes.get(instance.class.as_str()).ok_or(mlua::Error::runtime("Class missing"))?; let mut iter=SuperClassIter{ @@ -338,7 +335,7 @@ impl mlua::UserData for Instance{ &mlua::Value::Number(num)=>Ok(rbx_types::Enum::from_u32(num as u32)), mlua::Value::String(s)=>{ let e=db.enums.get(enum_name).ok_or(mlua::Error::runtime("Database DataType Enum name does not exist"))?; - Ok(rbx_types::Enum::from_u32(*e.items.get(s.to_str()?).ok_or(mlua::Error::runtime("Invalid enum item"))?)) + Ok(rbx_types::Enum::from_u32(*e.items.get(&*s.to_str()?).ok_or(mlua::Error::runtime("Invalid enum item"))?)) }, mlua::Value::UserData(any_user_data)=>{ let e:super::r#enum::Enum=any_user_data.take()?; diff --git a/src/runner/macros.rs b/src/runner/macros.rs index 8121af8..33f78bc 100644 --- a/src/runner/macros.rs +++ b/src/runner/macros.rs @@ -1,7 +1,7 @@ macro_rules! type_from_lua_userdata{ ($asd:ident)=>{ - impl<'lua> mlua::FromLua<'lua> for $asd{ - fn from_lua(value:mlua::Value<'lua>,_lua:&'lua mlua::Lua)->Result{ + impl mlua::FromLua for $asd{ + fn from_lua(value:mlua::Value,_lua:&mlua::Lua)->Result{ match value{ mlua::Value::UserData(ud)=>ud.take(), other=>Err(mlua::Error::runtime(format!("Expected {} got {:?}",stringify!($asd),other))), @@ -12,8 +12,8 @@ macro_rules! type_from_lua_userdata{ } macro_rules! type_from_lua_userdata_lua_lifetime{ ($asd:ident)=>{ - impl<'lua> mlua::FromLua<'lua> for $asd<'lua>{ - fn from_lua(value:mlua::Value<'lua>,_lua:&'lua mlua::Lua)->Result{ + impl mlua::FromLua for $asd<'_>{ + fn from_lua(value:mlua::Value,_lua:&mlua::Lua)->Result{ match value{ mlua::Value::UserData(ud)=>ud.take(), other=>Err(mlua::Error::runtime(format!("Expected {} got {:?}",stringify!($asd),other))), diff --git a/src/runner/vector3.rs b/src/runner/vector3.rs index 7b33eec..2e543de 100644 --- a/src/runner/vector3.rs +++ b/src/runner/vector3.rs @@ -7,7 +7,7 @@ impl Vector3{ } } -pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table<'_>)->Result<(),mlua::Error>{ +pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{ let vector3_table=lua.create_table()?; //Vector3.new @@ -35,7 +35,7 @@ impl From for Vector3{ } impl mlua::UserData for Vector3{ - fn add_fields<'lua,F: mlua::UserDataFields<'lua,Self>>(fields: &mut F){ + fn add_fields>(fields:&mut F){ fields.add_field_method_get("magnitude",|_,this|Ok(this.0.length())); fields.add_field_method_get("x",|_,this|Ok(this.0.x)); fields.add_field_method_set("x",|_,this,val|{ @@ -54,7 +54,7 @@ impl mlua::UserData for Vector3{ }); } - fn add_methods<'lua,M: mlua::UserDataMethods<'lua,Self>>(methods:&mut M){ + fn add_methods>(methods:&mut M){ //methods.add_method("area",|_,this,()| Ok(this.length * this.width)); methods.add_meta_function(mlua::MetaMethod::Add,|_,(this,val):(Self,Self)|Ok(Self(this.0+val.0)));