From 93d643e6a413af087ea8166179c25643bd7391b8 Mon Sep 17 00:00:00 2001 From: camc314 <18101008+camc314@users.noreply.github.com> Date: Sun, 19 Jan 2025 01:53:20 +0000 Subject: [PATCH] fix(minifier): keep side effects when folding const conditional exprs (#8591) --- .../ast_passes/peephole_remove_dead_code.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/oxc_minifier/src/ast_passes/peephole_remove_dead_code.rs b/crates/oxc_minifier/src/ast_passes/peephole_remove_dead_code.rs index 93e5777e00432..4054bad05d517 100644 --- a/crates/oxc_minifier/src/ast_passes/peephole_remove_dead_code.rs +++ b/crates/oxc_minifier/src/ast_passes/peephole_remove_dead_code.rs @@ -495,8 +495,24 @@ impl<'a, 'b> PeepholeRemoveDeadCode { } match ctx.get_boolean_value(&expr.test) { - Some(true) => Some(ctx.ast.move_expression(&mut expr.consequent)), - Some(false) => Some(ctx.ast.move_expression(&mut expr.alternate)), + Some(v) => { + if expr.test.may_have_side_effects() { + let mut exprs = ctx.ast.vec_with_capacity(2); + exprs.push(ctx.ast.move_expression(&mut expr.test)); + exprs.push(ctx.ast.move_expression(if v { + &mut expr.consequent + } else { + &mut expr.alternate + })); + Some(ctx.ast.expression_sequence(expr.span, exprs)) + } else { + Some(ctx.ast.move_expression(if v { + &mut expr.consequent + } else { + &mut expr.alternate + })) + } + } None => None, } } @@ -782,6 +798,14 @@ mod test { test("if (true) {}", ""); } + #[test] + fn test_fold_conditional() { + test("true ? foo() : bar()", "foo()"); + test("false ? foo() : bar()", "bar()"); + test_same("foo() ? bar() : baz()"); + test("foo && false ? foo() : bar()", "(foo && false, bar());"); + } + #[test] fn test_fold_iife() { fold_same("var k = () => {}");