From d99eef74297d030e239bdf608e883e17eadcbb35 Mon Sep 17 00:00:00 2001 From: Vincent Junge Date: Sat, 24 Feb 2024 02:50:24 +0100 Subject: [PATCH 1/2] fix SimpleExecutor crash --- .../bevy_ecs/src/schedule/executor/simple.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/bevy_ecs/src/schedule/executor/simple.rs b/crates/bevy_ecs/src/schedule/executor/simple.rs index 002ba532ad74b..cd96993fe2b4d 100644 --- a/crates/bevy_ecs/src/schedule/executor/simple.rs +++ b/crates/bevy_ecs/src/schedule/executor/simple.rs @@ -8,6 +8,8 @@ use crate::{ world::World, }; +use super::is_apply_deferred; + /// A variant of [`SingleThreadedExecutor`](crate::schedule::SingleThreadedExecutor) that calls /// [`apply_deferred`](crate::system::System::apply_deferred) immediately after running each system. #[derive(Default)] @@ -86,6 +88,10 @@ impl SystemExecutor for SimpleExecutor { } let system = &mut schedule.systems[system_index]; + if is_apply_deferred(system) { + continue; + } + let res = std::panic::catch_unwind(AssertUnwindSafe(|| { system.run((), world); })); @@ -125,3 +131,16 @@ fn evaluate_and_fold_conditions(conditions: &mut [BoxedCondition], world: &mut W .map(|condition| condition.run((), world)) .fold(true, |acc, res| acc && res) } + +#[cfg(test)] +#[test] +fn skip_automatic_sync_points() { + // Schedules automatically insert appy_deferred systems, but these should + // not be executed as they only serve as markers and are not initialized + use crate::prelude::*; + let mut sched = Schedule::default(); + sched.set_executor_kind(ExecutorKind::Simple); + sched.add_systems((|_: Commands| (), || ()).chain()); + let mut world = World::new(); + sched.run(&mut world); +} From f2ce111feb58349535dcb4f76ab88bd7baa8083e Mon Sep 17 00:00:00 2001 From: Vincent Junge Date: Sat, 24 Feb 2024 10:24:37 +0100 Subject: [PATCH 2/2] import --- crates/bevy_ecs/src/schedule/executor/simple.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/executor/simple.rs b/crates/bevy_ecs/src/schedule/executor/simple.rs index cd96993fe2b4d..6c1b7437aca8b 100644 --- a/crates/bevy_ecs/src/schedule/executor/simple.rs +++ b/crates/bevy_ecs/src/schedule/executor/simple.rs @@ -4,12 +4,12 @@ use fixedbitset::FixedBitSet; use std::panic::AssertUnwindSafe; use crate::{ - schedule::{BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule}, + schedule::{ + executor::is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule, + }, world::World, }; -use super::is_apply_deferred; - /// A variant of [`SingleThreadedExecutor`](crate::schedule::SingleThreadedExecutor) that calls /// [`apply_deferred`](crate::system::System::apply_deferred) immediately after running each system. #[derive(Default)]