the "transmute lifetimes" solution
This commit is contained in:
parent
acfdc1bd5e
commit
aa0bee9f69
@ -10,16 +10,17 @@ pub fn class_is_a(class:&str,superclass:&str)->bool{
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct Context{
|
pub struct Context{
|
||||||
pub(crate)dom:WeakDom,
|
pub(crate)dom:WeakDom,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Context{
|
impl Context{
|
||||||
pub fn new(dom:WeakDom)->Context{
|
pub const fn new(dom:WeakDom)->Context{
|
||||||
Context{dom}
|
Context{dom}
|
||||||
}
|
}
|
||||||
pub fn into_inner(self)->WeakDom{
|
pub fn from_mut(dom:&mut WeakDom)->&mut Context{
|
||||||
self.dom
|
unsafe{&mut *(dom as *mut WeakDom as *mut Context)}
|
||||||
}
|
}
|
||||||
/// Creates an iterator over all items of a particular class.
|
/// Creates an iterator over all items of a particular class.
|
||||||
pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator<Item=Ref>+'a{
|
pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator<Item=Ref>+'a{
|
||||||
|
@ -26,7 +26,8 @@ impl Instance{
|
|||||||
|
|
||||||
// LMAO look at this function!
|
// LMAO look at this function!
|
||||||
fn dom<T>(lua:&mlua::Lua,mut f:impl FnMut(&mut WeakDom)->mlua::Result<T>)->mlua::Result<T>{
|
fn dom<T>(lua:&mlua::Lua,mut f:impl FnMut(&mut WeakDom)->mlua::Result<T>)->mlua::Result<T>{
|
||||||
f(&mut *lua.app_data_mut::<WeakDom>().ok_or(mlua::Error::runtime("DataModel missing"))?)
|
let mut dom=lua.app_data_mut::<&'static mut WeakDom>().ok_or(mlua::Error::runtime("DataModel missing"))?;
|
||||||
|
f(&mut *dom)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn coerce_float(value:&mlua::Value)->Option<f32>{
|
fn coerce_float(value:&mlua::Value)->Option<f32>{
|
||||||
|
@ -76,19 +76,16 @@ impl Runner{
|
|||||||
init(&runner.lua)?;
|
init(&runner.lua)?;
|
||||||
Ok(runner)
|
Ok(runner)
|
||||||
}
|
}
|
||||||
pub fn run_script(&self,script:crate::script::Script,context:Context)->(Context,Result<(),Error>){
|
pub fn run_script(&self,script:crate::script::Script,context:&mut Context)->Result<(),Error>{
|
||||||
let yoink=script.name_source(&context);
|
let yoink=script.name_source(context);
|
||||||
self.lua.set_app_data(context.dom);
|
//this makes set_app_data shut up about the lifetime
|
||||||
let r=(||{
|
self.lua.set_app_data::<&'static mut rbx_dom_weak::WeakDom>(unsafe{core::mem::transmute(&mut context.dom)});
|
||||||
let (name,source)=yoink.map_err(Error::Script)?;
|
let (name,source)=yoink.map_err(Error::Script)?;
|
||||||
self.lua.globals().set("script",super::instance::Instance::from(script)).map_err(Error::Lua)?;
|
self.lua.globals().set("script",super::instance::Instance::from(script)).map_err(Error::Lua)?;
|
||||||
self.lua.load(source)
|
self.lua.load(source)
|
||||||
.set_name(name)
|
.set_name(name)
|
||||||
.exec().map_err(Error::Lua)?;
|
.exec().map_err(Error::Lua)?;
|
||||||
|
self.lua.remove_app_data::<&'static mut rbx_dom_weak::WeakDom>();
|
||||||
Ok(())
|
Ok(())
|
||||||
})();
|
|
||||||
let dom=self.lua.remove_app_data()
|
|
||||||
.expect("Fatal: Lua lost the dom");
|
|
||||||
(Context::new(dom),r)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user