Skip to content

Commit

Permalink
fix(es/minifier): Fix exponentiate operator (#9251)
Browse files Browse the repository at this point in the history
**Related issue:**

- Closes #9250.
  • Loading branch information
magic-akari committed Jul 16, 2024
1 parent f6f359e commit 06bb533
Show file tree
Hide file tree
Showing 12 changed files with 596 additions and 37 deletions.
15 changes: 5 additions & 10 deletions crates/swc_ecma_minifier/src/compress/util/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
#[cfg(feature = "debug")]
use swc_ecma_transforms_base::fixer::fixer;
use swc_ecma_utils::{ExprCtx, ExprExt, IdentUsageFinder, Value};
use swc_ecma_utils::{number::JsNumber, ExprCtx, ExprExt, IdentUsageFinder, Value};
#[cfg(feature = "debug")]
use swc_ecma_visit::{as_folder, FoldWith};
use swc_ecma_visit::{
Expand Down Expand Up @@ -512,16 +512,11 @@ pub(crate) fn eval_as_number(expr_ctx: &ExprCtx, e: &Expr) -> Option<f64> {
if args.len() != 2 {
return None;
}
let base = eval_as_number(expr_ctx, &args[0].expr)?;
let exponent = eval_as_number(expr_ctx, &args[1].expr)?;
let base: JsNumber = eval_as_number(expr_ctx, &args[0].expr)?.into();
let exponent: JsNumber =
eval_as_number(expr_ctx, &args[1].expr)?.into();

// https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-numeric-types-number-exponentiate
// https://github.com/rust-lang/rust/issues/60468
if exponent.is_nan() {
return Some(f64::NAN);
}

return Some(base.powf(exponent));
return Some(base.pow(exponent).into());
}

_ => {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
console.log(Math.pow(1, NaN));
console.log(1 ** NaN);
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
console.log(NaN);
console.log(NaN);
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
console.log(Math.pow(1, NaN));
console.log(1 ** NaN);
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,85 @@ NaN
Infinity
-Infinity
1
----
NaN
NaN
NaN
NaN
1
NaN
NaN
NaN
1
NaN
Infinity
Infinity
Infinity
1
Infinity
0
0
1
NaN
Infinity
4
2
1
1.4142135623730951
0
0.5
1
NaN
NaN
1
1
1
1
NaN
1
1
NaN
0
0.25
0.5
1
0.7071067811865476
Infinity
2
1
NaN
0
0
0
1
0
Infinity
Infinity
1
NaN
Infinity
Infinity
-Infinity
1
Infinity
0
-0
1
NaN
NaN
1
-1
1
NaN
NaN
-1
1
NaN
0
0
-0
1
0
Infinity
-Infinity
1
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,87 @@ console.log(Math.pow(-0, 0.5));
console.log(Math.pow(-0, -Infinity));
console.log(Math.pow(-0, -1));
console.log(Math.pow(-0, -0));

console.log("----");

console.log(NaN ** NaN);
console.log(NaN ** Infinity);
console.log(NaN ** 2);
console.log(NaN ** 1);
console.log(NaN ** 0);
console.log(NaN ** 0.5);
console.log(NaN ** -Infinity);
console.log(NaN ** -1);
console.log(NaN ** -0);
console.log(Infinity ** NaN);
console.log(Infinity ** Infinity);
console.log(Infinity ** 2);
console.log(Infinity ** 1);
console.log(Infinity ** 0);
console.log(Infinity ** 0.5);
console.log(Infinity ** -Infinity);
console.log(Infinity ** -1);
console.log(Infinity ** -0);
console.log(2 ** NaN);
console.log(2 ** Infinity);
console.log(2 ** 2);
console.log(2 ** 1);
console.log(2 ** 0);
console.log(2 ** 0.5);
console.log(2 ** -Infinity);
console.log(2 ** -1);
console.log(2 ** -0);
console.log(1 ** NaN);
console.log(1 ** Infinity);
console.log(1 ** 2);
console.log(1 ** 1);
console.log(1 ** 0);
console.log(1 ** 0.5);
console.log(1 ** -Infinity);
console.log(1 ** -1);
console.log(1 ** -0);
console.log(0.5 ** NaN);
console.log(0.5 ** Infinity);
console.log(0.5 ** 2);
console.log(0.5 ** 1);
console.log(0.5 ** 0);
console.log(0.5 ** 0.5);
console.log(0.5 ** -Infinity);
console.log(0.5 ** -1);
console.log(0.5 ** -0);
console.log(0 ** NaN);
console.log(0 ** Infinity);
console.log(0 ** 2);
console.log(0 ** 1);
console.log(0 ** 0);
console.log(0 ** 0.5);
console.log(0 ** -Infinity);
console.log(0 ** -1);
console.log(0 ** -0);
console.log((-Infinity) ** NaN);
console.log((-Infinity) ** Infinity);
console.log((-Infinity) ** 2);
console.log((-Infinity) ** 1);
console.log((-Infinity) ** 0);
console.log((-Infinity) ** 0.5);
console.log((-Infinity) ** -Infinity);
console.log((-Infinity) ** -1);
console.log((-Infinity) ** -0);
console.log((-1) ** NaN);
console.log((-1) ** Infinity);
console.log((-1) ** 2);
console.log((-1) ** 1);
console.log((-1) ** 0);
console.log((-1) ** 0.5);
console.log((-1) ** -Infinity);
console.log((-1) ** -1);
console.log((-1) ** -0);
console.log((-0) ** NaN);
console.log((-0) ** Infinity);
console.log((-0) ** 2);
console.log((-0) ** 1);
console.log((-0) ** 0);
console.log((-0) ** 0.5);
console.log((-0) ** -Infinity);
console.log((-0) ** -1);
console.log((-0) ** -0);
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,85 @@ console.log(0);
console.log(Math.pow(-0, -1 / 0));
console.log(-Infinity);
console.log(1);
console.log("----");
console.log(NaN);
console.log(NaN);
console.log(NaN);
console.log(NaN);
console.log(1);
console.log(NaN);
console.log(NaN);
console.log(NaN);
console.log(1);
console.log(NaN);
console.log(Infinity);
console.log(Infinity);
console.log(Infinity);
console.log(1);
console.log(Infinity);
console.log(0);
console.log(0);
console.log(1);
console.log(NaN);
console.log(Infinity);
console.log(4);
console.log(2);
console.log(1);
console.log(1.4142135623730951);
console.log(0);
console.log(0.5);
console.log(1);
console.log(NaN);
console.log(NaN);
console.log(1);
console.log(1);
console.log(1);
console.log(1);
console.log(NaN);
console.log(1);
console.log(1);
console.log(NaN);
console.log(0);
console.log(0.25);
console.log(0.5);
console.log(1);
console.log(0.7071067811865476);
console.log(Infinity);
console.log(2);
console.log(1);
console.log(NaN);
console.log(0);
console.log(0);
console.log(0);
console.log(1);
console.log(0);
console.log(Infinity);
console.log(Infinity);
console.log(1);
console.log(NaN);
console.log(Infinity);
console.log(Infinity);
console.log(-Infinity);
console.log(1);
console.log(Infinity);
console.log(0);
console.log(-0);
console.log(1);
console.log(NaN);
console.log(NaN);
console.log(1);
console.log(-1);
console.log(1);
console.log(NaN);
console.log(NaN);
console.log(-1);
console.log(1);
console.log(NaN);
console.log(0);
console.log(0);
console.log(-0);
console.log(1);
console.log(0);
console.log(Infinity);
console.log(-Infinity);
console.log(1);
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,85 @@ console.log(Math.pow(-0, 0.5));
console.log(Math.pow(-0, -Infinity));
console.log(Math.pow(-0, -1));
console.log(Math.pow(-0, -0));
console.log("----");
console.log(NaN ** NaN);
console.log(NaN ** Infinity);
console.log(NaN ** 2);
console.log(NaN ** 1);
console.log(NaN ** 0);
console.log(NaN ** 0.5);
console.log(NaN ** -Infinity);
console.log(NaN ** -1);
console.log(NaN ** -0);
console.log(Infinity ** NaN);
console.log(Infinity ** Infinity);
console.log(Infinity ** 2);
console.log(Infinity ** 1);
console.log(Infinity ** 0);
console.log(Infinity ** 0.5);
console.log(Infinity ** -Infinity);
console.log(Infinity ** -1);
console.log(Infinity ** -0);
console.log(2 ** NaN);
console.log(2 ** Infinity);
console.log(2 ** 2);
console.log(2 ** 1);
console.log(2 ** 0);
console.log(2 ** 0.5);
console.log(2 ** -Infinity);
console.log(2 ** -1);
console.log(2 ** -0);
console.log(1 ** NaN);
console.log(1 ** Infinity);
console.log(1 ** 2);
console.log(1 ** 1);
console.log(1 ** 0);
console.log(1 ** 0.5);
console.log(1 ** -Infinity);
console.log(1 ** -1);
console.log(1 ** -0);
console.log(0.5 ** NaN);
console.log(0.5 ** Infinity);
console.log(0.5 ** 2);
console.log(0.5 ** 1);
console.log(0.5 ** 0);
console.log(0.5 ** 0.5);
console.log(0.5 ** -Infinity);
console.log(0.5 ** -1);
console.log(0.5 ** -0);
console.log(0 ** NaN);
console.log(0 ** Infinity);
console.log(0 ** 2);
console.log(0 ** 1);
console.log(0 ** 0);
console.log(0 ** 0.5);
console.log(0 ** -Infinity);
console.log(0 ** -1);
console.log(0 ** -0);
console.log((-Infinity) ** NaN);
console.log((-Infinity) ** Infinity);
console.log((-Infinity) ** 2);
console.log((-Infinity) ** 1);
console.log((-Infinity) ** 0);
console.log((-Infinity) ** 0.5);
console.log((-Infinity) ** -Infinity);
console.log((-Infinity) ** -1);
console.log((-Infinity) ** -0);
console.log((-1) ** NaN);
console.log((-1) ** Infinity);
console.log((-1) ** 2);
console.log((-1) ** 1);
console.log((-1) ** 0);
console.log((-1) ** 0.5);
console.log((-1) ** -Infinity);
console.log((-1) ** -1);
console.log((-1) ** -0);
console.log((-0) ** NaN);
console.log((-0) ** Infinity);
console.log((-0) ** 2);
console.log((-0) ** 1);
console.log((-0) ** 0);
console.log((-0) ** 0.5);
console.log((-0) ** -Infinity);
console.log((-0) ** -1);
console.log((-0) ** -0);
Loading

0 comments on commit 06bb533

Please sign in to comment.