28
28
use std:: io:: { ErrorKind , Read , Result } ;
29
29
30
30
#[ derive( Eq , PartialEq , Copy , Clone , Debug ) ]
31
+ #[ repr( u8 ) ]
31
32
enum State {
32
33
Top ,
33
34
InString ,
@@ -252,7 +253,8 @@ fn consume_comment_whitespace_until_maybe_bracket(
252
253
settings : CommentSettings ,
253
254
) -> Result < bool > {
254
255
* i += 1 ;
255
- while * i < buf. len ( ) {
256
+ let len = buf. len ( ) ;
257
+ while * i < len {
256
258
let c = & mut buf[ * i] ;
257
259
* state = match state {
258
260
Top => {
@@ -278,68 +280,79 @@ fn consume_comment_whitespace_until_maybe_bracket(
278
280
fn strip_buf ( state : & mut State , buf : & mut [ u8 ] , settings : CommentSettings ) -> Result < ( ) > {
279
281
let mut i = 0 ;
280
282
let len = buf. len ( ) ;
283
+
284
+ // Fast path for Top state which is most common
281
285
while i < len {
282
286
let c = & mut buf[ i] ;
283
- if matches ! ( state, Top ) {
284
- let cur = i;
285
- * state = top ( c, settings) ;
286
- if settings. trailing_commas
287
- && * c == b','
288
- && consume_comment_whitespace_until_maybe_bracket ( state, buf, & mut i, settings) ?
289
- {
290
- buf[ cur] = b' ' ;
291
- }
292
- } else {
293
- * state = match state {
294
- Top => unreachable ! ( ) ,
295
- InString => in_string ( * c) ,
296
- StringEscape => InString ,
297
- InComment => in_comment ( c, settings) ?,
298
- InBlockComment => consume_block_comments ( buf, & mut i) ,
299
- MaybeCommentEnd => maybe_comment_end ( c) ,
300
- InLineComment => consume_line_comments ( buf, & mut i) ,
287
+
288
+ match state {
289
+ Top => {
290
+ let cur = i;
291
+ let new_state = top ( c, settings) ;
292
+ if settings. trailing_commas
293
+ && * c == b','
294
+ {
295
+ let mut temp_state = new_state;
296
+ if consume_comment_whitespace_until_maybe_bracket ( & mut temp_state, buf, & mut i, settings) ? {
297
+ buf[ cur] = b' ' ;
298
+ }
299
+ * state = temp_state;
300
+ } else {
301
+ * state = new_state;
302
+ }
301
303
}
304
+ InString => * state = in_string ( * c) ,
305
+ StringEscape => * state = InString ,
306
+ InComment => * state = in_comment ( c, settings) ?,
307
+ InBlockComment => * state = consume_block_comments ( buf, & mut i) ,
308
+ MaybeCommentEnd => * state = maybe_comment_end ( c) ,
309
+ InLineComment => * state = consume_line_comments ( buf, & mut i) ,
302
310
}
311
+
303
312
i += 1 ;
304
313
}
305
314
Ok ( ( ) )
306
315
}
307
316
308
- #[ inline]
317
+ #[ inline( always ) ]
309
318
fn consume_line_comments ( buf : & mut [ u8 ] , i : & mut usize ) -> State {
310
319
let cur = * i;
311
- match memchr:: memchr ( b'\n' , & buf[ * i..] ) {
320
+ let remaining = & buf[ * i..] ;
321
+ match memchr:: memchr ( b'\n' , remaining) {
312
322
Some ( offset) => {
313
323
* i += offset;
314
324
buf[ cur..* i] . fill ( b' ' ) ;
315
325
Top
316
326
}
317
327
None => {
318
- * i = buf. len ( ) - 1 ;
319
- buf[ cur..] . fill ( b' ' ) ;
328
+ let len = buf. len ( ) ;
329
+ * i = len - 1 ;
330
+ buf[ cur..len] . fill ( b' ' ) ;
320
331
InLineComment
321
332
}
322
333
}
323
334
}
324
335
325
- #[ inline]
336
+ #[ inline( always ) ]
326
337
fn consume_block_comments ( buf : & mut [ u8 ] , i : & mut usize ) -> State {
327
338
let cur = * i;
328
- match memchr:: memchr ( b'*' , & buf[ * i..] ) {
339
+ let remaining = & buf[ * i..] ;
340
+ match memchr:: memchr ( b'*' , remaining) {
329
341
Some ( offset) => {
330
342
* i += offset;
331
343
buf[ cur..=* i] . fill ( b' ' ) ;
332
344
MaybeCommentEnd
333
345
}
334
346
None => {
335
- * i = buf. len ( ) - 1 ;
336
- buf[ cur..] . fill ( b' ' ) ;
347
+ let len = buf. len ( ) ;
348
+ * i = len - 1 ;
349
+ buf[ cur..len] . fill ( b' ' ) ;
337
350
InBlockComment
338
351
}
339
352
}
340
353
}
341
354
342
- #[ inline]
355
+ #[ inline( always ) ]
343
356
fn top ( c : & mut u8 , settings : CommentSettings ) -> State {
344
357
match * c {
345
358
b'"' => InString ,
@@ -357,7 +370,7 @@ fn top(c: &mut u8, settings: CommentSettings) -> State {
357
370
}
358
371
}
359
372
360
- #[ inline]
373
+ #[ inline( always ) ]
361
374
fn in_string ( c : u8 ) -> State {
362
375
match c {
363
376
b'"' => Top ,
@@ -366,8 +379,9 @@ fn in_string(c: u8) -> State {
366
379
}
367
380
}
368
381
382
+ #[ inline]
369
383
fn in_comment ( c : & mut u8 , settings : CommentSettings ) -> Result < State > {
370
- let new_state = match c {
384
+ let new_state = match * c {
371
385
b'*' if settings. block_comments => InBlockComment ,
372
386
b'/' if settings. slash_line_comments => InLineComment ,
373
387
_ => return Err ( ErrorKind :: InvalidData . into ( ) ) ,
@@ -376,6 +390,7 @@ fn in_comment(c: &mut u8, settings: CommentSettings) -> Result<State> {
376
390
Ok ( new_state)
377
391
}
378
392
393
+ #[ inline]
379
394
fn maybe_comment_end ( c : & mut u8 ) -> State {
380
395
let old = * c;
381
396
* c = b' ' ;
0 commit comments