fix dead_code on return assignments (#2668)

fixes #2666
This commit is contained in:
Alex Lam S.L
2017-12-27 07:40:34 +08:00
committed by GitHub
parent 5205dbcbf4
commit f30790b11b
2 changed files with 48 additions and 1 deletions

View File

@@ -4841,15 +4841,17 @@ merge(Compressor.prototype, {
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ];
OPT(AST_Assign, function(self, compressor){
var def;
if (compressor.option("dead_code")
&& self.left instanceof AST_SymbolRef
&& self.left.definition().scope === compressor.find_parent(AST_Lambda)) {
&& (def = self.left.definition()).scope === compressor.find_parent(AST_Lambda)) {
var level = 0, node, parent = self;
do {
node = parent;
parent = compressor.parent(level++);
if (parent instanceof AST_Exit) {
if (in_try(level, parent instanceof AST_Throw)) break;
if (is_reachable(def)) break;
if (self.operator == "=") return self.right;
return make_node(AST_Binary, self, {
operator: self.operator.slice(0, -1),
@@ -4891,6 +4893,24 @@ merge(Compressor.prototype, {
}
}
}
function is_reachable(def) {
var reachable = false;
var find_ref = new TreeWalker(function(node) {
if (reachable) return true;
if (node instanceof AST_SymbolRef && node.definition() === def) {
return reachable = true;
}
});
self.right.walk(new TreeWalker(function(node) {
if (reachable) return true;
if (node instanceof AST_Scope) {
node.walk(find_ref);
return true;
}
}));
return reachable;
}
});
OPT(AST_Conditional, function(self, compressor){

View File

@@ -828,3 +828,30 @@ issue_2597: {
}
expect_stdout: "PASS"
}
issue_2666: {
options = {
dead_code: true,
}
input: {
function f(a) {
return a = {
p: function() {
return a;
}
};
}
console.log(typeof f().p());
}
expect: {
function f(a) {
return a = {
p: function() {
return a;
}
};
}
console.log(typeof f().p());
}
expect_stdout: "object"
}