fix corner case in ie8 (#3824)

fixes #3823
This commit is contained in:
Alex Lam S.L
2020-04-26 23:44:53 +01:00
committed by GitHub
parent a4a8ccea8c
commit bc2a4a3bb8
2 changed files with 58 additions and 14 deletions

View File

@@ -4906,20 +4906,39 @@ merge(Compressor.prototype, {
var consequent = this.consequent.drop_side_effect_free(compressor);
var alternative = this.alternative.drop_side_effect_free(compressor);
if (consequent === this.consequent && alternative === this.alternative) return this;
if (!consequent) return alternative ? make_node(AST_Binary, this, {
operator: "||",
left: this.condition,
right: alternative
}) : this.condition.drop_side_effect_free(compressor);
if (!alternative) return make_node(AST_Binary, this, {
operator: "&&",
left: this.condition,
right: consequent
});
var node = this.clone();
node.consequent = consequent;
node.alternative = alternative;
return node;
var exprs;
if (compressor.option("ie8")) {
exprs = [];
if (consequent instanceof AST_Function) {
exprs.push(consequent);
consequent = null;
}
if (alternative instanceof AST_Function) {
exprs.push(alternative);
alternative = null;
}
}
var node;
if (!consequent) {
node = alternative ? make_node(AST_Binary, this, {
operator: "||",
left: this.condition,
right: alternative
}) : this.condition.drop_side_effect_free(compressor);
} else if (!alternative) {
node = make_node(AST_Binary, this, {
operator: "&&",
left: this.condition,
right: consequent
});
} else {
node = this.clone();
node.consequent = consequent;
node.alternative = alternative;
}
if (!compressor.option("ie8")) return node;
if (node) exprs.push(node);
return make_sequence(this, exprs);
});
def(AST_Constant, return_null);
def(AST_Dot, function(compressor, first_in_statement) {

View File

@@ -2420,3 +2420,28 @@ issue_3750: {
}
expect_stdout: "PASS"
}
issue_3823: {
options = {
ie8: true,
toplevel: true,
unused: true,
}
input: {
for (var i = 0; i < 1; i++) {
var a = a ? function f() {
f;
} : 0;
console.log("PASS", typeof f);
}
}
expect: {
for (var i = 0; i < 1; i++) {
(function f() {
f;
});
console.log("PASS", typeof f);
}
}
expect_stdout: "PASS undefined"
}