Skip to content

Commit bfb2603

Browse files
committed
Auto merge of #28662 - semmaz:fmt-debug, r=alexcrichton
fixes #26920
2 parents 669fc7f + 0294098 commit bfb2603

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

src/libcore/char.rs

+27-4
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,7 @@ impl CharExt for char {
185185
'\t' => EscapeDefaultState::Backslash('t'),
186186
'\r' => EscapeDefaultState::Backslash('r'),
187187
'\n' => EscapeDefaultState::Backslash('n'),
188-
'\\' => EscapeDefaultState::Backslash('\\'),
189-
'\'' => EscapeDefaultState::Backslash('\''),
190-
'"' => EscapeDefaultState::Backslash('"'),
188+
'\\' | '\'' | '"' => EscapeDefaultState::Backslash(self),
191189
'\x20' ... '\x7e' => EscapeDefaultState::Char(self),
192190
_ => EscapeDefaultState::Unicode(self.escape_unicode())
193191
};
@@ -344,6 +342,22 @@ impl Iterator for EscapeUnicode {
344342
EscapeUnicodeState::Done => None,
345343
}
346344
}
345+
346+
fn size_hint(&self) -> (usize, Option<usize>) {
347+
let mut n = 0;
348+
while (self.c as usize) >> (4 * (n + 1)) != 0 {
349+
n += 1;
350+
}
351+
let n = match self.state {
352+
EscapeUnicodeState::Backslash => n + 5,
353+
EscapeUnicodeState::Type => n + 4,
354+
EscapeUnicodeState::LeftBrace => n + 3,
355+
EscapeUnicodeState::Value(offset) => offset + 2,
356+
EscapeUnicodeState::RightBrace => 1,
357+
EscapeUnicodeState::Done => 0,
358+
};
359+
(n, Some(n))
360+
}
347361
}
348362

349363
/// An iterator over the characters that represent a `char`, escaped
@@ -377,7 +391,16 @@ impl Iterator for EscapeDefault {
377391
Some(c)
378392
}
379393
EscapeDefaultState::Done => None,
380-
EscapeDefaultState::Unicode(ref mut iter) => iter.next()
394+
EscapeDefaultState::Unicode(ref mut iter) => iter.next(),
395+
}
396+
}
397+
398+
fn size_hint(&self) -> (usize, Option<usize>) {
399+
match self.state {
400+
EscapeDefaultState::Char(_) => (1, Some(1)),
401+
EscapeDefaultState::Backslash(_) => (2, Some(2)),
402+
EscapeDefaultState::Unicode(ref iter) => iter.size_hint(),
403+
EscapeDefaultState::Done => (0, Some(0)),
381404
}
382405
}
383406
}

src/libcore/fmt/mod.rs

+16-7
Original file line numberDiff line numberDiff line change
@@ -1332,11 +1332,21 @@ impl Display for bool {
13321332
#[stable(feature = "rust1", since = "1.0.0")]
13331333
impl Debug for str {
13341334
fn fmt(&self, f: &mut Formatter) -> Result {
1335-
try!(write!(f, "\""));
1336-
for c in self.chars().flat_map(|c| c.escape_default()) {
1337-
try!(f.write_char(c))
1335+
try!(f.write_char('"'));
1336+
let mut from = 0;
1337+
for (i, c) in self.char_indices() {
1338+
let esc = c.escape_default();
1339+
// If char needs escaping, flush backlog so far and write, else skip
1340+
if esc.size_hint() != (1, Some(1)) {
1341+
try!(f.write_str(&self[from..i]));
1342+
for c in esc {
1343+
try!(f.write_char(c));
1344+
}
1345+
from = i + c.len_utf8();
1346+
}
13381347
}
1339-
write!(f, "\"")
1348+
try!(f.write_str(&self[from..]));
1349+
f.write_char('"')
13401350
}
13411351
}
13421352

@@ -1350,12 +1360,11 @@ impl Display for str {
13501360
#[stable(feature = "rust1", since = "1.0.0")]
13511361
impl Debug for char {
13521362
fn fmt(&self, f: &mut Formatter) -> Result {
1353-
use char::CharExt;
1354-
try!(write!(f, "'"));
1363+
try!(f.write_char('\''));
13551364
for c in self.escape_default() {
13561365
try!(f.write_char(c))
13571366
}
1358-
write!(f, "'")
1367+
f.write_char('\'')
13591368
}
13601369
}
13611370

src/test/run-pass/ifmt.rs

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ pub fn main() {
7474
t!(format!("{:?}", 10_usize), "10");
7575
t!(format!("{:?}", "true"), "\"true\"");
7676
t!(format!("{:?}", "foo\nbar"), "\"foo\\nbar\"");
77+
t!(format!("{:?}", "foo\n\"bar\"\r\n\'baz\'\t\\qux\\"),
78+
r#""foo\n\"bar\"\r\n\'baz\'\t\\qux\\""#);
79+
t!(format!("{:?}", "foo\0bar\x01baz\u{3b1}q\u{75}x"),
80+
r#""foo\u{0}bar\u{1}baz\u{3b1}qux""#);
7781
t!(format!("{:o}", 10_usize), "12");
7882
t!(format!("{:x}", 10_usize), "a");
7983
t!(format!("{:X}", 10_usize), "A");

0 commit comments

Comments
 (0)