Skip to content

Commit 06bb533

Browse files
authored
fix(es/minifier): Fix exponentiate operator (#9251)
**Related issue:** - Closes #9250.
1 parent f6f359e commit 06bb533

12 files changed

Lines changed: 596 additions & 37 deletions

File tree

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use swc_common::{util::take::Take, DUMMY_SP};
44
use swc_ecma_ast::*;
55
#[cfg(feature = "debug")]
66
use swc_ecma_transforms_base::fixer::fixer;
7-
use swc_ecma_utils::{ExprCtx, ExprExt, IdentUsageFinder, Value};
7+
use swc_ecma_utils::{number::JsNumber, ExprCtx, ExprExt, IdentUsageFinder, Value};
88
#[cfg(feature = "debug")]
99
use swc_ecma_visit::{as_folder, FoldWith};
1010
use swc_ecma_visit::{
@@ -512,16 +512,11 @@ pub(crate) fn eval_as_number(expr_ctx: &ExprCtx, e: &Expr) -> Option<f64> {
512512
if args.len() != 2 {
513513
return None;
514514
}
515-
let base = eval_as_number(expr_ctx, &args[0].expr)?;
516-
let exponent = eval_as_number(expr_ctx, &args[1].expr)?;
515+
let base: JsNumber = eval_as_number(expr_ctx, &args[0].expr)?.into();
516+
let exponent: JsNumber =
517+
eval_as_number(expr_ctx, &args[1].expr)?.into();
517518

518-
// https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-numeric-types-number-exponentiate
519-
// https://github.com/rust-lang/rust/issues/60468
520-
if exponent.is_nan() {
521-
return Some(f64::NAN);
522-
}
523-
524-
return Some(base.powf(exponent));
519+
return Some(base.pow(exponent).into());
525520
}
526521

527522
_ => {}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
console.log(Math.pow(1, NaN));
2+
console.log(1 ** NaN);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
console.log(NaN);
2+
console.log(NaN);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
console.log(Math.pow(1, NaN));
2+
console.log(1 ** NaN);

crates/swc_ecma_minifier/tests/terser/compress/evaluate/pow_spec/expected.stdout

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,85 @@ NaN
7979
Infinity
8080
-Infinity
8181
1
82+
----
83+
NaN
84+
NaN
85+
NaN
86+
NaN
87+
1
88+
NaN
89+
NaN
90+
NaN
91+
1
92+
NaN
93+
Infinity
94+
Infinity
95+
Infinity
96+
1
97+
Infinity
98+
0
99+
0
100+
1
101+
NaN
102+
Infinity
103+
4
104+
2
105+
1
106+
1.4142135623730951
107+
0
108+
0.5
109+
1
110+
NaN
111+
NaN
112+
1
113+
1
114+
1
115+
1
116+
NaN
117+
1
118+
1
119+
NaN
120+
0
121+
0.25
122+
0.5
123+
1
124+
0.7071067811865476
125+
Infinity
126+
2
127+
1
128+
NaN
129+
0
130+
0
131+
0
132+
1
133+
0
134+
Infinity
135+
Infinity
136+
1
137+
NaN
138+
Infinity
139+
Infinity
140+
-Infinity
141+
1
142+
Infinity
143+
0
144+
-0
145+
1
146+
NaN
147+
NaN
148+
1
149+
-1
150+
1
151+
NaN
152+
NaN
153+
-1
154+
1
155+
NaN
156+
0
157+
0
158+
-0
159+
1
160+
0
161+
Infinity
162+
-Infinity
163+
1

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

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,87 @@ console.log(Math.pow(-0, 0.5));
7979
console.log(Math.pow(-0, -Infinity));
8080
console.log(Math.pow(-0, -1));
8181
console.log(Math.pow(-0, -0));
82+
83+
console.log("----");
84+
85+
console.log(NaN ** NaN);
86+
console.log(NaN ** Infinity);
87+
console.log(NaN ** 2);
88+
console.log(NaN ** 1);
89+
console.log(NaN ** 0);
90+
console.log(NaN ** 0.5);
91+
console.log(NaN ** -Infinity);
92+
console.log(NaN ** -1);
93+
console.log(NaN ** -0);
94+
console.log(Infinity ** NaN);
95+
console.log(Infinity ** Infinity);
96+
console.log(Infinity ** 2);
97+
console.log(Infinity ** 1);
98+
console.log(Infinity ** 0);
99+
console.log(Infinity ** 0.5);
100+
console.log(Infinity ** -Infinity);
101+
console.log(Infinity ** -1);
102+
console.log(Infinity ** -0);
103+
console.log(2 ** NaN);
104+
console.log(2 ** Infinity);
105+
console.log(2 ** 2);
106+
console.log(2 ** 1);
107+
console.log(2 ** 0);
108+
console.log(2 ** 0.5);
109+
console.log(2 ** -Infinity);
110+
console.log(2 ** -1);
111+
console.log(2 ** -0);
112+
console.log(1 ** NaN);
113+
console.log(1 ** Infinity);
114+
console.log(1 ** 2);
115+
console.log(1 ** 1);
116+
console.log(1 ** 0);
117+
console.log(1 ** 0.5);
118+
console.log(1 ** -Infinity);
119+
console.log(1 ** -1);
120+
console.log(1 ** -0);
121+
console.log(0.5 ** NaN);
122+
console.log(0.5 ** Infinity);
123+
console.log(0.5 ** 2);
124+
console.log(0.5 ** 1);
125+
console.log(0.5 ** 0);
126+
console.log(0.5 ** 0.5);
127+
console.log(0.5 ** -Infinity);
128+
console.log(0.5 ** -1);
129+
console.log(0.5 ** -0);
130+
console.log(0 ** NaN);
131+
console.log(0 ** Infinity);
132+
console.log(0 ** 2);
133+
console.log(0 ** 1);
134+
console.log(0 ** 0);
135+
console.log(0 ** 0.5);
136+
console.log(0 ** -Infinity);
137+
console.log(0 ** -1);
138+
console.log(0 ** -0);
139+
console.log((-Infinity) ** NaN);
140+
console.log((-Infinity) ** Infinity);
141+
console.log((-Infinity) ** 2);
142+
console.log((-Infinity) ** 1);
143+
console.log((-Infinity) ** 0);
144+
console.log((-Infinity) ** 0.5);
145+
console.log((-Infinity) ** -Infinity);
146+
console.log((-Infinity) ** -1);
147+
console.log((-Infinity) ** -0);
148+
console.log((-1) ** NaN);
149+
console.log((-1) ** Infinity);
150+
console.log((-1) ** 2);
151+
console.log((-1) ** 1);
152+
console.log((-1) ** 0);
153+
console.log((-1) ** 0.5);
154+
console.log((-1) ** -Infinity);
155+
console.log((-1) ** -1);
156+
console.log((-1) ** -0);
157+
console.log((-0) ** NaN);
158+
console.log((-0) ** Infinity);
159+
console.log((-0) ** 2);
160+
console.log((-0) ** 1);
161+
console.log((-0) ** 0);
162+
console.log((-0) ** 0.5);
163+
console.log((-0) ** -Infinity);
164+
console.log((-0) ** -1);
165+
console.log((-0) ** -0);

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

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,85 @@ console.log(0);
7979
console.log(Math.pow(-0, -1 / 0));
8080
console.log(-Infinity);
8181
console.log(1);
82+
console.log("----");
83+
console.log(NaN);
84+
console.log(NaN);
85+
console.log(NaN);
86+
console.log(NaN);
87+
console.log(1);
88+
console.log(NaN);
89+
console.log(NaN);
90+
console.log(NaN);
91+
console.log(1);
92+
console.log(NaN);
93+
console.log(Infinity);
94+
console.log(Infinity);
95+
console.log(Infinity);
96+
console.log(1);
97+
console.log(Infinity);
98+
console.log(0);
99+
console.log(0);
100+
console.log(1);
101+
console.log(NaN);
102+
console.log(Infinity);
103+
console.log(4);
104+
console.log(2);
105+
console.log(1);
106+
console.log(1.4142135623730951);
107+
console.log(0);
108+
console.log(0.5);
109+
console.log(1);
110+
console.log(NaN);
111+
console.log(NaN);
112+
console.log(1);
113+
console.log(1);
114+
console.log(1);
115+
console.log(1);
116+
console.log(NaN);
117+
console.log(1);
118+
console.log(1);
119+
console.log(NaN);
120+
console.log(0);
121+
console.log(0.25);
122+
console.log(0.5);
123+
console.log(1);
124+
console.log(0.7071067811865476);
125+
console.log(Infinity);
126+
console.log(2);
127+
console.log(1);
128+
console.log(NaN);
129+
console.log(0);
130+
console.log(0);
131+
console.log(0);
132+
console.log(1);
133+
console.log(0);
134+
console.log(Infinity);
135+
console.log(Infinity);
136+
console.log(1);
137+
console.log(NaN);
138+
console.log(Infinity);
139+
console.log(Infinity);
140+
console.log(-Infinity);
141+
console.log(1);
142+
console.log(Infinity);
143+
console.log(0);
144+
console.log(-0);
145+
console.log(1);
146+
console.log(NaN);
147+
console.log(NaN);
148+
console.log(1);
149+
console.log(-1);
150+
console.log(1);
151+
console.log(NaN);
152+
console.log(NaN);
153+
console.log(-1);
154+
console.log(1);
155+
console.log(NaN);
156+
console.log(0);
157+
console.log(0);
158+
console.log(-0);
159+
console.log(1);
160+
console.log(0);
161+
console.log(Infinity);
162+
console.log(-Infinity);
163+
console.log(1);

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

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,85 @@ console.log(Math.pow(-0, 0.5));
7979
console.log(Math.pow(-0, -Infinity));
8080
console.log(Math.pow(-0, -1));
8181
console.log(Math.pow(-0, -0));
82+
console.log("----");
83+
console.log(NaN ** NaN);
84+
console.log(NaN ** Infinity);
85+
console.log(NaN ** 2);
86+
console.log(NaN ** 1);
87+
console.log(NaN ** 0);
88+
console.log(NaN ** 0.5);
89+
console.log(NaN ** -Infinity);
90+
console.log(NaN ** -1);
91+
console.log(NaN ** -0);
92+
console.log(Infinity ** NaN);
93+
console.log(Infinity ** Infinity);
94+
console.log(Infinity ** 2);
95+
console.log(Infinity ** 1);
96+
console.log(Infinity ** 0);
97+
console.log(Infinity ** 0.5);
98+
console.log(Infinity ** -Infinity);
99+
console.log(Infinity ** -1);
100+
console.log(Infinity ** -0);
101+
console.log(2 ** NaN);
102+
console.log(2 ** Infinity);
103+
console.log(2 ** 2);
104+
console.log(2 ** 1);
105+
console.log(2 ** 0);
106+
console.log(2 ** 0.5);
107+
console.log(2 ** -Infinity);
108+
console.log(2 ** -1);
109+
console.log(2 ** -0);
110+
console.log(1 ** NaN);
111+
console.log(1 ** Infinity);
112+
console.log(1 ** 2);
113+
console.log(1 ** 1);
114+
console.log(1 ** 0);
115+
console.log(1 ** 0.5);
116+
console.log(1 ** -Infinity);
117+
console.log(1 ** -1);
118+
console.log(1 ** -0);
119+
console.log(0.5 ** NaN);
120+
console.log(0.5 ** Infinity);
121+
console.log(0.5 ** 2);
122+
console.log(0.5 ** 1);
123+
console.log(0.5 ** 0);
124+
console.log(0.5 ** 0.5);
125+
console.log(0.5 ** -Infinity);
126+
console.log(0.5 ** -1);
127+
console.log(0.5 ** -0);
128+
console.log(0 ** NaN);
129+
console.log(0 ** Infinity);
130+
console.log(0 ** 2);
131+
console.log(0 ** 1);
132+
console.log(0 ** 0);
133+
console.log(0 ** 0.5);
134+
console.log(0 ** -Infinity);
135+
console.log(0 ** -1);
136+
console.log(0 ** -0);
137+
console.log((-Infinity) ** NaN);
138+
console.log((-Infinity) ** Infinity);
139+
console.log((-Infinity) ** 2);
140+
console.log((-Infinity) ** 1);
141+
console.log((-Infinity) ** 0);
142+
console.log((-Infinity) ** 0.5);
143+
console.log((-Infinity) ** -Infinity);
144+
console.log((-Infinity) ** -1);
145+
console.log((-Infinity) ** -0);
146+
console.log((-1) ** NaN);
147+
console.log((-1) ** Infinity);
148+
console.log((-1) ** 2);
149+
console.log((-1) ** 1);
150+
console.log((-1) ** 0);
151+
console.log((-1) ** 0.5);
152+
console.log((-1) ** -Infinity);
153+
console.log((-1) ** -1);
154+
console.log((-1) ** -0);
155+
console.log((-0) ** NaN);
156+
console.log((-0) ** Infinity);
157+
console.log((-0) ** 2);
158+
console.log((-0) ** 1);
159+
console.log((-0) ** 0);
160+
console.log((-0) ** 0.5);
161+
console.log((-0) ** -Infinity);
162+
console.log((-0) ** -1);
163+
console.log((-0) ** -0);

0 commit comments

Comments
 (0)