Fix unsound lifetime annotation on Query::get_component (#2964)
#2605 changed the lifetime annotations on `get_component` introducing unsoundness as you could keep the returned borrow even after using the query. Example unsoundness: ```rust use bevy::prelude::*; fn main() { App::new() .add_startup_system(startup) .add_system(unsound) .run(); } #[derive(Debug, Component, PartialEq, Eq)] struct Foo(Vec<u32>); fn startup(mut c: Commands) { let e = c.spawn().insert(Foo(vec![10])).id(); c.insert_resource(e); } fn unsound(mut q: Query<&mut Foo>, res: Res<Entity>) { let foo = q.get_component::<Foo>(*res).unwrap(); let mut foo2 = q.iter_mut().next().unwrap(); let first_elem = &foo.0[0]; for _ in 0..16 { foo2.0.push(12); } dbg!(*first_elem); } ``` output: `[src/main.rs:26] *first_elem = 0`
This commit is contained in:
parent
f4776f2ec4
commit
099386f184
@ -699,10 +699,7 @@ where
|
|||||||
/// # print_selected_character_name_system.system();
|
/// # print_selected_character_name_system.system();
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_component<T: Component>(
|
pub fn get_component<T: Component>(&self, entity: Entity) -> Result<&T, QueryComponentError> {
|
||||||
&self,
|
|
||||||
entity: Entity,
|
|
||||||
) -> Result<&'w T, QueryComponentError> {
|
|
||||||
let world = self.world;
|
let world = self.world;
|
||||||
let entity_ref = world
|
let entity_ref = world
|
||||||
.get_entity(entity)
|
.get_entity(entity)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user