widen CharReader buffer (#1859)
This commit is contained in:
@@ -20,7 +20,7 @@ use std::str;
|
|||||||
|
|
||||||
pub struct CharReader<R> {
|
pub struct CharReader<R> {
|
||||||
inner: R,
|
inner: R,
|
||||||
buf: SmallVec<[u8;4]>,
|
buf: SmallVec<[u8;32]>,
|
||||||
pos: usize,
|
pos: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ impl<R: Read> CharReader<R> {
|
|||||||
|
|
||||||
self.buf.clear();
|
self.buf.clear();
|
||||||
|
|
||||||
let mut word = [0u8;4];
|
let mut word = [0u8; std::mem::size_of::<char>()];
|
||||||
let nread = self.inner.read(&mut word)?;
|
let nread = self.inner.read(&mut word)?;
|
||||||
|
|
||||||
self.buf.extend_from_slice(&word[..nread]);
|
self.buf.extend_from_slice(&word[..nread]);
|
||||||
@@ -234,10 +234,10 @@ impl<R: Read> CharRead for CharReader<R> {
|
|||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn put_back_char(&mut self, c: char) {
|
fn put_back_char(&mut self, c: char) {
|
||||||
let src_len = self.buf.len() - self.pos;
|
let src_len = self.buf.len() - self.pos;
|
||||||
debug_assert!(src_len <= 4);
|
debug_assert!(src_len <= self.buf.capacity());
|
||||||
|
|
||||||
let c_len = c.len_utf8();
|
let c_len = c.len_utf8();
|
||||||
let mut shifted_slice = [0u8; 4];
|
let mut shifted_slice = [0u8; 32];
|
||||||
|
|
||||||
shifted_slice[0..src_len].copy_from_slice(&self.buf[self.pos .. self.buf.len()]);
|
shifted_slice[0..src_len].copy_from_slice(&self.buf[self.pos .. self.buf.len()]);
|
||||||
|
|
||||||
|
|||||||
@@ -988,6 +988,17 @@ impl<'a, R: CharRead> Lexer<'a, R> {
|
|||||||
|
|
||||||
return Ok(Token::End);
|
return Ok(Token::End);
|
||||||
}
|
}
|
||||||
|
Ok(c) if c == '\\' => {
|
||||||
|
self.skip_char(c);
|
||||||
|
|
||||||
|
if self.lookahead_char().ok() == Some('n') {
|
||||||
|
self.skip_char('n');
|
||||||
|
return Ok(Token::End);
|
||||||
|
} else {
|
||||||
|
self.return_char(c);
|
||||||
|
self.return_char('.');
|
||||||
|
}
|
||||||
|
}
|
||||||
Err(ParserError::UnexpectedEOF) => {
|
Err(ParserError::UnexpectedEOF) => {
|
||||||
return Ok(Token::End);
|
return Ok(Token::End);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user