Evaluation order
⚠️ The design and implementation chapter is outdated ⚠️
Consider this log invocation:
#![allow(unused)]
fn main() {
extern crate defmt;
defmt::info!("x={=?}", foo());
fn foo() -> u8 {
defmt::info!("Hello");
42
}
}
Depending on when foo is invoked this can result in potential re-entrancy / nesting and cause info!("Hello") to be lost.
So we’ll make the macro evaluate format arguments before the acquire operation.
Something like this:
(core::fmt does a similar match operation)
#![allow(unused)]
fn main() {
struct Logger;
impl Logger {
fn acquire() -> Option<Self> { None }
}
fn foo() -> u8 { 0 }
match (foo()) { // evaluate formatting arguments
(_0) => {
if let Some(logger) = Logger::acquire() {
// serialize `_0`, etc.
}
}
}
}