Skip to content

Commit

Permalink
fix(es/minifier): Do not drop properties used via this (#7785)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7783.
  • Loading branch information
kdy1 committed Aug 10, 2023
1 parent e90b555 commit 552d9aa
Show file tree
Hide file tree
Showing 7 changed files with 149 additions and 1 deletion.
71 changes: 71 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7783/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": true
},
"target": "es2015",
"loose": false,
"minify": {
"compress": {
"arguments": false,
"arrows": true,
"booleans": true,
"booleans_as_integers": false,
"collapse_vars": true,
"comparisons": true,
"computed_props": true,
"conditionals": true,
"dead_code": true,
"directives": true,
"drop_console": false,
"drop_debugger": true,
"evaluate": true,
"expression": false,
"hoist_funs": false,
"hoist_props": true,
"hoist_vars": false,
"if_return": true,
"join_vars": true,
"keep_classnames": false,
"keep_fargs": true,
"keep_fnames": false,
"keep_infinity": false,
"loops": true,
"negate_iife": true,
"properties": true,
"reduce_funcs": false,
"reduce_vars": false,
"side_effects": true,
"switches": true,
"typeofs": true,
"unsafe": false,
"unsafe_arrows": false,
"unsafe_comps": false,
"unsafe_Function": false,
"unsafe_math": false,
"unsafe_symbols": false,
"unsafe_methods": false,
"unsafe_proto": false,
"unsafe_regexp": false,
"unsafe_undefined": false,
"unused": true,
"const_to_let": true,
"pristine_globals": true
},
"mangle": {
"toplevel": false,
"keep_classnames": false,
"keep_fnames": false,
"keep_private_props": false,
"ie8": false,
"safari10": false
}
}
},
"module": {
"type": "es6"
},
"minify": true,
"isModule": true
}
14 changes: 14 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7783/input/1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export default function Home() {
return (
<div>{foo.a}</div>
)
}

const foo = {
get a() {
return `a ${this.b}`;
},
get b() {
return `b`;
}
}
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-7xxx/7783/output/1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default function e(){return React.createElement("div",null,foo.a)}let foo={get a(){return`a ${this.b}`},get b(){return"b"}};
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ function implicitThis(n) {
return this.m + n + 12;
}
var impl = {
a: 12,
explicitVoid2: function() {
return _this.a;
},
Expand Down
41 changes: 40 additions & 1 deletion crates/swc_ecma_minifier/src/compress/optimize/unused.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
use rustc_hash::FxHashSet;
use swc_atoms::{js_word, JsWord};
use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_usage_analyzer::util::is_global_var_with_pure_property_access;
use swc_ecma_utils::{contains_ident_ref, ExprExt};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};

use super::Optimizer;
#[cfg(feature = "debug")]
Expand Down Expand Up @@ -785,11 +787,17 @@ impl Optimizer<'_> {
return None;
}

let properties_used_via_this = {
let mut v = ThisPropertyVisitor::default();
obj.visit_with(&mut v);
v.properties
};

let should_preserve_property = |sym: &JsWord| {
if let "toString" = &**sym {
return true;
}
!usage.accessed_props.contains_key(sym)
!usage.accessed_props.contains_key(sym) && !properties_used_via_this.contains(sym)
};
let should_preserve = |key: &PropName| match key {
PropName::Ident(k) => should_preserve_property(&k.sym),
Expand Down Expand Up @@ -824,3 +832,34 @@ impl Optimizer<'_> {
None
}
}

#[derive(Default)]
struct ThisPropertyVisitor {
properties: FxHashSet<JsWord>,

should_abort: bool,
}

impl Visit for ThisPropertyVisitor {
noop_visit_type!();

fn visit_member_expr(&mut self, e: &MemberExpr) {
if self.should_abort {
return;
}

e.visit_children_with(self);

if let Expr::This(..) = &*e.obj {
match &e.prop {
MemberProp::Ident(p) => {
self.properties.insert(p.sym.clone());
}
MemberProp::Computed(_) => {
self.should_abort = true;
}
_ => {}
}
}
}
}
11 changes: 11 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7783/1/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default function Home() {
return React.createElement("div", null, foo.a);
}
const foo = {
get a() {
return `a ${this.b}`;
},
get b() {
return `b`;
}
};
11 changes: 11 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7783/1/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default function Home() {
return React.createElement("div", null, foo.a);
}
const foo = {
get a () {
return `a ${this.b}`;
},
get b () {
return "b";
}
};

1 comment on commit 552d9aa

