diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-03-15 15:44:14 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-03-17 17:56:17 -0700 |
commit | 6c31546ced32fd968ae50da7803964c9195ebd62 (patch) | |
tree | 46ddb131a57a612e83f5d00efe847d3794725c94 /tools/js-optimizer.js | |
parent | f6c2bcd2a3058b4b36518aa4cabec2baa7222970 (diff) |
uncommaify between ifs that can potentially be simplified
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index b746489a..bb6acf73 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -140,6 +140,8 @@ var ALTER_FLOW = set('break', 'continue', 'return'); var BREAK_CAPTURERS = set('do', 'while', 'for', 'switch'); var CONTINUE_CAPTURERS = LOOP; +var COMMABLE = set('assign', 'binary', 'unary-prefix', 'unary-postfix', 'name', 'num', 'call', 'seq', 'conditional', 'sub'); + var FUNCTIONS_THAT_ALWAYS_THROW = set('abort', '___resumeException', '___cxa_throw', '___cxa_rethrow'); var NULL_NODE = ['name', 'null']; @@ -832,8 +834,29 @@ function simplifyIfs(ast) { var body = node[2]; // recurse to handle chains while (body[0] === 'block') { - if (body[1].length !== 1) break; - var singleton = body[1][0]; + var stats = body[1]; + if (stats.length > 1) { + var last = stats[stats.length-1]; + if (last[0] === 'if' && !last[3]) { + // try to commaify - turn everything between the ifs into a comma operator inside the second if + var ok = true; + for (var i = 0; i < stats.length-1; i++) { + var curr = stats[i]; + if (curr[0] === 'stat') curr = curr[1]; + if (!(curr[0] in COMMABLE)) ok = false; + } + if (ok) { + for (var i = stats.length-2; i >= 0; i--) { + var curr = stats[i]; + if (curr[0] === 'stat') curr = curr[1]; + last[1] = ['seq', curr, last[1]]; + } + stats = body[1] = [last]; + } + } + } + if (stats.length !== 1) break; + var singleton = stats[0]; if (singleton[0] === 'if' && !singleton[3]) { node[1] = ['conditional', node[1], singleton[1], ['num', 0]]; body = node[2] = singleton[2]; |