Skip to content

Commit 57b5c1a

Browse files
committed
Another ~5-7% performance improvement
1 parent 869bc2d commit 57b5c1a

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

src/tokenizer.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ impl<'a> StreamOnce for TokenStream<'a> {
4444

4545
fn uncons(&mut self) -> Result<Self::Item, Error<Token<'a>, Token<'a>>> {
4646
let (kind, len) = self.peek_token()?;
47-
let value = &self.buf[self.off..][..len];
48-
self.update_position(len);
47+
let value = &self.buf[self.off-len..self.off];
4948
self.skip_whitespace();
5049
Ok(Token { kind, value })
5150
}
@@ -116,7 +115,7 @@ impl<'a> TokenStream<'a> {
116115
me.skip_whitespace();
117116
return me;
118117
}
119-
fn peek_token(&self)
118+
fn peek_token(&mut self)
120119
-> Result<(Kind, usize), Error<Token<'a>, Token<'a>>>
121120
{
122121
use self::Kind::*;
@@ -128,10 +127,14 @@ impl<'a> TokenStream<'a> {
128127
match cur_char {
129128
'!' | '$' | ':' | '=' | '@' | '|' |
130129
'(' | ')' | '[' | ']' | '{' | '}' => {
130+
self.position.column += 1;
131+
self.off += 1;
131132
return Ok((Punctuator, 1));
132133
}
133134
'.' => {
134135
if iter.as_str().starts_with("..") {
136+
self.position.column += 3;
137+
self.off += 3;
135138
return Ok((Punctuator, 3))
136139
} else {
137140
return Err(Error::unexpected_message(
@@ -144,11 +147,16 @@ impl<'a> TokenStream<'a> {
144147
match cur_char {
145148
'_' | 'a'...'z' | 'A'...'Z' | '0'...'9' => continue,
146149
_ => {
150+
self.position.column += idx;
151+
self.off += idx;
147152
return Ok((Name, idx));
148153
}
149154
}
150155
}
151-
return Ok((Name, self.buf.len() - self.off));
156+
let len = self.buf.len() - self.off;
157+
self.position.column += len;
158+
self.off += len;
159+
return Ok((Name, len));
152160
}
153161
'-' | '0'...'9' => {
154162
let mut exponent = None;
@@ -175,13 +183,17 @@ impl<'a> TokenStream<'a> {
175183
return Err(Error::unexpected_message(
176184
format_args!("unsupported float {:?}", value)));
177185
}
186+
self.position.column += len;
187+
self.off += len;
178188
return Ok((FloatValue, len));
179189
} else {
180190
let value = &self.buf[self.off..][..len];
181191
if !check_int(value) {
182192
return Err(Error::unexpected_message(
183193
format_args!("unsupported integer {:?}", value)));
184194
}
195+
self.position.column += len;
196+
self.off += len;
185197
return Ok((IntValue, len));
186198
}
187199
}
@@ -190,24 +202,31 @@ impl<'a> TokenStream<'a> {
190202
let tail = &iter.as_str()[2..];
191203
for (endidx, _) in tail.match_indices("\"\"\"") {
192204
if !tail[..endidx].ends_with('\\') {
205+
self.update_position(endidx+6);
193206
return Ok((BlockString, endidx+6));
194207
}
195208
}
196209
return Err(Error::unexpected_message(
197210
"unterminated block string value"));
198211
} else {
199212
let mut prev_char = cur_char;
213+
let mut nchars = 1;
200214
while let Some((idx, cur_char)) = iter.next() {
215+
nchars += 1;
201216
match cur_char {
202217
'"' if prev_char == '\\' => {}
203218
'"' => {
219+
self.position.column += nchars;
220+
self.off += idx+1;
204221
return Ok((StringValue, idx+1));
205222
}
206223
'\n' => {
207224
return Err(Error::unexpected_message(
208225
"unterminated string value"));
209226
}
210-
_ => {}
227+
_ => {
228+
229+
}
211230
}
212231
prev_char = cur_char;
213232
}

0 commit comments

Comments
 (0)