Skip to content

Commit

Permalink
fix(es/minifier): Preserve this in more cases (#6226)
Browse files Browse the repository at this point in the history
**Related issue (if exists):**

 - Closes #6175.
 - Closes #6137.

Co-authored-by: Justin Ridgewell <justin@ridgewell.name>
  • Loading branch information
kdy1 and jridgewell committed Oct 21, 2022
1 parent fefbd0f commit e9d421b
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 5 deletions.
2 changes: 1 addition & 1 deletion crates/swc_ecma_ast/Cargo.toml
Expand Up @@ -33,7 +33,7 @@ rkyv-bytecheck-impl = [
arbitrary = { version = "1", optional = true, features = ["derive"] }
bitflags = "1"
bytecheck = { version = "0.6.9", optional = true }
is-macro = "0.2.0"
is-macro = "0.2.1"
num-bigint = { version = "0.4", features = ["serde"] }
rkyv = { package = "rkyv", version = "=0.7.37", optional = true }
# This is to avoid cargo version selection conflict between rkyv=0.7.37 and other versions, as it is strictly pinned
Expand Down
13 changes: 12 additions & 1 deletion crates/swc_ecma_ast/src/expr.rs
Expand Up @@ -8,7 +8,7 @@ use serde::{
Deserialize, Deserializer, Serialize,
};
use string_enum::StringEnum;
use swc_atoms::Atom;
use swc_atoms::{js_word, Atom};
use swc_common::{ast_node, util::take::Take, BytePos, EqIgnoreSpan, Span, Spanned, DUMMY_SP};

use crate::{
Expand Down Expand Up @@ -215,6 +215,17 @@ impl Expr {
}))
}
}

/// Returns true for `eval` and member expressions.
pub fn directness_maters(&self) -> bool {
matches!(
self,
Expr::Ident(Ident {
sym: js_word!("eval"),
..
}) | Expr::Member(..)
)
}
}

// Implement Clone without inline to avoid multiple copies of the
Expand Down
11 changes: 11 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/6175/1/input.js
@@ -0,0 +1,11 @@
let o = {
f() {
assert.ok(this !== o);
}
};
(1, o.f)``;
(true ? o.f : false)``;
(true && o.f)``;

