diff --git a/crates/bevy_ecs/src/system/combinator.rs b/crates/bevy_ecs/src/system/combinator.rs index e1de10b394..cec961ea0a 100644 --- a/crates/bevy_ecs/src/system/combinator.rs +++ b/crates/bevy_ecs/src/system/combinator.rs @@ -1,6 +1,4 @@ -use std::{borrow::Cow, cell::UnsafeCell, marker::PhantomData}; - -use bevy_ptr::UnsafeCellDeref; +use std::{borrow::Cow, marker::PhantomData}; use crate::{ archetype::ArchetypeComponentId, @@ -182,18 +180,16 @@ where ) } - fn run<'w>(&mut self, input: Self::In, world: &'w mut World) -> Self::Out { - // SAFETY: Converting `&mut T` -> `&UnsafeCell` - // is explicitly allowed in the docs for `UnsafeCell`. - let world: &'w UnsafeCell = unsafe { std::mem::transmute(world) }; + fn run(&mut self, input: Self::In, world: &mut World) -> Self::Out { + let world = world.as_unsafe_world_cell(); Func::combine( input, // SAFETY: Since these closures are `!Send + !Sync + !'static`, they can never // be called in parallel. Since mutable access to `world` only exists within // the scope of either closure, we can be sure they will never alias one another. - |input| self.a.run(input, unsafe { world.deref_mut() }), + |input| self.a.run(input, unsafe { world.world_mut() }), #[allow(clippy::undocumented_unsafe_blocks)] - |input| self.b.run(input, unsafe { world.deref_mut() }), + |input| self.b.run(input, unsafe { world.world_mut() }), ) }