diff --git a/library/core/src/fmt/mod.rs b/library/core/src/fmt/mod.rs index 80d3270d73c..6fc3cd0b7c4 100644 --- a/library/core/src/fmt/mod.rs +++ b/library/core/src/fmt/mod.rs @@ -2186,28 +2186,34 @@ fn fmt(&self, f: &mut Formatter<'_>) -> Result { #[stable(feature = "rust1", since = "1.0.0")] impl Pointer for *const T { fn fmt(&self, f: &mut Formatter<'_>) -> Result { - let old_width = f.width; - let old_flags = f.flags; + /// Since the formatting will be identical for all pointer types, use a non-monomorphized + /// implementation for the actual formatting to reduce the amount of codegen work needed + fn inner(ptr: *const (), f: &mut Formatter<'_>) -> Result { + let old_width = f.width; + let old_flags = f.flags; - // The alternate flag is already treated by LowerHex as being special- - // it denotes whether to prefix with 0x. We use it to work out whether - // or not to zero extend, and then unconditionally set it to get the - // prefix. - if f.alternate() { - f.flags |= 1 << (FlagV1::SignAwareZeroPad as u32); + // The alternate flag is already treated by LowerHex as being special- + // it denotes whether to prefix with 0x. We use it to work out whether + // or not to zero extend, and then unconditionally set it to get the + // prefix. + if f.alternate() { + f.flags |= 1 << (FlagV1::SignAwareZeroPad as u32); - if f.width.is_none() { - f.width = Some((usize::BITS / 4) as usize + 2); + if f.width.is_none() { + f.width = Some((usize::BITS / 4) as usize + 2); + } } + f.flags |= 1 << (FlagV1::Alternate as u32); + + let ret = LowerHex::fmt(&(ptr as usize), f); + + f.width = old_width; + f.flags = old_flags; + + ret } - f.flags |= 1 << (FlagV1::Alternate as u32); - let ret = LowerHex::fmt(&(*self as *const () as usize), f); - - f.width = old_width; - f.flags = old_flags; - - ret + inner(*self as *const (), f) } }