diff options
author | 2019-10-28 21:11:13 -0500 | |
---|---|---|
committer | 2019-10-28 21:11:13 -0500 | |
commit | a3783a6d3d90ab549766b13651ec8ff8013762c5 (patch) | |
tree | 29fc5a2ed50c73ebfeca65fd52ad241d9995677d /macros/src/codegen/resources_struct.rs | |
parent | f9b30a1ff87acd5f3c29a32369f0537e8e3d2bf1 (diff) | |
download | rtic-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.rs | 66 |
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)) |