diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2018-01-31 23:49:59 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-31 23:49:59 +0800 |
commit | 2a4c68be4f3ed60fa638b66a57e7056f7507da83 (patch) | |
tree | 4b81a3ab5a30cbf4a8842ee39109af82f960e2e9 | |
parent | 541e6011af7647074a41c5a82a0a16a3d32bb8c6 (diff) | |
download | tracifyjs-2a4c68be4f3ed60fa638b66a57e7056f7507da83.tar.gz tracifyjs-2a4c68be4f3ed60fa638b66a57e7056f7507da83.zip |
relax `collapse_vars` on `AST_Exit` (#2855)
First introduced in #1862 to stop assignments to migrate beyond `return` or `throw`. Since then `collapse_vars` has been improved to handle various side-effect-related corner cases.
-rw-r--r-- | lib/compress.js | 1 | ||||
-rw-r--r-- | test/compress/collapse_vars.js | 83 |
2 files changed, 83 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js index d0ef5f5d..db6ee8be 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1044,7 +1044,6 @@ merge(Compressor.prototype, { // but are otherwise not safe to scan into or beyond them. var sym; if (node instanceof AST_Call - || node instanceof AST_Exit || node instanceof AST_PropAccess && (side_effects || node.expression.may_throw_on_access(compressor)) || node instanceof AST_SymbolRef diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js index 4172b33b..b3617816 100644 --- a/test/compress/collapse_vars.js +++ b/test/compress/collapse_vars.js @@ -4107,3 +4107,86 @@ unsafe_builtin: { } expect_stdout: "1 4" } + +return_1: { + options = { + collapse_vars: true, + unused: true, + } + input: { + var log = console.log; + function f(b, c) { + var a = c; + if (b) return b; + log(a); + } + f(false, 1); + f(true, 2); + } + expect: { + var log = console.log; + function f(b, c) { + if (b) return b; + log(c); + } + f(false, 1); + f(true, 2); + } + expect_stdout: "1" +} + +return_2: { + options = { + collapse_vars: true, + unused: true, + } + input: { + var log = console.log; + function f(b, c) { + var a = c(); + if (b) return b; + log(a); + } + f(false, function() { return 1 }); + f(true, function() { return 2 }); + } + expect: { + var log = console.log; + function f(b, c) { + var a = c(); + if (b) return b; + log(a); + } + f(false, function() { return 1 }); + f(true, function() { return 2 }); + } + expect_stdout: "1" +} + +return_3: { + options = { + collapse_vars: true, + unused: true, + } + input: { + var log = console.log; + function f(b, c) { + var a = b <<= c; + if (b) return b; + log(a); + } + f(false, 1); + f(true, 2); + } + expect: { + var log = console.log; + function f(b, c) { + var a = b <<= c; + if (b) return b; + log(a); + } + f(false, 1); + f(true, 2); + } + expect_stdout: "0" +} |