aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-11-05 19:55:25 +0000
committerGitHub <noreply@github.com>2020-11-06 03:55:25 +0800
commitc2f6fd5fded46624da3851e3accc3b5165e6d588 (patch)
tree3f09f968b442df51362d1bf70bb377b16bf216b6
parentaf4ea3ff6978f079531d011cffc7e2337b3ab48c (diff)
downloadtracifyjs-c2f6fd5fded46624da3851e3accc3b5165e6d588.tar.gz
tracifyjs-c2f6fd5fded46624da3851e3accc3b5165e6d588.zip
fix corner case in `functions` (#4260)
fixes #4259
-rw-r--r--lib/compress.js25
-rw-r--r--test/compress/functions.js26
-rw-r--r--test/compress/reduce_vars.js2
3 files changed, 39 insertions, 14 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 0c49d49d..ab837f60 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1424,8 +1424,9 @@ merge(Compressor.prototype, {
if (!--replaced) abort = true;
if (is_lhs(node, multi_replacer.parent())) return node;
def.replaced++;
- value_def.replaced--;
- return rvalue.clone();
+ var ref = rvalue.clone();
+ value_def.references.push(ref);
+ return ref;
}
// Skip (non-executed) functions and (leading) default case in switch statements
if (node instanceof AST_Default || node instanceof AST_Scope) return node;
@@ -5433,7 +5434,7 @@ merge(Compressor.prototype, {
vars.set(def.name.name, def);
++vars_found;
});
- var seq = node.to_assignments(compressor);
+ var seq = node.to_assignments();
var p = tt.parent();
if (p instanceof AST_ForIn && p.init === node) {
if (seq) return seq;
@@ -6716,21 +6717,19 @@ merge(Compressor.prototype, {
AST_Let.DEFMETHOD("remove_initializers", remove_initializers);
AST_Var.DEFMETHOD("remove_initializers", remove_initializers);
- AST_Definitions.DEFMETHOD("to_assignments", function(compressor) {
- var reduce_vars = compressor.option("reduce_vars");
- var assignments = this.definitions.reduce(function(a, def) {
- if (def.value) {
- var name = make_node(AST_SymbolRef, def.name, def.name);
- a.push(make_node(AST_Assign, def, {
+ AST_Definitions.DEFMETHOD("to_assignments", function() {
+ var assignments = this.definitions.reduce(function(a, defn) {
+ var def = defn.name.definition();
+ if (defn.value) {
+ var name = make_node(AST_SymbolRef, defn.name, defn.name);
+ a.push(make_node(AST_Assign, defn, {
operator : "=",
left : name,
- right : def.value
+ right : defn.value
}));
- if (reduce_vars) name.definition().fixed = false;
+ def.references.push(name);
}
- def = def.name.definition();
def.eliminated++;
- def.replaced--;
return a;
}, []);
if (assignments.length == 0) return null;
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 4ed0dc1b..c2ab23f6 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -5115,3 +5115,29 @@ issue_4233: {
}
expect_stdout: "number"
}
+
+issue_4259: {
+ options = {
+ collapse_vars: true,
+ functions: true,
+ reduce_vars: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ var a = function b() {
+ var c = b;
+ for (b in c);
+ };
+ a();
+ console.log(typeof a);
+ }
+ expect: {
+ function a() {
+ for (a in a);
+ }
+ a();
+ console.log(typeof a);
+ }
+ expect_stdout: "function"
+}
diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js
index ea3703c1..838b130a 100644
--- a/test/compress/reduce_vars.js
+++ b/test/compress/reduce_vars.js
@@ -1999,7 +1999,7 @@ issue_1606: {
var a, b;
function g(){};
b = 2;
- x(b);
+ x(2);
}
}
}