diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2020-10-02 09:10:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-02 16:10:25 +0800 |
commit | 47a5e6e17a91719dd8ee124f818e6a1996b4d668 (patch) | |
tree | 5f659e96b4fc620aad3e87b646d1a3cdb19cea78 /lib | |
parent | 090ee895e12ff7e985a972c448b7d29f63e12696 (diff) | |
download | tracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.tar.gz tracifyjs-47a5e6e17a91719dd8ee124f818e6a1996b4d668.zip |
enhance `if_return` (#4164)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compress.js | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/compress.js b/lib/compress.js index dfe444ad..df797bf7 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2150,7 +2150,9 @@ merge(Compressor.prototype, { function handle_if_return(statements, compressor) { var self = compressor.self(); var parent = compressor.parent(); - var in_lambda = self instanceof AST_Lambda; + var in_lambda = last_of(function(node) { + return node instanceof AST_Lambda; + }); var in_iife = in_lambda && parent && parent.TYPE == "Call"; var multiple_if_returns = has_multiple_if_returns(statements); for (var i = statements.length; --i >= 0;) { @@ -2253,7 +2255,7 @@ merge(Compressor.prototype, { } //--- // if (foo()) return x; return y; => return foo() ? x : y; - if ((in_bool || value) && !stat.alternative && next instanceof AST_Return) { + if (!stat.alternative && next instanceof AST_Return) { CHANGED = true; stat = stat.clone(); stat.alternative = next; @@ -2323,14 +2325,21 @@ merge(Compressor.prototype, { return true; } - function match_target(target) { + function last_of(predicate) { var block = self, stat, level = 0; do { do { - if (block === target) return true; + if (predicate(block)) return true; block = compressor.parent(level++); } while (block instanceof AST_If && (stat = block)); - } while (block instanceof AST_BlockStatement && is_last_statement(block.body, stat)); + } while ((block instanceof AST_BlockStatement || block instanceof AST_Scope) + && is_last_statement(block.body, stat)); + } + + function match_target(target) { + return last_of(function(node) { + return node === target; + }); } function can_merge_flow(ab) { |