aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-05-02 11:23:18 +0100
committerGitHub <noreply@github.com>2021-05-02 18:23:18 +0800
commit4114431eec1f822e75b86753a801b720dbe5ad04 (patch)
treef90a294176a710ff795e5420e568daa25c2b6f18
parentfb035617996c416fd68d571fe351848d0e5aa506 (diff)
downloadtracifyjs-4114431eec1f822e75b86753a801b720dbe5ad04.tar.gz
tracifyjs-4114431eec1f822e75b86753a801b720dbe5ad04.zip
fix corner case in `collapse_vars` (#4896)
fixes #4895
-rw-r--r--lib/compress.js15
-rw-r--r--test/compress/collapse_vars.js24
2 files changed, 33 insertions, 6 deletions
diff --git a/lib/compress.js b/lib/compress.js
index b02a1163..73c9d653 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1886,8 +1886,7 @@ merge(Compressor.prototype, {
if (is_lhs(node, multi_replacer.parent())) return node;
var ref = rvalue.clone();
value_def.references.push(ref);
- if (abort && candidate instanceof AST_Assign
- && def.references.length - def.replaced - (assignments[def.name] || 0) > 1) {
+ if (abort && candidate instanceof AST_Assign && remaining_refs(def) > 1) {
return make_node(AST_Assign, candidate, {
operator: "=",
left: node,
@@ -2281,7 +2280,9 @@ merge(Compressor.prototype, {
if (!(lhs instanceof AST_Destructured)) candidates.push(hit_stack.slice());
extract_candidates(lhs);
extract_candidates(expr.right);
- if (lhs instanceof AST_SymbolRef) assignments[lhs.name] = (assignments[lhs.name] || 0) + 1;
+ if (lhs instanceof AST_SymbolRef && expr.operator == "=") {
+ assignments[lhs.name] = (assignments[lhs.name] || 0) + 1;
+ }
} else if (expr instanceof AST_Await) {
extract_candidates(expr.expression, unused);
} else if (expr instanceof AST_Binary) {
@@ -2584,6 +2585,10 @@ merge(Compressor.prototype, {
return value_def = def;
}
+ function remaining_refs(def) {
+ return def.references.length - def.replaced - (assignments[def.name] || 0);
+ }
+
function get_lhs(expr) {
if (expr instanceof AST_Assign) {
var lhs = expr.left;
@@ -2592,7 +2597,7 @@ merge(Compressor.prototype, {
var def = lhs.definition();
if (scope.uses_arguments && is_funarg(def)) return lhs;
if (compressor.exposed(def)) return lhs;
- remaining = def.references.length - def.replaced - (assignments[def.name] || 0);
+ remaining = remaining_refs(def);
if (def.fixed && lhs.fixed) remaining = Math.min(remaining, def.references.filter(function(ref) {
return ref.fixed === lhs.fixed;
}).length - 1);
@@ -2608,7 +2613,7 @@ merge(Compressor.prototype, {
if (!member(lhs, def.orig)) return;
if (scope.uses_arguments && is_funarg(def)) return;
var declared = def.orig.length - def.eliminated - (declare_only[def.name] || 0);
- remaining = def.references.length - def.replaced - (assignments[def.name] || 0);
+ remaining = remaining_refs(def);
if (def.fixed) remaining = Math.min(remaining, def.references.filter(function(ref) {
if (!ref.fixed) return true;
if (!ref.fixed.assigns) return true;
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index 3ac8894a..f8a8a31a 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -8560,7 +8560,7 @@ issue_4047_1: {
expect: {
var b = 1;
var a;
- console.log((a = --b + ((a = 0) !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
+ console.log((a = --b + (0 !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
}
expect_stdout: [
"PASS",
@@ -9085,3 +9085,25 @@ issue_4891: {
"0",
]
}
+
+issue_4895: {
+ options = {
+ collapse_vars: true,
+ toplevel: true,
+ }
+ input: {
+ var a, b;
+ (function f() {
+ a = 42;
+ })();
+ console.log((b = a) || b, b += 0);
+ }
+ expect: {
+ var a, b;
+ (function f() {
+ a = 42;
+ })();
+ console.log((b = a) || b, b += 0);
+ }
+ expect_stdout: "42 42"
+}