fix corner case in #2763 (#2766)

This commit is contained in:
Alex Lam S.L
2018-01-11 21:18:08 +08:00
committed by GitHub
parent f1e1bb419a
commit 23ec484806
2 changed files with 35 additions and 12 deletions

View File

@@ -1698,6 +1698,8 @@ merge(Compressor.prototype, {
function join_object_assignments(defn, body) { function join_object_assignments(defn, body) {
if (!(defn instanceof AST_Definitions)) return; if (!(defn instanceof AST_Definitions)) return;
var def = defn.definitions[defn.definitions.length - 1];
if (!(def.value instanceof AST_Object)) return;
var exprs; var exprs;
if (body instanceof AST_Assign) { if (body instanceof AST_Assign) {
exprs = [ body ]; exprs = [ body ];
@@ -1705,17 +1707,14 @@ merge(Compressor.prototype, {
exprs = body.expressions.slice(); exprs = body.expressions.slice();
} }
if (!exprs) return; if (!exprs) return;
var trimmed = false;
do { do {
var node = exprs[0]; var node = exprs[0];
if (!(node instanceof AST_Assign)) break; if (!(node instanceof AST_Assign)) break;
if (!(node.left instanceof AST_PropAccess)) break; if (!(node.left instanceof AST_PropAccess)) break;
var sym = node.left.expression; var sym = node.left.expression;
if (!(sym instanceof AST_SymbolRef)) break; if (!(sym instanceof AST_SymbolRef)) break;
var def = find_if(function(def) { if (def.name.name != sym.name) break;
return def.name.name == sym.name
&& def.value instanceof AST_Object;
}, defn.definitions);
if (!def) break;
if (!node.right.is_constant_expression(scope)) break; if (!node.right.is_constant_expression(scope)) break;
var prop = node.left.property; var prop = node.left.property;
if (prop instanceof AST_Node) { if (prop instanceof AST_Node) {
@@ -1727,8 +1726,9 @@ merge(Compressor.prototype, {
value: node.right value: node.right
})); }));
exprs.shift(); exprs.shift();
trimmed = true;
} while (exprs.length); } while (exprs.length);
return exprs; return trimmed && exprs;
} }
function join_consecutive_vars(statements, compressor) { function join_consecutive_vars(statements, compressor) {
@@ -1766,14 +1766,11 @@ merge(Compressor.prototype, {
} else if (stat instanceof AST_SimpleStatement) { } else if (stat instanceof AST_SimpleStatement) {
var exprs = join_object_assignments(prev, stat.body); var exprs = join_object_assignments(prev, stat.body);
if (exprs) { if (exprs) {
if (exprs.length > 0) {
stat.body = make_sequence(stat.body, exprs);
statements[++j] = stat;
}
CHANGED = true; CHANGED = true;
} else { if (!exprs.length) continue;
statements[++j] = stat; stat.body = make_sequence(stat.body, exprs);
} }
statements[++j] = stat;
} else { } else {
statements[++j] = stat; statements[++j] = stat;
} }

View File

@@ -1162,3 +1162,29 @@ join_object_assignments_2: {
} }
expect_stdout: "1 4 6" expect_stdout: "1 4 6"
} }
join_object_assignments_3: {
options = {
evaluate: true,
join_vars: true,
}
input: {
console.log(function() {
var o = {
a: "PASS",
}, a = o.a;
o.a = "FAIL";
return a;
}());
}
expect: {
console.log(function() {
var o = {
a: "PASS",
}, a = o.a;
o.a = "FAIL";
return a;
}());
}
expect_stdout: "PASS"
}