diff options
Diffstat (limited to 'embassy-macros')
| -rw-r--r-- | embassy-macros/src/lib.rs | 13 | ||||
| -rw-r--r-- | embassy-macros/src/macros/cortex_m_interrupt.rs | 66 | ||||
| -rw-r--r-- | embassy-macros/src/macros/cortex_m_interrupt_declare.rs | 21 | ||||
| -rw-r--r-- | embassy-macros/src/macros/mod.rs | 2 |
4 files changed, 0 insertions, 102 deletions
diff --git a/embassy-macros/src/lib.rs b/embassy-macros/src/lib.rs index d7ca1f69c..ba4f13b77 100644 --- a/embassy-macros/src/lib.rs +++ b/embassy-macros/src/lib.rs | |||
| @@ -156,16 +156,3 @@ pub fn main_wasm(args: TokenStream, item: TokenStream) -> TokenStream { | |||
| 156 | let f = syn::parse_macro_input!(item as syn::ItemFn); | 156 | let f = syn::parse_macro_input!(item as syn::ItemFn); |
| 157 | main::run(args, f, main::wasm()).unwrap_or_else(|x| x).into() | 157 | main::run(args, f, main::wasm()).unwrap_or_else(|x| x).into() |
| 158 | } | 158 | } |
| 159 | |||
| 160 | #[proc_macro_attribute] | ||
| 161 | pub fn cortex_m_interrupt(args: TokenStream, item: TokenStream) -> TokenStream { | ||
| 162 | let args = syn::parse_macro_input!(args as syn::AttributeArgs); | ||
| 163 | let f = syn::parse_macro_input!(item as syn::ItemFn); | ||
| 164 | cortex_m_interrupt::run(args, f).unwrap_or_else(|x| x).into() | ||
| 165 | } | ||
| 166 | |||
| 167 | #[proc_macro] | ||
| 168 | pub fn cortex_m_interrupt_declare(item: TokenStream) -> TokenStream { | ||
| 169 | let name = syn::parse_macro_input!(item as syn::Ident); | ||
| 170 | cortex_m_interrupt_declare::run(name).unwrap_or_else(|x| x).into() | ||
| 171 | } | ||
diff --git a/embassy-macros/src/macros/cortex_m_interrupt.rs b/embassy-macros/src/macros/cortex_m_interrupt.rs deleted file mode 100644 index 13af8ca07..000000000 --- a/embassy-macros/src/macros/cortex_m_interrupt.rs +++ /dev/null | |||
| @@ -1,66 +0,0 @@ | |||
| 1 | use std::iter; | ||
| 2 | |||
| 3 | use darling::FromMeta; | ||
| 4 | use proc_macro2::TokenStream; | ||
| 5 | use quote::quote; | ||
| 6 | use syn::{ReturnType, Type, Visibility}; | ||
| 7 | |||
| 8 | use crate::util::ctxt::Ctxt; | ||
| 9 | |||
| 10 | #[derive(Debug, FromMeta)] | ||
| 11 | struct Args {} | ||
| 12 | |||
| 13 | pub fn run(args: syn::AttributeArgs, mut f: syn::ItemFn) -> Result<TokenStream, TokenStream> { | ||
| 14 | let _args = Args::from_list(&args).map_err(|e| e.write_errors())?; | ||
| 15 | |||
| 16 | let ident = f.sig.ident.clone(); | ||
| 17 | let ident_s = ident.to_string(); | ||
| 18 | |||
| 19 | // XXX should we blacklist other attributes? | ||
| 20 | |||
| 21 | let valid_signature = f.sig.constness.is_none() | ||
| 22 | && f.vis == Visibility::Inherited | ||
| 23 | && f.sig.abi.is_none() | ||
| 24 | && f.sig.inputs.is_empty() | ||
| 25 | && f.sig.generics.params.is_empty() | ||
| 26 | && f.sig.generics.where_clause.is_none() | ||
| 27 | && f.sig.variadic.is_none() | ||
| 28 | && match f.sig.output { | ||
| 29 | ReturnType::Default => true, | ||
| 30 | ReturnType::Type(_, ref ty) => match **ty { | ||
| 31 | Type::Tuple(ref tuple) => tuple.elems.is_empty(), | ||
| 32 | Type::Never(..) => true, | ||
| 33 | _ => false, | ||
| 34 | }, | ||
| 35 | }; | ||
| 36 | |||
| 37 | let ctxt = Ctxt::new(); | ||
| 38 | |||
| 39 | if !valid_signature { | ||
| 40 | ctxt.error_spanned_by( | ||
| 41 | &f.sig, | ||
| 42 | "`#[interrupt]` handlers must have signature `[unsafe] fn() [-> !]`", | ||
| 43 | ); | ||
| 44 | } | ||
| 45 | |||
| 46 | ctxt.check()?; | ||
| 47 | |||
| 48 | f.block.stmts = iter::once( | ||
| 49 | syn::parse2(quote! {{ | ||
| 50 | // Check that this interrupt actually exists | ||
| 51 | let __irq_exists_check: interrupt::#ident; | ||
| 52 | }}) | ||
| 53 | .unwrap(), | ||
| 54 | ) | ||
| 55 | .chain(f.block.stmts) | ||
| 56 | .collect(); | ||
| 57 | |||
| 58 | let result = quote!( | ||
| 59 | #[doc(hidden)] | ||
| 60 | #[export_name = #ident_s] | ||
| 61 | #[allow(non_snake_case)] | ||
| 62 | #f | ||
| 63 | ); | ||
| 64 | |||
| 65 | Ok(result) | ||
| 66 | } | ||
diff --git a/embassy-macros/src/macros/cortex_m_interrupt_declare.rs b/embassy-macros/src/macros/cortex_m_interrupt_declare.rs deleted file mode 100644 index b317482f5..000000000 --- a/embassy-macros/src/macros/cortex_m_interrupt_declare.rs +++ /dev/null | |||
| @@ -1,21 +0,0 @@ | |||
| 1 | use proc_macro2::TokenStream; | ||
| 2 | use quote::{format_ident, quote}; | ||
| 3 | |||
| 4 | pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> { | ||
| 5 | let name = format_ident!("{}", name); | ||
| 6 | let doc = format!("{} interrupt.", name); | ||
| 7 | |||
| 8 | let result = quote! { | ||
| 9 | #[doc = #doc] | ||
| 10 | #[allow(non_camel_case_types)] | ||
| 11 | pub enum #name{} | ||
| 12 | unsafe impl ::embassy_cortex_m::interrupt::Interrupt for #name { | ||
| 13 | fn number() -> u16 { | ||
| 14 | use cortex_m::interrupt::InterruptNumber; | ||
| 15 | let irq = InterruptEnum::#name; | ||
| 16 | irq.number() as u16 | ||
| 17 | } | ||
| 18 | } | ||
| 19 | }; | ||
| 20 | Ok(result) | ||
| 21 | } | ||
diff --git a/embassy-macros/src/macros/mod.rs b/embassy-macros/src/macros/mod.rs index a5e7a50e6..572094ca6 100644 --- a/embassy-macros/src/macros/mod.rs +++ b/embassy-macros/src/macros/mod.rs | |||
| @@ -1,4 +1,2 @@ | |||
| 1 | pub mod cortex_m_interrupt; | ||
| 2 | pub mod cortex_m_interrupt_declare; | ||
| 3 | pub mod main; | 1 | pub mod main; |
| 4 | pub mod task; | 2 | pub mod task; |
