Optimize ascii::escape_default by using a digit LUT

This commit is contained in:
Martin Gammelsæter 2022-03-09 17:10:34 +01:00
parent 10dccdc7fc
commit 876142417c

View File

@ -98,15 +98,23 @@ pub fn escape_default(c: u8) -> EscapeDefault {
b'\'' => ([b'\\', b'\'', 0, 0], 2), b'\'' => ([b'\\', b'\'', 0, 0], 2),
b'"' => ([b'\\', b'"', 0, 0], 2), b'"' => ([b'\\', b'"', 0, 0], 2),
b'\x20'..=b'\x7e' => ([c, 0, 0, 0], 1), b'\x20'..=b'\x7e' => ([c, 0, 0, 0], 1),
_ => ([b'\\', b'x', hexify(c >> 4), hexify(c & 0xf)], 4), _ => {
let (b1, b2) = hexify(c);
([b'\\', b'x', b1, b2], 4)
}
}; };
return EscapeDefault { range: 0..len, data }; return EscapeDefault { range: 0..len, data };
fn hexify(b: u8) -> u8 { #[inline]
match b { fn hexify(b: u8) -> (u8, u8) {
0..=9 => b'0' + b, let hex_digits: &[u8; 16] = b"0123456789abcdef";
_ => b'a' + b - 10, // SAFETY: For all n: u8, n >> 4 < 16 and n & 0xf < 16
unsafe {
(
*hex_digits.get_unchecked((b >> 4) as usize),
*hex_digits.get_unchecked((b & 0xf) as usize),
)
} }
} }
} }