Skip to content

Commit 8761424

Browse files
committed
Optimize ascii::escape_default by using a digit LUT
1 parent 10dccdc commit 8761424

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

library/core/src/ascii.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,23 @@ pub fn escape_default(c: u8) -> EscapeDefault {
9898
b'\'' => ([b'\\', b'\'', 0, 0], 2),
9999
b'"' => ([b'\\', b'"', 0, 0], 2),
100100
b'\x20'..=b'\x7e' => ([c, 0, 0, 0], 1),
101-
_ => ([b'\\', b'x', hexify(c >> 4), hexify(c & 0xf)], 4),
101+
_ => {
102+
let (b1, b2) = hexify(c);
103+
([b'\\', b'x', b1, b2], 4)
104+
}
102105
};
103106

104107
return EscapeDefault { range: 0..len, data };
105108

106-
fn hexify(b: u8) -> u8 {
107-
match b {
108-
0..=9 => b'0' + b,
109-
_ => b'a' + b - 10,
109+
#[inline]
110+
fn hexify(b: u8) -> (u8, u8) {
111+
let hex_digits: &[u8; 16] = b"0123456789abcdef";
112+
// SAFETY: For all n: u8, n >> 4 < 16 and n & 0xf < 16
113+
unsafe {
114+
(
115+
*hex_digits.get_unchecked((b >> 4) as usize),
116+
*hex_digits.get_unchecked((b & 0xf) as usize),
117+
)
110118
}
111119
}
112120
}

0 commit comments

Comments
 (0)