Skip to content

Commit b05433d

Browse files
committed
chore: add tests
1 parent 0230bf6 commit b05433d

File tree

5 files changed

+42
-18
lines changed

5 files changed

+42
-18
lines changed

crates/swc_ecma_minifier/src/compress/pure/evaluate.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,17 +1181,27 @@ fn may_have_side_effects(args: &Vec<Option<ExprOrSpread>>, expr_ctx: &ExprCtx) -
11811181
}
11821182

11831183
fn get_first_arg(args: &Vec<Option<ExprOrSpread>>, expr_ctx: &ExprCtx) -> Option<Option<f64>> {
1184-
args.first().and_then(|arg| {
1185-
if let Some(arg) = arg {
1186-
if arg.spread.is_some() {
1187-
match arg.expr.as_array() {
1188-
Some(args) => get_first_arg(&args.elems, expr_ctx),
1189-
None => None,
1190-
};
1191-
} else if !arg.expr.is_undefined(*expr_ctx) {
1192-
return Some(eval_as_number(*expr_ctx, &arg.expr));
1184+
args.iter()
1185+
.find_map(|arg| {
1186+
if let Some(arg) = arg {
1187+
if arg.spread.is_some() {
1188+
match arg.expr.as_array() {
1189+
Some(args) => {
1190+
if args.elems.is_empty() {
1191+
// next argument is used if the first spread argument is empty
1192+
// so we can't evaluate the call.
1193+
return None;
1194+
} else {
1195+
Some(get_first_arg(&args.elems, expr_ctx))
1196+
}
1197+
}
1198+
None => Some(None),
1199+
};
1200+
} else if !arg.expr.is_undefined(*expr_ctx) {
1201+
return Some(Some(eval_as_number(*expr_ctx, &arg.expr)));
1202+
}
11931203
}
1194-
}
1195-
None
1196-
})
1204+
Some(None)
1205+
})
1206+
.unwrap_or(None)
11971207
}

crates/swc_ecma_minifier/tests/terser/compress/evaluate/number_method_call/input.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ console.log((1.23).toPrecision(...undefined));
1212
console.log((1.23).toExponential(undefined, ...undefined));
1313
console.log((1.23).toPrecision(undefined, ...undefined));
1414
console.log((1.23).toPrecision(undefined, 1n + 1));
15+
console.log((1.23).toPrecision(undefined, 1n >>> 1n));
16+
console.log((1.23).toFixed(...[2]));
17+
console.log((1.23).toPrecision(...[2]));
18+
console.log((1.23).toFixed(...[], 2));
19+
console.log((1.23).toPrecision(...[], 2));

crates/swc_ecma_minifier/tests/terser/compress/evaluate/number_method_call/output.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,9 @@ console.log(1.23.toExponential(...void 0));
1111
console.log(1.23.toPrecision(...void 0));
1212
console.log(1.23.toExponential(void 0, ...void 0));
1313
console.log(1.23.toPrecision(void 0, ...void 0));
14-
console.log(1.23.toPrecision(void 0, 1n + 1));
14+
console.log(1.23.toPrecision(void 0, 1n + 1));
15+
console.log((1.23).toPrecision(void 0, 1n >>> 1n));
16+
console.log("1.23");
17+
console.log("1.2");
18+
console.log("1.23");
19+
console.log("1.2");

crates/swc_ecma_minifier/tests/terser/compress/evaluate/number_method_call/output.mangleOnly.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/swc_ecma_utils/src/lib.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3605,8 +3605,13 @@ fn may_have_side_effects(expr: &Expr, ctx: ExprCtx) -> bool {
36053605
}) => {
36063606
left.may_have_side_effects(ctx)
36073607
|| right.may_have_side_effects(ctx)
3608+
// Shift operators may have side effects if one of the operands is BigInt.
3609+
|| matches!(
3610+
op,
3611+
op!(">>>") if left.is_big_int() || right.is_big_int()
3612+
)
36083613
// Arithmetic and Bitwise operators may have side effects if one of the operands is BigInt and the other is not.
3609-
|| (matches!(
3614+
|| matches!(
36103615
op,
36113616
op!(bin, "+")
36123617
| op!(bin, "-")
@@ -3616,10 +3621,9 @@ fn may_have_side_effects(expr: &Expr, ctx: ExprCtx) -> bool {
36163621
| op!("**")
36173622
| op!("<<")
36183623
| op!(">>")
3619-
| op!(">>>")
36203624
| op!("&")
3621-
| op!("|"),
3622-
) && left.is_big_int() != right.is_big_int())
3625+
| op!("|") if left.is_big_int() != right.is_big_int()
3626+
)
36233627
}
36243628

36253629
Expr::Member(MemberExpr { obj, prop, .. })

0 commit comments

Comments
 (0)