From 9c0057df58fbc4c79720f9a0104dda46d4d7074e Mon Sep 17 00:00:00 2001 From: Ryan Prichard Date: Sun, 1 Mar 2015 17:25:23 -0800 Subject: [PATCH] Remove core::panicking::panic's dependence on str's Display::fmt impl Display::fmt for str calls into Formatter::pad, which is modest in size and also pulls in string-related functions for its truncation and padding abilities. For size-critical programs (e.g. embedded), this call site may be the only reason Formatter::pad is linked into the output. --- src/libcore/panicking.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libcore/panicking.rs b/src/libcore/panicking.rs index c1c8ac9cc1f..377b5b57ae1 100644 --- a/src/libcore/panicking.rs +++ b/src/libcore/panicking.rs @@ -35,8 +35,14 @@ use fmt; #[cold] #[inline(never)] // this is the slow path, always #[lang="panic"] pub fn panic(expr_file_line: &(&'static str, &'static str, u32)) -> ! { + // Use Arguments::new_v1 instead of format_args!("{}", expr) to potentially + // reduce size overhead. The format_args! macro uses str's Display trait to + // write expr, which calls Formatter::pad, which must accommodate string + // truncation and padding (even though none is used here). Using + // Arguments::new_v1 may allow the compiler to omit Formatter::pad from the + // output binary, saving up to a few kilobytes. let (expr, file, line) = *expr_file_line; - panic_fmt(format_args!("{}", expr), &(file, line)) + panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line)) } #[cold] #[inline(never)]