Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions crates/bevy_mod_scripting_core/src/bindings/script_system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down
27 changes: 6 additions & 21 deletions crates/bevy_mod_scripting_core/src/context.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
//! Traits and types for managing script contexts.

use bevy_ecs::world::WorldId;

use crate::{
IntoScriptPluginParams,
bindings::{ThreadWorldContainer, WorldContainer, WorldGuard},
Expand All @@ -26,19 +28,15 @@ pub type ContextPreHandlingInitializer<P> =
pub type ContextLoadFn<P> = fn(
attachment: &ScriptAttachment,
content: &[u8],
context_initializers: &[ContextInitializer<P>],
pre_handling_initializers: &[ContextPreHandlingInitializer<P>],
runtime: &<P as IntoScriptPluginParams>::R,
world_id: WorldId,
) -> Result<<P as IntoScriptPluginParams>::C, ScriptError>;

/// A strategy for reloading contexts
pub type ContextReloadFn<P> = fn(
attachment: &ScriptAttachment,
content: &[u8],
previous_context: &mut <P as IntoScriptPluginParams>::C,
context_initializers: &[ContextInitializer<P>],
pre_handling_initializers: &[ContextPreHandlingInitializer<P>],
runtime: &<P as IntoScriptPluginParams>::R,
world_id: WorldId,
) -> Result<(), ScriptError>;

/// A utility trait for types implementing `IntoScriptPluginParams`.
Expand Down Expand Up @@ -70,13 +68,7 @@ impl<P: IntoScriptPluginParams> ScriptingLoader<P> 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)
})
}

Expand All @@ -89,14 +81,7 @@ impl<P: IntoScriptPluginParams> ScriptingLoader<P> 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)
})
}
}
5 changes: 1 addition & 4 deletions crates/bevy_mod_scripting_core/src/extractors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,9 @@ impl<P: IntoScriptPluginParams> HandlerContext<P> {
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.
Expand Down
17 changes: 4 additions & 13 deletions crates/bevy_mod_scripting_core/src/handler.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
//! Contains the logic for handling script callback events
use bevy_ecs::world::WorldId;

use {
bevy_ecs::{
event::EventCursor,
Expand All @@ -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,
Expand All @@ -31,8 +32,7 @@ pub type HandlerFn<P> = fn(
context_key: &ScriptAttachment,
callback: &CallbackLabel,
context: &mut <P as IntoScriptPluginParams>::C,
pre_handling_initializers: &[ContextPreHandlingInitializer<P>],
runtime: &<P as IntoScriptPluginParams>::R,
world_id: WorldId,
) -> Result<ScriptValue, ScriptError>;

/// A utility trait, implemented for all types implementing `IntoScriptPluginParams`.
Expand All @@ -46,7 +46,6 @@ pub trait ScriptingHandler<P: IntoScriptPluginParams> {
context_key: &ScriptAttachment,
callback: &CallbackLabel,
script_ctxt: &mut P::C,
runtime: &P::R,
world: WorldGuard,
) -> Result<ScriptValue, ScriptError>;
}
Expand All @@ -58,20 +57,12 @@ impl<P: IntoScriptPluginParams> ScriptingHandler<P> for P {
context_key: &ScriptAttachment,
callback: &CallbackLabel,
script_ctxt: &mut P::C,
runtime: &P::R,
world: WorldGuard,
) -> Result<ScriptValue, ScriptError> {
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)
})
}
}
Expand Down
50 changes: 16 additions & 34 deletions crates/languages/bevy_mod_scripting_lua/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -177,9 +177,11 @@ fn load_lua_content_into_context(
context: &mut Lua,
context_key: &ScriptAttachment,
content: &[u8],
initializers: &[ContextInitializer<LuaScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<LuaScriptingPlugin>],
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))?;
Expand All @@ -201,22 +203,14 @@ fn load_lua_content_into_context(
pub fn lua_context_load(
context_key: &ScriptAttachment,
content: &[u8],
initializers: &[ContextInitializer<LuaScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<LuaScriptingPlugin>],
_: &(),
world_id: WorldId,
) -> Result<Lua, ScriptError> {
#[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)
}

Expand All @@ -226,17 +220,9 @@ pub fn lua_context_reload(
context_key: &ScriptAttachment,
content: &[u8],
old_ctxt: &mut Lua,
initializers: &[ContextInitializer<LuaScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<LuaScriptingPlugin>],
_: &(),
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(())
}

Expand All @@ -248,10 +234,12 @@ pub fn lua_handler(
context_key: &ScriptAttachment,
callback_label: &CallbackLabel,
context: &mut Lua,
pre_handling_initializers: &[ContextPreHandlingInitializer<LuaScriptingPlugin>],
_: &(),
world_id: WorldId,
) -> Result<ScriptValue, bevy_mod_scripting_core::error::ScriptError> {
pre_handling_initializers
let config = LuaScriptingPlugin::readonly_configuration(world_id);

config
.pre_handling_callbacks
.iter()
.try_for_each(|init| init(context_key, context))?;

Expand Down Expand Up @@ -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);
Expand All @@ -300,9 +286,7 @@ mod test {

end"
.as_bytes(),
&initializers,
&pre_handling_initializers,
&(),
WorldId::new().unwrap(),
)
.unwrap();

Expand All @@ -313,9 +297,7 @@ mod test {
end"
.as_bytes(),
&mut old_ctxt,
&initializers,
&pre_handling_initializers,
&(),
WorldId::new().unwrap(),
)
.unwrap();

Expand Down
45 changes: 15 additions & 30 deletions crates/languages/bevy_mod_scripting_rhai/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -206,11 +206,12 @@ fn load_rhai_content_into_context(
context: &mut RhaiScriptContext,
context_key: &ScriptAttachment,
content: &[u8],
initializers: &[ContextInitializer<RhaiScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<RhaiScriptingPlugin>],
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
Expand All @@ -233,23 +234,14 @@ fn load_rhai_content_into_context(
pub fn rhai_context_load(
context_key: &ScriptAttachment,
content: &[u8],
initializers: &[ContextInitializer<RhaiScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<RhaiScriptingPlugin>],
runtime: &RhaiRuntime,
world_id: WorldId,
) -> Result<RhaiScriptContext, ScriptError> {
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)
}

Expand All @@ -258,18 +250,9 @@ pub fn rhai_context_reload(
context_key: &ScriptAttachment,
content: &[u8],
context: &mut RhaiScriptContext,
initializers: &[ContextInitializer<RhaiScriptingPlugin>],
pre_handling_initializers: &[ContextPreHandlingInitializer<RhaiScriptingPlugin>],
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)]
Expand All @@ -279,9 +262,11 @@ pub fn rhai_callback_handler(
context_key: &ScriptAttachment,
callback: &CallbackLabel,
context: &mut RhaiScriptContext,
pre_handling_initializers: &[ContextPreHandlingInitializer<RhaiScriptingPlugin>],
runtime: &RhaiRuntime,
world_id: WorldId,
) -> Result<ScriptValue, ScriptError> {
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))?;
Expand All @@ -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::<Dynamic>(
options,
Expand Down
Loading
Loading