Skip to content

Commit

Permalink
refactor(es/parser): Remove needless unsafe (#7818)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7797
  • Loading branch information
kdy1 committed Aug 16, 2023
1 parent 6f2773a commit 8b809db
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions crates/swc_ecma_parser/src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ impl From<u32> for Char {

pub(crate) struct CharIter(SmallVec<[char; 7]>);

/// Ported from https://github.com/web-infra-dev/oxc/blob/99a4816ce7b6132b2667257984f9d92ae3768f03/crates/oxc_parser/src/lexer/mod.rs#L1349-L1374
impl IntoIterator for Char {
type IntoIter = CharIter;
type Item = char;
Expand All @@ -69,20 +70,28 @@ impl IntoIterator for Char {
CharIter(match char::from_u32(self.0) {
Some(c) => smallvec![c],
None => {
let c = unsafe { char::from_u32_unchecked(self.0) };
let escaped = c.escape_unicode().to_string();
let mut buf = smallvec![];

debug_assert!(escaped.starts_with('\\'));
let high = self.0 & 0xffff0000 >> 16;

let mut buf = smallvec![];
buf.push('\\');
buf.push('\0');
buf.push('u');
let low = self.0 & 0x0000ffff;

if escaped.len() == 8 {
buf.extend(escaped[3..=6].chars());
// The second code unit of a surrogate pair is always in the range from 0xDC00
// to 0xDFFF, and is called a low surrogate or a trail surrogate.
if !(0xdc00..=0xdfff).contains(&low) {
buf.push('\\');
buf.push('u');
buf.extend(format!("{high:x}").chars());
buf.push('\\');
buf.push('u');
buf.extend(format!("{low:x}").chars());
} else {
buf.extend(escaped[2..].chars());
// `https://tc39.es/ecma262/#sec-utf16decodesurrogatepair`
let astral_code_point = (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;

buf.push('\\');
buf.push('u');
buf.extend(format!("{astral_code_point:x}").chars());
}

buf
Expand Down

1 comment on commit 8b809db

@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: 8b809db Previous: 478fa47 Ratio
es/full/bugs-1 288636 ns/iter (± 6993) 284055 ns/iter (± 5375) 1.02
es/full/minify/libraries/antd 1322030778 ns/iter (± 19388878) 1321495201 ns/iter (± 13665152) 1.00
es/full/minify/libraries/d3 272123651 ns/iter (± 3165031) 277267110 ns/iter (± 1462154) 0.98
es/full/minify/libraries/echarts 1057658124 ns/iter (± 8826843) 1052466619 ns/iter (± 11413827) 1.00
es/full/minify/libraries/jquery 84981244 ns/iter (± 197210) 84832326 ns/iter (± 86368) 1.00
es/full/minify/libraries/lodash 98420258 ns/iter (± 281812) 98206031 ns/iter (± 167926) 1.00
es/full/minify/libraries/moment 49920560 ns/iter (± 458400) 49962411 ns/iter (± 95581) 1.00
es/full/minify/libraries/react 18018448 ns/iter (± 52485) 17983205 ns/iter (± 46817) 1.00
es/full/minify/libraries/terser 220191443 ns/iter (± 1506787) 218879392 ns/iter (± 1369152) 1.01
es/full/minify/libraries/three 385568237 ns/iter (± 1655649) 383350893 ns/iter (± 1777864) 1.01
es/full/minify/libraries/typescript 2676292546 ns/iter (± 14166789) 2672034877 ns/iter (± 12155552) 1.00
es/full/minify/libraries/victory 573290633 ns/iter (± 6035343) 580560639 ns/iter (± 5305655) 0.99
es/full/minify/libraries/vue 120742143 ns/iter (± 295304) 120416280 ns/iter (± 364068) 1.00
es/full/codegen/es3 35003 ns/iter (± 115) 35234 ns/iter (± 79) 0.99
es/full/codegen/es5 35010 ns/iter (± 53) 35215 ns/iter (± 78) 0.99
es/full/codegen/es2015 35016 ns/iter (± 142) 35286 ns/iter (± 86) 0.99
es/full/codegen/es2016 34991 ns/iter (± 103) 35221 ns/iter (± 95) 0.99
es/full/codegen/es2017 35087 ns/iter (± 447) 35288 ns/iter (± 72) 0.99
es/full/codegen/es2018 35070 ns/iter (± 150) 35212 ns/iter (± 95) 1.00
es/full/codegen/es2019 35044 ns/iter (± 80) 35194 ns/iter (± 116) 1.00
es/full/codegen/es2020 35062 ns/iter (± 61) 35240 ns/iter (± 111) 0.99
es/full/all/es3 169992626 ns/iter (± 1834897) 169021014 ns/iter (± 1373862) 1.01
es/full/all/es5 162315773 ns/iter (± 1087248) 160805929 ns/iter (± 1539014) 1.01
es/full/all/es2015 120824552 ns/iter (± 558375) 120338300 ns/iter (± 564282) 1.00
es/full/all/es2016 119189941 ns/iter (± 527764) 118747705 ns/iter (± 658059) 1.00
es/full/all/es2017 119032321 ns/iter (± 827929) 118504855 ns/iter (± 783939) 1.00
es/full/all/es2018 116565943 ns/iter (± 450884) 116549496 ns/iter (± 501797) 1.00
es/full/all/es2019 115752579 ns/iter (± 392763) 115431518 ns/iter (± 1663059) 1.00
es/full/all/es2020 111294239 ns/iter (± 1806121) 111004264 ns/iter (± 2593980) 1.00
es/full/parser 484679 ns/iter (± 3256) 494674 ns/iter (± 4690) 0.98
es/full/base/fixer 17585 ns/iter (± 47) 19435 ns/iter (± 98) 0.90
es/full/base/resolver_and_hygiene 79587 ns/iter (± 748) 82347 ns/iter (± 353) 0.97
serialization of serde 291 ns/iter (± 2) 293 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 30015443 ns/iter (± 107447) 28747417 ns/iter (± 43888) 1.04
css/visitor/compare/clone 1649228 ns/iter (± 24145) 1648837 ns/iter (± 8333) 1.00
css/visitor/compare/visit_mut_span 1766549 ns/iter (± 10265) 1769997 ns/iter (± 4789) 1.00
css/visitor/compare/visit_mut_span_panic 1852369 ns/iter (± 23069) 1837692 ns/iter (± 2551) 1.01
css/visitor/compare/fold_span 2566121 ns/iter (± 10811) 2599453 ns/iter (± 6436) 0.99
css/visitor/compare/fold_span_panic 2741722 ns/iter (± 9991) 2769366 ns/iter (± 16134) 0.99
css/lexer/bootstrap_5_1_3 4447062 ns/iter (± 34180) 4530288 ns/iter (± 23969) 0.98
css/lexer/foundation_6_7_4 3746492 ns/iter (± 1912) 3800071 ns/iter (± 3034) 0.99
css/lexer/tailwind_3_1_1 711633 ns/iter (± 1365) 723326 ns/iter (± 374) 0.98
css/parser/bootstrap_5_1_3 19511856 ns/iter (± 241040) 19066785 ns/iter (± 90366) 1.02
css/parser/foundation_6_7_4 15686508 ns/iter (± 14446) 15394323 ns/iter (± 101223) 1.02
css/parser/tailwind_3_1_1 3036624 ns/iter (± 2131) 2942565 ns/iter (± 3754) 1.03
es/codegen/colors 740022 ns/iter (± 404481) 737381 ns/iter (± 403066) 1.00
es/codegen/large 2904806 ns/iter (± 1530129) 3162105 ns/iter (± 1664579) 0.92
es/codegen/with-parser/colors 46116 ns/iter (± 207) 44933 ns/iter (± 581) 1.03
es/codegen/with-parser/large 486899 ns/iter (± 683) 484679 ns/iter (± 690) 1.00
es/minify/libraries/antd 1173469536 ns/iter (± 17104191) 1136508598 ns/iter (± 9192760) 1.03
es/minify/libraries/d3 240901922 ns/iter (± 608773) 240068034 ns/iter (± 1222725) 1.00
es/minify/libraries/echarts 916346139 ns/iter (± 5032112) 911568947 ns/iter (± 6029929) 1.01
es/minify/libraries/jquery 73793547 ns/iter (± 115659) 73549662 ns/iter (± 130703) 1.00
es/minify/libraries/lodash 87849194 ns/iter (± 201204) 87621884 ns/iter (± 222458) 1.00
es/minify/libraries/moment 43506408 ns/iter (± 63847) 43341436 ns/iter (± 83278) 1.00
es/minify/libraries/react 16013943 ns/iter (± 46848) 15974064 ns/iter (± 41657) 1.00
es/minify/libraries/terser 189022877 ns/iter (± 1334070) 186714002 ns/iter (± 458378) 1.01
es/minify/libraries/three 335080964 ns/iter (± 9147349) 319652491 ns/iter (± 1519407) 1.05
es/minify/libraries/typescript 2338615432 ns/iter (± 24290309) 2263992960 ns/iter (± 9307777) 1.03
es/minify/libraries/victory 519509998 ns/iter (± 12089772) 479624719 ns/iter (± 2140663) 1.08
es/minify/libraries/vue 110400159 ns/iter (± 1661655) 106374833 ns/iter (± 223652) 1.04
es/visitor/compare/clone 1940648 ns/iter (± 4811) 1929442 ns/iter (± 5936) 1.01
es/visitor/compare/visit_mut_span 2280226 ns/iter (± 4693) 2233365 ns/iter (± 2708) 1.02
es/visitor/compare/visit_mut_span_panic 2329730 ns/iter (± 24559) 2301447 ns/iter (± 1835) 1.01
es/visitor/compare/fold_span 3540043 ns/iter (± 59565) 3343465 ns/iter (± 4395) 1.06
es/visitor/compare/fold_span_panic 3655167 ns/iter (± 29877) 3468371 ns/iter (± 13827) 1.05
es/lexer/colors 13129 ns/iter (± 29) 13486 ns/iter (± 40) 0.97
es/lexer/angular 6105410 ns/iter (± 5589) 6205237 ns/iter (± 8215) 0.98
es/lexer/backbone 793894 ns/iter (± 1473) 813859 ns/iter (± 2835) 0.98
es/lexer/jquery 4479731 ns/iter (± 4277) 4621616 ns/iter (± 6277) 0.97
es/lexer/jquery mobile 6860056 ns/iter (± 4403) 7014112 ns/iter (± 6860) 0.98
es/lexer/mootools 3557281 ns/iter (± 3705) 3626080 ns/iter (± 1648) 0.98
es/lexer/underscore 666279 ns/iter (± 2174) 684340 ns/iter (± 387) 0.97
es/lexer/three 21509846 ns/iter (± 24279) 21833769 ns/iter (± 16552) 0.99
es/lexer/yui 3831564 ns/iter (± 2587) 3901601 ns/iter (± 4499) 0.98
es/parser/colors 28069 ns/iter (± 58) 27974 ns/iter (± 98) 1.00
es/parser/angular 13822530 ns/iter (± 84196) 13403316 ns/iter (± 62616) 1.03
es/parser/backbone 2034428 ns/iter (± 6384) 1980636 ns/iter (± 7308) 1.03
es/parser/jquery 11055371 ns/iter (± 46105) 10810636 ns/iter (± 45271) 1.02
es/parser/jquery mobile 16945610 ns/iter (± 75471) 16565840 ns/iter (± 36493) 1.02
es/parser/mootools 8533870 ns/iter (± 20809) 8352854 ns/iter (± 15936) 1.02
es/parser/underscore 1747855 ns/iter (± 10316) 1711357 ns/iter (± 10651) 1.02
es/parser/three 48670826 ns/iter (± 452514) 46516499 ns/iter (± 229236) 1.05
es/parser/yui 8437201 ns/iter (± 35765) 8271685 ns/iter (± 29979) 1.02
es/preset-env/usage/builtin_type 136603 ns/iter (± 32197) 137053 ns/iter (± 32748) 1.00
es/preset-env/usage/property 16807 ns/iter (± 79) 16872 ns/iter (± 104) 1.00
es/resolver/typescript 90213962 ns/iter (± 1454630) 87970764 ns/iter (± 855785) 1.03
es/fixer/typescript 64924050 ns/iter (± 1561414) 63033981 ns/iter (± 614829) 1.03
es/hygiene/typescript 132379934 ns/iter (± 1170358) 130767927 ns/iter (± 1035122) 1.01
es/resolver_with_hygiene/typescript 243486621 ns/iter (± 1507382) 243856475 ns/iter (± 1427041) 1.00
es/visitor/base-perf/module_clone 60520 ns/iter (± 296) 59182 ns/iter (± 204) 1.02
es/visitor/base-perf/fold_empty 64118 ns/iter (± 158) 63669 ns/iter (± 224) 1.01
es/visitor/base-perf/fold_noop_impl_all 63876 ns/iter (± 753) 64040 ns/iter (± 313) 1.00
es/visitor/base-perf/fold_noop_impl_vec 64880 ns/iter (± 330) 64300 ns/iter (± 291) 1.01
es/visitor/base-perf/boxing_boxed_clone 58 ns/iter (± 0) 57 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 40 ns/iter (± 0) 38 ns/iter (± 0) 1.05
es/visitor/base-perf/boxing_boxed 105 ns/iter (± 0) 108 ns/iter (± 1) 0.97
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 78 ns/iter (± 0) 0.96
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2581 ns/iter (± 14) 2591 ns/iter (± 20) 1.00
es/base/parallel/resolver/typescript 4084810886 ns/iter (± 309075363) 4457335696 ns/iter (± 228911829) 0.92
es/base/parallel/hygiene/typescript 1462569620 ns/iter (± 12485381) 1451798630 ns/iter (± 12304265) 1.01
misc/visitors/time-complexity/time 5 134 ns/iter (± 7) 137 ns/iter (± 0) 0.98
misc/visitors/time-complexity/time 10 379 ns/iter (± 0) 383 ns/iter (± 7) 0.99
misc/visitors/time-complexity/time 15 523 ns/iter (± 1) 526 ns/iter (± 5) 0.99
misc/visitors/time-complexity/time 20 1019 ns/iter (± 2) 1047 ns/iter (± 2) 0.97
misc/visitors/time-complexity/time 40 3652 ns/iter (± 13) 3548 ns/iter (± 9) 1.03
misc/visitors/time-complexity/time 60 7402 ns/iter (± 27) 7357 ns/iter (± 28) 1.01
es/full-target/es2016 232238 ns/iter (± 532) 231628 ns/iter (± 1377) 1.00
es/full-target/es2017 221214 ns/iter (± 836) 218781 ns/iter (± 772) 1.01
es/full-target/es2018 208563 ns/iter (± 777) 207047 ns/iter (± 788) 1.01
es2020_nullish_coalescing 71803 ns/iter (± 177) 70748 ns/iter (± 395) 1.01
es2020_optional_chaining 80451 ns/iter (± 259) 81699 ns/iter (± 232) 0.98
es2022_class_properties 117186 ns/iter (± 486) 115210 ns/iter (± 751) 1.02
es2018_object_rest_spread 75503 ns/iter (± 236) 76464 ns/iter (± 880) 0.99
es2019_optional_catch_binding 66374 ns/iter (± 278) 63850 ns/iter (± 277) 1.04
es2017_async_to_generator 64871 ns/iter (± 155) 63865 ns/iter (± 178) 1.02
es2016_exponentiation 69481 ns/iter (± 189) 68494 ns/iter (± 176) 1.01
es2015_arrow 72750 ns/iter (± 317) 71985 ns/iter (± 254) 1.01
es2015_block_scoped_fn 69698 ns/iter (± 170) 68406 ns/iter (± 283) 1.02
es2015_block_scoping 123807 ns/iter (± 482) 120707 ns/iter (± 403) 1.03

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

Please sign in to comment.