aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2014-03-15 13:19:38 -0700
committerAlon Zakai <alonzakai@gmail.com>2014-03-15 13:19:38 -0700
commit7b68d960c36c0b6f7d67aa8082fef684ef355114 (patch)
treee3bc91238aec63dfeafee4d27259885a9ed40b22 /tools
parent0daeb7d072ab836ce65e95c91b4133bbba92fda9 (diff)
remove empty subnodes after eliminate
Diffstat (limited to 'tools')
-rw-r--r--tools/js-optimizer.js27
1 files changed, 27 insertions, 0 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 240ee2bd..221b555f 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -279,6 +279,28 @@ function clearEmptyNodes(list) {
}
}
+function filterEmptyNodes(list) { // creates a copy and returns it
+ return list.filter(function(node) {
+ return !(isEmptyNode(node) || (node[0] === 'stat' && isEmptyNode(node[1])));
+ });
+}
+
+function removeEmptySubNodes(node) {
+ if (node[0] === 'defun') {
+ node[3] = filterEmptyNodes(node[3]);
+ } else if (node[0] === 'block' && node[1]) {
+ node[1] = filterEmptyNodes(node[1]);
+ }
+/*
+ var stats = getStatements(node);
+ if (stats) clearEmptyNodes(stats);
+*/
+}
+
+function removeAllEmptySubNodes(ast) {
+ traverse(ast, removeEmptySubNodes);
+}
+
// Passes
// Dump the AST. Useful for debugging. For example,
@@ -3877,6 +3899,8 @@ function eliminate(ast, memSafe) {
}
new ExpressionOptimizer(ast).run();
}
+
+ removeAllEmptySubNodes(ast);
}
function eliminateMemSafe(ast) {
@@ -5282,6 +5306,9 @@ if (extraInfoStart > 0) extraInfo = JSON.parse(src.substr(extraInfoStart + 14));
arguments_.slice(1).forEach(function(arg) {
passes[arg](ast);
+ //traverse(ast, function(node) {
+ // if (isEmptyNode(node)) throw 'empty node after ' + arg;
+ //});
});
if (asm && last) {
asmLastOpts(ast); // TODO: move out of last, to make last faster when done later (as in side modules)