]> Repositorios git - scryer-prolog.git/commitdiff
optimize put_back_char
authorSkgland <[email protected]>
Sun, 26 Apr 2026 11:43:04 +0000 (13:43 +0200)
committerSkgland <[email protected]>
Sun, 26 Apr 2026 12:13:55 +0000 (14:13 +0200)
Always encode the char directly into the buffer.
Only shift the buffer content if there isn't enough room in the front.

src/parser/char_reader.rs

index 69d592e15d70566e8d9a2ea353b12edb5d16b77c..1ad6971ebeaf39932b50efb13c11bf0219eb1e51 100644 (file)
@@ -235,16 +235,17 @@ impl<R: Read> CharRead for CharReader<R> {
     #[inline(always)]
     fn put_back_char(&mut self, c: char) {
         let c_len = c.len_utf8();
+        if c_len <= self.pos {
+            self.pos -= c_len;
+        } else {
+            self.buf.insert_from_slice(
+                0,
+                &[0u8; 4/* char::MAX_LEN_UTF8 once msrv reached 1.93 */][..c_len - self.pos],
+            );
+            self.pos = 0;
+        }
 
-        let mut shifted_slice = SmallVec::<[u8; 32]>::new();
-        shifted_slice.extend_from_slice(&self.buf[self.pos..]);
-
-        self.buf.clear();
-        self.buf.resize(c_len, 0);
-        c.encode_utf8(&mut self.buf[..c_len]);
-
-        self.buf.extend_from_slice(&shifted_slice);
-        self.pos = 0;
+        c.encode_utf8(&mut self.buf[self.pos..]);
     }
 
     #[inline(always)]