ecs: fix resource borrow safety

This commit is contained in:
Carter Anderson 2020-07-12 12:27:11 -07:00
parent 17f3860d12
commit 67f1bd66ce

View File

@ -1,7 +1,7 @@
use crate::{ use crate::{
resource_query::{FetchResource, ResourceQuery, UnsafeClone}, resource_query::{FetchResource, ResourceQuery, UnsafeClone},
system::{System, SystemId, ThreadLocalExecution}, system::{System, SystemId, ThreadLocalExecution},
Commands, Resources, Commands, Resources, Res,
}; };
use core::marker::PhantomData; use core::marker::PhantomData;
use hecs::{ use hecs::{
@ -83,10 +83,14 @@ macro_rules! impl_into_foreach_system {
name: core::any::type_name::<Self>().into(), name: core::any::type_name::<Self>().into(),
id, id,
func: move |commands, world, resources| { func: move |commands, world, resources| {
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id); <<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::borrow(&resources.resource_archetypes);
for ($($component,)*) in world.query::<($($component,)*)>().iter() { {
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($component),*)) let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
for ($($component,)*) in world.query::<($($component,)*)>().iter() {
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($component),*))
}
} }
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::release(&resources.resource_archetypes);
}, },
init_func: move |resources| { init_func: move |resources| {
<($($resource,)*)>::initialize(resources, Some(id)); <($($resource,)*)>::initialize(resources, Some(id));
@ -146,13 +150,17 @@ macro_rules! impl_into_query_system {
id, id,
name: core::any::type_name::<Self>().into(), name: core::any::type_name::<Self>().into(),
func: move |commands, world, resources| { func: move |commands, world, resources| {
let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id); <<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::borrow(&resources.resource_archetypes);
$(let $query = Query::<$query> { {
world, let ($($resource,)*) = resources.query_system::<($($resource,)*)>(id);
_marker: PhantomData::default(), $(let $query = Query::<$query> {
};)* world,
_marker: PhantomData::default(),
};)*
fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($query),*)) fn_call!(self, ($($commands, commands)*), ($($resource),*), ($($query),*))
}
<<($($resource,)*) as ResourceQuery>::Fetch as FetchResource>::release(&resources.resource_archetypes);
}, },
init_func: move |resources| { init_func: move |resources| {
<($($resource,)*)>::initialize(resources, Some(id)); <($($resource,)*)>::initialize(resources, Some(id));