diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index b0791d63f..f6de156f0 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -37,16 +37,28 @@ macro_rules! span { && __CALLSITE.is_enabled(interest) { let meta = __CALLSITE.metadata(); - // span with explicit parent - $crate::Span::child_of( - $parent, - meta, - &$crate::valueset!(meta.fields(), $($fields)*), - ) + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + // span with explicit parent + $crate::Span::child_of( + $parent, + meta, + &fields.value_set(field_arr), + ) + } + } } else { let span = __CALLSITE.disabled_span(); $crate::if_log_enabled! { $lvl, { - span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + span.record_all(&fields.value_set(field_arr)); + } + } }}; span } @@ -69,15 +81,27 @@ macro_rules! span { && __CALLSITE.is_enabled(interest) { let meta = __CALLSITE.metadata(); - // span with contextual parent - $crate::Span::new( - meta, - &$crate::valueset!(meta.fields(), $($fields)*), - ) + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + // span with contextual parent + $crate::Span::new( + meta, + &fields.value_set(field_arr), + ) + } + } } else { let span = __CALLSITE.disabled_span(); $crate::if_log_enabled! { $lvl, { - span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + span.record_all(&fields.value_set(field_arr)); + } + } }}; span } @@ -600,25 +624,38 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - let meta = __CALLSITE.metadata(); - // event with explicit parent - $crate::Event::child_of( - $parent, - meta, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + let meta = __CALLSITE.metadata(); + // event with explicit parent + $crate::Event::child_of( + $parent, + meta, + value_set + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -653,24 +690,37 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - let meta = __CALLSITE.metadata(); - // event with contextual parent - $crate::Event::dispatch( - meta, - &value_set - ); - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let meta = __CALLSITE.metadata(); + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + // event with contextual parent + $crate::Event::dispatch( + meta, + value_set + ); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -710,25 +760,38 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - let meta = __CALLSITE.metadata(); - // event with explicit parent - $crate::Event::child_of( - $parent, - meta, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let meta = __CALLSITE.metadata(); + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + // event with explicit parent + $crate::Event::child_of( + $parent, + meta, + value_set + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -763,25 +826,38 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - let meta = __CALLSITE.metadata(); - // event with explicit parent - $crate::Event::child_of( - $parent, - meta, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let meta = __CALLSITE.metadata(); + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + // event with explicit parent + $crate::Event::child_of( + $parent, + meta, + value_set + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -815,24 +891,37 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - let meta = __CALLSITE.metadata(); - // event with contextual parent - $crate::Event::dispatch( - meta, - &value_set - ); - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let meta = __CALLSITE.metadata(); + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + // event with contextual parent + $crate::Event::dispatch( + meta, + value_set + ); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -870,24 +959,37 @@ macro_rules! event { !interest.is_never() && __CALLSITE.is_enabled(interest) }; if enabled { - (|value_set: $crate::field::ValueSet| { - let meta = __CALLSITE.metadata(); - // event with contextual parent - $crate::Event::dispatch( - meta, - &value_set - ); - $crate::__tracing_log!( - $lvl, - __CALLSITE, - &value_set - ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + let meta = __CALLSITE.metadata(); + let fields = meta.fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + let value_set = &fields.value_set(field_arr); + // event with contextual parent + $crate::Event::dispatch( + meta, + value_set + ); + $crate::__tracing_log!( + $lvl, + __CALLSITE, + |cb| cb(value_set) + ); + } + } } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + |cb| { + let fields = __CALLSITE.metadata().fields(); + let mut fields_iter = fields.iter(); + match $crate::valueset!(fields_iter, $($fields)*) { + field_arr => { + cb(&fields.value_set(field_arr)); + } + } + } ); } }); @@ -2784,6 +2886,9 @@ macro_rules! level_enabled { #[doc(hidden)] #[macro_export] +// `valueset` needs to be used as a `match` scrutinee. +// `Value`s assume a transient, temporary lifetime. +// This is necessary to support https://github.com/rust-lang/rfcs/pull/3606. macro_rules! valueset { // === base case === @@ -2800,79 +2905,79 @@ macro_rules! valueset { // }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$($k).+) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$($k).+) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$($k).+) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$($k).+) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, $next, ) }; @@ -2880,40 +2985,40 @@ macro_rules! valueset { // Handle literal names (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $next, ) }; @@ -2921,67 +3026,68 @@ macro_rules! valueset { // Handle constant names (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, $next, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $next, ) }; (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, + @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, $next, ) }; // Remainder is unparsable, but exists --- must be format args! (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => { - $crate::valueset!(@ { (&$next, $crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn Value)), $($out),* }, $next, ) + $crate::valueset!( + @ { + ( + &$next, + $crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn $crate::field::Value) + ), + $($out),* + }, + $next, + ) }; // === entry === - ($fields:expr, $($kvs:tt)+) => { - { - #[allow(unused_imports)] - use $crate::field::{debug, display, Value}; - let mut iter = $fields.iter(); - $fields.value_set($crate::valueset!( - @ { }, - $crate::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"), - $($kvs)+ - )) - } - }; - ($fields:expr,) => { - { - $fields.value_set(&[]) - } + ($fields:ident, $($kvs:tt)+) => { + $crate::valueset!( + @ { }, + $crate::__macro_support::Iterator::next(&mut $fields).expect("FieldSet corrupted (this is a bug)"), + $($kvs)+ + ) }; + + ($fields:ident, ) => { &[] } } #[doc(hidden)] @@ -3096,7 +3202,10 @@ macro_rules! __tracing_log { .build(); let logger = log::logger(); if logger.enabled(&log_meta) { - $callsite.log(logger, log_meta, $value_set) + let callsite = $callsite; + $value_set(|value_set| + callsite.log(logger, log_meta, value_set) + ); } } }}