diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2018-08-21 18:34:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-21 18:34:16 +0800 |
commit | 57fb58b263677d8667eadc94634c2018934a0f52 (patch) | |
tree | edb923bb88312c9008d311bb8afc74bbd7c81f36 | |
parent | 18c1c9b38a284279e5370601380a6ef2363e0569 (diff) | |
download | tracifyjs-57fb58b263677d8667eadc94634c2018934a0f52.tar.gz tracifyjs-57fb58b263677d8667eadc94634c2018934a0f52.zip |
enhance `if_return` (#3232)
-rw-r--r-- | lib/compress.js | 13 | ||||
-rw-r--r-- | test/compress/if_return.js | 148 |
2 files changed, 161 insertions, 0 deletions
diff --git a/lib/compress.js b/lib/compress.js index 9b6e3369..eded00c7 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1699,6 +1699,19 @@ merge(Compressor.prototype, { continue; } + if (ab && !stat.alternative && stat.body instanceof AST_BlockStatement && next instanceof AST_Jump) { + var negated = stat.condition.negate(compressor); + if (negated.print_to_string().length <= stat.condition.print_to_string().length) { + CHANGED = true; + stat = stat.clone(); + stat.condition = negated; + statements[j] = stat.body; + stat.body = next; + statements[i] = stat.transform(compressor); + continue; + } + } + var ab = aborts(stat.alternative); if (can_merge_flow(ab)) { if (ab.label) { diff --git a/test/compress/if_return.js b/test/compress/if_return.js index c56fa04d..857406d4 100644 --- a/test/compress/if_return.js +++ b/test/compress/if_return.js @@ -396,3 +396,151 @@ if_if_return_return: { } } } + +if_body_return_1: { + options = { + if_return: true, + } + input: { + var c = "PASS"; + function f(a, b) { + if (a) { + if (b) throw new Error(c); + return 42; + } + return true; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect: { + var c = "PASS"; + function f(a, b) { + if (a) { + if (b) throw new Error(c); + return 42; + } + return true; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect_stdout: [ + "true", + "true", + "42", + "PASS", + ] +} + +if_body_return_2: { + options = { + if_return: true, + } + input: { + var c = "PASS"; + function f(a, b) { + if (0 + a) { + if (b) throw new Error(c); + return 42; + } + return true; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect: { + var c = "PASS"; + function f(a, b) { + if (0 + a) { + if (b) throw new Error(c); + return 42; + } + return true; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect_stdout: [ + "true", + "true", + "42", + "PASS", + ] +} + +if_body_return_3: { + options = { + if_return: true, + } + input: { + var c = "PASS"; + function f(a, b) { + if (1 == a) { + if (b) throw new Error(c); + return 42; + } + return true; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect: { + var c = "PASS"; + function f(a, b) { + if (1 != a) return true; + if (b) throw new Error(c); + return 42; + } + console.log(f(0, 0)); + console.log(f(0, 1)); + console.log(f(1, 0)); + try { + f(1, 1); + console.log("FAIL"); + } catch (e) { + console.log(e.message); + } + } + expect_stdout: [ + "true", + "true", + "42", + "PASS", + ] +} |