Miscellaneous cleanups to World::resource_scope (#8256)
# Objective * Make a safety comment less tautological. * Clearly document that the function can run user code. * Other small changes.
This commit is contained in:
parent
a141aed67d
commit
dbb9e428cd
@ -1263,7 +1263,8 @@ impl World {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Temporarily removes the requested resource from this [`World`], then re-adds it before returning.
|
/// Temporarily removes the requested resource from this [`World`], runs custom user code,
|
||||||
|
/// then re-adds the resource before returning.
|
||||||
///
|
///
|
||||||
/// This enables safe simultaneous mutable access to both a resource and the rest of the [`World`].
|
/// This enables safe simultaneous mutable access to both a resource and the rest of the [`World`].
|
||||||
/// For more complex access patterns, consider using [`SystemState`](crate::system::SystemState).
|
/// For more complex access patterns, consider using [`SystemState`](crate::system::SystemState).
|
||||||
@ -1293,7 +1294,6 @@ impl World {
|
|||||||
.components
|
.components
|
||||||
.get_resource_id(TypeId::of::<R>())
|
.get_resource_id(TypeId::of::<R>())
|
||||||
.unwrap_or_else(|| panic!("resource does not exist: {}", std::any::type_name::<R>()));
|
.unwrap_or_else(|| panic!("resource does not exist: {}", std::any::type_name::<R>()));
|
||||||
// If the resource isn't send and sync, validate that we are on the main thread, so that we can access it.
|
|
||||||
let (ptr, mut ticks) = self
|
let (ptr, mut ticks) = self
|
||||||
.storages
|
.storages
|
||||||
.resources
|
.resources
|
||||||
@ -1301,7 +1301,7 @@ impl World {
|
|||||||
.and_then(|info| info.remove())
|
.and_then(|info| info.remove())
|
||||||
.unwrap_or_else(|| panic!("resource does not exist: {}", std::any::type_name::<R>()));
|
.unwrap_or_else(|| panic!("resource does not exist: {}", std::any::type_name::<R>()));
|
||||||
// Read the value onto the stack to avoid potential mut aliasing.
|
// Read the value onto the stack to avoid potential mut aliasing.
|
||||||
// SAFETY: pointer is of type R
|
// SAFETY: `ptr` was obtained from the TypeId of `R`.
|
||||||
let mut value = unsafe { ptr.read::<R>() };
|
let mut value = unsafe { ptr.read::<R>() };
|
||||||
let value_mut = Mut {
|
let value_mut = Mut {
|
||||||
value: &mut value,
|
value: &mut value,
|
||||||
@ -1315,7 +1315,7 @@ impl World {
|
|||||||
let result = f(self, value_mut);
|
let result = f(self, value_mut);
|
||||||
assert!(!self.contains_resource::<R>(),
|
assert!(!self.contains_resource::<R>(),
|
||||||
"Resource `{}` was inserted during a call to World::resource_scope.\n\
|
"Resource `{}` was inserted during a call to World::resource_scope.\n\
|
||||||
This is not allowed as the original resource is reinserted to the world after the FnOnce param is invoked.",
|
This is not allowed as the original resource is reinserted to the world after the closure is invoked.",
|
||||||
std::any::type_name::<R>());
|
std::any::type_name::<R>());
|
||||||
|
|
||||||
OwningPtr::make(value, |ptr| {
|
OwningPtr::make(value, |ptr| {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user