aboutsummaryrefslogtreecommitdiff
path: root/macros/src/codegen/init.rs
diff options
context:
space:
mode:
authorGravatar Emil Fresk <emil.fresk@gmail.com> 2021-07-06 22:47:48 +0200
committerGravatar Emil Fresk <emil.fresk@gmail.com> 2021-07-06 22:47:48 +0200
commitef5307d83a1d62df0569d78db75d4006147c927d (patch)
tree542ff46adf7600cbd7f908cb62ac3a44e1bfa683 /macros/src/codegen/init.rs
parent3f85cb5caf1ae930e6551e139978ceec859a2348 (diff)
downloadrtic-ef5307d83a1d62df0569d78db75d4006147c927d.tar.gz
rtic-ef5307d83a1d62df0569d78db75d4006147c927d.tar.zst
rtic-ef5307d83a1d62df0569d78db75d4006147c927d.zip
Minimal app now compiles
Diffstat (limited to 'macros/src/codegen/init.rs')
-rw-r--r--macros/src/codegen/init.rs130
1 files changed, 79 insertions, 51 deletions
diff --git a/macros/src/codegen/init.rs b/macros/src/codegen/init.rs
index fe8a1263..e3f74086 100644
--- a/macros/src/codegen/init.rs
+++ b/macros/src/codegen/init.rs
@@ -5,7 +5,7 @@ use rtic_syntax::{ast::App, Context};
use crate::{
analyze::Analysis,
check::Extra,
- codegen::{locals, module, resources_struct},
+ codegen::{local_resources_struct, module},
};
type CodegenResult = (
@@ -18,68 +18,96 @@ type CodegenResult = (
// - the `${init}` module, which contains types like `${init}::Context`
Vec<TokenStream2>,
// user_init -- the `#[init]` function written by the user
- Option<TokenStream2>,
- // call_init -- the call to the user `#[init]` if there's one
- Option<TokenStream2>,
+ TokenStream2,
+ // call_init -- the call to the user `#[init]`
+ TokenStream2,
);
/// Generates support code for `#[init]` functions
pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> CodegenResult {
- if !app.inits.is_empty() {
- let init = &app.inits.first().unwrap();
- let mut needs_lt = false;
- let name = &init.name;
+ let init = &app.init;
+ let mut needs_lt = false;
+ let name = &init.name;
- let mut root_init = vec![];
+ let mut root_init = vec![];
- let mut locals_pat = None;
- let mut locals_new = None;
- if !init.locals.is_empty() {
- let (struct_, pat) = locals::codegen(Context::Init, &init.locals, app);
+ // TODO: Fix locals
+ // let mut locals_pat = None;
+ // let mut locals_new = None;
+ // if !init.locals.is_empty() {
+ // let (struct_, pat) = locals::codegen(Context::Init, &init.locals, app);
- locals_new = Some(quote!(#name::Locals::new()));
- locals_pat = Some(pat);
- root_init.push(struct_);
- }
+ // locals_new = Some(quote!(#name::Locals::new()));
+ // locals_pat = Some(pat);
+ // root_init.push(struct_);
+ // }
- let context = &init.context;
- let attrs = &init.attrs;
- let stmts = &init.stmts;
- let locals_pat = locals_pat.iter();
+ let context = &init.context;
+ let attrs = &init.attrs;
+ let stmts = &init.stmts;
+ let shared = &init.user_shared_struct;
+ let local = &init.user_local_struct;
- let user_init_return = quote! {#name::LateResources, #name::Monotonics};
+ let shared_resources: Vec<_> = app
+ .shared_resources
+ .iter()
+ .map(|(k, v)| {
+ let ty = &v.ty;
+ let cfgs = &v.cfgs;
+ quote!(
+ #(#cfgs)*
+ #k: #ty,
+ )
+ })
+ .collect();
+ let local_resources: Vec<_> = app
+ .local_resources
+ .iter()
+ .map(|(k, v)| {
+ let ty = &v.ty;
+ let cfgs = &v.cfgs;
+ quote!(
+ #(#cfgs)*
+ #k: #ty,
+ )
+ })
+ .collect();
+ root_init.push(quote! {
+ struct #shared {
+ #(#shared_resources)*
+ }
- let user_init = Some(quote!(
- #(#attrs)*
- #[allow(non_snake_case)]
- fn #name(#(#locals_pat,)* #context: #name::Context) -> (#user_init_return) {
- #(#stmts)*
- }
- ));
+ struct #local {
+ #(#local_resources)*
+ }
+ });
- let mut mod_app = None;
- if !init.args.resources.is_empty() {
- let (item, constructor) = resources_struct::codegen(Context::Init, &mut needs_lt, app);
+ // let locals_pat = locals_pat.iter();
- root_init.push(item);
- mod_app = Some(constructor);
+ let user_init_return = quote! {#shared, #local, #name::Monotonics};
+
+ let user_init = quote!(
+ #(#attrs)*
+ #[allow(non_snake_case)]
+ fn #name(#context: #name::Context) -> (#user_init_return) {
+ #(#stmts)*
}
+ );
+
+ let mut mod_app = None;
+
+ // let locals_new = locals_new.iter();
+ let call_init = quote! {
+ let (shared_resources, local_resources, mut monotonics) = #name(#name::Context::new(core.into()));
+ };
+
+ root_init.push(module::codegen(
+ Context::Init,
+ needs_lt,
+ app,
+ analysis,
+ extra,
+ ));
- let locals_new = locals_new.iter();
- let call_init = Some(
- quote!(let (late, mut monotonics) = #name(#(#locals_new,)* #name::Context::new(core.into()));),
- );
-
- root_init.push(module::codegen(
- Context::Init,
- needs_lt,
- app,
- analysis,
- extra,
- ));
-
- (mod_app, root_init, user_init, call_init)
- } else {
- (None, vec![], None, None)
- }
+ (mod_app, root_init, user_init, call_init)
}