Skip to content

Commit 9d821ce

Browse files
committed
Workaround format_args! with closure
1 parent cd6edbc commit 9d821ce

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

common/logging/src/async_record.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,21 @@ impl Serialize for AsyncRecord {
194194
};
195195
let mut map_serializer = SerdeSerializer::new(serializer)?;
196196
let kv = self.kv.lock();
197-
let message = format_args!("{}", self.msg);
198-
let record = Record::new(&rs, &message, BorrowedKV(&(*kv)));
199197

200-
self.logger_values
201-
.serialize(&record, &mut map_serializer)
202-
.map_err(|e| serde::ser::Error::custom(e))?;
203-
record
204-
.kv()
205-
.serialize(&record, &mut map_serializer)
206-
.map_err(serde::ser::Error::custom)?;
198+
// Convoluted pattern to avoid binding `format_args!` to a temporary.
199+
// See: https://stackoverflow.com/questions/56304313/cannot-use-format-args-due-to-temporary-value-is-freed-at-the-end-of-this-state
200+
let mut f = |msg: std::fmt::Arguments| {
201+
let record = Record::new(&rs, &msg, BorrowedKV(&(*kv)));
202+
self.logger_values
203+
.serialize(&record, &mut map_serializer)
204+
.map_err(serde::ser::Error::custom)?;
205+
record
206+
.kv()
207+
.serialize(&record, &mut map_serializer)
208+
.map_err(serde::ser::Error::custom)
209+
};
210+
f(format_args!("{}", self.msg))?;
211+
207212
map_serializer.end()
208213
}
209214
}

0 commit comments

Comments
 (0)