Skip to content

Commit

Permalink
Replace UnsafeCell<World> usage with UnsafeWorldCell in CombinatorSys…
Browse files Browse the repository at this point in the history
…tem (bevyengine#14706)

# Objective

Replace usage of `UnsafeCell<World>` with our standard `UnsafeWorldCell`
that seemed to have been missed.

## Solution

Do just that.
  • Loading branch information
ItsDoot authored Aug 11, 2024
1 parent 91fa4bb commit 7f658ca
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions crates/bevy_ecs/src/system/combinator.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -182,18 +180,16 @@ where
)
}

fn run<'w>(&mut self, input: Self::In, world: &'w mut World) -> Self::Out {
// SAFETY: Converting `&mut T` -> `&UnsafeCell<T>`
// is explicitly allowed in the docs for `UnsafeCell`.
let world: &'w UnsafeCell<World> = 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() }),
)
}

Expand Down

0 comments on commit 7f658ca

Please sign in to comment.