diff --git a/crates/swc_ecma_minifier/src/compress/pure/arrows.rs b/crates/swc_ecma_minifier/src/compress/pure/arrows.rs index b1e1b9a7fd76..5b6f22b2e79d 100644 --- a/crates/swc_ecma_minifier/src/compress/pure/arrows.rs +++ b/crates/swc_ecma_minifier/src/compress/pure/arrows.rs @@ -21,7 +21,10 @@ impl Pure<'_> { function, }) = e { - if contains_this_expr(&function.body) || function.is_generator { + if function.params.iter().any(contains_this_expr) + || contains_this_expr(&function.body) + || function.is_generator + { return; } @@ -65,6 +68,7 @@ impl Pure<'_> { if m.function.is_generator || contains_arguments(&m.function.body) || contains_super(&m.function.body) + || m.function.params.iter().any(contains_this_expr) { return; } diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/input.js new file mode 100644 index 000000000000..2e8405a3467a --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/input.js @@ -0,0 +1,15 @@ +o = { + foo() { + return val; + }, + s: "test", +}; +console.log(o.foo().length); + +o = { + foo(val = this.s) { + return val; + }, + s: "test", +}; +console.log(o.foo().length); diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/output.js new file mode 100644 index 000000000000..2bd3a56f096a --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9186/1/output.js @@ -0,0 +1,9 @@ +console.log((o = { + foo: ()=>val, + s: "test" +}).foo().length), console.log((o = { + foo (val1 = this.s) { + return val1; + }, + s: "test" +}).foo().length); diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/config.json new file mode 100644 index 000000000000..a788b0827803 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/config.json @@ -0,0 +1,6 @@ +{ + "unsafe_arrows": true, + "ecma": 2015, + "evaluate": true, + "side_effects": true +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/input.js new file mode 100644 index 000000000000..2902c52dbd81 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/input.js @@ -0,0 +1,14 @@ +console.log( + (function () { + while (true) { + console.log(123); + } + })() +); +console.log( + (function (a = this.a) { + while (true) { + console.log(123); + } + })() +); diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/output.js new file mode 100644 index 000000000000..11db4a03af0b --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/9186/2/output.js @@ -0,0 +1,10 @@ +console.log((()=>{ + while(true){ + console.log(123); + } +})()); +console.log(function(a = this.a) { + while(true){ + console.log(123); + } +}());