Skip to content

Commit

Permalink
enhance dead_code (#3551)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl committed Oct 29, 2019
1 parent 0f4cfa8 commit f1eb03f
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 18 deletions.
51 changes: 33 additions & 18 deletions lib/compress.js
Expand Up @@ -3441,6 +3441,7 @@ merge(Compressor.prototype, {
return true;
}
if (node instanceof AST_Scope) {
if (node === self) return;
scopes.push(node);
descend();
scopes.pop();
Expand All @@ -3451,6 +3452,7 @@ merge(Compressor.prototype, {
result = false;
return true;
}
if (self.variables.has(node.name)) return true;
var def = node.definition();
if (member(def.scope, scopes)) return true;
if (scope) {
Expand Down Expand Up @@ -6429,24 +6431,37 @@ merge(Compressor.prototype, {
var ASSIGN_OPS = makePredicate("+ - / * % >> << >>> | ^ &");
var ASSIGN_OPS_COMMUTATIVE = makePredicate("* | ^ &");
OPT(AST_Assign, function(self, compressor) {
var def;
if (compressor.option("dead_code")
&& self.left instanceof AST_SymbolRef
&& (def = self.left.definition()).scope === compressor.find_parent(AST_Lambda)) {
if (self.left.is_immutable()) return strip_assignment();
var level = 0, node, parent = self;
do {
node = parent;
parent = compressor.parent(level++);
if (parent instanceof AST_Exit) {
if (in_try(level, parent)) break;
if (is_reachable(def.scope, [ def ])) break;
def.fixed = false;
return strip_assignment();
}
} while (parent instanceof AST_Binary && parent.right === node
|| parent instanceof AST_Sequence && parent.tail_node() === node
|| parent instanceof AST_UnaryPrefix);
if (compressor.option("dead_code")) {
if (self.left instanceof AST_PropAccess) {
var exp = self.left.expression;
if (exp instanceof AST_Lambda
|| !compressor.has_directive("use strict")
&& exp instanceof AST_Constant
&& !exp.may_throw_on_access(compressor)) {
return self.left instanceof AST_Dot ? self.right : make_sequence(self, [
self.left.property,
self.right
]).optimize(compressor);
}
} else if (self.left instanceof AST_SymbolRef) {
var def = self.left.definition();
if (def.scope === compressor.find_parent(AST_Lambda)) {
if (self.left.is_immutable()) return strip_assignment();
var level = 0, node, parent = self;
do {
node = parent;
parent = compressor.parent(level++);
if (parent instanceof AST_Exit) {
if (in_try(level, parent)) break;
if (is_reachable(def.scope, [ def ])) break;
def.fixed = false;
return strip_assignment();
}
} while (parent instanceof AST_Binary && parent.right === node
|| parent instanceof AST_Sequence && parent.tail_node() === node
|| parent instanceof AST_UnaryPrefix);
}
}
}
self = self.lift_sequences(compressor);
if (!compressor.option("assignments")) return self;
Expand Down
29 changes: 29 additions & 0 deletions test/compress/dead-code.js
Expand Up @@ -1013,3 +1013,32 @@ issue_3406: {
}
expect_stdout: "true"
}

function_assign: {
options = {
dead_code: true,
}
input: {
console.log(function() {
var a = "PASS";
function h(c) {
return c;
}
h.p = function(b) {
return b;
}.p = a;
return h;
}().p);
}
expect: {
console.log(function() {
var a = "PASS";
function h(c) {
return c;
}
h.p = a;
return h;
}().p);
}
expect_stdout: "PASS"
}
34 changes: 34 additions & 0 deletions test/compress/drop-unused.js
Expand Up @@ -2187,3 +2187,37 @@ issue_3515_3: {
}
expect_stdout: "PASS"
}

function_assign: {
options = {
pure_getters: "strict",
reduce_vars: true,
side_effects: true,
unused: true,
}
input: {
console.log(function() {
var a = "PASS";
function g(b) {
return b;
}
g.p = a;
function h(c) {
return c;
}
h.p = a;
return h;
}().p);
}
expect: {
console.log(function() {
var a = "PASS";
function h(c) {
return c;
}
h.p = a;
return h;
}().p);
}
expect_stdout: "PASS"
}

0 comments on commit f1eb03f

Please sign in to comment.