diff --git a/crates/swc_ecma_minifier/src/compress/optimize/evaluate.rs b/crates/swc_ecma_minifier/src/compress/optimize/evaluate.rs index b7052ee3619b..718cafff25b2 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/evaluate.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/evaluate.rs @@ -354,12 +354,20 @@ impl Optimizer<'_> { self.changed = true; report_change!("evaluate: Evaluated `{:?} ** {:?}`", l, r); - let value = l.powf(r); - *e = Expr::Lit(Lit::Num(Number { - span: bin.span, - value, - raw: None, - })); + if l.is_nan() || r.is_nan() { + *e = Expr::Ident(Ident::new( + "NaN".into(), + bin.span.with_ctxt( + SyntaxContext::empty().apply_mark(self.marks.unresolved_mark), + ), + )); + } else { + *e = Expr::Lit(Lit::Num(Number { + span: bin.span, + value: l.powf(r), + raw: None, + })); + }; } } } diff --git a/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs b/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs index b1422fcc87eb..415b21eb98e1 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/sequences.rs @@ -1552,7 +1552,7 @@ impl Optimizer<'_> { } } - if match &*b { + match &*b { Expr::Arrow(..) | Expr::Fn(..) | Expr::Class(..) @@ -1560,13 +1560,27 @@ impl Optimizer<'_> { | Expr::Await(..) | Expr::Yield(..) | Expr::Tpl(..) - | Expr::TaggedTpl(..) => true, + | Expr::TaggedTpl(..) => return Ok(false), + + Expr::Assign(AssignExpr { + op: op!("**="), + right, + .. + }) + | Expr::Bin(BinExpr { + op: op!("**"), + right, + .. + }) => { + if is_pure_undefined(&self.expr_ctx, right) { + return Ok(false); + } + } + Expr::Unary(UnaryExpr { op: op!("delete"), .. - }) => true, - _ => false, - } { - return Ok(false); + }) => return Ok(false), + _ => {} } match a { diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8924/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/8924/config.json new file mode 100644 index 000000000000..7e144b291fa7 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8924/config.json @@ -0,0 +1,47 @@ +{ + "defaults": true, + "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 +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8924/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/8924/input.js new file mode 100644 index 000000000000..0881567c8338 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8924/input.js @@ -0,0 +1,5 @@ +"use strict"; +const k = (() => { + let x = 1; x **= undefined; + return x; +})(); \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js new file mode 100644 index 000000000000..f010cc298f42 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/8924/output.js @@ -0,0 +1,2 @@ +"use strict"; +const k = NaN;