Fix SimpleExecutor crash (#12076)
# Objective Since #9822, `SimpleExecutor` panics when an automatic sync point is inserted: ```rust let mut sched = Schedule::default(); sched.set_executor_kind(ExecutorKind::Simple); sched.add_systems((|_: Commands| (), || ()).chain()); sched.run(&mut World::new()); ``` ``` System's param_state was not found. Did you forget to initialize this system before running it? note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Encountered a panic in system `bevy_ecs::schedule::executor::apply_deferred`! ``` ## Solution Don't try to run the `apply_deferred` system.
This commit is contained in:
parent
b1f061586d
commit
d6e6814ac3
@ -4,7 +4,9 @@ use fixedbitset::FixedBitSet;
|
|||||||
use std::panic::AssertUnwindSafe;
|
use std::panic::AssertUnwindSafe;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
schedule::{BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule},
|
schedule::{
|
||||||
|
executor::is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule,
|
||||||
|
},
|
||||||
world::World,
|
world::World,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -86,6 +88,10 @@ impl SystemExecutor for SimpleExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let system = &mut schedule.systems[system_index];
|
let system = &mut schedule.systems[system_index];
|
||||||
|
if is_apply_deferred(system) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let res = std::panic::catch_unwind(AssertUnwindSafe(|| {
|
let res = std::panic::catch_unwind(AssertUnwindSafe(|| {
|
||||||
system.run((), world);
|
system.run((), world);
|
||||||
}));
|
}));
|
||||||
@ -125,3 +131,16 @@ fn evaluate_and_fold_conditions(conditions: &mut [BoxedCondition], world: &mut W
|
|||||||
.map(|condition| condition.run((), world))
|
.map(|condition| condition.run((), world))
|
||||||
.fold(true, |acc, res| acc && res)
|
.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);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user