aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2014-03-15 15:44:14 -0700
committerAlon Zakai <alonzakai@gmail.com>2014-03-17 17:56:17 -0700
commit6c31546ced32fd968ae50da7803964c9195ebd62 (patch)
tree46ddb131a57a612e83f5d00efe847d3794725c94 /tools/js-optimizer.js
parentf6c2bcd2a3058b4b36518aa4cabec2baa7222970 (diff)
uncommaify between ifs that can potentially be simplified
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js27
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];