fix corner case in evaluate (#3921)

fixes #3920
This commit is contained in:
Alex Lam S.L
2020-05-22 04:38:09 +01:00
committed by GitHub
parent 75c5b6029b
commit d1cc5270a3
2 changed files with 42 additions and 11 deletions

View File

@@ -3256,11 +3256,21 @@ merge(Compressor.prototype, {
&& unaryPrefix[this.operator]; && unaryPrefix[this.operator];
} }
}); });
function modified(sym) { var scan_modified = new TreeWalker(function(node) {
if (!(sym instanceof AST_SymbolRef)) return; if (node instanceof AST_Assign) modified(node.left);
sym.definition().references.forEach(function(node) { if (node instanceof AST_Unary && unary_arithmetic[node.operator]) modified(node.expression);
delete node._eval; });
}); function modified(node) {
if (node instanceof AST_Dot) {
modified(node.expression);
} else if (node instanceof AST_Sub) {
modified(node.expression);
node.property.walk(scan_modified);
} else if (node instanceof AST_SymbolRef) {
node.definition().references.forEach(function(ref) {
delete ref._eval;
});
}
} }
def(AST_Statement, function() { def(AST_Statement, function() {
throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start));
@@ -3280,12 +3290,11 @@ merge(Compressor.prototype, {
}); });
def(AST_Sequence, function(compressor, ignore_side_effects, cached, depth) { def(AST_Sequence, function(compressor, ignore_side_effects, cached, depth) {
if (!ignore_side_effects) return this; if (!ignore_side_effects) return this;
var tail = this.tail_node(); var exprs = this.expressions;
this.walk(new TreeWalker(function(node) { for (var i = 0, last = exprs.length - 1; i < last; i++) {
if (node === tail) return true; exprs[i].walk(scan_modified);
if (node instanceof AST_Assign) modified(node.left); }
if (node instanceof AST_Unary && unary_arithmetic[node.operator]) modified(node.expression); var tail = exprs[last];
}));
var value = tail._eval(compressor, ignore_side_effects, cached, depth); var value = tail._eval(compressor, ignore_side_effects, cached, depth);
return value === tail ? this : value; return value === tail ? this : value;
}); });

View File

@@ -2463,3 +2463,25 @@ issue_3905: {
} }
expect_stdout: "0" expect_stdout: "0"
} }
issue_3920: {
options = {
evaluate: true,
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
var a = function(b) {
return (b[b = 0] = 0) >= (b ? 0 : 1);
}("foo");
console.log(a);
}
expect: {
var a = function(b) {
return (b[b = 0] = 0) >= (b ? 0 : 1);
}("foo");
console.log(a);
}
expect_stdout: "false"
}