@@ -7436,56 +7436,58 @@ merge(Compressor.prototype, {
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
|
||||
// 0 + n => n
|
||||
case "+":
|
||||
if (self.left.value == 0) {
|
||||
if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
|
||||
operator: "+",
|
||||
expression: self.right
|
||||
}).optimize(compressor);
|
||||
if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
|
||||
if (!(parent instanceof AST_UnaryPrefix && parent.operator == "delete")) {
|
||||
if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
|
||||
// 0 + n => n
|
||||
case "+":
|
||||
if (self.left.value == 0) {
|
||||
if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
|
||||
operator: "+",
|
||||
expression: 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;
|
||||
// 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);
|
||||
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;
|
||||
}
|
||||
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) {
|
||||
|
||||
@@ -2833,3 +2833,39 @@ issue_3997: {
|
||||
}
|
||||
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",
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user