fix corner case in evaluate & unsafe (#5355)

fixes #5354
This commit is contained in:
Alex Lam S.L
2022-02-15 14:47:22 +08:00
committed by GitHub
parent 316245ee12
commit 0b50880b4f
3 changed files with 58 additions and 29 deletions

View File

@@ -4389,9 +4389,6 @@ Compressor.prototype.compress = function(node) {
"setUTCMonth", "setUTCMonth",
"setUTCSeconds", "setUTCSeconds",
"setYear", "setYear",
"toExponential",
"toFixed",
"toPrecision",
]); ]);
def(AST_Call, function(compressor) { def(AST_Call, function(compressor) {
if (!compressor.option("unsafe")) return false; if (!compressor.option("unsafe")) return false;
@@ -4442,7 +4439,10 @@ Compressor.prototype.compress = function(node) {
"charAt", "charAt",
"substr", "substr",
"substring", "substring",
"toExponential",
"toFixed",
"toLowerCase", "toLowerCase",
"toPrecision",
"toString", "toString",
"toUpperCase", "toUpperCase",
"trim", "trim",
@@ -10771,6 +10771,9 @@ Compressor.prototype.compress = function(node) {
if (seq !== self) return seq.optimize(compressor); if (seq !== self) return seq.optimize(compressor);
} }
switch (op) { switch (op) {
case "+":
if (compressor.option("evaluate") && exp.is_number(compressor)) return exp;
break;
case "-": case "-":
if (exp instanceof AST_Infinity) exp = exp.transform(compressor); if (exp instanceof AST_Infinity) exp = exp.transform(compressor);
// avoids infinite recursion of numerals // avoids infinite recursion of numerals
@@ -11477,19 +11480,17 @@ Compressor.prototype.compress = function(node) {
if (self.left.value == 0) { if (self.left.value == 0) {
if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
operator: "+", operator: "+",
expression: self.right expression: self.right,
}).optimize(compressor); }).optimize(compressor);
if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right; if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
} }
break; break;
// 1 * n ---> n // 1 * n ---> n
case "*": case "*":
if (self.left.value == 1) { if (self.left.value == 1) return make_node(AST_UnaryPrefix, self, {
return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, { operator: "+",
operator: "+", expression: self.right,
expression: self.right }).optimize(compressor);
}).optimize(compressor);
}
break; break;
} }
if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) { if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
@@ -11498,28 +11499,24 @@ Compressor.prototype.compress = function(node) {
if (self.right.value == 0) { if (self.right.value == 0) {
if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
operator: "+", operator: "+",
expression: self.left expression: self.left,
}).optimize(compressor); }).optimize(compressor);
if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left; if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
} }
break; break;
// n - 0 ---> n // n - 0 ---> n
case "-": case "-":
if (self.right.value == 0) { if (self.right.value == 0) return make_node(AST_UnaryPrefix, self, {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { operator: "+",
operator: "+", expression: self.left,
expression: self.left }).optimize(compressor);
}).optimize(compressor);
}
break; break;
// n / 1 ---> n // n / 1 ---> n
case "/": case "/":
if (self.right.value == 1) { if (self.right.value == 1) return make_node(AST_UnaryPrefix, self, {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, { operator: "+",
operator: "+", expression: self.left,
expression: self.left }).optimize(compressor);
}).optimize(compressor);
}
break; break;
} }
} }

View File

@@ -745,7 +745,7 @@ call_args: {
expect: { expect: {
var a = 1; var a = 1;
console.log(1); console.log(1);
+(1, 1); 1, 1;
} }
expect_stdout: true expect_stdout: true
} }
@@ -769,7 +769,7 @@ call_args_drop_param: {
} }
expect: { expect: {
console.log(1); console.log(1);
+(b, 1); b, 1;
} }
expect_stdout: true expect_stdout: true
} }
@@ -3241,3 +3241,35 @@ issue_4886_2: {
} }
expect_stdout: "true" expect_stdout: "true"
} }
issue_5354: {
options = {
evaluate: true,
unsafe: true,
}
input: {
function f(a) {
return +a.toExponential(1);
}
function g(b) {
return 0 + b.toFixed(2);
}
function h(c) {
return 1 * c.toPrecision(3);
}
console.log(typeof f(45), typeof g(67), typeof h(89));
}
expect: {
function f(a) {
return +a.toExponential(1);
}
function g(b) {
return 0 + b.toFixed(2);
}
function h(c) {
return +c.toPrecision(3);
}
console.log(typeof f(45), typeof g(67), typeof h(89));
}
expect_stdout: "number string number"
}

View File

@@ -842,9 +842,9 @@ unary_binary_parentheses: {
v.forEach(function(x) { v.forEach(function(x) {
v.forEach(function(y) { v.forEach(function(y) {
console.log( console.log(
+x*y, x*y,
+x/y, x/y,
+x%y, x%y,
-x*y, -x*y,
-x/y, -x/y,
-x%y -x%y
@@ -1397,7 +1397,7 @@ issue_3695: {
} }
expect: { expect: {
var a = []; var a = [];
console.log(+(a * (a[0] = false))); console.log(a * (a[0] = false));
} }
expect_stdout: "NaN" expect_stdout: "NaN"
} }