Skip to content

Commit

Permalink
refactor(es/parser): Don't attempt to handle shebangs in `read_token_…
Browse files Browse the repository at this point in the history
…number_sign` (#7803)

bump() has a safety invariant that there must be input in the buffer to
read (See #7709).

This function as currently written calls `bump()` after calling
`read_token_interpreter()`, which *may* have exhausted the buffer
already in the specific case that it is handling a shebang. (The input
string `#!/bin/js` with no newline is sufficient to cause UB here)

Fortunately, shebangs never reach this function, due to `read_shebang`!
Hurray!

It's cleaner to not attempt to handle shebangs here when this code path
will never be reached, and use a debug assertion to ensure that we're
not dealing with shebangs.
  • Loading branch information
Manishearth committed Aug 14, 2023
1 parent 7fac027 commit 5e7834a
Showing 1 changed file with 7 additions and 27 deletions.
34 changes: 7 additions & 27 deletions crates/swc_ecma_parser/src/lexer/mod.rs
Expand Up @@ -192,35 +192,15 @@ impl<'a> Lexer<'a> {
fn read_token_number_sign(&mut self) -> LexResult<Option<Token>> {
debug_assert!(self.cur().is_some());

if self.input.is_at_start() && self.read_token_interpreter()? {
return Ok(None);
}

self.input.bump(); // '#'
Ok(Some(Token::Hash))
}

#[inline(never)]
fn read_token_interpreter(&mut self) -> LexResult<bool> {
if !self.input.is_at_start() {
return Ok(false);
}

let start = self.input.cur_pos();
self.input.bump();
let c = self.input.cur();
if c == Some('!') {
while let Some(c) = self.input.cur() {
self.input.bump();
if c == '\n' || c == '\r' || c == '\u{8232}' || c == '\u{8233}' {
return Ok(true);
}
}
Ok(false)
} else {
self.input.reset_to(start);
Ok(false)
}
// `#` can also be a part of shebangs, however they should have been
// handled by `read_shebang()`
debug_assert!(
!self.input.is_at_start() || self.cur() != Some('!'),
"#! should have already been handled by read_shebang()"
);
Ok(Some(Token::Hash))
}

/// Read a token given `.`.
Expand Down

1 comment on commit 5e7834a

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 5e7834a Previous: 9e0f3be Ratio
es/full/bugs-1 290182 ns/iter (± 3993) 283171 ns/iter (± 7787) 1.02
es/full/minify/libraries/antd 1308960514 ns/iter (± 9326156) 1303972324 ns/iter (± 11734339) 1.00
es/full/minify/libraries/d3 279696969 ns/iter (± 4526061) 271555362 ns/iter (± 9360847) 1.03
es/full/minify/libraries/echarts 1051804016 ns/iter (± 4203229) 1046504857 ns/iter (± 6287442) 1.01
es/full/minify/libraries/jquery 84928046 ns/iter (± 105879) 84663271 ns/iter (± 142508) 1.00
es/full/minify/libraries/lodash 98435136 ns/iter (± 252299) 98333949 ns/iter (± 268506) 1.00
es/full/minify/libraries/moment 50030303 ns/iter (± 61871) 49731090 ns/iter (± 75104) 1.01
es/full/minify/libraries/react 18089232 ns/iter (± 40340) 18006988 ns/iter (± 259118) 1.00
es/full/minify/libraries/terser 220115546 ns/iter (± 505684) 217419376 ns/iter (± 842330) 1.01
es/full/minify/libraries/three 384499746 ns/iter (± 1167559) 381548459 ns/iter (± 653090) 1.01
es/full/minify/libraries/typescript 2789494711 ns/iter (± 67649059) 2641347152 ns/iter (± 10899048) 1.06
es/full/minify/libraries/victory 597748036 ns/iter (± 16816410) 565254278 ns/iter (± 7587556) 1.06
es/full/minify/libraries/vue 121447944 ns/iter (± 609997) 119771652 ns/iter (± 251319) 1.01
es/full/codegen/es3 34544 ns/iter (± 42) 35324 ns/iter (± 61) 0.98
es/full/codegen/es5 34477 ns/iter (± 57) 35351 ns/iter (± 286) 0.98
es/full/codegen/es2015 34537 ns/iter (± 67) 35327 ns/iter (± 45) 0.98
es/full/codegen/es2016 34593 ns/iter (± 125) 35298 ns/iter (± 471) 0.98
es/full/codegen/es2017 34594 ns/iter (± 61) 35320 ns/iter (± 91) 0.98
es/full/codegen/es2018 34590 ns/iter (± 65) 35279 ns/iter (± 84) 0.98
es/full/codegen/es2019 34541 ns/iter (± 99) 35312 ns/iter (± 1261) 0.98
es/full/codegen/es2020 34549 ns/iter (± 67) 35341 ns/iter (± 59) 0.98
es/full/all/es3 173370550 ns/iter (± 835288) 173024232 ns/iter (± 1527435) 1.00
es/full/all/es5 165253714 ns/iter (± 619598) 163733545 ns/iter (± 1239426) 1.01
es/full/all/es2015 124430677 ns/iter (± 764945) 123664620 ns/iter (± 770983) 1.01
es/full/all/es2016 123241645 ns/iter (± 596997) 123070043 ns/iter (± 1288404) 1.00
es/full/all/es2017 122360433 ns/iter (± 930967) 121133977 ns/iter (± 528325) 1.01
es/full/all/es2018 120826376 ns/iter (± 594832) 120399907 ns/iter (± 1373266) 1.00
es/full/all/es2019 119911666 ns/iter (± 639455) 119212406 ns/iter (± 704405) 1.01
es/full/all/es2020 115901236 ns/iter (± 763322) 115815378 ns/iter (± 1160403) 1.00
es/full/parser 532335 ns/iter (± 7712) 538563 ns/iter (± 4927) 0.99
es/full/base/fixer 17352 ns/iter (± 353) 16999 ns/iter (± 74) 1.02
es/full/base/resolver_and_hygiene 80678 ns/iter (± 130) 80301 ns/iter (± 1273) 1.00
serialization of serde 296 ns/iter (± 0) 293 ns/iter (± 0) 1.01
css/minify/libraries/bootstrap 29399706 ns/iter (± 74321) 30268770 ns/iter (± 1854569) 0.97
css/visitor/compare/clone 1641557 ns/iter (± 1912) 1680501 ns/iter (± 20108) 0.98
css/visitor/compare/visit_mut_span 1791235 ns/iter (± 10170) 1795968 ns/iter (± 13876) 1.00
css/visitor/compare/visit_mut_span_panic 1842726 ns/iter (± 2790) 1886704 ns/iter (± 10778) 0.98
css/visitor/compare/fold_span 2574133 ns/iter (± 17536) 2646026 ns/iter (± 43966) 0.97
css/visitor/compare/fold_span_panic 2763538 ns/iter (± 12417) 2823509 ns/iter (± 29810) 0.98
css/lexer/bootstrap_5_1_3 4475668 ns/iter (± 4542) 4442302 ns/iter (± 35162) 1.01
css/lexer/foundation_6_7_4 3806869 ns/iter (± 1967) 3725963 ns/iter (± 1848) 1.02
css/lexer/tailwind_3_1_1 722511 ns/iter (± 678) 708244 ns/iter (± 851) 1.02
css/parser/bootstrap_5_1_3 19340223 ns/iter (± 35575) 19407447 ns/iter (± 127024) 1.00
css/parser/foundation_6_7_4 15606382 ns/iter (± 27830) 15381424 ns/iter (± 152006) 1.01
css/parser/tailwind_3_1_1 2994553 ns/iter (± 1436) 2962121 ns/iter (± 1968) 1.01
es/codegen/colors 730030 ns/iter (± 396720) 727481 ns/iter (± 396185) 1.00
es/codegen/large 2913050 ns/iter (± 1531522) 2944864 ns/iter (± 1551581) 0.99
es/codegen/with-parser/colors 45583 ns/iter (± 781) 45148 ns/iter (± 701) 1.01
es/codegen/with-parser/large 487583 ns/iter (± 1027) 482533 ns/iter (± 1372) 1.01
es/minify/libraries/antd 1151057280 ns/iter (± 11905031) 1284134043 ns/iter (± 34456869) 0.90
es/minify/libraries/d3 240463737 ns/iter (± 551078) 271283192 ns/iter (± 9425321) 0.89
es/minify/libraries/echarts 907903523 ns/iter (± 2740840) 990686795 ns/iter (± 42872898) 0.92
es/minify/libraries/jquery 74094869 ns/iter (± 218545) 75907647 ns/iter (± 766584) 0.98
es/minify/libraries/lodash 88507188 ns/iter (± 344805) 93883003 ns/iter (± 954452) 0.94
es/minify/libraries/moment 43765907 ns/iter (± 144572) 43992340 ns/iter (± 385867) 0.99
es/minify/libraries/react 16028831 ns/iter (± 193803) 16057981 ns/iter (± 82654) 1.00
es/minify/libraries/terser 188855249 ns/iter (± 1693850) 192231676 ns/iter (± 1540672) 0.98
es/minify/libraries/three 320964827 ns/iter (± 1127687) 350799576 ns/iter (± 17376729) 0.91
es/minify/libraries/typescript 2293656738 ns/iter (± 33040408) 2367560738 ns/iter (± 22690140) 0.97
es/minify/libraries/victory 492254999 ns/iter (± 6007464) 532548345 ns/iter (± 32262040) 0.92
es/minify/libraries/vue 106751425 ns/iter (± 174314) 108527402 ns/iter (± 1736833) 0.98
es/visitor/compare/clone 1930690 ns/iter (± 4446) 1982398 ns/iter (± 6287) 0.97
es/visitor/compare/visit_mut_span 2286355 ns/iter (± 5596) 2327458 ns/iter (± 28180) 0.98
es/visitor/compare/visit_mut_span_panic 2312709 ns/iter (± 4392) 2361975 ns/iter (± 21625) 0.98
es/visitor/compare/fold_span 3349339 ns/iter (± 19346) 3364921 ns/iter (± 17256) 1.00
es/visitor/compare/fold_span_panic 3452980 ns/iter (± 7795) 3518417 ns/iter (± 11975) 0.98
es/lexer/colors 13227 ns/iter (± 35) 13323 ns/iter (± 45) 0.99
es/lexer/angular 6132611 ns/iter (± 33121) 6140592 ns/iter (± 29604) 1.00
es/lexer/backbone 801752 ns/iter (± 709) 803916 ns/iter (± 1440) 1.00
es/lexer/jquery 4495883 ns/iter (± 3665) 4507483 ns/iter (± 22280) 1.00
es/lexer/jquery mobile 6886155 ns/iter (± 37704) 6966748 ns/iter (± 6115) 0.99
es/lexer/mootools 3562921 ns/iter (± 1442) 3595298 ns/iter (± 5668) 0.99
es/lexer/underscore 670531 ns/iter (± 1506) 670107 ns/iter (± 499) 1.00
es/lexer/three 21408038 ns/iter (± 53338) 21406299 ns/iter (± 21557) 1.00
es/lexer/yui 3761299 ns/iter (± 1728) 3850296 ns/iter (± 3394) 0.98
es/parser/colors 27056 ns/iter (± 50) 27865 ns/iter (± 64) 0.97
es/parser/angular 13387550 ns/iter (± 47262) 14413723 ns/iter (± 178839) 0.93
es/parser/backbone 1980625 ns/iter (± 10897) 2085041 ns/iter (± 9954) 0.95
es/parser/jquery 10775610 ns/iter (± 45470) 11517933 ns/iter (± 226145) 0.94
es/parser/jquery mobile 16559320 ns/iter (± 43803) 17908110 ns/iter (± 447336) 0.92
es/parser/mootools 8275971 ns/iter (± 21139) 8786015 ns/iter (± 69285) 0.94
es/parser/underscore 1713700 ns/iter (± 10935) 1791851 ns/iter (± 8747) 0.96
es/parser/three 46625817 ns/iter (± 170034) 49839016 ns/iter (± 671294) 0.94
es/parser/yui 8174981 ns/iter (± 31834) 8643089 ns/iter (± 93217) 0.95
es/preset-env/usage/builtin_type 136636 ns/iter (± 32059) 139180 ns/iter (± 32386) 0.98
es/preset-env/usage/property 16860 ns/iter (± 72) 17191 ns/iter (± 96) 0.98
es/resolver/typescript 89045848 ns/iter (± 1257982) 89989196 ns/iter (± 1025152) 0.99
es/fixer/typescript 64684293 ns/iter (± 837784) 64110181 ns/iter (± 801746) 1.01
es/hygiene/typescript 132700604 ns/iter (± 2297088) 134248841 ns/iter (± 2840437) 0.99
es/resolver_with_hygiene/typescript 240130753 ns/iter (± 3214127) 238568360 ns/iter (± 6433000) 1.01
es/visitor/base-perf/module_clone 59646 ns/iter (± 455) 60651 ns/iter (± 328) 0.98
es/visitor/base-perf/fold_empty 63872 ns/iter (± 216) 64592 ns/iter (± 460) 0.99
es/visitor/base-perf/fold_noop_impl_all 63860 ns/iter (± 403) 64291 ns/iter (± 469) 0.99
es/visitor/base-perf/fold_noop_impl_vec 64214 ns/iter (± 317) 64913 ns/iter (± 249) 0.99
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 57 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 40 ns/iter (± 0) 39 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 108 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 77 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2545 ns/iter (± 16) 2551 ns/iter (± 18) 1.00
es/base/parallel/resolver/typescript 4457138072 ns/iter (± 265055999) 4282872051 ns/iter (± 264962682) 1.04
es/base/parallel/hygiene/typescript 1461418366 ns/iter (± 19046645) 1444869137 ns/iter (± 19959866) 1.01
misc/visitors/time-complexity/time 5 154 ns/iter (± 0) 150 ns/iter (± 0) 1.03
misc/visitors/time-complexity/time 10 442 ns/iter (± 2) 421 ns/iter (± 7) 1.05
misc/visitors/time-complexity/time 15 801 ns/iter (± 2) 797 ns/iter (± 1) 1.01
misc/visitors/time-complexity/time 20 1287 ns/iter (± 1) 1286 ns/iter (± 0) 1.00
misc/visitors/time-complexity/time 40 4352 ns/iter (± 7) 5019 ns/iter (± 5) 0.87
misc/visitors/time-complexity/time 60 9030 ns/iter (± 24) 9036 ns/iter (± 37) 1.00
es/full-target/es2016 234148 ns/iter (± 785) 235313 ns/iter (± 1036) 1.00
es/full-target/es2017 221535 ns/iter (± 1199) 224621 ns/iter (± 853) 0.99
es/full-target/es2018 208767 ns/iter (± 310) 213606 ns/iter (± 669) 0.98
es2020_nullish_coalescing 71561 ns/iter (± 300) 71340 ns/iter (± 451) 1.00
es2020_optional_chaining 81668 ns/iter (± 300) 81692 ns/iter (± 347) 1.00
es2022_class_properties 116335 ns/iter (± 2886) 117217 ns/iter (± 321) 0.99
es2018_object_rest_spread 76003 ns/iter (± 211) 75876 ns/iter (± 222) 1.00
es2019_optional_catch_binding 64743 ns/iter (± 161) 64953 ns/iter (± 249) 1.00
es2017_async_to_generator 65223 ns/iter (± 210) 65275 ns/iter (± 401) 1.00
es2016_exponentiation 69245 ns/iter (± 278) 69966 ns/iter (± 367) 0.99
es2015_arrow 72623 ns/iter (± 219) 72187 ns/iter (± 224) 1.01
es2015_block_scoped_fn 69298 ns/iter (± 232) 69328 ns/iter (± 285) 1.00
es2015_block_scoping 124348 ns/iter (± 469) 125702 ns/iter (± 447) 0.99

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.