From 333eb85d4b7dc51ada5202c35d5c67663111f403 Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Tue, 7 Apr 2015 17:53:55 -0700 Subject: [PATCH] fmt: {:p#} formats pointers padded to native width --- src/libcore/fmt/mod.rs | 26 +++++++++++++++++++++++++- src/test/run-pass/fmt-pointer-trait.rs | 8 ++++++++ src/test/run-pass/ifmt.rs | 8 ++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/libcore/fmt/mod.rs b/src/libcore/fmt/mod.rs index be804327663e5..2a7569e3b731d 100644 --- a/src/libcore/fmt/mod.rs +++ b/src/libcore/fmt/mod.rs @@ -847,9 +847,33 @@ impl Display for char { #[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; + + // 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.flags & 1 << (FlagV1::Alternate as u32) > 0 { + f.flags |= 1 << (FlagV1::SignAwareZeroPad as u32); + + if let None = f.width { + // The formats need two extra bytes, for the 0x + if cfg!(target_pointer_width = "32") { + f.width = Some(10); + } + if cfg!(target_pointer_width = "64") { + f.width = Some(18); + } + } + } f.flags |= 1 << (FlagV1::Alternate as u32); + let ret = LowerHex::fmt(&(*self as usize), f); - f.flags &= !(1 << (FlagV1::Alternate as u32)); + + f.width = old_width; + f.flags = old_flags; + ret } } diff --git a/src/test/run-pass/fmt-pointer-trait.rs b/src/test/run-pass/fmt-pointer-trait.rs index be8ecde67836e..0f4b0bfcec983 100644 --- a/src/test/run-pass/fmt-pointer-trait.rs +++ b/src/test/run-pass/fmt-pointer-trait.rs @@ -23,6 +23,14 @@ fn main() { let _ = format!("{:p}{:p}{:p}", rc, arc, b); + if cfg!(target_pointer_width = "32") { + assert_eq!(format!("{:#p}", p), + "0x00000000"); + } + if cfg!(target_pointer_width = "64") { + assert_eq!(format!("{:#p}", p), + "0x0000000000000000"); + } assert_eq!(format!("{:p}", p), "0x0"); } diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs index 41c859214e96b..7230fe71e21ee 100644 --- a/src/test/run-pass/ifmt.rs +++ b/src/test/run-pass/ifmt.rs @@ -72,6 +72,14 @@ pub fn main() { t!(format!("{:X}", 10_usize), "A"); t!(format!("{}", "foo"), "foo"); t!(format!("{}", "foo".to_string()), "foo"); + if cfg!(target_pointer_width = "32") { + t!(format!("{:#p}", 0x1234 as *const isize), "0x00001234"); + t!(format!("{:#p}", 0x1234 as *mut isize), "0x00001234"); + } + if cfg!(target_pointer_width = "64") { + t!(format!("{:#p}", 0x1234 as *const isize), "0x0000000000001234"); + t!(format!("{:#p}", 0x1234 as *mut isize), "0x0000000000001234"); + } t!(format!("{:p}", 0x1234 as *const isize), "0x1234"); t!(format!("{:p}", 0x1234 as *mut isize), "0x1234"); t!(format!("{:x}", A), "aloha");