@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: 552d9aa Previous: eff0cac Ratio
es/full/bugs-1 291272 ns/iter (± 4464) 294983 ns/iter (± 10736) 0.99
es/full/minify/libraries/antd 1314983115 ns/iter (± 8464378) 1393451284 ns/iter (± 12355364) 0.94
es/full/minify/libraries/d3 280107813 ns/iter (± 2503141) 294944366 ns/iter (± 7342342) 0.95
es/full/minify/libraries/echarts 1052310968 ns/iter (± 13384943) 1106663308 ns/iter (± 24141764) 0.95
es/full/minify/libraries/jquery 85123447 ns/iter (± 119507) 85503274 ns/iter (± 716073) 1.00
es/full/minify/libraries/lodash 98535771 ns/iter (± 231091) 100659215 ns/iter (± 918345) 0.98
es/full/minify/libraries/moment 50104968 ns/iter (± 55255) 50414762 ns/iter (± 537849) 0.99
es/full/minify/libraries/react 18055265 ns/iter (± 33558) 18172136 ns/iter (± 122945) 0.99
es/full/minify/libraries/terser 219747790 ns/iter (± 606503) 229593321 ns/iter (± 5006638) 0.96
es/full/minify/libraries/three 385373353 ns/iter (± 1823612) 408699446 ns/iter (± 9219747) 0.94
es/full/minify/libraries/typescript 2672584838 ns/iter (± 6067121) 2747289997 ns/iter (± 21911913) 0.97
es/full/minify/libraries/victory 566346710 ns/iter (± 3034159) 590590452 ns/iter (± 13457291) 0.96
es/full/minify/libraries/vue 120010701 ns/iter (± 268621) 123570004 ns/iter (± 779407) 0.97
es/full/codegen/es3 33508 ns/iter (± 101) 34070 ns/iter (± 59) 0.98
es/full/codegen/es5 33437 ns/iter (± 133) 34039 ns/iter (± 51) 0.98
es/full/codegen/es2015 33583 ns/iter (± 80) 33970 ns/iter (± 108) 0.99
es/full/codegen/es2016 33639 ns/iter (± 86) 33982 ns/iter (± 75) 0.99
es/full/codegen/es2017 33480 ns/iter (± 174) 34028 ns/iter (± 88) 0.98
es/full/codegen/es2018 33579 ns/iter (± 115) 34018 ns/iter (± 106) 0.99
es/full/codegen/es2019 33557 ns/iter (± 114) 34051 ns/iter (± 80) 0.99
es/full/codegen/es2020 33657 ns/iter (± 105) 34087 ns/iter (± 77) 0.99
es/full/all/es3 173524514 ns/iter (± 667633) 171898682 ns/iter (± 607742) 1.01
es/full/all/es5 165788081 ns/iter (± 1321109) 164384543 ns/iter (± 1577156) 1.01
es/full/all/es2015 125089653 ns/iter (± 657250) 123491325 ns/iter (± 447676) 1.01
es/full/all/es2016 124719635 ns/iter (± 784361) 122848446 ns/iter (± 1287123) 1.02
es/full/all/es2017 123607291 ns/iter (± 1283621) 122586959 ns/iter (± 728454) 1.01
es/full/all/es2018 121186685 ns/iter (± 914225) 120143891 ns/iter (± 651318) 1.01
es/full/all/es2019 121073662 ns/iter (± 732299) 119627782 ns/iter (± 1547531) 1.01
es/full/all/es2020 116064653 ns/iter (± 840430) 115429026 ns/iter (± 451329) 1.01
es/full/parser 541613 ns/iter (± 6299) 536594 ns/iter (± 5615) 1.01
es/full/base/fixer 17624 ns/iter (± 53) 18715 ns/iter (± 1036) 0.94
es/full/base/resolver_and_hygiene 78980 ns/iter (± 266) 80956 ns/iter (± 357) 0.98
serialization of serde 290 ns/iter (± 0) 293 ns/iter (± 4) 0.99
css/minify/libraries/bootstrap 28778903 ns/iter (± 83995) 29355574 ns/iter (± 77669) 0.98
css/visitor/compare/clone 1638327 ns/iter (± 3168) 1635441 ns/iter (± 2344) 1.00
css/visitor/compare/visit_mut_span 1764912 ns/iter (± 2148) 1758759 ns/iter (± 1752) 1.00
css/visitor/compare/visit_mut_span_panic 1838390 ns/iter (± 3045) 1850422 ns/iter (± 5631) 0.99
css/visitor/compare/fold_span 2581123 ns/iter (± 17048) 2591087 ns/iter (± 12405) 1.00
css/visitor/compare/fold_span_panic 2763355 ns/iter (± 13929) 2761411 ns/iter (± 10650) 1.00
css/lexer/bootstrap_5_1_3 4467055 ns/iter (± 5674) 4458079 ns/iter (± 4684) 1.00
css/lexer/foundation_6_7_4 3769657 ns/iter (± 2868) 3756489 ns/iter (± 1995) 1.00
css/lexer/tailwind_3_1_1 717062 ns/iter (± 254) 713534 ns/iter (± 532) 1.00
css/parser/bootstrap_5_1_3 19277858 ns/iter (± 175866) 19735381 ns/iter (± 51781) 0.98
css/parser/foundation_6_7_4 15541900 ns/iter (± 36389) 15985505 ns/iter (± 19095) 0.97
css/parser/tailwind_3_1_1 2989800 ns/iter (± 4359) 3060712 ns/iter (± 5656) 0.98
es/codegen/colors 737022 ns/iter (± 405879) 731655 ns/iter (± 395973) 1.01
es/codegen/large 2888458 ns/iter (± 1526052) 2889574 ns/iter (± 1531028) 1.00
es/codegen/with-parser/colors 45367 ns/iter (± 640) 45014 ns/iter (± 128) 1.01
es/codegen/with-parser/large 482467 ns/iter (± 1023) 484317 ns/iter (± 675) 1.00
es/minify/libraries/antd 1146685163 ns/iter (± 10408689) 1153314101 ns/iter (± 9359004) 0.99
es/minify/libraries/d3 241309235 ns/iter (± 530877) 242730983 ns/iter (± 575532) 0.99
es/minify/libraries/echarts 900420376 ns/iter (± 2770669) 906891977 ns/iter (± 2527853) 0.99
es/minify/libraries/jquery 74360904 ns/iter (± 104421) 74745881 ns/iter (± 132608) 0.99
es/minify/libraries/lodash 88441932 ns/iter (± 149972) 88935000 ns/iter (± 294006) 0.99
es/minify/libraries/moment 44097272 ns/iter (± 29822) 44254677 ns/iter (± 42933) 1.00
es/minify/libraries/react 16124293 ns/iter (± 77965) 16164488 ns/iter (± 35719) 1.00
es/minify/libraries/terser 188804560 ns/iter (± 273823) 190080754 ns/iter (± 390454) 0.99
es/minify/libraries/three 321973123 ns/iter (± 511576) 322999123 ns/iter (± 506817) 1.00
es/minify/libraries/typescript 2268351276 ns/iter (± 6210532) 2277740778 ns/iter (± 8549469) 1.00
es/minify/libraries/victory 480717211 ns/iter (± 2295246) 480413938 ns/iter (± 1843816) 1.00
es/minify/libraries/vue 107095727 ns/iter (± 124832) 108209962 ns/iter (± 95334) 0.99
es/visitor/compare/clone 1948787 ns/iter (± 7151) 1947301 ns/iter (± 4848) 1.00
es/visitor/compare/visit_mut_span 2298921 ns/iter (± 6579) 2294285 ns/iter (± 4182) 1.00
es/visitor/compare/visit_mut_span_panic 2319548 ns/iter (± 4964) 2324281 ns/iter (± 5195) 1.00
es/visitor/compare/fold_span 3355158 ns/iter (± 9283) 3352974 ns/iter (± 6416) 1.00
es/visitor/compare/fold_span_panic 3479409 ns/iter (± 9075) 3472470 ns/iter (± 6210) 1.00
es/lexer/colors 13026 ns/iter (± 71) 13173 ns/iter (± 49) 0.99
es/lexer/angular 6127162 ns/iter (± 5173) 6141500 ns/iter (± 6791) 1.00
es/lexer/backbone 788527 ns/iter (± 680) 803811 ns/iter (± 1508) 0.98
es/lexer/jquery 4420627 ns/iter (± 121400) 4545671 ns/iter (± 2193) 0.97
es/lexer/jquery mobile 6750819 ns/iter (± 13640) 6949075 ns/iter (± 3419) 0.97
es/lexer/mootools 3494384 ns/iter (± 4646) 3606903 ns/iter (± 2577) 0.97
es/lexer/underscore 657322 ns/iter (± 509) 684498 ns/iter (± 812) 0.96
es/lexer/three 20971776 ns/iter (± 57305) 21557565 ns/iter (± 90565) 0.97
es/lexer/yui 3779878 ns/iter (± 25139) 3880218 ns/iter (± 4263) 0.97
es/parser/colors 27846 ns/iter (± 67) 27754 ns/iter (± 32) 1.00
es/parser/angular 13685900 ns/iter (± 82460) 13587234 ns/iter (± 67998) 1.01
es/parser/backbone 2033067 ns/iter (± 5565) 2003605 ns/iter (± 9224) 1.01
es/parser/jquery 11124101 ns/iter (± 46852) 10983409 ns/iter (± 50318) 1.01
es/parser/jquery mobile 16949227 ns/iter (± 40758) 16870868 ns/iter (± 152349) 1.00
es/parser/mootools 8550221 ns/iter (± 17908) 8438775 ns/iter (± 16159) 1.01
es/parser/underscore 1755779 ns/iter (± 11259) 1730043 ns/iter (± 8135) 1.01
es/parser/three 47414874 ns/iter (± 201517) 46910176 ns/iter (± 182108) 1.01
es/parser/yui 8457511 ns/iter (± 24921) 8350564 ns/iter (± 26998) 1.01
es/preset-env/usage/builtin_type 139041 ns/iter (± 32442) 138109 ns/iter (± 31782) 1.01
es/preset-env/usage/property 16927 ns/iter (± 56) 16959 ns/iter (± 121) 1.00
es/resolver/typescript 88399126 ns/iter (± 848618) 87530002 ns/iter (± 1201609) 1.01
es/fixer/typescript 63527362 ns/iter (± 506753) 61935767 ns/iter (± 375114) 1.03
es/hygiene/typescript 128919492 ns/iter (± 395514) 129637016 ns/iter (± 858790) 0.99
es/resolver_with_hygiene/typescript 239443564 ns/iter (± 1177961) 239371918 ns/iter (± 1210757) 1.00
es/visitor/base-perf/module_clone 59579 ns/iter (± 215) 58697 ns/iter (± 105) 1.02
es/visitor/base-perf/fold_empty 63465 ns/iter (± 244) 62015 ns/iter (± 388) 1.02
es/visitor/base-perf/fold_noop_impl_all 63542 ns/iter (± 144) 62755 ns/iter (± 201) 1.01
es/visitor/base-perf/fold_noop_impl_vec 63326 ns/iter (± 357) 62197 ns/iter (± 310) 1.02
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 57 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 38 ns/iter (± 0) 38 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 107 ns/iter (± 0) 106 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 75 ns/iter (± 0) 1
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2521 ns/iter (± 16) 2514 ns/iter (± 10) 1.00
es/base/parallel/resolver/typescript 4228665020 ns/iter (± 266107826) 3649089563 ns/iter (± 232440358) 1.16
es/base/parallel/hygiene/typescript 1446577542 ns/iter (± 12163374) 1460780479 ns/iter (± 24221190) 0.99
misc/visitors/time-complexity/time 5 137 ns/iter (± 0) 133 ns/iter (± 1) 1.03
misc/visitors/time-complexity/time 10 344 ns/iter (± 45) 259 ns/iter (± 0) 1.33
misc/visitors/time-complexity/time 15 522 ns/iter (± 2) 500 ns/iter (± 2) 1.04
misc/visitors/time-complexity/time 20 1061 ns/iter (± 2) 1090 ns/iter (± 23) 0.97
misc/visitors/time-complexity/time 40 3609 ns/iter (± 15) 3555 ns/iter (± 18) 1.02
misc/visitors/time-complexity/time 60 8861 ns/iter (± 6) 7352 ns/iter (± 96) 1.21
es/full-target/es2016 230818 ns/iter (± 1074) 229875 ns/iter (± 330) 1.00
es/full-target/es2017 218633 ns/iter (± 827) 217448 ns/iter (± 981) 1.01
es/full-target/es2018 208039 ns/iter (± 491) 204979 ns/iter (± 682) 1.01
es2020_nullish_coalescing 69889 ns/iter (± 309) 68658 ns/iter (± 565) 1.02
es2020_optional_chaining 78457 ns/iter (± 383) 79088 ns/iter (± 255) 0.99
es2022_class_properties 115982 ns/iter (± 357) 113695 ns/iter (± 420) 1.02
es2018_object_rest_spread 73462 ns/iter (± 905) 73132 ns/iter (± 351) 1.00
es2019_optional_catch_binding 63523 ns/iter (± 248) 61842 ns/iter (± 288) 1.03
es2017_async_to_generator 63720 ns/iter (± 148) 62216 ns/iter (± 265) 1.02
es2016_exponentiation 67712 ns/iter (± 255) 66595 ns/iter (± 552) 1.02
es2015_arrow 71320 ns/iter (± 185) 69565 ns/iter (± 290) 1.03
es2015_block_scoped_fn 66988 ns/iter (± 154) 66215 ns/iter (± 214) 1.01
es2015_block_scoping 120438 ns/iter (± 553) 121310 ns/iter (± 414) 0.99

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

Please sign in to comment.