aboutsummaryrefslogtreecommitdiff
path: root/lib/compress.js
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-04-21 02:16:05 +0800
committerGitHub <noreply@github.com>2019-04-21 02:16:05 +0800
commitc719552317a4ec14b04226cc0440d25b4028f09c (patch)
treefb68ca3051fb5d475b68ebd0fa7912fd820036cd /lib/compress.js
parent855964a87a14308ae97eea35171982fb33bd58ca (diff)
downloadtracifyjs-c719552317a4ec14b04226cc0440d25b4028f09c.tar.gz
tracifyjs-c719552317a4ec14b04226cc0440d25b4028f09c.zip
fix corner cases in `functions` (#3372)
fixes #3371
Diffstat (limited to 'lib/compress.js')
-rw-r--r--lib/compress.js34
1 files changed, 24 insertions, 10 deletions
diff --git a/lib/compress.js b/lib/compress.js
index b0f1bfba..2fd36095 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -114,7 +114,7 @@ function Compressor(options, false_by_default) {
};
} else if (Array.isArray(pure_funcs)) {
this.pure_funcs = function(node) {
- return pure_funcs.indexOf(node.expression.print_to_string()) < 0;
+ return !member(node.expression.print_to_string(), pure_funcs);
};
} else {
this.pure_funcs = return_true;
@@ -131,7 +131,7 @@ function Compressor(options, false_by_default) {
top_retain = top_retain.split(/,/);
}
this.top_retain = function(def) {
- return top_retain.indexOf(def.name) >= 0;
+ return member(def.name, top_retain);
};
}
var toplevel = this.options["toplevel"];
@@ -1711,7 +1711,7 @@ merge(Compressor.prototype, {
CHANGED = true;
statements.splice(i, 1);
} else if (stat instanceof AST_Directive) {
- if (seen_dirs.indexOf(stat.value) < 0) {
+ if (!member(stat.value, seen_dirs)) {
i++;
seen_dirs.push(stat.value);
} else {
@@ -2853,7 +2853,7 @@ merge(Compressor.prototype, {
var fixed = this.fixed_value();
if (!fixed) return this;
var value;
- if (cached.indexOf(fixed) >= 0) {
+ if (member(fixed, cached)) {
value = fixed._eval();
} else {
this._eval = return_this;
@@ -3638,11 +3638,16 @@ merge(Compressor.prototype, {
var defun = make_node(AST_Defun, def, def.value);
defun.name = make_node(AST_SymbolDefun, def.name, def.name);
var name_def = def.name.scope.resolve().def_function(defun.name);
- if (def.value.name) def.value.name.definition().references.forEach(function(ref) {
- ref.name = name_def.name;
- ref.thedef = name_def;
- ref.reference({});
- });
+ if (def.value.name) {
+ var old_def = def.value.name.definition();
+ def.value.walk(new TreeWalker(function(node) {
+ if (node instanceof AST_SymbolRef && node.definition() === old_def) {
+ node.name = name_def.name;
+ node.thedef = name_def;
+ node.reference({});
+ }
+ }));
+ }
body.push(defun);
} else {
if (side_effects.length > 0) {
@@ -3703,6 +3708,7 @@ merge(Compressor.prototype, {
// https://github.com/mishoo/UglifyJS2/issues/44
// https://github.com/mishoo/UglifyJS2/issues/1830
// https://github.com/mishoo/UglifyJS2/issues/1838
+ // https://github.com/mishoo/UglifyJS2/issues/3371
// that's an invalid AST.
// We fix it at this stage by moving the `var` outside the `for`.
if (node instanceof AST_For) {
@@ -3713,7 +3719,15 @@ merge(Compressor.prototype, {
node.init = block.body.pop();
block.body.push(node);
}
- if (node.init instanceof AST_SimpleStatement) {
+ if (node.init instanceof AST_Defun) {
+ if (!block) {
+ block = make_node(AST_BlockStatement, node, {
+ body: [ node ]
+ });
+ }
+ block.body.splice(-1, 0, node.init);
+ node.init = null;
+ } else if (node.init instanceof AST_SimpleStatement) {
node.init = node.init.body;
} else if (is_empty(node.init)) {
node.init = null;