]> Repositorios git - scryer-prolog.git/commitdiff
Improve CharReader buffering
authorjosd <[email protected]>
Sun, 26 Apr 2026 11:42:41 +0000 (13:42 +0200)
committerjosd <[email protected]>
Sun, 26 Apr 2026 11:42:41 +0000 (13:42 +0200)
src/parser/char_reader.rs

index 4d5d7d7477e2587c5f744497a11d28fa69ee7723..69d592e15d70566e8d9a2ea353b12edb5d16b77c 100644 (file)
@@ -110,10 +110,10 @@ impl<R: Read> CharReader<R> {
         if self.pos >= self.buf.len() {
             self.buf.clear();
 
-            let mut word = [0u8; std::mem::size_of::<char>()];
-            let nread = self.inner.read(&mut word)?;
+            let mut chunk = [0u8; 8 * 1024];
+            let nread = self.inner.read(&mut chunk)?;
 
-            self.buf.extend_from_slice(&word[..nread]);
+            self.buf.extend_from_slice(&chunk[..nread]);
             self.pos = 0;
         }
 
@@ -234,19 +234,17 @@ impl<R: Read> CharRead for CharReader<R> {
 
     #[inline(always)]
     fn put_back_char(&mut self, c: char) {
-        let src_len = self.buf.len() - self.pos;
-        debug_assert!(src_len <= self.buf.capacity());
-
         let c_len = c.len_utf8();
-        let mut shifted_slice = [0u8; 32];
 
-        shifted_slice[0..src_len].copy_from_slice(&self.buf[self.pos..self.buf.len()]);
+        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);
-        self.buf.extend_from_slice(&shifted_slice[0..src_len]);
-        self.pos = 0;
+        c.encode_utf8(&mut self.buf[..c_len]);
 
-        c.encode_utf8(&mut self.buf[0..c_len]);
+        self.buf.extend_from_slice(&shifted_slice);
+        self.pos = 0;
     }
 
     #[inline(always)]