diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-07-06 19:23:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-07 02:23:09 +0800 |
commit | 1fefe3f1d138f2a1dd9386e02c58f60635632611 (patch) | |
tree | f3d8dc93563cf1b4864f55b1c8b43a950fbceaac | |
parent | 0668fad5e9000fc8d4857f033c3e90b1cedb4563 (diff) | |
download | tracifyjs-1fefe3f1d138f2a1dd9386e02c58f60635632611.tar.gz tracifyjs-1fefe3f1d138f2a1dd9386e02c58f60635632611.zip |
fix corner case in `reduce_vars` (#5056)
fixes #5055
-rw-r--r-- | lib/compress.js | 31 | ||||
-rw-r--r-- | test/compress/reduce_vars.js | 46 |
2 files changed, 65 insertions, 12 deletions
diff --git a/lib/compress.js b/lib/compress.js index 714d3cd7..75b1c8ab 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -526,26 +526,33 @@ merge(Compressor.prototype, { tw.fn_scanning = was_scanning; } + function revisit_fn_def(tw, fn) { + fn.enclosed.forEach(function(d) { + if (fn.variables.get(d.name) === d) return; + if (safe_to_read(tw, d)) return; + d.single_use = false; + var fixed = d.fixed; + if (typeof fixed == "function") fixed = fixed(); + if (fixed instanceof AST_Lambda && HOP(fixed, "safe_ids")) return; + d.fixed = false; + }); + } + function mark_fn_def(tw, def, fn) { if (!HOP(fn, "safe_ids")) return; var marker = fn.safe_ids; if (marker === false) return; - if (fn.parent_scope.resolve().may_call_this === return_true) return; - if (marker) { + if (fn.parent_scope.resolve().may_call_this === return_true) { + if (member(fn, tw.fn_visited)) revisit_fn_def(tw, fn); + } else if (marker) { var visited = member(fn, tw.fn_visited); if (marker === tw.safe_ids) { if (!visited) walk_fn_def(tw, fn); - } else if (!visited) { + } else if (visited) { + revisit_fn_def(tw, fn); + } else { fn.safe_ids = false; - } else fn.enclosed.forEach(function(d) { - if (fn.variables.get(d.name) === d) return; - if (safe_to_read(tw, d)) return; - d.single_use = false; - var fixed = d.fixed; - if (typeof fixed == "function") fixed = fixed(); - if (fixed instanceof AST_Lambda && HOP(fixed, "safe_ids")) return; - d.fixed = false; - }); + } } else if (tw.fn_scanning && tw.fn_scanning !== def.scope.resolve()) { fn.safe_ids = false; } else { diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index 4af4945f..66c70d5a 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -7725,3 +7725,49 @@ issue_5050: { "3", ] } + +issue_5055_1: { + options = { + evaluate: true, + reduce_vars: true, + toplevel: true, + } + input: { + var a = "PASS"; + function f() { + console.log(a || "FAIL"); + } + f(0 && (a = 0)(f(this))); + } + expect: { + var a = "PASS"; + function f() { + console.log(a || "FAIL"); + } + f(0); + } + expect_stdout: "PASS" +} + +issue_5055_2: { + options = { + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a = "PASS"; + function f() { + console.log(a || "FAIL"); + } + f(0 && (a = 0)(f(this))); + } + expect: { + var a = "PASS"; + function f() { + console.log(a || "FAIL"); + } + f(0 && (a = 0)(f())); + } + expect_stdout: "PASS" +} |