aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2020-08-09 22:48:56 +0100
committerGitHub <noreply@github.com>2020-08-10 05:48:56 +0800
commit49670d216bf7eca9218c797d509e149cd8515708 (patch)
treeba5e747b7918454d13248eeaa5650dd9212c9395
parente2237d8cd26e27a284c6a564762345e84a365dae (diff)
downloadtracifyjs-49670d216bf7eca9218c797d509e149cd8515708.tar.gz
tracifyjs-49670d216bf7eca9218c797d509e149cd8515708.zip
fix corner case in `collapse_vars` (#4048)
fixes #4047
-rw-r--r--lib/compress.js9
-rw-r--r--test/compress/collapse_vars.js56
2 files changed, 62 insertions, 3 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 9c1fc3a9..6f739368 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1984,9 +1984,12 @@ merge(Compressor.prototype, {
if (expr.name instanceof AST_SymbolFunarg) {
var index = compressor.self().argnames.indexOf(expr.name);
var args = compressor.parent().args;
- if (args[index]) args[index] = make_node(AST_Number, args[index], {
- value: 0
- });
+ if (args[index]) {
+ args[index] = make_node(AST_Number, args[index], {
+ value: 0
+ });
+ expr.name.definition().fixed = false;
+ }
return true;
}
var end = hit_stack.length - 1;
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index ff6b9a29..7fc4b768 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -8391,3 +8391,59 @@ issue_4040: {
}
expect_stdout: "PASS"
}
+
+issue_4047_1: {
+ options = {
+ collapse_vars: true,
+ evaluate: true,
+ inline: true,
+ reduce_vars: true,
+ sequences: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ var b = 1;
+ console.log(+function(a) {
+ b = a;
+ (a >>= 0) && console.log("PASS");
+ }(--b + (0 !== typeof A)));
+ }
+ expect: {
+ var b = 1;
+ var a;
+ console.log((a = --b + ((a = 0) !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
+ }
+ expect_stdout: [
+ "PASS",
+ "NaN",
+ ]
+}
+
+issue_4047_2: {
+ options = {
+ collapse_vars: true,
+ evaluate: true,
+ inline: true,
+ passes: 2,
+ reduce_vars: true,
+ sequences: true,
+ toplevel: true,
+ unused: true,
+ }
+ input: {
+ var b = 1;
+ console.log(+function(a) {
+ b = a;
+ (a >>= 0) && console.log("PASS");
+ }(--b + (0 !== typeof A)));
+ }
+ expect: {
+ var a;
+ console.log((a = +(0 !== typeof A), +void ((a >>= 0) && console.log("PASS"))));
+ }
+ expect_stdout: [
+ "PASS",
+ "NaN",
+ ]
+}