Skip to content

Commit 69b875e

Browse files
committed
fix(es/minifier): Preserve spread
1 parent 343441c commit 69b875e

File tree

5 files changed

+22
-24
lines changed

5 files changed

+22
-24
lines changed

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

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ impl Pure<'_> {
526526

527527
if args
528528
.iter()
529-
.any(|arg| arg.expr.may_have_side_effects(self.expr_ctx))
529+
.any(|arg| arg.spread.is_some() || arg.expr.may_have_side_effects(self.expr_ctx))
530530
{
531531
return;
532532
}
@@ -586,9 +586,7 @@ impl Pure<'_> {
586586
}
587587

588588
if &*method.sym == "toPrecision" {
589-
if args.is_empty()
590-
|| (args[0].spread.is_none() && args[0].expr.is_undefined(self.expr_ctx))
591-
{
589+
if args.is_empty() || (args[0].expr.is_undefined(self.expr_ctx)) {
592590
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.prototype.toprecision
593591
// 2. If precision is undefined, return ! ToString(x).
594592
let value = num.value.to_js_string().into();
@@ -609,13 +607,10 @@ impl Pure<'_> {
609607
return;
610608
}
611609

612-
if let Some(precision) = args.first().and_then(|arg| {
613-
if arg.spread.is_none() {
614-
eval_as_number(self.expr_ctx, &arg.expr)
615-
} else {
616-
None
617-
}
618-
}) {
610+
if let Some(precision) = args
611+
.first()
612+
.and_then(|arg| eval_as_number(self.expr_ctx, &arg.expr))
613+
{
619614
let p = precision.trunc() as usize;
620615
// 5. If p < 1 or p > 100, throw a RangeError exception.
621616
if !(1..=21).contains(&p) {
@@ -640,9 +635,7 @@ impl Pure<'_> {
640635
}
641636

642637
if &*method.sym == "toExponential" {
643-
if args.is_empty()
644-
|| (args[0].spread.is_none() && args[0].expr.is_undefined(self.expr_ctx))
645-
{
638+
if args.is_empty() || (args[0].expr.is_undefined(self.expr_ctx)) {
646639
let value = f64_to_exponential(num.value).into();
647640

648641
self.changed = true;
@@ -659,13 +652,10 @@ impl Pure<'_> {
659652
})
660653
.into();
661654
return;
662-
} else if let Some(precision) = args.first().and_then(|arg| {
663-
if arg.spread.is_none() {
664-
eval_as_number(self.expr_ctx, &arg.expr)
665-
} else {
666-
None
667-
}
668-
}) {
655+
} else if let Some(precision) = args
656+
.first()
657+
.and_then(|arg| eval_as_number(self.expr_ctx, &arg.expr))
658+
{
669659
let p = precision.trunc() as usize;
670660
// 5. If p < 1 or p > 100, throw a RangeError exception.
671661
if !(0..=20).contains(&p) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ console.log((1.23).toExponential(undefined));
44
console.log((1.23).toPrecision(undefined));
55
console.log((1.23).toExponential(...undefined));
66
console.log((1.23).toPrecision(...undefined));
7+
console.log((1.23).toExponential(undefined, ...undefined));
8+
console.log((1.23).toPrecision(undefined, ...undefined));

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ console.log("1.23");
33
console.log("1.23e+0");
44
console.log("1.23");
55
console.log((1.23).toExponential(...void 0));
6-
console.log((1.23).toPrecision(...void 0));
6+
console.log((1.23).toPrecision(...void 0));
7+
console.log((1.23).toExponential(void 0,...void 0));
8+
console.log((1.23).toPrecision(void 0,...void 0));

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ console.log((1.23).toPrecision());
33
console.log((1.23).toExponential(undefined));
44
console.log((1.23).toPrecision(undefined));
55
console.log((1.23).toExponential(...undefined));
6-
console.log((1.23).toPrecision(...undefined));
6+
console.log((1.23).toPrecision(...undefined));
7+
console.log((1.23).toExponential(undefined, ...undefined));
8+
console.log((1.23).toPrecision(undefined, ...undefined));

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ console.log("1.23");
33
console.log("1.23e+0");
44
console.log("1.23");
55
console.log((1.23).toExponential(...void 0));
6-
console.log((1.23).toPrecision(...void 0));
6+
console.log((1.23).toPrecision(...void 0));
7+
console.log((1.23).toExponential(void 0, ...void 0));
8+
console.log((1.23).toPrecision(void 0, ...void 0));

0 commit comments

Comments
 (0)