From f5e9287798fa0015d139e74138b8d117a9a4095a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 3 Oct 2024 17:20:31 -0700 Subject: [PATCH] weave the thread of fate lifetime annotations hold &mut Context while scripts are runnable --- src/runner/runner.rs | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/runner/runner.rs b/src/runner/runner.rs index aaa4547..2d44869 100644 --- a/src/runner/runner.rs +++ b/src/runner/runner.rs @@ -11,6 +11,7 @@ pub enum Error{ }, RustLua(mlua::Error), Script(super::instance::GetScriptError), + NoContext, } impl std::fmt::Display for Error{ fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ @@ -42,16 +43,37 @@ impl Runner{ init(&runner.lua).map_err(Error::RustLua)?; Ok(runner) } - pub fn run_script(&self,script:super::instance::Script,context:&mut Context)->Result<(),Error>{ - let (name,source)=script.get_name_source(context).map_err(Error::Script)?; - self.lua.globals().set("script",script).map_err(Error::RustLua)?; + pub fn runnable_context<'a>(self,context:&'a mut Context,services:crate::place::Services)->Result,Error>{ //this makes set_app_data shut up about the lifetime self.lua.set_app_data::<&'static mut rbx_dom_weak::WeakDom>(unsafe{core::mem::transmute(&mut context.dom)}); - let r=self.lua.load(source.as_str()) - .set_name(name) - .exec().map_err(|error|Error::Lua{source,error}); - self.lua.remove_app_data::<&'static mut rbx_dom_weak::WeakDom>(); - r?; - Ok(()) + Ok(Runnable{ + lua:self.lua, + _lifetime:&std::marker::PhantomData + }) + } +} + +//Runnable is the same thing but has context set, which it holds the lifetime for. +pub struct Runnable<'a>{ + lua:mlua::Lua, + _lifetime:&'a std::marker::PhantomData<()> +} +impl Runnable<'_>{ + pub fn drop_context(self)->Runner{ + self.lua.remove_app_data::<&'static mut rbx_dom_weak::WeakDom>(); + Runner{ + lua:self.lua, + } + } + pub fn run_script(&self,script:super::instance::Script)->Result<(),Error>{ + let (name,source)={ + let dom=&mut *self.lua.app_data_mut::<&'static mut rbx_dom_weak::WeakDom>().ok_or(Error::NoContext)?; + let (name,source)=script.get_name_source(Context::from_mut(dom)).map_err(Error::Script)?; + self.lua.globals().set("script",script).map_err(Error::RustLua)?; + (name,source) + }; + self.lua.load(source.as_str()) + .set_name(name) + .exec().map_err(|error|Error::Lua{source,error}) } }