From 601a126c301230ec1aaf7c75f25ca8eeb7923228 Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Tue, 7 Feb 2023 19:14:01 +0000 Subject: [PATCH 1/6] Remove `impl $Label for Box` --- crates/bevy_utils/src/label.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/crates/bevy_utils/src/label.rs b/crates/bevy_utils/src/label.rs index 631ef7a426245..d3e816552bb1e 100644 --- a/crates/bevy_utils/src/label.rs +++ b/crates/bevy_utils/src/label.rs @@ -98,14 +98,6 @@ macro_rules! define_boxed_label { self.dyn_clone() } } - - impl $label_trait_name for Box { - fn dyn_clone(&self) -> Box { - // Be explicit that we want to use the inner value - // to avoid infinite recursion. - (**self).dyn_clone() - } - } }; } From 586a72d42b9cc1fa8f743dc916f50fb6f47027cf Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Tue, 7 Feb 2023 19:18:17 +0000 Subject: [PATCH 2/6] Add `insert_boxed` to `Schedules` --- crates/bevy_app/src/app.rs | 2 +- crates/bevy_ecs/src/schedule/schedule.rs | 4 ++++ crates/bevy_ecs/src/world/mod.rs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/bevy_app/src/app.rs b/crates/bevy_app/src/app.rs index 8a67a2fc30cad..0806aa59450cc 100644 --- a/crates/bevy_app/src/app.rs +++ b/crates/bevy_app/src/app.rs @@ -987,7 +987,7 @@ impl App { let mut schedules = self.world.resource_mut::(); if schedules.get(&label).is_none() { - schedules.insert(label.dyn_clone(), Schedule::new()); + schedules.insert_boxed(label.dyn_clone(), Schedule::new()); } let schedule = schedules.get_mut(&label).unwrap(); diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 3c64995a106f2..ab35b94e6d162 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -43,6 +43,10 @@ impl Schedules { /// and the old schedule is returned. Otherwise, `None` is returned. pub fn insert(&mut self, label: impl ScheduleLabel, schedule: Schedule) -> Option { let label = label.dyn_clone(); + self.insert_boxed(label, schedule) + } + + pub fn insert_boxed(&mut self, label: BoxedScheduleLabel, schedule: Schedule) -> Option { if self.inner.contains_key(&label) { warn!("schedule with label {:?} already exists", label); } diff --git a/crates/bevy_ecs/src/world/mod.rs b/crates/bevy_ecs/src/world/mod.rs index face0b33ef0b4..09ce0f32b6da2 100644 --- a/crates/bevy_ecs/src/world/mod.rs +++ b/crates/bevy_ecs/src/world/mod.rs @@ -1747,7 +1747,7 @@ impl World { let _span = bevy_utils::tracing::info_span!("schedule", name = ?extracted_label).entered(); schedule.run(self); self.resource_mut::() - .insert(extracted_label, schedule); + .insert_boxed(extracted_label, schedule); } } From 9c5f1fda71eaa877278412cc376cfa28a3969baf Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Tue, 7 Feb 2023 19:30:16 +0000 Subject: [PATCH 3/6] Add docs for `insert_boxed` --- crates/bevy_ecs/src/schedule/schedule.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index ab35b94e6d162..6538c4e13c87c 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -46,6 +46,13 @@ impl Schedules { self.insert_boxed(label, schedule) } + /// Inserts a labeled schedule into the map. + /// + /// Unlike `insert`, this method take a [`BoxedScheduleLabel`]. This is useful when you + /// do not have a concrete schedule label and only a boxed version of it. + /// + /// If the map already had an entry for `label`, `schedule` is inserted, + /// and the old schedule is returned. Otherwise, `None` is returned. pub fn insert_boxed(&mut self, label: BoxedScheduleLabel, schedule: Schedule) -> Option { if self.inner.contains_key(&label) { warn!("schedule with label {:?} already exists", label); From 3012dfcd4adcff08fe22df73c01d8ee17d3c6d19 Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Tue, 7 Feb 2023 19:34:38 +0000 Subject: [PATCH 4/6] Adjust docs for `run_schedule_ref` --- crates/bevy_ecs/src/world/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/world/mod.rs b/crates/bevy_ecs/src/world/mod.rs index 09ce0f32b6da2..d7ebea84fcca4 100644 --- a/crates/bevy_ecs/src/world/mod.rs +++ b/crates/bevy_ecs/src/world/mod.rs @@ -1726,7 +1726,8 @@ impl World { /// Runs the [`Schedule`] associated with the `label` a single time. /// - /// Unlike the `run_schedule` method, this method takes the label by reference, which can save a clone. + /// Unlike the `run_schedule` method, this method takes the label by reference. This is useful + /// when you have the schedule label behind a pointer, such as a `Box`. /// /// The [`Schedule`] is fetched from the [`Schedules`] resource of the world by its label, /// and system state is cached. From 2b5203ccf1372d96e2222eee8c80053dfc810adf Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Tue, 7 Feb 2023 19:36:23 +0000 Subject: [PATCH 5/6] Cargo fmt --- crates/bevy_ecs/src/schedule/schedule.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 6538c4e13c87c..6d835ab4fd7de 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -47,13 +47,17 @@ impl Schedules { } /// Inserts a labeled schedule into the map. - /// + /// /// Unlike `insert`, this method take a [`BoxedScheduleLabel`]. This is useful when you /// do not have a concrete schedule label and only a boxed version of it. /// /// If the map already had an entry for `label`, `schedule` is inserted, /// and the old schedule is returned. Otherwise, `None` is returned. - pub fn insert_boxed(&mut self, label: BoxedScheduleLabel, schedule: Schedule) -> Option { + pub fn insert_boxed( + &mut self, + label: BoxedScheduleLabel, + schedule: Schedule, + ) -> Option { if self.inner.contains_key(&label) { warn!("schedule with label {:?} already exists", label); } From 557c5cb50361663c89966b37d86d6a7fdac6b462 Mon Sep 17 00:00:00 2001 From: Wen Jin Date: Thu, 9 Feb 2023 18:30:25 +0000 Subject: [PATCH 6/6] Fix doc grammar --- crates/bevy_ecs/src/schedule/schedule.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/schedule/schedule.rs b/crates/bevy_ecs/src/schedule/schedule.rs index 6d835ab4fd7de..87088f2781e2c 100644 --- a/crates/bevy_ecs/src/schedule/schedule.rs +++ b/crates/bevy_ecs/src/schedule/schedule.rs @@ -48,7 +48,7 @@ impl Schedules { /// Inserts a labeled schedule into the map. /// - /// Unlike `insert`, this method take a [`BoxedScheduleLabel`]. This is useful when you + /// Unlike `insert`, this method takes a [`BoxedScheduleLabel`]. This is useful when you /// do not have a concrete schedule label and only a boxed version of it. /// /// If the map already had an entry for `label`, `schedule` is inserted,