From af54fb2aba46af538b4564045ba40ba7b854d1d3 Mon Sep 17 00:00:00 2001 From: Skgland Date: Sun, 26 Apr 2026 13:43:04 +0200 Subject: [PATCH] optimize put_back_char 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 | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/parser/char_reader.rs b/src/parser/char_reader.rs index 69d592e1..1ad6971e 100644 --- a/src/parser/char_reader.rs +++ b/src/parser/char_reader.rs @@ -235,16 +235,17 @@ impl CharRead for CharReader { #[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)] -- 2.54.0