diff --git a/crates/bevy_mod_scripting_core/src/bindings/script_system.rs b/crates/bevy_mod_scripting_core/src/bindings/script_system.rs index e6cd8390a6..e54fca8503 100644 --- a/crates/bevy_mod_scripting_core/src/bindings/script_system.rs +++ b/crates/bevy_mod_scripting_core/src/bindings/script_system.rs @@ -247,11 +247,10 @@ impl<'w, P: IntoScriptPluginParams> DynamicHandlerContext<'w, P> { }; // call the script - let runtime = P::readonly_configuration(guard.id()).runtime; let mut context = context.lock(); - P::handle(payload, context_key, label, &mut context, runtime, guard) + P::handle(payload, context_key, label, &mut context, guard) } } diff --git a/crates/bevy_mod_scripting_core/src/context.rs b/crates/bevy_mod_scripting_core/src/context.rs index 2a50e29374..b9b65b9131 100644 --- a/crates/bevy_mod_scripting_core/src/context.rs +++ b/crates/bevy_mod_scripting_core/src/context.rs @@ -1,5 +1,7 @@ //! Traits and types for managing script contexts. +use bevy_ecs::world::WorldId; + use crate::{ IntoScriptPluginParams, bindings::{ThreadWorldContainer, WorldContainer, WorldGuard}, @@ -26,9 +28,7 @@ pub type ContextPreHandlingInitializer

= pub type ContextLoadFn

= fn( attachment: &ScriptAttachment, content: &[u8], - context_initializers: &[ContextInitializer

], - pre_handling_initializers: &[ContextPreHandlingInitializer

], - runtime: &

::R, + world_id: WorldId, ) -> Result<

::C, ScriptError>; /// A strategy for reloading contexts @@ -36,9 +36,7 @@ pub type ContextReloadFn

= fn( attachment: &ScriptAttachment, content: &[u8], previous_context: &mut

::C, - context_initializers: &[ContextInitializer

], - pre_handling_initializers: &[ContextPreHandlingInitializer

], - runtime: &

::R, + world_id: WorldId, ) -> Result<(), ScriptError>; /// A utility trait for types implementing `IntoScriptPluginParams`. @@ -70,13 +68,7 @@ impl ScriptingLoader

for P { WorldGuard::with_existing_static_guard(world.clone(), |world| { let world_id = world.id(); ThreadWorldContainer.set_world(world)?; - Self::context_loader()( - attachment, - content, - P::readonly_configuration(world_id).context_initialization_callbacks, - P::readonly_configuration(world_id).pre_handling_callbacks, - P::readonly_configuration(world_id).runtime, - ) + Self::context_loader()(attachment, content, world_id) }) } @@ -89,14 +81,7 @@ impl ScriptingLoader

for P { WorldGuard::with_existing_static_guard(world, |world| { let world_id = world.id(); ThreadWorldContainer.set_world(world)?; - Self::context_reloader()( - attachment, - content, - previous_context, - P::readonly_configuration(world_id).context_initialization_callbacks, - P::readonly_configuration(world_id).pre_handling_callbacks, - P::readonly_configuration(world_id).runtime, - ) + Self::context_reloader()(attachment, content, previous_context, world_id) }) } } diff --git a/crates/bevy_mod_scripting_core/src/extractors.rs b/crates/bevy_mod_scripting_core/src/extractors.rs index 253a7c5adc..8d0d8235e4 100644 --- a/crates/bevy_mod_scripting_core/src/extractors.rs +++ b/crates/bevy_mod_scripting_core/src/extractors.rs @@ -103,12 +103,9 @@ impl HandlerContext

{ return Err(InteropError::missing_context(context_key.clone()).into()); }; - // call the script - let runtime = P::readonly_configuration(guard.id()).runtime; - let mut context = context.lock(); - P::handle(payload, context_key, label, &mut context, runtime, guard) + P::handle(payload, context_key, label, &mut context, guard) } /// Invoke a callback in a script immediately. diff --git a/crates/bevy_mod_scripting_core/src/handler.rs b/crates/bevy_mod_scripting_core/src/handler.rs index 589768f0e9..df6478db85 100644 --- a/crates/bevy_mod_scripting_core/src/handler.rs +++ b/crates/bevy_mod_scripting_core/src/handler.rs @@ -1,4 +1,6 @@ //! Contains the logic for handling script callback events +use bevy_ecs::world::WorldId; + use { bevy_ecs::{ event::EventCursor, @@ -15,7 +17,6 @@ use crate::{ ThreadWorldContainer, WorldAccessGuard, WorldContainer, WorldGuard, pretty_print::DisplayWithWorld, script_value::ScriptValue, }, - context::ContextPreHandlingInitializer, error::ScriptError, event::{ CallbackLabel, IntoCallbackLabel, ScriptCallbackEvent, ScriptCallbackResponseEvent, @@ -31,8 +32,7 @@ pub type HandlerFn

