@@ -16,8 +16,8 @@ use std::collections::HashSet;
16
16
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
17
17
use std:: time:: { SystemTime , UNIX_EPOCH } ;
18
18
use syn:: {
19
- parse, spanned:: Spanned , FnArg , Ident , Item , ItemFn , ItemStatic , ReturnType , Stmt , Type ,
20
- Visibility ,
19
+ parse, spanned:: Spanned , AttrStyle , Attribute , FnArg , Ident , Item , ItemFn , ItemStatic ,
20
+ PathArguments , ReturnType , Stmt , Type , Visibility ,
21
21
} ;
22
22
23
23
static CALL_COUNT : AtomicUsize = AtomicUsize :: new ( 0 ) ;
@@ -128,15 +128,17 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream {
128
128
let vars = statics
129
129
. into_iter ( )
130
130
. map ( |var| {
131
- let attrs = var. attrs ;
131
+ let ( ref cfgs , ref attrs) = extract_cfgs ( var. attrs ) ;
132
132
let ident = var. ident ;
133
133
let ty = var. ty ;
134
134
let expr = var. expr ;
135
135
136
136
quote ! (
137
137
#[ allow( non_snake_case) ]
138
+ #( #cfgs) *
138
139
let #ident: & ' static mut #ty = unsafe {
139
140
#( #attrs) *
141
+ #( #cfgs) *
140
142
static mut #ident: #ty = #expr;
141
143
142
144
& mut #ident
@@ -405,7 +407,6 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
405
407
406
408
// further type check of the input argument
407
409
let #pat: & cortex_m_rt:: ExceptionFrame = #pat;
408
-
409
410
#( #stmts) *
410
411
}
411
412
)
@@ -446,15 +447,17 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
446
447
let vars = statics
447
448
. into_iter ( )
448
449
. map ( |var| {
449
- let attrs = var. attrs ;
450
+ let ( ref cfgs , ref attrs) = extract_cfgs ( var. attrs ) ;
450
451
let ident = var. ident ;
451
452
let ty = var. ty ;
452
453
let expr = var. expr ;
453
454
454
455
quote ! (
455
456
#[ allow( non_snake_case) ]
457
+ #( #cfgs) *
456
458
let #ident: & mut #ty = unsafe {
457
459
#( #attrs) *
460
+ #( #cfgs) *
458
461
static mut #ident: #ty = #expr;
459
462
460
463
& mut #ident
@@ -603,15 +606,17 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
603
606
let vars = statics
604
607
. into_iter ( )
605
608
. map ( |var| {
606
- let attrs = var. attrs ;
609
+ let ( ref cfgs , ref attrs) = extract_cfgs ( var. attrs ) ;
607
610
let ident = var. ident ;
608
611
let ty = var. ty ;
609
612
let expr = var. expr ;
610
613
611
614
quote ! (
612
615
#[ allow( non_snake_case) ]
616
+ #( #cfgs) *
613
617
let #ident: & mut #ty = unsafe {
614
618
#( #attrs) *
619
+ #( #cfgs) *
615
620
static mut #ident: #ty = #expr;
616
621
617
622
& mut #ident
@@ -776,3 +781,27 @@ fn extract_static_muts(stmts: Vec<Stmt>) -> Result<(Vec<ItemStatic>, Vec<Stmt>),
776
781
777
782
Ok ( ( statics, stmts) )
778
783
}
784
+
785
+ fn extract_cfgs ( attrs : Vec < Attribute > ) -> ( Vec < Attribute > , Vec < Attribute > ) {
786
+ let mut cfgs = vec ! [ ] ;
787
+ let mut not_cfgs = vec ! [ ] ;
788
+
789
+ for attr in attrs {
790
+ if eq ( & attr, "cfg" ) {
791
+ cfgs. push ( attr) ;
792
+ } else {
793
+ not_cfgs. push ( attr) ;
794
+ }
795
+ }
796
+
797
+ ( cfgs, not_cfgs)
798
+ }
799
+
800
+ /// Returns `true` if `attr.path` matches `name`
801
+ fn eq ( attr : & Attribute , name : & str ) -> bool {
802
+ attr. style == AttrStyle :: Outer && attr. path . segments . len ( ) == 1 && {
803
+ let pair = attr. path . segments . first ( ) . unwrap ( ) ;
804
+ let segment = pair. value ( ) ;
805
+ segment. arguments == PathArguments :: None && segment. ident . to_string ( ) == name
806
+ }
807
+ }
0 commit comments