diff options
| author | diaphore <diaphore@gmail.com> | 2015-07-26 19:32:13 +0200 |
|---|---|---|
| committer | diaphore <diaphore@gmail.com> | 2015-07-27 19:57:28 +0200 |
| commit | aa8950427e522794dc5c0201c5e0d5bd2da1f0db (patch) | |
| tree | f44de6ca4dbd10c738844ada745bb771892d1918 /src/libstd/sys | |
| parent | 0469be1eb70404a57dcc558aa8f53ab529aede47 (diff) | |
| download | rust-aa8950427e522794dc5c0201c5e0d5bd2da1f0db.tar.gz rust-aa8950427e522794dc5c0201c5e0d5bd2da1f0db.zip | |
Fix escaping of characters in Debug for OsStr
Fixes #27211
Fix Debug for {char, str} in core::fmt
Diffstat (limited to 'src/libstd/sys')
| -rw-r--r-- | src/libstd/sys/common/wtf8.rs | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/libstd/sys/common/wtf8.rs b/src/libstd/sys/common/wtf8.rs index 6f15d606724..3d5d1f5e0eb 100644 --- a/src/libstd/sys/common/wtf8.rs +++ b/src/libstd/sys/common/wtf8.rs @@ -426,26 +426,36 @@ impl Ord for Wtf8 { /// and surrogates as `\u` followed by four hexadecimal digits. /// Example: `"a\u{D800}"` for a slice with code points [U+0061, U+D800] impl fmt::Debug for Wtf8 { - fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + fn write_str_escaped(f: &mut fmt::Formatter, s: &str) -> fmt::Result { + use fmt::Write; + for c in s.chars().flat_map(|c| c.escape_default()) { + try!(f.write_char(c)) + } + Ok(()) + } + try!(formatter.write_str("\"")); let mut pos = 0; loop { match self.next_surrogate(pos) { None => break, Some((surrogate_pos, surrogate)) => { - try!(formatter.write_str(unsafe { - // the data in this slice is valid UTF-8, transmute to &str - mem::transmute(&self.bytes[pos .. surrogate_pos]) - })); + try!(write_str_escaped( + formatter, + unsafe { str::from_utf8_unchecked( + &self.bytes[pos .. surrogate_pos] + )}, + )); try!(write!(formatter, "\\u{{{:X}}}", surrogate)); pos = surrogate_pos + 3; } } } - try!(formatter.write_str(unsafe { - // the data in this slice is valid UTF-8, transmute to &str - mem::transmute(&self.bytes[pos..]) - })); + try!(write_str_escaped( + formatter, + unsafe { str::from_utf8_unchecked(&self.bytes[pos..]) }, + )); formatter.write_str("\"") } } @@ -1083,9 +1093,9 @@ mod tests { #[test] fn wtf8buf_show() { - let mut string = Wtf8Buf::from_str("aé 💩"); + let mut string = Wtf8Buf::from_str("a\té 💩\r"); string.push(CodePoint::from_u32(0xD800).unwrap()); - assert_eq!(format!("{:?}", string), r#""aé 💩\u{D800}""#); + assert_eq!(format!("{:?}", string), r#""a\t\u{e9} \u{1f4a9}\r\u{D800}""#); } #[test] @@ -1094,10 +1104,10 @@ mod tests { } #[test] - fn wtf8_show() { - let mut string = Wtf8Buf::from_str("aé 💩"); - string.push(CodePoint::from_u32(0xD800).unwrap()); - assert_eq!(format!("{:?}", string), r#""aé 💩\u{D800}""#); + fn wtf8buf_show_str() { + let text = "a\té 💩\r"; + let mut string = Wtf8Buf::from_str(text); + assert_eq!(format!("{:?}", text), format!("{:?}", string)); } #[test] |
