aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-02-18 08:15:44 +0000
committerGitHub <noreply@github.com>2021-02-18 16:15:44 +0800
commita7bcd4d613b73ff43300bf9053ce466735a7f81a (patch)
tree10d04fc5ed2a9a80218158ea917856150122905a
parent6a2bda52f332b0c39f1a5f81583cc5c63f437f4c (diff)
downloadtracifyjs-a7bcd4d613b73ff43300bf9053ce466735a7f81a.tar.gz
tracifyjs-a7bcd4d613b73ff43300bf9053ce466735a7f81a.zip
fix corner case in `inline` (#4660)
fixes #4659
-rw-r--r--lib/compress.js16
-rw-r--r--lib/scope.js4
-rw-r--r--test/compress/functions.js122
3 files changed, 133 insertions, 9 deletions
diff --git a/lib/compress.js b/lib/compress.js
index a2a28ab9..09e78d46 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -5964,7 +5964,7 @@ merge(Compressor.prototype, {
if (old_def) old_def.forEach(function(node) {
node.name = name_def.name;
node.thedef = name_def;
- node.reference({});
+ node.reference();
});
body.push(defun);
} else {
@@ -6798,7 +6798,7 @@ merge(Compressor.prototype, {
scope: self,
thedef: decl.definition()
});
- sym.reference({});
+ sym.reference();
assignments.push(make_node(AST_Assign, node, {
operator: "=",
left: sym,
@@ -6845,7 +6845,7 @@ merge(Compressor.prototype, {
scope: node.expression.scope,
thedef: def
});
- sym.reference({});
+ sym.reference();
return sym;
}
if (node instanceof AST_Unary) {
@@ -8469,12 +8469,12 @@ merge(Compressor.prototype, {
node = maintain_this_binding(compressor, parent, current, node);
if (replacing || best_of_expression(node, self) === node) {
refs.forEach(function(ref) {
- var def = ref.definition();
- def.references.push(ref);
+ ref.scope = exp === fn ? fn.parent_scope : exp.scope;
+ ref.reference();
if (replacing) {
- def.replaced++;
+ ref.definition().replaced++;
} else {
- def.single_use = false;
+ ref.definition().single_use = false;
}
});
return node;
@@ -10853,7 +10853,7 @@ merge(Compressor.prototype, {
}, fn.argnames) === argname) {
def.reassigned = false;
var sym = make_node(AST_SymbolRef, self, argname);
- sym.reference({});
+ sym.reference();
delete argname.__unused;
return sym;
}
diff --git a/lib/scope.js b/lib/scope.js
index 0f94d4e8..f638890f 100644
--- a/lib/scope.js
+++ b/lib/scope.js
@@ -433,7 +433,9 @@ AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
var def = this.definition();
for (var s = this.scope; s; s = s.parent_scope) {
push_uniq(s.enclosed, def);
- if (options.keep_fnames) {
+ if (!options) {
+ delete s._var_names;
+ } else if (options.keep_fnames) {
s.functions.each(function(d) {
push_uniq(def.scope.enclosed, d);
});
diff --git a/test/compress/functions.js b/test/compress/functions.js
index 7e2b45db..f521433d 100644
--- a/test/compress/functions.js
+++ b/test/compress/functions.js
@@ -5436,3 +5436,125 @@ issue_4655: {
}
expect_stdout: "PASS"
}
+
+issue_4659_1: {
+ options = {
+ inline: true,
+ reduce_vars: true,
+ }
+ input: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ f && f();
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ f && a++;
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect_stdout: "1"
+}
+
+issue_4659_2: {
+ options = {
+ inline: true,
+ reduce_vars: true,
+ }
+ input: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ (function() {
+ f && f();
+ })();
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ void (f && a++);
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect_stdout: "1"
+}
+
+issue_4659_3: {
+ options = {
+ inline: true,
+ reduce_vars: true,
+ unused: true,
+ }
+ input: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ function g() {
+ while (!console);
+ }
+ g(f && f());
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect: {
+ var a = 0;
+ (function() {
+ function f() {
+ return a++;
+ }
+ (function() {
+ (function() {
+ while (!console);
+ })(f && a++);
+ (function() {
+ var a = console && a;
+ })();
+ })();
+ })();
+ console.log(a);
+ }
+ expect_stdout: "1"
+}