aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/resources_struct.rs
diff options
context:
space:
mode:
authorGravatar Jorge Aparicio <jorge@japaric.io> 2019-10-28 21:11:13 -0500
committerGravatar Jorge Aparicio <jorge@japaric.io> 2019-10-28 21:11:13 -0500
commita3783a6d3d90ab549766b13651ec8ff8013762c5 (patch)
tree29fc5a2ed50c73ebfeca65fd52ad241d9995677d /macros/src/codegen/resources_struct.rs
parentf9b30a1ff87acd5f3c29a32369f0537e8e3d2bf1 (diff)
downloadrtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.tar.gz
rtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.tar.zst
rtic-a3783a6d3d90ab549766b13651ec8ff8013762c5.zip
WIP generators tasksgenerator-tasks
Diffstat (limited to 'macros/src/codegen/resources_struct.rs')
-rw-r--r--macros/src/codegen/resources_struct.rs66
1 files changed, 64 insertions, 2 deletions
diff --git a/macros/src/codegen/resources_struct.rs b/macros/src/codegen/resources_struct.rs
index 07a60616..17503a66 100644
--- a/macros/src/codegen/resources_struct.rs
+++ b/macros/src/codegen/resources_struct.rs
@@ -4,6 +4,7 @@ use rtfm_syntax::{ast::App, Context};
use crate::{analyze::Analysis, codegen::util};
+// TODO need to do something different when generators are involved
pub fn codegen(
ctxt: Context,
priority: u8,
@@ -63,6 +64,67 @@ pub fn codegen(
#name: &mut #name
));
}
+ } else if ctxt.is_generator(app) {
+ let ownership = &analysis.ownerships[name];
+
+ if ownership.needs_lock(priority) {
+ if mut_.is_none() {
+ // mod gresourcesd
+ unimplemented!()
+ } else {
+ // resource proxy
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: gresources::#name
+ ));
+
+ values.push(quote!(
+ #(#cfgs)*
+ #name: gresources::#name::new()
+
+ ));
+
+ continue;
+ }
+ } else {
+ let lt = if ctxt.runs_once(app) {
+ quote!('static)
+ } else {
+ lt = Some(quote!('a));
+ quote!('a)
+ };
+
+ if ownership.is_owned() || mut_.is_none() {
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: &#lt #mut_ #ty
+ ));
+ } else {
+ fields.push(quote!(
+ #(#cfgs)*
+ pub #name: &#lt mut #ty
+ ));
+ }
+ }
+
+ let is_late = expr.is_none();
+ if is_late {
+ let expr = if mut_.is_some() {
+ quote!(&mut *#name.as_mut_ptr())
+ } else {
+ quote!(&*#name.as_ptr())
+ };
+
+ values.push(quote!(
+ #(#cfgs)*
+ #name: #expr
+ ));
+ } else {
+ values.push(quote!(
+ #(#cfgs)*
+ #name: &#mut_ #name
+ ));
+ }
} else {
let ownership = &analysis.ownerships[name];
@@ -92,7 +154,7 @@ pub fn codegen(
continue;
}
} else {
- let lt = if ctxt.runs_once() {
+ let lt = if ctxt.runs_once(app) {
quote!('static)
} else {
lt = Some(quote!('a));
@@ -161,7 +223,7 @@ pub fn codegen(
}
);
- let arg = if ctxt.is_init() {
+ let arg = if ctxt.is_init() || ctxt.is_generator(app) {
None
} else {
Some(quote!(priority: &#lt rtfm::export::Priority))