From 3046d71daa77327e7b211cfdb641e3e6148bea5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 13 May 2024 10:11:46 +0900 Subject: [PATCH] fix(es/minifier): Abort seq inliner on `**` (#8947) **Related issue:** - Closes #8942 --- .../src/compress/optimize/dead_code.rs | 4 ++++ .../src/compress/optimize/sequences.rs | 3 ++- crates/swc_ecma_minifier/tests/exec.rs | 15 +++++++++++++++ .../tests/fixture/issues/8924/output.js | 5 ++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/crates/swc_ecma_minifier/src/compress/optimize/dead_code.rs b/crates/swc_ecma_minifier/src/compress/optimize/dead_code.rs index 614a2fc5a477..bbf2bc224b76 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/dead_code.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/dead_code.rs @@ -68,6 +68,10 @@ impl Optimizer<'_> { if let Expr::Assign(assign) = e { // x += 1 => x + 1 if let Some(op) = assign.op.to_update() { + if op == op!("**") { + return false; + } + if let Some(lhs) = assign.left.as_ident() { // if self diff --git a/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs b/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs index 415b21eb98e1..9ea419d07fe1 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs @@ -1562,6 +1562,7 @@ impl Optimizer<'_> { | Expr::Tpl(..) | Expr::TaggedTpl(..) => return Ok(false), + // See https://github.com/swc-project/swc/issues/8924 and https://github.com/swc-project/swc/issues/8942 Expr::Assign(AssignExpr { op: op!("**="), right, @@ -1572,7 +1573,7 @@ impl Optimizer<'_> { right, .. }) => { - if is_pure_undefined(&self.expr_ctx, right) { + if !right.is_lit() { return Ok(false); } } diff --git a/crates/swc_ecma_minifier/tests/exec.rs b/crates/swc_ecma_minifier/tests/exec.rs index d3224adc019c..ff42d211314f 100644 --- a/crates/swc_ecma_minifier/tests/exec.rs +++ b/crates/swc_ecma_minifier/tests/exec.rs @@ -11224,6 +11224,21 @@ console.log(eval(foo));", ); } +#[test] +fn issue_8942() { + run_default_exec_test( + " + 'use strict'; + const k = (() => { + let x = 1; + x **= undefined / x; + return x; + })(); + console.log(k); + ", + ); +} + #[test] fn issue_8937() { run_default_exec_test( diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js index f010cc298f42..c254dba096a6 100644 --- a/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js @@ -1,2 +1,5 @@ "use strict"; -const k = NaN; +const k = (()=>{ + let x = 1; + return x **= void 0; +})();