Skip to content

Commit

Permalink
fix(es/minifier): Fix infinite loop (#6300)
Browse files Browse the repository at this point in the history
**Related issue:**

 - vercel/next.js#42171.
  • Loading branch information
kdy1 committed Nov 1, 2022
1 parent 00457b5 commit 655f674
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 18 deletions.
2 changes: 2 additions & 0 deletions crates/swc_ecma_minifier/scripts/test.sh
Expand Up @@ -6,6 +6,8 @@ export UPDATE=1
export SWC_CHECK=0
export SWC_RUN=0

touch tests/compress.rs

cargo test -q -p swc_ecma_minifier -p swc --no-fail-fast --test projects --test tsc --test compress --test mangle --features concurrent $@

# find ../swc/tests/ -type f -empty -delete
39 changes: 22 additions & 17 deletions crates/swc_ecma_minifier/src/lib.rs
Expand Up @@ -38,12 +38,7 @@
#![allow(clippy::match_like_matches_macro)]

use once_cell::sync::Lazy;
use swc_common::{
comments::Comments,
pass::{Repeat, Repeated},
sync::Lrc,
SourceMap, SyntaxContext,
};
use swc_common::{comments::Comments, pass::Repeated, sync::Lrc, SourceMap, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_transforms_optimization::debug_assert_valid;
use swc_ecma_visit::VisitMutWith;
Expand Down Expand Up @@ -230,17 +225,27 @@ pub fn optimize(
let _timer = timer!("postcompress");

m.visit_mut_with(&mut postcompress_optimizer(options));
m.visit_mut_with(&mut Repeat::new(pure_optimizer(
options,
None,
marks,
PureOptimizerConfig {
force_str_for_tpl: Minification::force_str_for_tpl(),
enable_join_vars: true,
#[cfg(feature = "debug")]
debug_infinite_loop: false,
},
)));

let mut pass = 0;
loop {
pass += 1;

let mut v = pure_optimizer(
options,
None,
marks,
PureOptimizerConfig {
force_str_for_tpl: Minification::force_str_for_tpl(),
enable_join_vars: true,
#[cfg(feature = "debug")]
debug_infinite_loop: false,
},
);
m.visit_mut_with(&mut v);
if !v.changed() || options.passes <= pass {
break;
}
}
}

if let Some(ref mut _t) = timings {
Expand Down
Expand Up @@ -440,7 +440,7 @@
}
}
function internalRemoveData(elem, name1, pvt) {
if (jQuery.acceptData(elem)) {
if (!!jQuery.acceptData(elem)) {
var i, l, thisCache, isNode = elem.nodeType, cache = isNode ? jQuery.cache : elem, id = isNode ? elem[jQuery.expando] : jQuery.expando;
if (cache[id]) {
if (name1 && (thisCache = pvt ? cache[id] : cache[id].data)) {
Expand Down

1 comment on commit 655f674

@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: 655f674 Previous: 0967e8f Ratio
es/full/bugs-1 338587 ns/iter (± 25065) 421728 ns/iter (± 57912) 0.80
es/full/minify/libraries/antd 1819540785 ns/iter (± 39172952) 2231201446 ns/iter (± 332358325) 0.82
es/full/minify/libraries/d3 393708825 ns/iter (± 15261028) 490219091 ns/iter (± 20524134) 0.80
es/full/minify/libraries/echarts 1574781134 ns/iter (± 46269988) 1854911157 ns/iter (± 96606898) 0.85
es/full/minify/libraries/jquery 98076612 ns/iter (± 2586366) 134039899 ns/iter (± 10585721) 0.73
es/full/minify/libraries/lodash 116716696 ns/iter (± 6988872) 162215410 ns/iter (± 6586077) 0.72
es/full/minify/libraries/moment 57798336 ns/iter (± 1135112) 73512775 ns/iter (± 8409508) 0.79
es/full/minify/libraries/react 19932541 ns/iter (± 309578) 25895674 ns/iter (± 3296036) 0.77
es/full/minify/libraries/terser 304546184 ns/iter (± 24425600) 387786637 ns/iter (± 17576130) 0.79
es/full/minify/libraries/three 553245544 ns/iter (± 21562229) 666473578 ns/iter (± 47406577) 0.83
es/full/minify/libraries/typescript 3567407570 ns/iter (± 328106135) 4111655570 ns/iter (± 152213724) 0.87
es/full/minify/libraries/victory 919712489 ns/iter (± 153495738) 864666903 ns/iter (± 25426307) 1.06
es/full/minify/libraries/vue 177927025 ns/iter (± 44923356) 175974762 ns/iter (± 18012733) 1.01
es/full/codegen/es3 35298 ns/iter (± 1092) 35839 ns/iter (± 3980) 0.98
es/full/codegen/es5 35433 ns/iter (± 2095) 36742 ns/iter (± 4616) 0.96
es/full/codegen/es2015 35370 ns/iter (± 2469) 35278 ns/iter (± 3035) 1.00
es/full/codegen/es2016 35745 ns/iter (± 3829) 34658 ns/iter (± 2206) 1.03
es/full/codegen/es2017 35002 ns/iter (± 7148) 37600 ns/iter (± 7753) 0.93
es/full/codegen/es2018 34764 ns/iter (± 24937) 41749 ns/iter (± 4498) 0.83
es/full/codegen/es2019 34357 ns/iter (± 712) 39311 ns/iter (± 4431) 0.87
es/full/codegen/es2020 34312 ns/iter (± 780) 36656 ns/iter (± 3537) 0.94
es/full/all/es3 194867417 ns/iter (± 29601477) 232773858 ns/iter (± 77317000) 0.84
es/full/all/es5 189184617 ns/iter (± 31849484) 215176525 ns/iter (± 91854707) 0.88
es/full/all/es2015 149887284 ns/iter (± 47027125) 169608699 ns/iter (± 65316844) 0.88
es/full/all/es2016 158736880 ns/iter (± 43394885) 183816844 ns/iter (± 79927029) 0.86
es/full/all/es2017 179692741 ns/iter (± 25671927) 179090293 ns/iter (± 56197776) 1.00
es/full/all/es2018 147805896 ns/iter (± 41638402) 167585615 ns/iter (± 45293145) 0.88
es/full/all/es2019 152004701 ns/iter (± 44630873) 163102332 ns/iter (± 64269667) 0.93
es/full/all/es2020 159153191 ns/iter (± 44342181) 176030427 ns/iter (± 50858897) 0.90
es/full/parser 759275 ns/iter (± 118680) 741873 ns/iter (± 47563) 1.02
es/full/base/fixer 27289 ns/iter (± 1882) 27364 ns/iter (± 4889) 1.00
es/full/base/resolver_and_hygiene 95250 ns/iter (± 31241) 94856 ns/iter (± 14895) 1.00
serialization of ast node 218 ns/iter (± 8) 216 ns/iter (± 73) 1.01
serialization of serde 216 ns/iter (± 12) 220 ns/iter (± 6) 0.98

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

Please sign in to comment.