Skip to content

Commit

Permalink
refactor(common): Simplify StringInput implementation (#9071)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Jun 18, 2024
1 parent ae6ab65 commit c3a8c0b
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 25 deletions.
29 changes: 4 additions & 25 deletions crates/swc_common/src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ pub type SourceFileInput<'a> = StringInput<'a>;
/// Implementation of [Input].
#[derive(Clone)]
pub struct StringInput<'a> {
start_pos_of_iter: BytePos,
last_pos: BytePos,
/// Current cursor
iter: str::CharIndices<'a>,
Expand All @@ -31,7 +30,6 @@ impl<'a> StringInput<'a> {
assert!(start <= end);

StringInput {
start_pos_of_iter: start,
last_pos: start,
orig: src,
iter: src.char_indices(),
Expand Down Expand Up @@ -82,8 +80,8 @@ impl<'a> Input for StringInput<'a> {

#[inline]
unsafe fn bump(&mut self) {
if let Some((i, c)) = self.iter.next() {
self.last_pos = self.start_pos_of_iter + BytePos((i + c.len_utf8()) as u32);
if let Some((_, c)) = self.iter.next() {
self.last_pos = self.last_pos + BytePos((c.len_utf8()) as u32);
} else {
unsafe {
debug_unreachable!("bump should not be called when cur() == None");
Expand Down Expand Up @@ -131,7 +129,6 @@ impl<'a> Input for StringInput<'a> {

self.iter = unsafe { s.get_unchecked(end_idx..) }.char_indices();
self.last_pos = end;
self.start_pos_of_iter = end;

ret
}
Expand All @@ -155,7 +152,6 @@ impl<'a> Input for StringInput<'a> {
let ret = unsafe { s.get_unchecked(..last) };

self.last_pos = self.last_pos + BytePos(last as _);
self.start_pos_of_iter = self.last_pos;
self.iter = unsafe { s.get_unchecked(last..) }.char_indices();

ret
Expand All @@ -181,7 +177,6 @@ impl<'a> Input for StringInput<'a> {
debug_assert!(last <= s.len());

self.last_pos = self.last_pos + BytePos(last as _);
self.start_pos_of_iter = self.last_pos;
self.iter = unsafe { s.get_unchecked(last..) }.char_indices();

Some(self.last_pos)
Expand All @@ -195,7 +190,6 @@ impl<'a> Input for StringInput<'a> {
debug_assert!(idx <= orig.len());
let s = unsafe { orig.get_unchecked(idx..) };
self.iter = s.char_indices();
self.start_pos_of_iter = to;
self.last_pos = to;
}

Expand All @@ -217,15 +211,8 @@ impl<'a> Input for StringInput<'a> {
#[inline]
fn eat_byte(&mut self, c: u8) -> bool {
if self.is_byte(c) {
if let Some((i, _)) = self.iter.next() {
self.last_pos = self.start_pos_of_iter + BytePos((i + 1) as u32);
} else {
unsafe {
debug_unreachable!(
"We can't enter here as we already checked the state using `is_byte`"
)
}
}
self.iter.next();
self.last_pos = self.last_pos + BytePos(1_u32);
true
} else {
false
Expand Down Expand Up @@ -340,13 +327,11 @@ mod tests {
with_test_sess("foo/d", |mut i| {
assert_eq!(unsafe { i.slice(BytePos(1), BytePos(2)) }, "f");
assert_eq!(i.last_pos, BytePos(2));
assert_eq!(i.start_pos_of_iter, BytePos(2));
assert_eq!(i.cur(), Some('o'));

assert_eq!(unsafe { i.slice(BytePos(2), BytePos(4)) }, "oo");
assert_eq!(unsafe { i.slice(BytePos(1), BytePos(4)) }, "foo");
assert_eq!(i.last_pos, BytePos(4));
assert_eq!(i.start_pos_of_iter, BytePos(4));
assert_eq!(i.cur(), Some('/'));
});
}
Expand All @@ -356,13 +341,11 @@ mod tests {
with_test_sess("load", |mut i| {
assert_eq!(unsafe { i.slice(BytePos(1), BytePos(3)) }, "lo");
assert_eq!(i.last_pos, BytePos(3));
assert_eq!(i.start_pos_of_iter, BytePos(3));
assert_eq!(i.cur(), Some('a'));
unsafe { i.reset_to(BytePos(1)) };

assert_eq!(i.cur(), Some('l'));
assert_eq!(i.last_pos, BytePos(1));
assert_eq!(i.start_pos_of_iter, BytePos(1));
});
}

Expand All @@ -371,12 +354,10 @@ mod tests {
with_test_sess("foo/d", |mut i| {
assert_eq!(i.cur_pos(), BytePos(1));
assert_eq!(i.last_pos, BytePos(1));
assert_eq!(i.start_pos_of_iter, BytePos(1));
assert_eq!(i.uncons_while(|c| c.is_alphabetic()), "foo");

// assert_eq!(i.cur_pos(), BytePos(4));
assert_eq!(i.last_pos, BytePos(4));
assert_eq!(i.start_pos_of_iter, BytePos(4));
assert_eq!(i.cur(), Some('/'));

unsafe {
Expand All @@ -398,10 +379,8 @@ mod tests {
with_test_sess("foo/d", |mut i| {
assert_eq!(i.cur_pos(), BytePos(1));
assert_eq!(i.last_pos, BytePos(1));
assert_eq!(i.start_pos_of_iter, BytePos(1));

assert_eq!(i.find(|c| c == '/'), Some(BytePos(5)));
assert_eq!(i.start_pos_of_iter, BytePos(5));
assert_eq!(i.last_pos, BytePos(5));
assert_eq!(i.cur(), Some('d'));
});
Expand Down
1 change: 1 addition & 0 deletions crates/swc_ecma_parser/src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ use crate::{
};

mod comments_buffer;
#[deprecated = "Directly use swc_common::input instead"]
pub mod input;
mod jsx;
mod number;
Expand Down

1 comment on commit c3a8c0b

@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: c3a8c0b Previous: aa59ca3 Ratio
es/full/bugs-1 298404 ns/iter (± 7389) 276806 ns/iter (± 2708) 1.08
es/full/minify/libraries/antd 1776794993 ns/iter (± 85834534) 1775197361 ns/iter (± 38370083) 1.00
es/full/minify/libraries/d3 340009579 ns/iter (± 1198619) 343969819 ns/iter (± 2606464) 0.99
es/full/minify/libraries/echarts 1448185177 ns/iter (± 57215045) 1501173311 ns/iter (± 18164791) 0.96
es/full/minify/libraries/jquery 102620388 ns/iter (± 328948) 103152825 ns/iter (± 345404) 0.99
es/full/minify/libraries/lodash 114180397 ns/iter (± 210575) 114381057 ns/iter (± 203713) 1.00
es/full/minify/libraries/moment 59497708 ns/iter (± 113926) 59949144 ns/iter (± 154846) 0.99
es/full/minify/libraries/react 18440265 ns/iter (± 34169) 18468183 ns/iter (± 23208) 1.00
es/full/minify/libraries/terser 273836591 ns/iter (± 812847) 275930999 ns/iter (± 2986853) 0.99
es/full/minify/libraries/three 465472623 ns/iter (± 1926269) 469200391 ns/iter (± 4033313) 0.99
es/full/minify/libraries/typescript 3307073236 ns/iter (± 66794527) 3242314516 ns/iter (± 22886511) 1.02
es/full/minify/libraries/victory 778814392 ns/iter (± 41362395) 732126398 ns/iter (± 17609658) 1.06
es/full/minify/libraries/vue 146983765 ns/iter (± 1449861) 146382973 ns/iter (± 445805) 1.00
es/full/codegen/es3 59683 ns/iter (± 500) 59433 ns/iter (± 179) 1.00
es/full/codegen/es5 59802 ns/iter (± 544) 60223 ns/iter (± 344) 0.99
es/full/codegen/es2015 59643 ns/iter (± 837) 59750 ns/iter (± 129) 1.00
es/full/codegen/es2016 59363 ns/iter (± 225) 59555 ns/iter (± 88) 1.00
es/full/codegen/es2017 59922 ns/iter (± 486) 59444 ns/iter (± 127) 1.01
es/full/codegen/es2018 59558 ns/iter (± 251) 59558 ns/iter (± 311) 1
es/full/codegen/es2019 59539 ns/iter (± 292) 59687 ns/iter (± 124) 1.00
es/full/codegen/es2020 59522 ns/iter (± 258) 59589 ns/iter (± 124) 1.00
es/full/all/es3 163304623 ns/iter (± 863134) 163857586 ns/iter (± 500847) 1.00
es/full/all/es5 157410189 ns/iter (± 944630) 158320732 ns/iter (± 1270723) 0.99
es/full/all/es2015 117606130 ns/iter (± 657633) 118311382 ns/iter (± 546503) 0.99
es/full/all/es2016 116507800 ns/iter (± 731290) 116986396 ns/iter (± 941812) 1.00
es/full/all/es2017 116006693 ns/iter (± 405918) 116573294 ns/iter (± 611717) 1.00
es/full/all/es2018 113359110 ns/iter (± 1290446) 114176931 ns/iter (± 557222) 0.99
es/full/all/es2019 113166007 ns/iter (± 880351) 113743086 ns/iter (± 625226) 0.99
es/full/all/es2020 108889352 ns/iter (± 901090) 109919158 ns/iter (± 1430361) 0.99
es/full/parser 471641 ns/iter (± 3575) 479660 ns/iter (± 2123) 0.98
es/full/base/fixer 15396 ns/iter (± 84) 16231 ns/iter (± 111) 0.95
es/full/base/resolver_and_hygiene 80207 ns/iter (± 1059) 81629 ns/iter (± 363) 0.98
serialization of serde 283 ns/iter (± 5) 283 ns/iter (± 1) 1
css/minify/libraries/bootstrap 22138820 ns/iter (± 159663) 22134904 ns/iter (± 152367) 1.00
css/visitor/compare/clone 1386424 ns/iter (± 8019) 1386120 ns/iter (± 18098) 1.00
css/visitor/compare/visit_mut_span 1513463 ns/iter (± 3707) 1509238 ns/iter (± 5745) 1.00
css/visitor/compare/visit_mut_span_panic 1528328 ns/iter (± 27601) 1546440 ns/iter (± 23388) 0.99
css/visitor/compare/fold_span 2041419 ns/iter (± 7657) 2019398 ns/iter (± 8705) 1.01
css/visitor/compare/fold_span_panic 2177620 ns/iter (± 21379) 2167035 ns/iter (± 9491) 1.00
css/lexer/bootstrap_5_1_3 3456385 ns/iter (± 39317) 3443347 ns/iter (± 14131) 1.00
css/lexer/foundation_6_7_4 2796930 ns/iter (± 3929) 2783031 ns/iter (± 4421) 1.00
css/lexer/tailwind_3_1_1 538937 ns/iter (± 775) 532985 ns/iter (± 773) 1.01
css/parser/bootstrap_5_1_3 16545483 ns/iter (± 137019) 16107989 ns/iter (± 149250) 1.03
css/parser/foundation_6_7_4 13124173 ns/iter (± 119272) 12869520 ns/iter (± 22296) 1.02
css/parser/tailwind_3_1_1 2550064 ns/iter (± 3689) 2543938 ns/iter (± 11924) 1.00
es/codegen/colors 728851 ns/iter (± 397041) 735491 ns/iter (± 408238) 0.99
es/codegen/large 2983940 ns/iter (± 1625054) 2992674 ns/iter (± 1606215) 1.00
es/codegen/with-parser/colors 42861 ns/iter (± 752) 43173 ns/iter (± 210) 0.99
es/codegen/with-parser/large 463201 ns/iter (± 4098) 467093 ns/iter (± 2937) 0.99
es/minify/libraries/antd 1513500764 ns/iter (± 25599337) 1439457464 ns/iter (± 36673194) 1.05
es/minify/libraries/d3 288267559 ns/iter (± 7617598) 285662113 ns/iter (± 5249859) 1.01
es/minify/libraries/echarts 1240120004 ns/iter (± 21590249) 1170164309 ns/iter (± 14949633) 1.06
es/minify/libraries/jquery 82730473 ns/iter (± 266598) 82586949 ns/iter (± 405363) 1.00
es/minify/libraries/lodash 105214327 ns/iter (± 419612) 105128179 ns/iter (± 211494) 1.00
es/minify/libraries/moment 48489880 ns/iter (± 312850) 48295516 ns/iter (± 70956) 1.00
es/minify/libraries/react 16217688 ns/iter (± 105146) 16199453 ns/iter (± 34603) 1.00
es/minify/libraries/terser 220720334 ns/iter (± 2242913) 216286510 ns/iter (± 798911) 1.02
es/minify/libraries/three 378929763 ns/iter (± 11942029) 368498737 ns/iter (± 5626273) 1.03
es/minify/libraries/typescript 2790346985 ns/iter (± 33552215) 2715281684 ns/iter (± 25664593) 1.03
es/minify/libraries/victory 619834605 ns/iter (± 12233761) 591470493 ns/iter (± 7952854) 1.05
es/minify/libraries/vue 121795427 ns/iter (± 649642) 121398326 ns/iter (± 372699) 1.00
es/visitor/compare/clone 1696722 ns/iter (± 5310) 1713411 ns/iter (± 14268) 0.99
es/visitor/compare/visit_mut_span 2042908 ns/iter (± 10336) 2048905 ns/iter (± 10058) 1.00
es/visitor/compare/visit_mut_span_panic 2042237 ns/iter (± 28066) 2045473 ns/iter (± 41457) 1.00
es/visitor/compare/fold_span 2776874 ns/iter (± 11132) 2772337 ns/iter (± 6743) 1.00
es/visitor/compare/fold_span_panic 2812427 ns/iter (± 20426) 2820538 ns/iter (± 5833) 1.00
es/lexer/colors 10691 ns/iter (± 85) 10206 ns/iter (± 91) 1.05
es/lexer/angular 5534263 ns/iter (± 28585) 5214165 ns/iter (± 34944) 1.06
es/lexer/backbone 655838 ns/iter (± 4645) 629176 ns/iter (± 1605) 1.04
es/lexer/jquery 3915086 ns/iter (± 19192) 3633085 ns/iter (± 12200) 1.08
es/lexer/jquery mobile 5815009 ns/iter (± 16885) 5536835 ns/iter (± 23727) 1.05
es/lexer/mootools 3052463 ns/iter (± 10752) 2849917 ns/iter (± 5374) 1.07
es/lexer/underscore 563484 ns/iter (± 1971) 532613 ns/iter (± 2920) 1.06
es/lexer/three 17109930 ns/iter (± 133284) 16306356 ns/iter (± 38543) 1.05
es/lexer/yui 3015053 ns/iter (± 29154) 3002907 ns/iter (± 3010) 1.00
es/lexer/cal-com 13918241 ns/iter (± 67615) 13633090 ns/iter (± 57692) 1.02
es/lexer/typescript 94039195 ns/iter (± 1370052) 92648171 ns/iter (± 355589) 1.02
es/parser/colors 25309 ns/iter (± 111) 25332 ns/iter (± 113) 1.00
es/parser/angular 12846321 ns/iter (± 74576) 12885464 ns/iter (± 280849) 1.00
es/parser/backbone 1860392 ns/iter (± 11844) 1857796 ns/iter (± 8970) 1.00
es/parser/jquery 10302454 ns/iter (± 65260) 10259686 ns/iter (± 68907) 1.00
es/parser/jquery mobile 15480345 ns/iter (± 99111) 15582878 ns/iter (± 99629) 0.99
es/parser/mootools 8012240 ns/iter (± 28885) 7996509 ns/iter (± 33679) 1.00
es/parser/underscore 1639893 ns/iter (± 8571) 1616671 ns/iter (± 6097) 1.01
es/parser/three 45414497 ns/iter (± 460074) 45039401 ns/iter (± 480377) 1.01
es/parser/yui 7615016 ns/iter (± 42554) 7654266 ns/iter (± 30951) 0.99
es/parser/cal-com 42831274 ns/iter (± 639576) 42289782 ns/iter (± 748184) 1.01
es/parser/typescript 277522985 ns/iter (± 1277989) 274300310 ns/iter (± 7167512) 1.01
es/preset-env/usage/builtin_type 135538 ns/iter (± 33325) 136058 ns/iter (± 33335) 1.00
es/preset-env/usage/property 16039 ns/iter (± 92) 16281 ns/iter (± 88) 0.99
es/resolver/typescript 102309416 ns/iter (± 3037993) 102555464 ns/iter (± 1365729) 1.00
es/fixer/typescript 80536188 ns/iter (± 3452806) 81560688 ns/iter (± 3697622) 0.99
es/hygiene/typescript 180336595 ns/iter (± 3601611) 182196149 ns/iter (± 2158027) 0.99
es/resolver_with_hygiene/typescript 304889774 ns/iter (± 3959176) 323507695 ns/iter (± 2333822) 0.94
es/visitor/base-perf/module_clone 55652 ns/iter (± 522) 55585 ns/iter (± 359) 1.00
es/visitor/base-perf/fold_empty 59116 ns/iter (± 648) 58896 ns/iter (± 559) 1.00
es/visitor/base-perf/fold_noop_impl_all 58932 ns/iter (± 1376) 59084 ns/iter (± 380) 1.00
es/visitor/base-perf/fold_noop_impl_vec 59112 ns/iter (± 829) 59131 ns/iter (± 264) 1.00
es/visitor/base-perf/boxing_boxed_clone 63 ns/iter (± 2) 59 ns/iter (± 0) 1.07
es/visitor/base-perf/boxing_unboxed_clone 47 ns/iter (± 0) 47 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 104 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed 80 ns/iter (± 0) 80 ns/iter (± 0) 1
es/visitor/base-perf/visit_contains_this 2597 ns/iter (± 12) 2612 ns/iter (± 24) 0.99
es/base/parallel/resolver/typescript 2436017107 ns/iter (± 72836518) 2380471652 ns/iter (± 128751168) 1.02
es/base/parallel/hygiene/typescript 3139457241 ns/iter (± 61243789) 3261009079 ns/iter (± 41248450) 0.96
babelify-only 478735 ns/iter (± 3149) 473918 ns/iter (± 8144) 1.01
parse_and_babelify_angular 45531651 ns/iter (± 1604539) 43476548 ns/iter (± 365649) 1.05
parse_and_babelify_backbone 4568744 ns/iter (± 136873) 4382243 ns/iter (± 92113) 1.04
parse_and_babelify_jquery 30799783 ns/iter (± 807998) 29831873 ns/iter (± 432730) 1.03
parse_and_babelify_jquery_mobile 52077767 ns/iter (± 606159) 51297593 ns/iter (± 1140609) 1.02
parse_and_babelify_mootools 27603262 ns/iter (± 366593) 26654944 ns/iter (± 430449) 1.04
parse_and_babelify_underscore 3758173 ns/iter (± 50246) 3719071 ns/iter (± 317861) 1.01
parse_and_babelify_yui 25805334 ns/iter (± 450343) 23909403 ns/iter (± 407830) 1.08
html/minify/document/css_spec 45443479 ns/iter (± 175720) 45865777 ns/iter (± 84665) 0.99
html/minify/document/github 18191952 ns/iter (± 411843) 18580770 ns/iter (± 70040) 0.98
html/minify/document/stackoverflow 16698712 ns/iter (± 561420) 16763175 ns/iter (± 225949) 1.00
html/minify/document_fragment/css_spec 43941909 ns/iter (± 81582) 44936090 ns/iter (± 103232) 0.98
html/minify/document_fragment/github 17770515 ns/iter (± 19087) 18207564 ns/iter (± 47733) 0.98
html/minify/document_fragment/stackoverflow 16273228 ns/iter (± 12522) 16520892 ns/iter (± 15909) 0.99
html/document/visitor/compare/clone 165338 ns/iter (± 2596) 166009 ns/iter (± 1049) 1.00
html/document/visitor/compare/visit_mut_span 182918 ns/iter (± 631) 181627 ns/iter (± 1085) 1.01
html/document/visitor/compare/visit_mut_span_panic 189903 ns/iter (± 5648) 192007 ns/iter (± 5626) 0.99
html/document/visitor/compare/fold_span 231199 ns/iter (± 656) 227009 ns/iter (± 806) 1.02
html/document/visitor/compare/fold_span_panic 283812 ns/iter (± 1416) 279091 ns/iter (± 1433) 1.02
html/document_fragment/visitor/compare/clone 170277 ns/iter (± 947) 166976 ns/iter (± 942) 1.02
html/document_fragment/visitor/compare/visit_mut_span 185527 ns/iter (± 1369) 181363 ns/iter (± 801) 1.02
html/document_fragment/visitor/compare/visit_mut_span_panic 190603 ns/iter (± 1847) 184907 ns/iter (± 590) 1.03
html/document_fragment/visitor/compare/fold_span 229256 ns/iter (± 950) 226840 ns/iter (± 1262) 1.01
html/document_fragment/visitor/compare/fold_span_panic 284213 ns/iter (± 723) 277386 ns/iter (± 740) 1.02
html/lexer/css_2021_spec 13011994 ns/iter (± 33124) 13192877 ns/iter (± 26308) 0.99
html/lexer/github_com_17_05_2022 4981924 ns/iter (± 11618) 5070885 ns/iter (± 6753) 0.98
html/lexer/stackoverflow_com_17_05_2022 4737239 ns/iter (± 6519) 4804463 ns/iter (± 101773) 0.99
html/parser/parser_document/css_2021_spec 25436241 ns/iter (± 58674) 25360492 ns/iter (± 50573) 1.00
html/parser/parser_document/github_com_17_05_2022 8486533 ns/iter (± 40552) 8571934 ns/iter (± 25019) 0.99
html/parser/parser_document/stackoverflow_com_17_05_2022 7351350 ns/iter (± 9532) 7542405 ns/iter (± 7971) 0.97
html/parser/parser_document_fragment/css_2021_spec 25043667 ns/iter (± 116284) 25284252 ns/iter (± 80956) 0.99
html/parser/parser_document_fragment/github_com_17_05_2022 8443954 ns/iter (± 13464) 8523139 ns/iter (± 30603) 0.99
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7294208 ns/iter (± 5476) 7508153 ns/iter (± 11702) 0.97

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

Please sign in to comment.