fix corner case in evaluate (#4036)

fixes #4035
This commit is contained in:
Alex Lam S.L
2020-08-04 20:05:10 +08:00
committed by GitHub
parent 9d758a216b
commit a4002ef467
2 changed files with 86 additions and 48 deletions

View File

@@ -7436,56 +7436,58 @@ merge(Compressor.prototype, {
} }
break; break;
} }
if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) { if (!(parent instanceof AST_UnaryPrefix && parent.operator == "delete")) {
// 0 + n => n if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
case "+": // 0 + n => n
if (self.left.value == 0) { case "+":
if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, { if (self.left.value == 0) {
operator: "+", if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
expression: self.right operator: "+",
}).optimize(compressor); expression: self.right
if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right; }).optimize(compressor);
if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
}
break;
// 1 * n => n
case "*":
if (self.left.value == 1) {
return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.right
}).optimize(compressor);
}
break;
} }
break; if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
// 1 * n => n // n + 0 => n
case "*": case "+":
if (self.left.value == 1) { if (self.right.value == 0) {
return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, { if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
operator: "+", operator: "+",
expression: self.right expression: self.left
}).optimize(compressor); }).optimize(compressor);
if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
}
break;
// n - 0 => n
case "-":
if (self.right.value == 0) {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.left
}).optimize(compressor);
}
break;
// n / 1 => n
case "/":
if (self.right.value == 1) {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.left
}).optimize(compressor);
}
break;
} }
break;
}
if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
// n + 0 => n
case "+":
if (self.right.value == 0) {
if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.left
}).optimize(compressor);
if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
}
break;
// n - 0 => n
case "-":
if (self.right.value == 0) {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.left
}).optimize(compressor);
}
break;
// n / 1 => n
case "/":
if (self.right.value == 1) {
return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
operator: "+",
expression: self.left
}).optimize(compressor);
}
break;
} }
} }
if (compressor.option("typeofs")) switch (self.operator) { if (compressor.option("typeofs")) switch (self.operator) {

View File

@@ -2833,3 +2833,39 @@ issue_3997: {
} }
expect_stdout: "string" expect_stdout: "string"
} }
issue_4035: {
options = {
evaluate: true,
reduce_vars: true,
}
input: {
var a = 0;
(function() {
var b = --a;
console.log(delete (0 + b));
console.log(delete (1 * b));
console.log(delete (b + 0));
console.log(delete (b - 0));
console.log(delete (b / 1));
})();
}
expect: {
var a = 0;
(function() {
var b = --a;
console.log((0 + b, true));
console.log((1 * b, true));
console.log((0 + b, true));
console.log((b - 0, true));
console.log((b / 1, true));
})();
}
expect_stdout: [
"true",
"true",
"true",
"true",
"true",
]
}