Skip to content

Commit ed5a9b3

Browse files
authoredNov 25, 2023
fix(es/minifier): Give up terminate merge if in try with finally (#8342)
**Related issue:** - Closes #8337. - Closes #8324. - Reverts #8328.
1 parent 8e37eca commit ed5a9b3

File tree

5 files changed

+58
-33
lines changed

5 files changed

+58
-33
lines changed
 

‎crates/swc_ecma_minifier/src/compress/pure/dead_code.rs

+26-23
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@
22
use rayon::prelude::*;
33
use swc_common::{util::take::Take, EqIgnoreSpan, Spanned, DUMMY_SP};
44
use swc_ecma_ast::*;
5-
use swc_ecma_utils::{extract_var_ids, ExprExt, StmtExt, StmtLike, Value};
5+
use swc_ecma_utils::{extract_var_ids, ExprCtx, ExprExt, StmtExt, StmtLike, Value};
66
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
77

88
use super::Pure;
9-
use crate::{
10-
compress::util::is_fine_for_if_cons,
11-
maybe_par,
12-
util::{contains_await_or_yield, ModuleItemExt},
13-
};
9+
use crate::{compress::util::is_fine_for_if_cons, maybe_par, util::ModuleItemExt};
1410

1511
/// Methods related to option `dead_code`.
1612
impl Pure<'_> {
@@ -289,11 +285,7 @@ impl Pure<'_> {
289285
_ => return,
290286
};
291287

292-
if contains_await_or_yield(last) {
293-
return;
294-
}
295-
296-
fn drop<T: StmtLike>(stmt: &mut T, last: &Stmt, need_break: bool) -> bool {
288+
fn drop<T: StmtLike>(stmt: &mut T, last: &Stmt, need_break: bool, ctx: &ExprCtx) -> bool {
297289
match stmt.as_stmt_mut() {
298290
Some(s) if s.eq_ignore_span(last) => {
299291
if need_break {
@@ -308,26 +300,37 @@ impl Pure<'_> {
308300
}
309301
Some(Stmt::If(i)) => {
310302
let mut changed = false;
311-
changed |= drop(&mut *i.cons, last, need_break);
303+
changed |= drop(&mut *i.cons, last, need_break, ctx);
312304
if let Some(alt) = i.alt.as_mut() {
313-
changed |= drop(&mut **alt, last, need_break);
305+
changed |= drop(&mut **alt, last, need_break, ctx);
314306
}
315307
changed
316308
}
317-
Some(Stmt::Try(t)) if !last.is_throw() => {
309+
Some(Stmt::Try(t)) => {
318310
let mut changed = false;
311+
// TODO: let chain
319312
if let Some(stmt) = t.block.stmts.last_mut() {
320-
changed |= drop(stmt, last, need_break)
313+
let side_effect = match last {
314+
Stmt::Break(_) | Stmt::Continue(_) => false,
315+
Stmt::Return(ReturnStmt { arg: None, .. }) => false,
316+
Stmt::Return(ReturnStmt { arg: Some(arg), .. }) => {
317+
arg.may_have_side_effects(ctx)
318+
}
319+
Stmt::Throw(_) => true,
320+
_ => unreachable!(),
321+
};
322+
if t.finalizer.is_none() && !side_effect {
323+
changed |= drop(stmt, last, need_break, ctx)
324+
}
321325
}
322-
// TODO: let chain
323326
if let Some(h) = t.handler.as_mut() {
324327
if let Some(stmt) = h.body.stmts.last_mut() {
325-
changed |= drop(stmt, last, need_break);
328+
changed |= drop(stmt, last, need_break, ctx);
326329
}
327330
}
328331
if let Some(f) = t.finalizer.as_mut() {
329332
if let Some(stmt) = f.stmts.last_mut() {
330-
changed |= drop(stmt, last, need_break);
333+
changed |= drop(stmt, last, need_break, ctx);
331334
}
332335
}
333336
changed
@@ -336,7 +339,7 @@ impl Pure<'_> {
336339
let mut changed = false;
337340
for case in s.cases.iter_mut() {
338341
for stmt in case.cons.iter_mut() {
339-
changed |= drop(stmt, last, true);
342+
changed |= drop(stmt, last, true, ctx);
340343
}
341344
}
342345

@@ -352,16 +355,16 @@ impl Pure<'_> {
352355
if let Stmt::Block(b) = &mut **body {
353356
let mut changed = false;
354357
for stmt in b.stmts.iter_mut() {
355-
changed |= drop(stmt, last, true);
358+
changed |= drop(stmt, last, true, ctx);
356359
}
357360
changed
358361
} else {
359-
drop(&mut **body, last, true)
362+
drop(&mut **body, last, true, ctx)
360363
}
361364
}
362365
Some(Stmt::Block(b)) => {
363366
if let Some(stmt) = b.stmts.last_mut() {
364-
drop(stmt, last, need_break)
367+
drop(stmt, last, need_break, ctx)
365368
} else {
366369
false
367370
}
@@ -371,7 +374,7 @@ impl Pure<'_> {
371374
}
372375

373376
if let Some(before_last) = stmts.last_mut() {
374-
if drop(before_last, last, false) {
377+
if drop(before_last, last, false, &self.expr_ctx) {
375378
self.changed = true;
376379

377380
report_change!("Dropping control keyword in nested block");

‎crates/swc_ecma_minifier/src/util/mod.rs

-10
Original file line numberDiff line numberDiff line change
@@ -256,16 +256,6 @@ impl Visit for LeapFinder {
256256
}
257257
}
258258

259-
#[allow(unused)]
260-
pub(crate) fn contains_await_or_yield<N>(n: &N) -> bool
261-
where
262-
N: VisitWith<LeapFinder>,
263-
{
264-
let mut v = LeapFinder::default();
265-
n.visit_with(&mut v);
266-
v.found_yield || v.found_await
267-
}
268-
269259
/// This method returns true only if `T` is `var`. (Not `const` or `let`)
270260
pub(crate) fn is_hoisted_var_decl_without_init<T>(t: &T) -> bool
271261
where
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"defaults": false,
3+
"if_return": true,
4+
"dead_code": true,
5+
"passes": 3
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export function allowInAnd(callback) {
2+
var flags = this.prodParam.currentFlags();
3+
var prodParamToSet = ParamKind.PARAM_IN & ~flags;
4+
if (prodParamToSet) {
5+
this.prodParam.enter(flags | ParamKind.PARAM_IN);
6+
try {
7+
return callback();
8+
} finally {
9+
this.prodParam.exit();
10+
}
11+
}
12+
return callback();
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export function allowInAnd(callback) {
2+
var flags = this.prodParam.currentFlags();
3+
var prodParamToSet = ParamKind.PARAM_IN & ~flags;
4+
if (prodParamToSet) {
5+
this.prodParam.enter(flags | ParamKind.PARAM_IN);
6+
try {
7+
return callback();
8+
} finally{
9+
this.prodParam.exit();
10+
}
11+
}
12+
return callback();
13+
}

0 commit comments

Comments
 (0)
Please sign in to comment.