Skip to content

Commit

Permalink
fix(es/minifier): Don't inline into nested scope (#6002)
Browse files Browse the repository at this point in the history
**Related issue:**

- vercel/next.js#30237 (comment)
  • Loading branch information
kdy1 committed Sep 30, 2022
1 parent 77836e5 commit 2ee3ad0
Show file tree
Hide file tree
Showing 10 changed files with 2,302 additions and 23 deletions.
Expand Up @@ -3,19 +3,20 @@ import _class_private_field_init from "@swc/helpers/src/_class_private_field_ini
import _class_private_method_init from "@swc/helpers/src/_class_private_method_init.mjs";
let array = [];
for(let i = 0; i < 10; ++i){
var _myField, _method, _accessor;
function get_accessor() {
return 42;
}
function set_accessor(val) {}
array.push(class {
array.push((_myField = new WeakMap(), _method = new WeakSet(), _accessor = new WeakMap(), class {
constructor(){
_class_private_method_init(this, new WeakSet()), _class_private_field_init(this, new WeakMap(), {
_class_private_method_init(this, _method), _class_private_field_init(this, _accessor, {
get: get_accessor,
set: set_accessor
}), _class_private_field_init(this, new WeakMap(), {
}), _class_private_field_init(this, _myField, {
writable: !0,
value: "hello"
});
}
});
}));
}
@@ -1,10 +1,10 @@
//// [typeOfThisInStaticMembers12.ts]
var _Inner;
let _c;
let _c, _c1;
class C {
}
C.c = "foo", C.bar = (_c = C.c, (_Inner = class {
C.c = "foo", C.bar = (_c = C.c, _c1 = C.c, (_Inner = class {
constructor(){
this[C.c] = 123;
this[_c1] = 123;
}
})[_c] = 123, _Inner);
@@ -1,11 +1,11 @@
//// [typeOfThisInStaticMembers13.ts]
var _Inner;
let _c;
let _c, _c1;
import _define_property from "@swc/helpers/src/_define_property.mjs";
class C {
}
_define_property(C, "c", "foo"), _define_property(C, "bar", (_c = C.c, _Inner = class {
_define_property(C, "c", "foo"), _define_property(C, "bar", (_c = C.c, _c1 = C.c, _Inner = class {
constructor(){
_define_property(this, C.c, 123);
_define_property(this, _c1, 123);
}
}, _define_property(_Inner, _c, 123), _Inner));
18 changes: 18 additions & 0 deletions crates/swc_ecma_minifier/src/analyzer/mod.rs
Expand Up @@ -425,6 +425,24 @@ where
})
}

#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
fn visit_constructor(&mut self, n: &Constructor) {
self.with_child(n.span.ctxt, ScopeKind::Fn, |child| {
{
let ctx = Ctx {
in_pat_of_param: true,
..child.ctx
};
n.params.visit_with(&mut *child.with_ctx(ctx));
}

// Bypass visit_block_stmt
if let Some(body) = &n.body {
body.visit_with(child);
}
})
}

#[cfg_attr(feature = "debug", tracing::instrument(skip(self, n)))]
fn visit_assign_expr(&mut self, n: &AssignExpr) {
let ctx = Ctx {
Expand Down
4 changes: 4 additions & 0 deletions crates/swc_ecma_minifier/src/compress/optimize/sequences.rs
Expand Up @@ -1308,6 +1308,10 @@ where
)
};

if b.is_class() || b.is_fn_expr() || b.is_arrow() {
return Ok(false);
}

match a {
Mergable::Var(..) => {}
Mergable::Expr(a) => {
Expand Down
14 changes: 2 additions & 12 deletions crates/swc_ecma_minifier/src/compress/util/mod.rs
Expand Up @@ -347,20 +347,10 @@ pub(crate) fn negate_cost(
return cost(expr_ctx, last, in_bool_ctx, bin_op, is_ret_val_ignored);
}

if is_ret_val_ignored {
0
} else {
1
}
isize::from(!is_ret_val_ignored)
}

_ => {
if is_ret_val_ignored {
0
} else {
1
}
}
_ => isize::from(!is_ret_val_ignored),
}
})();

Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/src/util/size.rs
Expand Up @@ -162,7 +162,7 @@ impl SizeWithCtxt for Expr {
_ => 2 + params.size(unresolved),
};
let a = if *is_async {
5 + if params.len() == 1 { 0 } else { 1 }
5 + usize::from(params.len() != 1)
} else {
0
};
Expand Down
@@ -0,0 +1,4 @@
{
"defaults": true,
"toplevel": true
}

1 comment on commit 2ee3ad0

@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: 2ee3ad0 Previous: 10fb645 Ratio
es/full/minify/libraries/antd 1891998755 ns/iter (± 63978350) 2392505427 ns/iter (± 149103064) 0.79
es/full/minify/libraries/d3 378090965 ns/iter (± 25629083) 487496806 ns/iter (± 47316772) 0.78
es/full/minify/libraries/echarts 1453092930 ns/iter (± 61746082) 1873052828 ns/iter (± 330980697) 0.78
es/full/minify/libraries/jquery 91474543 ns/iter (± 5061007) 127000080 ns/iter (± 11552662) 0.72
es/full/minify/libraries/lodash 113671737 ns/iter (± 3638967) 150230656 ns/iter (± 13590214) 0.76
es/full/minify/libraries/moment 51655160 ns/iter (± 579860) 68310416 ns/iter (± 1882794) 0.76
es/full/minify/libraries/react 20719477 ns/iter (± 1288869) 25432253 ns/iter (± 973910) 0.81
es/full/minify/libraries/terser 332633017 ns/iter (± 63624141) 358222360 ns/iter (± 39276840) 0.93
es/full/minify/libraries/three 503964623 ns/iter (± 87891878) 634994145 ns/iter (± 59420013) 0.79
es/full/minify/libraries/typescript 3402723113 ns/iter (± 115299594) 4096010458 ns/iter (± 187222307) 0.83
es/full/minify/libraries/victory 821380707 ns/iter (± 30428967) 981381160 ns/iter (± 83353082) 0.84
es/full/minify/libraries/vue 160593192 ns/iter (± 17066531) 188258199 ns/iter (± 19117713) 0.85
es/full/codegen/es3 34806 ns/iter (± 2231) 38458 ns/iter (± 5286) 0.91
es/full/codegen/es5 36133 ns/iter (± 3021) 42739 ns/iter (± 7374) 0.85
es/full/codegen/es2015 35067 ns/iter (± 1482) 42479 ns/iter (± 6716) 0.83
es/full/codegen/es2016 35595 ns/iter (± 1848) 39579 ns/iter (± 7327) 0.90
es/full/codegen/es2017 34484 ns/iter (± 1400) 46802 ns/iter (± 6336) 0.74
es/full/codegen/es2018 34997 ns/iter (± 2048) 40104 ns/iter (± 7542) 0.87
es/full/codegen/es2019 34902 ns/iter (± 1434) 43095 ns/iter (± 6834) 0.81
es/full/codegen/es2020 34767 ns/iter (± 1474) 40028 ns/iter (± 6631) 0.87
es/full/all/es3 222369858 ns/iter (± 35384613) 254930024 ns/iter (± 22056453) 0.87
es/full/all/es5 199097315 ns/iter (± 26116119) 233983080 ns/iter (± 28017783) 0.85
es/full/all/es2015 156708952 ns/iter (± 50016340) 183353422 ns/iter (± 22155530) 0.85
es/full/all/es2016 148291287 ns/iter (± 13439462) 187072163 ns/iter (± 17072527) 0.79
es/full/all/es2017 150570434 ns/iter (± 14745064) 177577187 ns/iter (± 21132566) 0.85
es/full/all/es2018 148527204 ns/iter (± 17158928) 184319546 ns/iter (± 24613743) 0.81
es/full/all/es2019 148981905 ns/iter (± 15979593) 182987951 ns/iter (± 14987760) 0.81
es/full/all/es2020 144319173 ns/iter (± 15189563) 173914830 ns/iter (± 19776035) 0.83
es/full/parser 735164 ns/iter (± 46076) 839961 ns/iter (± 127160) 0.88
es/full/base/fixer 26747 ns/iter (± 2114) 30585 ns/iter (± 3994) 0.87
es/full/base/resolver_and_hygiene 94475 ns/iter (± 7658) 111035 ns/iter (± 13114) 0.85
serialization of ast node 224 ns/iter (± 16) 242 ns/iter (± 49) 0.93
serialization of serde 220 ns/iter (± 16) 247 ns/iter (± 49) 0.89

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

Please sign in to comment.