fix corner case in comparisons (#4820)

fixes #4819
This commit is contained in:
Alex Lam S.L
2021-03-24 02:10:02 +00:00
committed by GitHub
parent 78e3936cd4
commit 40ef074cb3
2 changed files with 27 additions and 8 deletions

View File

@@ -3689,20 +3689,25 @@ merge(Compressor.prototype, {
(function(def) {
def(AST_Node, return_false);
def(AST_Array, return_true);
def(AST_Assign, function(compressor) {
return this.operator != "=" || this.right.is_defined(compressor);
});
def(AST_Binary, function(compressor) {
switch (this.operator) {
function is_binary_defined(compressor, op, node) {
switch (op) {
case "&&":
return this.left.is_defined(compressor) && this.right.is_defined(compressor);
return node.left.is_defined(compressor) && node.right.is_defined(compressor);
case "||":
return this.left.is_truthy() || this.right.is_defined(compressor);
return node.left.is_truthy() || node.right.is_defined(compressor);
case "??":
return this.left.is_defined(compressor) || this.right.is_defined(compressor);
return node.left.is_defined(compressor) || node.right.is_defined(compressor);
default:
return true;
}
}
def(AST_Assign, function(compressor) {
var op = this.operator;
if (op == "=") return this.right.is_defined(compressor);
return is_binary_defined(compressor, op.slice(0, -1), this);
});
def(AST_Binary, function(compressor) {
return is_binary_defined(compressor, this.operator, this);
});
def(AST_Conditional, function(compressor) {
return this.consequent.is_defined(compressor) && this.alternative.is_defined(compressor);

View File

@@ -589,3 +589,17 @@ issue_4815_2: {
expect_stdout: "PASS"
node_version: ">=15"
}
issue_4819: {
options = {
comparisons: true,
}
input: {
console.log(void 0 === ([].p &&= 42));
}
expect: {
console.log(void 0 === ([].p &&= 42));
}
expect_stdout: "true"
node_version: ">=15"
}