@@ -4841,15 +4841,17 @@ merge(Compressor.prototype, {
|
|||||||
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
|
var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
|
||||||
var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ];
|
var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ];
|
||||||
OPT(AST_Assign, function(self, compressor){
|
OPT(AST_Assign, function(self, compressor){
|
||||||
|
var def;
|
||||||
if (compressor.option("dead_code")
|
if (compressor.option("dead_code")
|
||||||
&& self.left instanceof AST_SymbolRef
|
&& 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;
|
var level = 0, node, parent = self;
|
||||||
do {
|
do {
|
||||||
node = parent;
|
node = parent;
|
||||||
parent = compressor.parent(level++);
|
parent = compressor.parent(level++);
|
||||||
if (parent instanceof AST_Exit) {
|
if (parent instanceof AST_Exit) {
|
||||||
if (in_try(level, parent instanceof AST_Throw)) break;
|
if (in_try(level, parent instanceof AST_Throw)) break;
|
||||||
|
if (is_reachable(def)) break;
|
||||||
if (self.operator == "=") return self.right;
|
if (self.operator == "=") return self.right;
|
||||||
return make_node(AST_Binary, self, {
|
return make_node(AST_Binary, self, {
|
||||||
operator: self.operator.slice(0, -1),
|
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){
|
OPT(AST_Conditional, function(self, compressor){
|
||||||
|
|||||||
@@ -828,3 +828,30 @@ issue_2597: {
|
|||||||
}
|
}
|
||||||
expect_stdout: "PASS"
|
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"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user