diff options
Diffstat (limited to 'macros/src/codegen/locals.rs')
-rw-r--r-- | macros/src/codegen/locals.rs | 95 |
1 files changed, 0 insertions, 95 deletions
diff --git a/macros/src/codegen/locals.rs b/macros/src/codegen/locals.rs deleted file mode 100644 index 0fb8c6d2..00000000 --- a/macros/src/codegen/locals.rs +++ /dev/null @@ -1,95 +0,0 @@ -use proc_macro2::TokenStream as TokenStream2; -use quote::quote; -use rtic_syntax::{ - ast::{App, Local}, - Context, Map, -}; - -use crate::codegen::util; - -pub fn codegen( - ctxt: Context, - locals: &Map<Local>, - app: &App, -) -> ( - // locals - TokenStream2, - // pat - TokenStream2, -) { - assert!(!locals.is_empty()); - - let runs_once = ctxt.runs_once(); - let ident = util::locals_ident(ctxt, app); - - let mut lt = None; - let mut fields = vec![]; - let mut items = vec![]; - let mut names = vec![]; - let mut values = vec![]; - let mut pats = vec![]; - let mut has_cfgs = false; - - for (name, local) in locals { - let lt = if runs_once { - quote!('static) - } else { - lt = Some(quote!('a)); - quote!('a) - }; - - let cfgs = &local.cfgs; - has_cfgs |= !cfgs.is_empty(); - - let expr = &local.expr; - let ty = &local.ty; - fields.push(quote!( - #(#cfgs)* - #name: &#lt mut #ty - )); - items.push(quote!( - #(#cfgs)* - #[doc(hidden)] - static #name: rtic::RacyCell<#ty> = rtic::RacyCell::new(#expr) - )); - values.push(quote!( - #(#cfgs)* - #name: #name.get_mut_unchecked() - )); - names.push(name); - pats.push(quote!( - #(#cfgs)* - #name - )); - } - - if lt.is_some() && has_cfgs { - fields.push(quote!(__marker__: core::marker::PhantomData<&'a ()>)); - values.push(quote!(__marker__: core::marker::PhantomData)); - } - - let locals = quote!( - #[allow(non_snake_case)] - #[doc(hidden)] - pub struct #ident<#lt> { - #(#fields),* - } - - impl<#lt> #ident<#lt> { - #[inline(always)] - unsafe fn new() -> Self { - #(#items;)* - - #ident { - #(#values),* - } - } - } - ); - - let ident = ctxt.ident(app); - ( - locals, - quote!(#ident::Locals { #(#pats,)* .. }: #ident::Locals), - ) -} |