From 7e6ec8d587471dba1dde44ebcfd6af6d03247955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 20 Dec 2022 16:45:29 +0900 Subject: [PATCH] fix(es/minifier): Don't inline invalid LHS into an update argument (#6680) **Related issue:** - Closes https://github.com/swc-project/swc/issues/6641. --- .../src/compress/optimize/inline.rs | 5 +++++ .../swc_ecma_minifier/src/compress/optimize/mod.rs | 6 ++++++ crates/swc_ecma_minifier/tests/exec.rs | 13 +++++++++++++ 3 files changed, 24 insertions(+) diff --git a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs index 51e37a4c977f..f463702119ee 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/inline.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/inline.rs @@ -733,6 +733,11 @@ where }) .cloned() { + if !matches!(&*value, Expr::Ident(..) | Expr::Member(..)) && self.ctx.is_update_arg + { + return; + } + self.changed = true; report_change!("inline: Replacing a variable `{}` with cheap expression", i); diff --git a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs index b508e20edc3f..a3e2200f4601 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/mod.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/mod.rs @@ -1536,6 +1536,7 @@ where }, is_lhs_of_assign: false, is_exact_lhs_of_assign: false, + is_update_arg: false, ..self.ctx }; e.callee.visit_mut_with(&mut *self.with_ctx(ctx)); @@ -1566,6 +1567,7 @@ where is_this_aware_callee: false, is_lhs_of_assign: false, is_exact_lhs_of_assign: false, + is_update_arg: false, ..self.ctx }; // TODO: Prevent inline if callee is unknown. @@ -1583,6 +1585,7 @@ where { let ctx = Ctx { dont_invoke_iife: true, + is_update_arg: false, ..self.ctx }; n.super_class.visit_mut_with(&mut *self.with_ctx(ctx)); @@ -1591,6 +1594,7 @@ where { let ctx = Ctx { in_strict: true, + is_update_arg: false, ..self.ctx }; n.body.visit_mut_with(&mut *self.with_ctx(ctx)); @@ -2184,6 +2188,7 @@ where let ctx = Ctx { in_obj_of_non_computed_member: !n.prop.is_computed(), is_exact_lhs_of_assign: false, + is_update_arg: false, ..self.ctx }; n.obj.visit_mut_with(&mut *self.with_ctx(ctx)); @@ -2192,6 +2197,7 @@ where let ctx = Ctx { is_exact_lhs_of_assign: false, is_lhs_of_assign: false, + is_update_arg: false, ..self.ctx }; c.visit_mut_with(&mut *self.with_ctx(ctx)); diff --git a/crates/swc_ecma_minifier/tests/exec.rs b/crates/swc_ecma_minifier/tests/exec.rs index a00ad7941c36..c609814dd320 100644 --- a/crates/swc_ecma_minifier/tests/exec.rs +++ b/crates/swc_ecma_minifier/tests/exec.rs @@ -10394,3 +10394,16 @@ fn issue_6528() { "###, ) } + +#[test] +fn issue_6641() { + run_default_exec_test( + r###" + const iota = (i => () => 1 << ++i)(-1); + + const a = iota(), b = iota(); + + console.log(a, b); + "###, + ) +}