make task.$T.path mandatory

This commit is contained in:
Jorge Aparicio 2017-07-27 19:39:18 -05:00
parent d396da5950
commit b9f50e432e
2 changed files with 32 additions and 58 deletions

View file

@ -49,7 +49,7 @@ pub enum Kind {
pub struct Task { pub struct Task {
pub kind: Kind, pub kind: Kind,
pub path: Option<Path>, pub path: Path,
pub priority: u8, pub priority: u8,
pub resources: Idents, pub resources: Idents,
} }
@ -122,7 +122,7 @@ fn task(name: &str, task: syntax::check::Task) -> Result<Task> {
Ok(Task { Ok(Task {
kind, kind,
path: task.path, path: task.path.ok_or("`path` field is missing")?,
priority: task.priority.unwrap_or(1), priority: task.priority.unwrap_or(1),
resources: task.resources, resources: task.resources,
}) })

View file

@ -603,67 +603,41 @@ fn tasks(app: &App, ownerships: &Ownerships, root: &mut Vec<Tokens>) {
}); });
} }
if let Some(path) = task.path.as_ref() { let mut tys = vec![];
let mut tys = vec![]; let mut exprs = vec![];
let mut exprs = vec![];
let priority = task.priority;
if needs_threshold {
tys.push(quote!(&mut #krate::Threshold));
exprs.push(quote! {
&mut if #priority == 1 << #device::NVIC_PRIO_BITS {
#krate::Threshold::new(::core::u8::MAX)
} else {
#krate::Threshold::new(#priority)
}
});
}
if has_resources {
tys.push(quote!(#name::Resources));
exprs.push(quote!(#name::Resources::new()));
}
let _name = Ident::new(format!("_{}", name));
let export_name =
Lit::Str(name.as_ref().to_owned(), StrStyle::Cooked);
root.push(quote! {
#[allow(non_snake_case)]
#[allow(unsafe_code)]
#[export_name = #export_name]
pub unsafe extern "C" fn #_name() {
let f: fn(#(#tys,)*) = #path;
f(#(#exprs,)*)
}
});
} else if !has_resources {
items.push(quote! {
pub struct Resources {
_0: (),
}
impl Resources {
pub unsafe fn new() -> Self {
Resources { _0: () }
}
}
});
// the `task!` macro will be used so the `#NAME::Resources` type
// must exist
}
let priority = task.priority; let priority = task.priority;
if task.path.is_none() { if needs_threshold {
// This `const`ant is mainly used to make sure the user doesn't tys.push(quote!(&mut #krate::Threshold));
// forget to set a task handler using the `task!` macro. They'll get exprs.push(quote! {
// an error if they do. &mut if #priority == 1 << #device::NVIC_PRIO_BITS {
items.push(quote! { #krate::Threshold::new(::core::u8::MAX)
#[deny(dead_code)] } else {
pub const #name: u8 = #priority; #krate::Threshold::new(#priority)
}
}); });
} }
if has_resources {
tys.push(quote!(#name::Resources));
exprs.push(quote!(#name::Resources::new()));
}
let path = &task.path;
let _name = Ident::new(format!("_{}", name));
let export_name =
Lit::Str(name.as_ref().to_owned(), StrStyle::Cooked);
root.push(quote! {
#[allow(non_snake_case)]
#[allow(unsafe_code)]
#[export_name = #export_name]
pub unsafe extern "C" fn #_name() {
let f: fn(#(#tys,)*) = #path;
f(#(#exprs,)*)
}
});
root.push(quote!{ root.push(quote!{
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[allow(unsafe_code)] #[allow(unsafe_code)]