refactor: make binds harder to misuse

This commit is contained in:
Jorge Aparicio 2019-02-26 23:25:16 +01:00
parent 2fd6ae69d1
commit 8eccef7d9c
3 changed files with 16 additions and 21 deletions

View file

@ -106,12 +106,8 @@ pub fn app(app: &App) -> parse::Result<()> {
} }
// Check that free interrupts are not being used // Check that free interrupts are not being used
for (name, interrupt) in &app.interrupts { for (handler, interrupt) in &app.interrupts {
let name = if let Some(ref binds) = interrupt.args.binds { let name = interrupt.args.binds(handler);
binds
} else {
name
};
if app.free_interrupts.contains_key(name) { if app.free_interrupts.contains_key(name) {
return Err(parse::Error::new( return Err(parse::Error::new(

View file

@ -468,12 +468,8 @@ fn post_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Tok
// the device into compile errors // the device into compile errors
let device = &app.args.device; let device = &app.args.device;
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS); let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
for (name, exception) in &app.exceptions { for (handler, exception) in &app.exceptions {
let name = if let Some(ref binds) = exception.args.binds { let name = exception.args.binds(handler);
binds
} else {
name
};
let priority = exception.args.priority; let priority = exception.args.priority;
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits)))); exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits))));
exprs.push(quote!(p.SCB.set_priority( exprs.push(quote!(p.SCB.set_priority(
@ -1128,7 +1124,7 @@ fn exceptions(ctxt: &mut Context, app: &App, analysis: &Analysis) -> Vec<proc_ma
}; };
let locals = mk_locals(&exception.statics, false); let locals = mk_locals(&exception.statics, false);
let symbol = exception.args.binds.as_ref().unwrap_or(ident).to_string(); let symbol = exception.args.binds(ident).to_string();
let alias = ctxt.ident_gen.mk_ident(None, false); let alias = ctxt.ident_gen.mk_ident(None, false);
let unsafety = &exception.unsafety; let unsafety = &exception.unsafety;
quote!( quote!(
@ -1214,7 +1210,7 @@ fn interrupts(
let locals = mk_locals(&interrupt.statics, false); let locals = mk_locals(&interrupt.statics, false);
let alias = ctxt.ident_gen.mk_ident(None, false); let alias = ctxt.ident_gen.mk_ident(None, false);
let symbol = interrupt.args.binds.as_ref().unwrap_or(ident).to_string(); let symbol = interrupt.args.binds(ident).to_string();
let unsafety = &interrupt.unsafety; let unsafety = &interrupt.unsafety;
scoped.push(quote!( scoped.push(quote!(
// unsafe trampoline to deter end-users from calling this non-reentrant function // unsafe trampoline to deter end-users from calling this non-reentrant function
@ -1997,12 +1993,8 @@ fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Toke
// the device into compile errors // the device into compile errors
let device = &app.args.device; let device = &app.args.device;
let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS); let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS);
for (name, interrupt) in &app.interrupts { for (handler, interrupt) in &app.interrupts {
let name = if let Some(ref binds) = interrupt.args.binds { let name = interrupt.args.binds(handler);
binds
} else {
name
};
let priority = interrupt.args.priority; let priority = interrupt.args.priority;
exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);)); exprs.push(quote!(p.NVIC.enable(#device::Interrupt::#name);));
exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));)); exprs.push(quote!(assert!(#priority <= (1 << #nvic_prio_bits));));

View file

@ -731,13 +731,20 @@ pub struct Exception {
} }
pub struct ExceptionArgs { pub struct ExceptionArgs {
pub binds: Option<Ident>, binds: Option<Ident>,
pub priority: u8, pub priority: u8,
pub resources: Idents, pub resources: Idents,
pub schedule: Idents, pub schedule: Idents,
pub spawn: Idents, pub spawn: Idents,
} }
impl ExceptionArgs {
/// Returns the name of the exception / interrupt this handler binds to
pub fn binds<'a>(&'a self, handler: &'a Ident) -> &'a Ident {
self.binds.as_ref().unwrap_or(handler)
}
}
impl Parse for ExceptionArgs { impl Parse for ExceptionArgs {
fn parse(input: ParseStream<'_>) -> parse::Result<Self> { fn parse(input: ParseStream<'_>) -> parse::Result<Self> {
parse_args(input, /* binds */ true, /* capacity */ false).map( parse_args(input, /* binds */ true, /* capacity */ false).map(