= fn( context_key: &ScriptAttachment, callback: &CallbackLabel, context: &mut

::C, - pre_handling_initializers: &[ContextPreHandlingInitializer

], - runtime: &

::R, + world_id: WorldId, ) -> Result; /// A utility trait, implemented for all types implementing `IntoScriptPluginParams`. @@ -46,7 +46,6 @@ pub trait ScriptingHandler { context_key: &ScriptAttachment, callback: &CallbackLabel, script_ctxt: &mut P::C, - runtime: &P::R, world: WorldGuard, ) -> Result; } @@ -58,20 +57,12 @@ impl ScriptingHandler

for P { context_key: &ScriptAttachment, callback: &CallbackLabel, script_ctxt: &mut P::C, - runtime: &P::R, world: WorldGuard, ) -> Result { WorldGuard::with_existing_static_guard(world.clone(), |world| { let world_id = world.id(); ThreadWorldContainer.set_world(world)?; - Self::handler()( - args, - context_key, - callback, - script_ctxt, - P::readonly_configuration(world_id).pre_handling_callbacks, - runtime, - ) + Self::handler()(args, context_key, callback, script_ctxt, world_id) }) } } diff --git a/crates/languages/bevy_mod_scripting_lua/src/lib.rs b/crates/languages/bevy_mod_scripting_lua/src/lib.rs index 5b8da7e627..3c7ca7df7f 100644 --- a/crates/languages/bevy_mod_scripting_lua/src/lib.rs +++ b/crates/languages/bevy_mod_scripting_lua/src/lib.rs @@ -5,6 +5,7 @@ use ::{ bevy_ecs::{entity::Entity, world::World}, }; use bevy_app::App; +use bevy_ecs::world::WorldId; use bevy_log::trace; use bevy_mod_scripting_core::{ IntoScriptPluginParams, ScriptingPlugin, @@ -14,7 +15,6 @@ use bevy_mod_scripting_core::{ globals::AppScriptGlobalsRegistry, script_value::ScriptValue, }, config::{GetPluginThreadConfig, ScriptingPluginConfiguration}, - context::{ContextInitializer, ContextPreHandlingInitializer}, error::ScriptError, event::CallbackLabel, make_plugin_config_static, @@ -177,9 +177,11 @@ fn load_lua_content_into_context( context: &mut Lua, context_key: &ScriptAttachment, content: &[u8], - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], + world_id: WorldId, ) -> Result<(), ScriptError> { + let config = LuaScriptingPlugin::readonly_configuration(world_id); + let initializers = config.context_initialization_callbacks; + let pre_handling_initializers = config.pre_handling_callbacks; initializers .iter() .try_for_each(|init| init(context_key, context))?; @@ -201,22 +203,14 @@ fn load_lua_content_into_context( pub fn lua_context_load( context_key: &ScriptAttachment, content: &[u8], - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], - _: &(), + world_id: WorldId, ) -> Result { #[cfg(feature = "unsafe_lua_modules")] let mut context = unsafe { Lua::unsafe_new() }; #[cfg(not(feature = "unsafe_lua_modules"))] let mut context = Lua::new(); - load_lua_content_into_context( - &mut context, - context_key, - content, - initializers, - pre_handling_initializers, - )?; + load_lua_content_into_context(&mut context, context_key, content, world_id)?; Ok(context) } @@ -226,17 +220,9 @@ pub fn lua_context_reload( context_key: &ScriptAttachment, content: &[u8], old_ctxt: &mut Lua, - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], - _: &(), + world_id: WorldId, ) -> Result<(), ScriptError> { - load_lua_content_into_context( - old_ctxt, - context_key, - content, - initializers, - pre_handling_initializers, - )?; + load_lua_content_into_context(old_ctxt, context_key, content, world_id)?; Ok(()) } @@ -248,10 +234,12 @@ pub fn lua_handler( context_key: &ScriptAttachment, callback_label: &CallbackLabel, context: &mut Lua, - pre_handling_initializers: &[ContextPreHandlingInitializer], - _: &(), + world_id: WorldId, ) -> Result { - pre_handling_initializers + let config = LuaScriptingPlugin::readonly_configuration(world_id); + + config + .pre_handling_callbacks .iter() .try_for_each(|init| init(context_key, context))?; @@ -288,8 +276,6 @@ mod test { #[test] fn test_reload_doesnt_overwrite_old_context() { let lua = Lua::new(); - let initializers = vec![]; - let pre_handling_initializers = vec![]; let mut old_ctxt = lua.clone(); let handle = Handle::Weak(AssetId::from(AssetIndex::from_bits(0))); let context_key = ScriptAttachment::EntityScript(Entity::from_raw(1), handle); @@ -300,9 +286,7 @@ mod test { end" .as_bytes(), - &initializers, - &pre_handling_initializers, - &(), + WorldId::new().unwrap(), ) .unwrap(); @@ -313,9 +297,7 @@ mod test { end" .as_bytes(), &mut old_ctxt, - &initializers, - &pre_handling_initializers, - &(), + WorldId::new().unwrap(), ) .unwrap(); diff --git a/crates/languages/bevy_mod_scripting_rhai/src/lib.rs b/crates/languages/bevy_mod_scripting_rhai/src/lib.rs index 266713fe21..f25023f7a6 100644 --- a/crates/languages/bevy_mod_scripting_rhai/src/lib.rs +++ b/crates/languages/bevy_mod_scripting_rhai/src/lib.rs @@ -8,6 +8,7 @@ use ::{ bevy_ecs::{entity::Entity, world::World}, }; use bevy_app::App; +use bevy_ecs::world::WorldId; use bevy_log::trace; use bevy_mod_scripting_core::{ IntoScriptPluginParams, ScriptingPlugin, @@ -17,7 +18,6 @@ use bevy_mod_scripting_core::{ globals::AppScriptGlobalsRegistry, script_value::ScriptValue, }, config::{GetPluginThreadConfig, ScriptingPluginConfiguration}, - context::{ContextInitializer, ContextPreHandlingInitializer}, error::ScriptError, event::CallbackLabel, make_plugin_config_static, @@ -206,11 +206,12 @@ fn load_rhai_content_into_context( context: &mut RhaiScriptContext, context_key: &ScriptAttachment, content: &[u8], - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], - runtime: &RhaiRuntime, + world_id: WorldId, ) -> Result<(), ScriptError> { - let runtime = runtime.read(); + let config = RhaiScriptingPlugin::readonly_configuration(world_id); + let initializers = config.context_initialization_callbacks; + let pre_handling_initializers = config.pre_handling_callbacks; + let runtime = config.runtime.read(); context.ast = runtime.compile(std::str::from_utf8(content)?)?; context @@ -233,23 +234,14 @@ fn load_rhai_content_into_context( pub fn rhai_context_load( context_key: &ScriptAttachment, content: &[u8], - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], - runtime: &RhaiRuntime, + world_id: WorldId, ) -> Result { let mut context = RhaiScriptContext { // Using an empty AST as a placeholder. ast: AST::empty(), scope: Scope::new(), }; - load_rhai_content_into_context( - &mut context, - context_key, - content, - initializers, - pre_handling_initializers, - runtime, - )?; + load_rhai_content_into_context(&mut context, context_key, content, world_id)?; Ok(context) } @@ -258,18 +250,9 @@ pub fn rhai_context_reload( context_key: &ScriptAttachment, content: &[u8], context: &mut RhaiScriptContext, - initializers: &[ContextInitializer], - pre_handling_initializers: &[ContextPreHandlingInitializer], - runtime: &RhaiRuntime, + world_id: WorldId, ) -> Result<(), ScriptError> { - load_rhai_content_into_context( - context, - context_key, - content, - initializers, - pre_handling_initializers, - runtime, - ) + load_rhai_content_into_context(context, context_key, content, world_id) } #[allow(clippy::too_many_arguments)] @@ -279,9 +262,11 @@ pub fn rhai_callback_handler( context_key: &ScriptAttachment, callback: &CallbackLabel, context: &mut RhaiScriptContext, - pre_handling_initializers: &[ContextPreHandlingInitializer], - runtime: &RhaiRuntime, + world_id: WorldId, ) -> Result { + let config = RhaiScriptingPlugin::readonly_configuration(world_id); + let pre_handling_initializers = config.pre_handling_callbacks; + pre_handling_initializers .iter() .try_for_each(|init| init(context_key, context))?; @@ -297,7 +282,7 @@ pub fn rhai_callback_handler( "Calling callback {} in context {} with args: {:?}", callback, context_key, args ); - let runtime = runtime.read(); + let runtime = config.runtime.read(); match runtime.call_fn_with_options::( options, diff --git a/crates/testing_crates/test_utils/src/test_plugin.rs b/crates/testing_crates/test_utils/src/test_plugin.rs index c4c71ed79b..670c9deccc 100644 --- a/crates/testing_crates/test_utils/src/test_plugin.rs +++ b/crates/testing_crates/test_utils/src/test_plugin.rs @@ -33,7 +33,9 @@ macro_rules! make_test_plugin { } fn handler() -> $ident::HandlerFn { - (|args, context_key, callback, script_ctxt, pre_handling_initializers, runtime| { + (|args, context_key, callback, script_ctxt, world_id| { + let config = TestPlugin::readonly_configuration(world_id); + let runtime = config.runtime; runtime .invocations .lock() @@ -43,7 +45,7 @@ macro_rules! make_test_plugin { } fn context_loader() -> $ident::ContextLoadFn { - (|attachment, content, context_initializers, pre_handling_initializers, runtime| { + (|attachment, content, world_id| { Ok(TestContext { invocations: vec![], }) @@ -51,12 +53,7 @@ macro_rules! make_test_plugin { } fn context_reloader() -> $ident::ContextReloadFn { - (|attachment, - content, - previous_context, - context_initializers, - pre_handling_initializers, - runtime| { + (|attachment, content, previous_context, world_id| { previous_context.invocations.clear(); Ok(()) })