Skip to content

Commit 9d7efbf

Browse files
committed
Replace boxed labels with interned labels
1 parent 912fb58 commit 9d7efbf

File tree

20 files changed

+552
-126
lines changed

20 files changed

+552
-126
lines changed

benches/benches/bevy_ecs/scheduling/schedule.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ pub fn build_schedule(criterion: &mut Criterion) {
6969
struct DummySet;
7070

7171
impl SystemSet for NumSet {
72-
fn dyn_clone(&self) -> Box<dyn SystemSet> {
73-
Box::new(self.clone())
72+
fn dyn_leak(&self) -> &'static dyn SystemSet {
73+
Box::leak(Box::new(self.clone()))
7474
}
7575
}
7676

crates/bevy_app/src/app.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use bevy_ecs::{
44
prelude::*,
55
schedule::{
66
apply_state_transition, common_conditions::run_once as run_once_condition,
7-
run_enter_schedule, BoxedScheduleLabel, IntoSystemConfig, IntoSystemSetConfigs,
7+
run_enter_schedule, InternedScheduleLabel, IntoSystemConfig, IntoSystemSetConfigs,
88
ScheduleLabel,
99
},
1010
};
@@ -69,11 +69,11 @@ pub struct App {
6969
/// The schedule that systems are added to by default.
7070
///
7171
/// This is initially set to [`CoreSchedule::Main`].
72-
pub default_schedule_label: BoxedScheduleLabel,
72+
pub default_schedule_label: InternedScheduleLabel,
7373
/// The schedule that controls the outer loop of schedule execution.
7474
///
7575
/// This is initially set to [`CoreSchedule::Outer`].
76-
pub outer_schedule_label: BoxedScheduleLabel,
76+
pub outer_schedule_label: InternedScheduleLabel,
7777
sub_apps: HashMap<AppLabelId, SubApp>,
7878
plugin_registry: Vec<Box<dyn Plugin>>,
7979
plugin_name_added: HashSet<String>,
@@ -223,8 +223,8 @@ impl App {
223223
sub_apps: HashMap::default(),
224224
plugin_registry: Vec::default(),
225225
plugin_name_added: Default::default(),
226-
default_schedule_label: Box::new(CoreSchedule::Main),
227-
outer_schedule_label: Box::new(CoreSchedule::Outer),
226+
default_schedule_label: CoreSchedule::Main.dyn_intern(),
227+
outer_schedule_label: CoreSchedule::Outer.dyn_intern(),
228228
is_building_plugin: false,
229229
}
230230
}
@@ -952,7 +952,7 @@ impl App {
952952
/// To avoid this behavior, use the `init_schedule` method instead.
953953
pub fn add_schedule(&mut self, label: impl ScheduleLabel, schedule: Schedule) -> &mut Self {
954954
let mut schedules = self.world.resource_mut::<Schedules>();
955-
schedules.insert(label, schedule);
955+
schedules.insert(label.dyn_intern(), schedule);
956956

957957
self
958958
}
@@ -963,7 +963,7 @@ impl App {
963963
pub fn init_schedule(&mut self, label: impl ScheduleLabel) -> &mut Self {
964964
let mut schedules = self.world.resource_mut::<Schedules>();
965965
if !schedules.contains(&label) {
966-
schedules.insert(label, Schedule::new());
966+
schedules.insert(label.dyn_intern(), Schedule::new());
967967
}
968968
self
969969
}
@@ -993,7 +993,7 @@ impl App {
993993
let mut schedules = self.world.resource_mut::<Schedules>();
994994

995995
if schedules.get(&label).is_none() {
996-
schedules.insert(label.dyn_clone(), Schedule::new());
996+
schedules.insert(label.dyn_intern(), Schedule::new());
997997
}
998998

999999
let schedule = schedules.get_mut(&label).unwrap();

crates/bevy_ecs/macros/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ mod set;
66
mod states;
77

88
use crate::{fetch::derive_world_query_impl, set::derive_set};
9-
use bevy_macro_utils::{derive_boxed_label, get_named_struct_fields, BevyManifest};
9+
use bevy_macro_utils::{derive_interned_label, get_named_struct_fields, BevyManifest};
1010
use proc_macro::TokenStream;
1111
use proc_macro2::Span;
1212
use quote::{format_ident, quote};
@@ -465,7 +465,7 @@ pub fn derive_schedule_label(input: TokenStream) -> TokenStream {
465465
trait_path
466466
.segments
467467
.push(format_ident!("ScheduleLabel").into());
468-
derive_boxed_label(input, &trait_path)
468+
derive_interned_label(input, &trait_path)
469469
}
470470

471471
/// Derive macro generating an impl of the trait `SystemSet`.

crates/bevy_ecs/macros/src/set.rs

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use proc_macro::TokenStream;
2-
use quote::{quote, ToTokens};
3-
use syn::parse::{Parse, ParseStream};
2+
use quote::{quote, quote_spanned, ToTokens};
3+
use syn::{
4+
parse::{Parse, ParseStream},
5+
spanned::Spanned,
6+
};
47

58
pub static SYSTEM_SET_ATTRIBUTE_NAME: &str = "system_set";
69
pub static BASE_ATTRIBUTE_NAME: &str = "base";
@@ -64,15 +67,57 @@ pub fn derive_set(input: syn::DeriveInput, trait_path: &syn::Path) -> TokenStrea
6467
})
6568
.unwrap(),
6669
);
67-
70+
let fallback_leak =
71+
quote! { std::boxed::Box::leak(std::boxed::Box::new(std::clone::Clone::clone(self))) };
72+
let dyn_leak_impl = match input.data {
73+
syn::Data::Struct(data) => {
74+
if data.fields.is_empty() {
75+
quote! { &Self }
76+
} else {
77+
fallback_leak
78+
}
79+
}
80+
syn::Data::Enum(data) => {
81+
let mut use_fallback_variant = false;
82+
let variants: Vec<_> = data
83+
.variants
84+
.into_iter()
85+
.filter_map(|variant| {
86+
if variant.fields.is_empty() {
87+
let span = variant.span();
88+
let variant_ident = variant.ident;
89+
Some(quote_spanned! { span => Self::#variant_ident => &Self::#variant_ident, })
90+
} else {
91+
use_fallback_variant = true;
92+
None
93+
}
94+
})
95+
.collect();
96+
if use_fallback_variant {
97+
quote! {
98+
match self {
99+
#(#variants)*
100+
_ => #fallback_leak
101+
}
102+
}
103+
} else {
104+
quote! {
105+
match self {
106+
#(#variants)*
107+
}
108+
}
109+
}
110+
}
111+
syn::Data::Union(_) => fallback_leak,
112+
};
68113
(quote! {
69114
impl #impl_generics #trait_path for #ident #ty_generics #where_clause {
70115
fn is_base(&self) -> bool {
71116
#is_base
72117
}
73118

74-
fn dyn_clone(&self) -> std::boxed::Box<dyn #trait_path> {
75-
std::boxed::Box::new(std::clone::Clone::clone(self))
119+
fn dyn_leak(&self) -> &'static dyn #trait_path {
120+
#dyn_leak_impl
76121
}
77122
}
78123
})

0 commit comments

Comments
 (0)