From 2b51a875ec77f29d3f4a0e65ba69dfaa551f2f02 Mon Sep 17 00:00:00 2001 From: JaySpruce Date: Mon, 10 Aug 2026 11:46:08 -0500 Subject: [PATCH 1/3] remove redundant initializing in `Table::allocate` --- crates/bevy_ecs/src/storage/table/mod.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/crates/bevy_ecs/src/storage/table/mod.rs b/crates/bevy_ecs/src/storage/table/mod.rs index 9b3a0c86c097d..5e66aaeb2076c 100644 --- a/crates/bevy_ecs/src/storage/table/mod.rs +++ b/crates/bevy_ecs/src/storage/table/mod.rs @@ -491,25 +491,10 @@ impl Table { /// The allocated row must be written to immediately with valid values in each column pub(crate) unsafe fn allocate(&mut self, entity: Entity) -> TableRow { self.reserve(1); - let len = self.entity_count(); // SAFETY: No entity index may be in more than one table row at once, so there are no duplicates, // and there can not be an entity index of u32::MAX. Therefore, this can not be max either. - let row = unsafe { TableRow::new(NonMaxU32::new_unchecked(len)) }; - let len = len as usize; + let row = unsafe { TableRow::new(NonMaxU32::new_unchecked(self.entity_count())) }; self.entities.push(entity); - for col in self.columns.values_mut() { - col.added_ticks - .initialize_unchecked(len, UnsafeCell::new(Tick::new(0))); - col.changed_ticks - .initialize_unchecked(len, UnsafeCell::new(Tick::new(0))); - col.changed_by - .as_mut() - .zip(MaybeLocation::caller()) - .map(|(changed_by, caller)| { - changed_by.initialize_unchecked(len, UnsafeCell::new(caller)); - }); - } - row } From 18876f37ce348e72250ea346adf56ccaf867c545 Mon Sep 17 00:00:00 2001 From: JaySpruce Date: Mon, 10 Aug 2026 12:33:54 -0500 Subject: [PATCH 2/3] don't dereference uninitialized memory --- crates/bevy_ecs/src/storage/table/column.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/bevy_ecs/src/storage/table/column.rs b/crates/bevy_ecs/src/storage/table/column.rs index 1cfe664bd92f7..ada2ba55fea51 100644 --- a/crates/bevy_ecs/src/storage/table/column.rs +++ b/crates/bevy_ecs/src/storage/table/column.rs @@ -178,12 +178,16 @@ impl Column { caller: MaybeLocation, ) { self.data.initialize_unchecked(row.index(), data); - *self.added_ticks.get_unchecked_mut(row.index()).get_mut() = tick; - *self.changed_ticks.get_unchecked_mut(row.index()).get_mut() = tick; + self.added_ticks + .initialize_unchecked(row.index(), UnsafeCell::new(tick)); + self.changed_ticks + .initialize_unchecked(row.index(), UnsafeCell::new(tick)); self.changed_by .as_mut() - .map(|changed_by| changed_by.get_unchecked_mut(row.index()).get_mut()) - .assign(caller); + .zip(caller) + .map(|(changed_by, caller)| { + changed_by.initialize_unchecked(row.index(), UnsafeCell::new(caller)) + }); } /// Overwrites component data to the column at given row. The previous value is dropped. From 1670803d09e23ae5a8e47506cf1b6da77d22a41f Mon Sep 17 00:00:00 2001 From: JaySpruce Date: Mon, 10 Aug 2026 12:58:49 -0500 Subject: [PATCH 3/3] semicolon --- crates/bevy_ecs/src/storage/table/column.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/storage/table/column.rs b/crates/bevy_ecs/src/storage/table/column.rs index ada2ba55fea51..a6e6683812b70 100644 --- a/crates/bevy_ecs/src/storage/table/column.rs +++ b/crates/bevy_ecs/src/storage/table/column.rs @@ -186,7 +186,7 @@ impl Column { .as_mut() .zip(caller) .map(|(changed_by, caller)| { - changed_by.initialize_unchecked(row.index(), UnsafeCell::new(caller)) + changed_by.initialize_unchecked(row.index(), UnsafeCell::new(caller)); }); }