about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--library/core/src/ascii.rs18
1 files changed, 13 insertions, 5 deletions
diff --git a/library/core/src/ascii.rs b/library/core/src/ascii.rs
index 532208e41af..20f2dd13d8f 100644
--- a/library/core/src/ascii.rs
+++ b/library/core/src/ascii.rs
@@ -98,15 +98,23 @@ pub fn escape_default(c: u8) -> EscapeDefault {
         b'\'' => ([b'\\', b'\'', 0, 0], 2),
         b'"' => ([b'\\', b'"', 0, 0], 2),
         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 };
 
-    fn hexify(b: u8) -> u8 {
-        match b {
-            0..=9 => b'0' + b,
-            _ => b'a' + b - 10,
+    #[inline]
+    fn hexify(b: u8) -> (u8, u8) {
+        let hex_digits: &[u8; 16] = b"0123456789abcdef";
+        // 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),
+            )
         }
     }
 }