let a;
(a = o.f)``;
@@ -0,0 +1,6 @@
let o = {
f () {
assert.ok(this !== o);
}
};
(0, o.f)``, (0, o.f)``, (0, o.f)``, (0, o.f)``;
20 changes: 17 additions & 3 deletions crates/swc_ecma_transforms_optimization/src/simplify/expr/mod.rs
Expand Up @@ -483,7 +483,7 @@ impl SimplifyExpr {
self.changed = true;

// 0 && $right
*expr = *(left.take());
*expr = *left.take();
return;
}
} else if val {
Expand All @@ -500,7 +500,14 @@ impl SimplifyExpr {
if !left.may_have_side_effects(&self.expr_ctx) {
self.changed = true;

*expr = *node.take();
if node.directness_maters() {
*expr = Expr::Seq(SeqExpr {
span: node.span(),
exprs: vec![0.into(), node.take()],
});
} else {
*expr = *node.take();
}
} else {
self.changed = true;

Expand Down Expand Up @@ -1330,7 +1337,14 @@ impl VisitMut for SimplifyExpr {

let expr_value = if val { cons } else { alt };
*expr = if p.is_pure() {
*(expr_value.take())
if expr_value.directness_maters() {
Expr::Seq(SeqExpr {
span: *span,
exprs: vec![0.into(), expr_value.take()],
})
} else {
*expr_value.take()
}
} else {
Expr::Seq(SeqExpr {
span: *span,
Expand Down

1 comment on commit e9d421b

@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: e9d421b Previous: de03675 Ratio
es/full/bugs-1 352728 ns/iter (± 16461) 433925 ns/iter (± 38854) 0.81
es/full/minify/libraries/antd 1876121238 ns/iter (± 93998476) 2900162799 ns/iter (± 357856406) 0.65
es/full/minify/libraries/d3 445690106 ns/iter (± 27738608) 610340593 ns/iter (± 106665463) 0.73
es/full/minify/libraries/echarts 1594371426 ns/iter (± 39370578) 1851163897 ns/iter (± 124920337) 0.86
es/full/minify/libraries/jquery 109874804 ns/iter (± 7379159) 115024018 ns/iter (± 6847072) 0.96
es/full/minify/libraries/lodash 128895187 ns/iter (± 9028078) 140669572 ns/iter (± 16482145) 0.92
es/full/minify/libraries/moment 68306559 ns/iter (± 21662268) 65390387 ns/iter (± 3743164) 1.04
es/full/minify/libraries/react 20977761 ns/iter (± 1439685) 25299342 ns/iter (± 2628572) 0.83
es/full/minify/libraries/terser 307325056 ns/iter (± 18334503) 353976016 ns/iter (± 20066380) 0.87
es/full/minify/libraries/three 579597432 ns/iter (± 86831830) 613540580 ns/iter (± 44793577) 0.94
es/full/minify/libraries/typescript 3726982724 ns/iter (± 424264117) 4004659232 ns/iter (± 152887625) 0.93
es/full/minify/libraries/victory 839567529 ns/iter (± 42528527) 918133987 ns/iter (± 33881405) 0.91
es/full/minify/libraries/vue 178545541 ns/iter (± 7709082) 195697752 ns/iter (± 8747150) 0.91
es/full/codegen/es3 33208 ns/iter (± 319) 37465 ns/iter (± 4336) 0.89
es/full/codegen/es5 33076 ns/iter (± 762) 37043 ns/iter (± 4160) 0.89
es/full/codegen/es2015 33244 ns/iter (± 741) 37035 ns/iter (± 3058) 0.90
es/full/codegen/es2016 33257 ns/iter (± 1193) 36505 ns/iter (± 3931) 0.91
es/full/codegen/es2017 33142 ns/iter (± 313) 35917 ns/iter (± 2605) 0.92
es/full/codegen/es2018 33211 ns/iter (± 829) 36440 ns/iter (± 6533) 0.91
es/full/codegen/es2019 33267 ns/iter (± 978) 36560 ns/iter (± 3160) 0.91
es/full/codegen/es2020 33403 ns/iter (± 1144) 35733 ns/iter (± 5351) 0.93
es/full/all/es3 207342424 ns/iter (± 19351195) 237253394 ns/iter (± 343091007) 0.87
es/full/all/es5 186954468 ns/iter (± 11101064) 221275023 ns/iter (± 223437294) 0.84
es/full/all/es2015 144819831 ns/iter (± 7179057) 183971269 ns/iter (± 2002816904) 0.79
es/full/all/es2016 143267185 ns/iter (± 6264083) 224500350 ns/iter (± 357848316) 0.64
es/full/all/es2017 142216613 ns/iter (± 7793784) 217189224 ns/iter (± 28406458) 0.65
es/full/all/es2018 143954849 ns/iter (± 9959615) 205483375 ns/iter (± 436891866) 0.70
es/full/all/es2019 146541444 ns/iter (± 12200107) 198906303 ns/iter (± 384642806) 0.74
es/full/all/es2020 147261279 ns/iter (± 14146789) 175947456 ns/iter (± 22220554) 0.84
es/full/parser 716481 ns/iter (± 136439) 795402 ns/iter (± 130039) 0.90
es/full/base/fixer 26046 ns/iter (± 1040) 27192 ns/iter (± 3698) 0.96
es/full/base/resolver_and_hygiene 90465 ns/iter (± 4402) 99277 ns/iter (± 16008) 0.91
serialization of ast node 215 ns/iter (± 6) 256 ns/iter (± 59) 0.84
serialization of serde 219 ns/iter (± 2) 233 ns/iter (± 941) 0.94

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

Please sign in to comment.