fix corner case in collapse_vars (#3501)
This commit is contained in:
@@ -1465,50 +1465,20 @@ merge(Compressor.prototype, {
|
|||||||
hit_stack.pop();
|
hit_stack.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
function find_stop(node, level, write_only) {
|
function find_stop(node, level) {
|
||||||
var parent = scanner.parent(level);
|
var parent = scanner.parent(level);
|
||||||
if (parent instanceof AST_Assign) {
|
if (parent instanceof AST_Assign) return node;
|
||||||
if (write_only
|
if (parent instanceof AST_Binary) return node;
|
||||||
&& !(parent.left instanceof AST_PropAccess
|
|
||||||
|| parent.left.name in lvalues)) {
|
|
||||||
return find_stop(parent, level + 1, write_only);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_Binary) {
|
|
||||||
if (write_only && (!lazy_op[parent.operator] || parent.left === node)) {
|
|
||||||
return find_stop(parent, level + 1, write_only);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_Call) return node;
|
if (parent instanceof AST_Call) return node;
|
||||||
if (parent instanceof AST_Case) return node;
|
if (parent instanceof AST_Case) return node;
|
||||||
if (parent instanceof AST_Conditional) {
|
if (parent instanceof AST_Conditional) return node;
|
||||||
if (write_only && parent.condition === node) {
|
if (parent instanceof AST_Definitions) return find_stop(parent, level + 1);
|
||||||
return find_stop(parent, level + 1, write_only);
|
if (parent instanceof AST_Exit) return node;
|
||||||
}
|
if (parent instanceof AST_If) return node;
|
||||||
return node;
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_Definitions) {
|
|
||||||
return find_stop(parent, level + 1, true);
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_Exit) {
|
|
||||||
return write_only ? find_stop(parent, level + 1, write_only) : node;
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_If) {
|
|
||||||
if (write_only && parent.condition === node) {
|
|
||||||
return find_stop(parent, level + 1, write_only);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_IterationStatement) return node;
|
if (parent instanceof AST_IterationStatement) return node;
|
||||||
if (parent instanceof AST_PropAccess) return node;
|
if (parent instanceof AST_PropAccess) return node;
|
||||||
if (parent instanceof AST_Sequence) {
|
if (parent instanceof AST_Sequence) return find_stop(parent, level + 1);
|
||||||
return find_stop(parent, level + 1, parent.tail_node() !== node);
|
if (parent instanceof AST_SimpleStatement) return find_stop(parent, level + 1);
|
||||||
}
|
|
||||||
if (parent instanceof AST_SimpleStatement) {
|
|
||||||
return find_stop(parent, level + 1, true);
|
|
||||||
}
|
|
||||||
if (parent instanceof AST_Switch) return node;
|
if (parent instanceof AST_Switch) return node;
|
||||||
if (parent instanceof AST_Unary) return node;
|
if (parent instanceof AST_Unary) return node;
|
||||||
if (parent instanceof AST_VarDef) return node;
|
if (parent instanceof AST_VarDef) return node;
|
||||||
|
|||||||
@@ -6237,3 +6237,24 @@ issue_3439_2: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "number"
|
expect_stdout: "number"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_sequence_return: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(n) {
|
||||||
|
var c = 0;
|
||||||
|
for (var k in [0, 1])
|
||||||
|
if (c++, k == n) return c;
|
||||||
|
}(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(n) {
|
||||||
|
var c = 0;
|
||||||
|
for (var k in [0, 1])
|
||||||
|
if (c++, k == n) return c;
|
||||||
|
}(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user