Skip to content

Commit 1dfadb8

Browse files
authoredFeb 20, 2023
fix(es/minifier): Fix optimization of expressions in numeric context (#6965)
1 parent 89bbadb commit 1dfadb8

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed
 

‎crates/swc_ecma_minifier/src/compress/pure/numbers.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
use swc_common::util::take::Take;
22
use swc_ecma_ast::*;
3+
use swc_ecma_utils::num_from_str;
34

45
use super::Pure;
56

67
impl Pure<'_> {
78
pub(super) fn optimize_expr_in_num_ctx(&mut self, e: &mut Expr) {
89
if let Expr::Lit(Lit::Str(Str { span, value, .. })) = e {
9-
let value = if value.is_empty() { 0f64 } else { 1f64 };
10+
let value = if value.is_empty() {
11+
0f64
12+
} else {
13+
match num_from_str(value).into_result() {
14+
Ok(f) if f.is_finite() => f,
15+
_ => return,
16+
}
17+
};
1018

1119
self.changed = true;
1220
report_change!("numbers: Converting a string literal to {:?}", value);

‎crates/swc_ecma_minifier/tests/fixture/issues/6957/number-tostring/output.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ assertEquals("0", "0");
8888
assertEquals("100000000000000000000000000000000", "100000000000000000000000000000000");
8989
assertEquals("100000000000000000000000000000001", "100000000000000000000000000000001");
9090
assertEquals("100000000000080", "100000000000080");
91-
assertEquals("1000000000000100", "1");
92-
assertEquals("1000000000000000", "1");
93-
assertEquals("1000000000000000", "1");
91+
assertEquals("1000000000000100", "1000000000000100");
92+
assertEquals("1000000000000000", "1000000000000000");
93+
assertEquals("1000000000000000", "1000000000000000");
9494
assertEquals("100000000000000000000000000000000000000000000000010000000", "100000000000000000000000000000000000000000000000010000000");
9595
assertEquals("-11111111111111111111111111111111", "-11111111111111111111111111111111");
9696
assertEquals("-5yc1z", "-5yc1z");

‎crates/swc_ecma_utils/src/lib.rs

+23-6
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,7 @@ fn may_be_str(ty: Value<Type>) -> bool {
15751575
}
15761576
}
15771577

1578-
fn num_from_str(s: &str) -> Value<f64> {
1578+
pub fn num_from_str(s: &str) -> Value<f64> {
15791579
if s.contains('\u{000b}') {
15801580
return Unknown;
15811581
}
@@ -1587,11 +1587,28 @@ fn num_from_str(s: &str) -> Value<f64> {
15871587
return Known(0.0);
15881588
}
15891589

1590-
if s.starts_with("0x") || s.starts_with("0X") {
1591-
return match s[2..4].parse() {
1592-
Ok(n) => Known(n),
1593-
Err(_) => Known(NAN),
1594-
};
1590+
if s.len() >= 2 {
1591+
match &s.as_bytes()[..2] {
1592+
b"0x" | b"0X" => {
1593+
return match u64::from_str_radix(&s[2..], 16) {
1594+
Ok(n) => Known(n as f64),
1595+
Err(_) => Known(NAN),
1596+
}
1597+
}
1598+
b"0o" | b"0O" => {
1599+
return match u64::from_str_radix(&s[2..], 8) {
1600+
Ok(n) => Known(n as f64),
1601+
Err(_) => Known(NAN),
1602+
};
1603+
}
1604+
b"0b" | b"0B" => {
1605+
return match u64::from_str_radix(&s[2..], 2) {
1606+
Ok(n) => Known(n as f64),
1607+
Err(_) => Known(NAN),
1608+
};
1609+
}
1610+
_ => {}
1611+
}
15951612
}
15961613

15971614
if (s.starts_with('-') || s.starts_with('+'))

1 commit comments

Comments
 (1)

github-actions[bot] commented on Feb 20, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 1dfadb8 Previous: e946c43 Ratio
es/full/bugs-1 301735 ns/iter (± 20081) 291105 ns/iter (± 21556) 1.04
es/full/minify/libraries/antd 1705571688 ns/iter (± 19722332) 1647226943 ns/iter (± 27112889) 1.04
es/full/minify/libraries/d3 325486104 ns/iter (± 7821574) 292931748 ns/iter (± 6676619) 1.11
es/full/minify/libraries/echarts 1337438953 ns/iter (± 32658077) 1273886527 ns/iter (± 23791808) 1.05
es/full/minify/libraries/jquery 91398475 ns/iter (± 638772) 89016549 ns/iter (± 748099) 1.03
es/full/minify/libraries/lodash 107291880 ns/iter (± 1060637) 105127733 ns/iter (± 921733) 1.02
es/full/minify/libraries/moment 53069581 ns/iter (± 405045) 52036264 ns/iter (± 554135) 1.02
es/full/minify/libraries/react 19303763 ns/iter (± 185563) 18940037 ns/iter (± 130692) 1.02
es/full/minify/libraries/terser 262783534 ns/iter (± 8653275) 241753596 ns/iter (± 2095976) 1.09
es/full/minify/libraries/three 448997596 ns/iter (± 4080611) 427460789 ns/iter (± 4721122) 1.05
es/full/minify/libraries/typescript 3211602757 ns/iter (± 86622248) 3161091276 ns/iter (± 30950470) 1.02
es/full/minify/libraries/victory 672073678 ns/iter (± 8860909) 649963164 ns/iter (± 9158184) 1.03
es/full/minify/libraries/vue 130910972 ns/iter (± 1258156) 127747470 ns/iter (± 1663802) 1.02
es/full/codegen/es3 26077 ns/iter (± 73) 25341 ns/iter (± 176) 1.03
es/full/codegen/es5 25972 ns/iter (± 66) 25725 ns/iter (± 143) 1.01
es/full/codegen/es2015 26042 ns/iter (± 423) 25199 ns/iter (± 265) 1.03
es/full/codegen/es2016 25840 ns/iter (± 151) 25254 ns/iter (± 213) 1.02
es/full/codegen/es2017 25819 ns/iter (± 126) 25432 ns/iter (± 193) 1.02
es/full/codegen/es2018 25980 ns/iter (± 93) 25347 ns/iter (± 226) 1.02
es/full/codegen/es2019 25864 ns/iter (± 138) 25471 ns/iter (± 169) 1.02
es/full/codegen/es2020 25911 ns/iter (± 93) 25364 ns/iter (± 249) 1.02
es/full/all/es3 169595864 ns/iter (± 2844851) 174231549 ns/iter (± 3296003) 0.97
es/full/all/es5 162761896 ns/iter (± 3320907) 166655882 ns/iter (± 3924087) 0.98
es/full/all/es2015 123205025 ns/iter (± 965605) 129930316 ns/iter (± 1230471) 0.95
es/full/all/es2016 121848976 ns/iter (± 2448654) 127046790 ns/iter (± 1475595) 0.96
es/full/all/es2017 120593007 ns/iter (± 766255) 125301986 ns/iter (± 1219208) 0.96
es/full/all/es2018 118670890 ns/iter (± 1067337) 120830828 ns/iter (± 1592860) 0.98
es/full/all/es2019 119292470 ns/iter (± 1086393) 120808385 ns/iter (± 993653) 0.99
es/full/all/es2020 113902361 ns/iter (± 978593) 115574799 ns/iter (± 821801) 0.99
es/full/parser 528008 ns/iter (± 6980) 540237 ns/iter (± 10840) 0.98
es/full/base/fixer 21681 ns/iter (± 236) 21351 ns/iter (± 117) 1.02
es/full/base/resolver_and_hygiene 81440 ns/iter (± 324) 79840 ns/iter (± 729) 1.02
serialization of ast node 121 ns/iter (± 0) 120 ns/iter (± 3) 1.01
serialization of serde 126 ns/iter (± 0) 125 ns/iter (± 1) 1.01
css/minify/libraries/bootstrap 27692007 ns/iter (± 162423) 27173609 ns/iter (± 373929) 1.02
css/visitor/compare/clone 2071868 ns/iter (± 11853) 2020628 ns/iter (± 24079) 1.03
css/visitor/compare/visit_mut_span 2264386 ns/iter (± 7783) 2227123 ns/iter (± 23832) 1.02
css/visitor/compare/visit_mut_span_panic 2334824 ns/iter (± 5421) 2275935 ns/iter (± 21844) 1.03
css/visitor/compare/fold_span 2998490 ns/iter (± 26257) 2962693 ns/iter (± 23955) 1.01
css/visitor/compare/fold_span_panic 3178578 ns/iter (± 23356) 3094306 ns/iter (± 28868) 1.03
css/lexer/bootstrap_5_1_3 5251171 ns/iter (± 51970) 5165376 ns/iter (± 97092) 1.02
css/lexer/foundation_6_7_4 4409838 ns/iter (± 8307) 4337589 ns/iter (± 51910) 1.02
css/lexer/tailwind_3_1_1 839493 ns/iter (± 610) 814367 ns/iter (± 4723) 1.03
css/parser/bootstrap_5_1_3 22010836 ns/iter (± 215434) 21431226 ns/iter (± 246591) 1.03
css/parser/foundation_6_7_4 17603719 ns/iter (± 88021) 16947307 ns/iter (± 113794) 1.04
css/parser/tailwind_3_1_1 3320922 ns/iter (± 4452) 3236498 ns/iter (± 20897) 1.03
es/codegen/colors 328109 ns/iter (± 185001) 324457 ns/iter (± 185090) 1.01
es/codegen/large 1233412 ns/iter (± 639406) 1202320 ns/iter (± 640990) 1.03
es/codegen/with-parser/colors 48520 ns/iter (± 359) 48348 ns/iter (± 656) 1.00
es/codegen/with-parser/large 532044 ns/iter (± 2083) 518718 ns/iter (± 5476) 1.03
es/minify/libraries/antd 1529058815 ns/iter (± 23450194) 1430287285 ns/iter (± 28308359) 1.07
es/minify/libraries/d3 265879993 ns/iter (± 9578860) 240518722 ns/iter (± 1442396) 1.11
es/minify/libraries/echarts 1191192572 ns/iter (± 9655413) 1042009016 ns/iter (± 16076834) 1.14
es/minify/libraries/jquery 80364794 ns/iter (± 521882) 76802261 ns/iter (± 415236) 1.05
es/minify/libraries/lodash 97148705 ns/iter (± 772861) 93409999 ns/iter (± 808194) 1.04
es/minify/libraries/moment 46357974 ns/iter (± 361788) 45096772 ns/iter (± 331830) 1.03
es/minify/libraries/react 17058268 ns/iter (± 131539) 16877716 ns/iter (± 137671) 1.01
es/minify/libraries/terser 222190417 ns/iter (± 5939334) 203958170 ns/iter (± 2531780) 1.09
es/minify/libraries/three 380763284 ns/iter (± 6801453) 351834244 ns/iter (± 6507787) 1.08
es/minify/libraries/typescript 2782209409 ns/iter (± 13513717) 2707930895 ns/iter (± 18412444) 1.03
es/minify/libraries/victory 639075227 ns/iter (± 22039695) 559413823 ns/iter (± 8513400) 1.14
es/minify/libraries/vue 119919943 ns/iter (± 1812036) 113037876 ns/iter (± 1014709) 1.06
es/visitor/compare/clone 2416662 ns/iter (± 18189) 2351539 ns/iter (± 20620) 1.03
es/visitor/compare/visit_mut_span 2822860 ns/iter (± 7117) 2803724 ns/iter (± 41095) 1.01
es/visitor/compare/visit_mut_span_panic 2861868 ns/iter (± 7790) 2856157 ns/iter (± 21090) 1.00
es/visitor/compare/fold_span 3959223 ns/iter (± 14617) 3877084 ns/iter (± 26291) 1.02
es/visitor/compare/fold_span_panic 4099505 ns/iter (± 15296) 4114886 ns/iter (± 30664) 1.00
es/lexer/colors 17149 ns/iter (± 6) 16849 ns/iter (± 146) 1.02
es/lexer/angular 8257749 ns/iter (± 6016) 8100253 ns/iter (± 62172) 1.02
es/lexer/backbone 1080322 ns/iter (± 1497) 1061200 ns/iter (± 9471) 1.02
es/lexer/jquery 5964522 ns/iter (± 2613) 5862915 ns/iter (± 41299) 1.02
es/lexer/jquery mobile 9196435 ns/iter (± 4279) 9154852 ns/iter (± 61958) 1.00
es/lexer/mootools 4669513 ns/iter (± 1950) 4597643 ns/iter (± 27145) 1.02
es/lexer/underscore 897778 ns/iter (± 652) 884620 ns/iter (± 3783) 1.01
es/lexer/three 27932962 ns/iter (± 49204) 27382346 ns/iter (± 182775) 1.02
es/lexer/yui 5071104 ns/iter (± 20963) 4966907 ns/iter (± 49483) 1.02
es/parser/colors 30766 ns/iter (± 202) 30127 ns/iter (± 199) 1.02
es/parser/angular 15488501 ns/iter (± 111382) 15170263 ns/iter (± 76268) 1.02
es/parser/backbone 2324282 ns/iter (± 13337) 2263628 ns/iter (± 23854) 1.03
es/parser/jquery 12574212 ns/iter (± 92163) 12190068 ns/iter (± 77894) 1.03
es/parser/jquery mobile 20053243 ns/iter (± 315801) 19280598 ns/iter (± 468547) 1.04
es/parser/mootools 9661947 ns/iter (± 25457) 9389903 ns/iter (± 77564) 1.03
es/parser/underscore 1991881 ns/iter (± 11725) 1955426 ns/iter (± 17737) 1.02
es/parser/three 61499760 ns/iter (± 387111) 55710768 ns/iter (± 915729) 1.10
es/parser/yui 9651682 ns/iter (± 254741) 9532920 ns/iter (± 93030) 1.01
es/preset-env/usage/builtin_type 144888 ns/iter (± 34012) 139734 ns/iter (± 31553) 1.04
es/preset-env/usage/property 21396 ns/iter (± 70) 20677 ns/iter (± 122) 1.03
es/resolver/typescript 124069283 ns/iter (± 1878460) 119430212 ns/iter (± 2054132) 1.04
es/fixer/typescript 97083491 ns/iter (± 6835719) 95432649 ns/iter (± 957736) 1.02
es/hygiene/typescript 204907016 ns/iter (± 2710120) 200089059 ns/iter (± 1131692) 1.02
es/resolver_with_hygiene/typescript 343364517 ns/iter (± 2406248) 333896643 ns/iter (± 1607281) 1.03
es/visitor/base-perf/module_clone 75412 ns/iter (± 962) 74385 ns/iter (± 952) 1.01
es/visitor/base-perf/fold_empty 86881 ns/iter (± 1814) 84538 ns/iter (± 1854) 1.03
es/visitor/base-perf/fold_noop_impl_all 85977 ns/iter (± 1170) 85409 ns/iter (± 1861) 1.01
es/visitor/base-perf/fold_noop_impl_vec 85673 ns/iter (± 1343) 84221 ns/iter (± 1581) 1.02
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 55 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 59 ns/iter (± 0) 58 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 104 ns/iter (± 0) 104 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 103 ns/iter (± 0) 101 ns/iter (± 0) 1.02
es/visitor/base-perf/visit_contains_this 3495 ns/iter (± 67) 3348 ns/iter (± 41) 1.04
es/base/parallel/resolver/typescript 5391644618 ns/iter (± 538131967) 5384560790 ns/iter (± 520230875) 1.00
es/base/parallel/hygiene/typescript 2415480792 ns/iter (± 29957223) 2366456310 ns/iter (± 23699533) 1.02
misc/visitors/time-complexity/time 5 101 ns/iter (± 0) 91 ns/iter (± 1) 1.11
misc/visitors/time-complexity/time 10 320 ns/iter (± 1) 295 ns/iter (± 3) 1.08
misc/visitors/time-complexity/time 15 652 ns/iter (± 0) 587 ns/iter (± 4) 1.11
misc/visitors/time-complexity/time 20 1218 ns/iter (± 2) 1122 ns/iter (± 8) 1.09
misc/visitors/time-complexity/time 40 6653 ns/iter (± 76) 5984 ns/iter (± 39) 1.11
misc/visitors/time-complexity/time 60 17039 ns/iter (± 54) 15178 ns/iter (± 39) 1.12
es/full-target/es2016 188491 ns/iter (± 640) 188392 ns/iter (± 690) 1.00
es/full-target/es2017 183671 ns/iter (± 4194) 182022 ns/iter (± 919) 1.01
es/full-target/es2018 172195 ns/iter (± 215) 168494 ns/iter (± 1217) 1.02
es2020_nullish_coalescing 67036 ns/iter (± 832) 66659 ns/iter (± 609) 1.01
es2020_optional_chaining 95980 ns/iter (± 383) 95227 ns/iter (± 7257) 1.01
es2022_class_properties 94026 ns/iter (± 163) 91814 ns/iter (± 646) 1.02
es2018_object_rest_spread 71293 ns/iter (± 97) 71576 ns/iter (± 242) 1.00
es2019_optional_catch_binding 61246 ns/iter (± 82) 61042 ns/iter (± 489) 1.00
es2017_async_to_generator 62024 ns/iter (± 87) 61251 ns/iter (± 389) 1.01
es2016_exponentiation 65222 ns/iter (± 270) 63998 ns/iter (± 515) 1.02
es2015_arrow 70475 ns/iter (± 274) 69594 ns/iter (± 778) 1.01
es2015_block_scoped_fn 66704 ns/iter (± 151) 65914 ns/iter (± 812) 1.01
es2015_block_scoping 144179 ns/iter (± 10705) 153339 ns/iter (± 10128) 0.94
es2015_classes 116769 ns/iter (± 498) 116257 ns/iter (± 684) 1.00
es2015_computed_props 61002 ns/iter (± 84) 61151 ns/iter (± 279) 1.00
es2015_destructuring 116479 ns/iter (± 253) 114136 ns/iter (± 654) 1.02
es2015_duplicate_keys 64051 ns/iter (± 93) 62473 ns/iter (± 516) 1.03
es2015_parameters 80016 ns/iter (± 312) 78146 ns/iter (± 938) 1.02
es2015_fn_name 66547 ns/iter (± 595) 64635 ns/iter (± 534) 1.03
es2015_for_of 64567 ns/iter (± 111) 64177 ns/iter (± 582) 1.01
es2015_instanceof 63203 ns/iter (± 109) 61861 ns/iter (± 338) 1.02
es2015_shorthand_property 61109 ns/iter (± 108) 60092 ns/iter (± 264) 1.02
es2015_spread 60985 ns/iter (± 81) 59712 ns/iter (± 470) 1.02
es2015_sticky_regex 62481 ns/iter (± 92) 60959 ns/iter (± 280) 1.02
es2015_typeof_symbol 62600 ns/iter (± 103) 61066 ns/iter (± 470) 1.03
es/transform/baseline/base 51967 ns/iter (± 112) 50901 ns/iter (± 225) 1.02
es/transform/baseline/common_reserved_word 62683 ns/iter (± 131) 61234 ns/iter (± 430) 1.02
es/transform/baseline/common_typescript 161095 ns/iter (± 10287) 164180 ns/iter (± 711) 0.98
es/target/es3 165568 ns/iter (± 156) 168102 ns/iter (± 10503) 0.98
es/target/es2015 601535 ns/iter (± 695) 618732 ns/iter (± 3861) 0.97
es/target/es2016 63859 ns/iter (± 90) 63260 ns/iter (± 520) 1.01
es/target/es2017 60558 ns/iter (± 111) 60835 ns/iter (± 354) 1.00
es/target/es2018 79602 ns/iter (± 81) 80114 ns/iter (± 400) 0.99
es/target/es2020 129430 ns/iter (± 137) 131919 ns/iter (± 398) 0.98
babelify-only 672993 ns/iter (± 1462) 676136 ns/iter (± 6876) 1.00
parse_and_babelify_angular 49536559 ns/iter (± 960212) 42045805 ns/iter (± 1694457) 1.18
parse_and_babelify_backbone 6000372 ns/iter (± 240648) 5287936 ns/iter (± 31227) 1.13
parse_and_babelify_jquery 35810038 ns/iter (± 862502) 31309612 ns/iter (± 346499) 1.14
parse_and_babelify_jquery_mobile 57244162 ns/iter (± 650627) 53527417 ns/iter (± 640389) 1.07
parse_and_babelify_mootools 34533737 ns/iter (± 940140) 32195103 ns/iter (± 495820) 1.07
parse_and_babelify_underscore 4419917 ns/iter (± 33920) 4307853 ns/iter (± 25232) 1.03
parse_and_babelify_yui 34536689 ns/iter (± 1221406) 30735738 ns/iter (± 625993) 1.12
html/minify/document/css_spec 45723928 ns/iter (± 858673) 41210578 ns/iter (± 328703) 1.11
html/minify/document/github 18129830 ns/iter (± 217281) 16919875 ns/iter (± 73151) 1.07
html/minify/document/stackoverflow 15892931 ns/iter (± 200963) 15338756 ns/iter (± 93626) 1.04
html/minify/document_fragment/css_spec 41160945 ns/iter (± 1449932) 38380861 ns/iter (± 353558) 1.07
html/minify/document_fragment/github 17475473 ns/iter (± 84356) 16099589 ns/iter (± 78189) 1.09
html/minify/document_fragment/stackoverflow 15915746 ns/iter (± 156922) 14892731 ns/iter (± 238605) 1.07
html/document/visitor/compare/clone 340561 ns/iter (± 2702) 334188 ns/iter (± 2610) 1.02
html/document/visitor/compare/visit_mut_span 369127 ns/iter (± 2512) 360074 ns/iter (± 3354) 1.03
html/document/visitor/compare/visit_mut_span_panic 378142 ns/iter (± 1788) 373121 ns/iter (± 4044) 1.01
html/document/visitor/compare/fold_span 409927 ns/iter (± 2216) 396613 ns/iter (± 1342) 1.03
html/document/visitor/compare/fold_span_panic 467595 ns/iter (± 2576) 455125 ns/iter (± 3083) 1.03
html/document_fragment/visitor/compare/clone 340503 ns/iter (± 2334) 338402 ns/iter (± 2688) 1.01
html/document_fragment/visitor/compare/visit_mut_span 367908 ns/iter (± 2560) 358814 ns/iter (± 3328) 1.03
html/document_fragment/visitor/compare/visit_mut_span_panic 375451 ns/iter (± 2392) 370958 ns/iter (± 3371) 1.01
html/document_fragment/visitor/compare/fold_span 403984 ns/iter (± 2011) 393709 ns/iter (± 2026) 1.03
html/document_fragment/visitor/compare/fold_span_panic 462137 ns/iter (± 1602) 454311 ns/iter (± 4647) 1.02
html/lexer/css_2021_spec 15575797 ns/iter (± 23786) 15124529 ns/iter (± 164619) 1.03
html/lexer/github_com_17_05_2022 6018331 ns/iter (± 2511) 5813876 ns/iter (± 46609) 1.04
html/lexer/stackoverflow_com_17_05_2022 5629901 ns/iter (± 2875) 5466689 ns/iter (± 23439) 1.03
html/parser/parser_document/css_2021_spec 27906202 ns/iter (± 352430) 24928413 ns/iter (± 218619) 1.12
html/parser/parser_document/github_com_17_05_2022 8822850 ns/iter (± 49349) 8533369 ns/iter (± 62229) 1.03
html/parser/parser_document/stackoverflow_com_17_05_2022 7740962 ns/iter (± 12158) 7488086 ns/iter (± 37591) 1.03
html/parser/parser_document_fragment/css_2021_spec 25756324 ns/iter (± 182412) 24845912 ns/iter (± 252019) 1.04
html/parser/parser_document_fragment/github_com_17_05_2022 8729960 ns/iter (± 17863) 8684101 ns/iter (± 50553) 1.01
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7722930 ns/iter (± 9781) 7501042 ns/iter (± 37896) 1.03

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

Please sign in to comment.