From b2dad662706d56c7f80a303a08df507cf3af26ec Mon Sep 17 00:00:00 2001 From: josd Date: Sun, 26 Apr 2026 13:42:41 +0200 Subject: [PATCH] Improve CharReader buffering --- src/parser/char_reader.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/parser/char_reader.rs b/src/parser/char_reader.rs index 4d5d7d74..69d592e1 100644 --- a/src/parser/char_reader.rs +++ b/src/parser/char_reader.rs @@ -110,10 +110,10 @@ impl CharReader { if self.pos >= self.buf.len() { self.buf.clear(); - let mut word = [0u8; std::mem::size_of::()]; - 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 CharRead for CharReader { #[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)] -- 2.54.0