aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-11-26 18:59:28 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-11-26 18:59:28 -0800
commit17601d89617282c79a1a0e4cd381a9c2401016f5 (patch)
treec6375c120b751e616740ba000d24d9618ac03887
parentd9af31471571b868b7a7da57e7d9f14d2f52bd5a (diff)
refactor a js optimizer pass
-rw-r--r--tests/runner.py4
-rw-r--r--tools/js-optimizer.js51
2 files changed, 31 insertions, 24 deletions
diff --git a/tests/runner.py b/tests/runner.py
index ba501372..f08c747b 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -4606,7 +4606,7 @@ TT = %s
def test_js_optimizer(self):
input = open(path_from_root('tools', 'test-js-optimizer.js')).read()
expected = open(path_from_root('tools', 'test-js-optimizer-output.js')).read()
- output = Popen([NODE_JS, JS_OPTIMIZER, 'unGlobalize', 'removeAssignsToUndefined', 'simplifyNotComps', 'loopOptimizer'],
+ output = Popen([NODE_JS, JS_OPTIMIZER, 'unGlobalize', 'removeAssignsToUndefined', 'simplifyExpressions', 'loopOptimizer'],
stdin=PIPE, stdout=PIPE).communicate(input)[0]
self.assertIdentical(expected, output.replace('\n\n', '\n'))
@@ -4645,7 +4645,7 @@ else:
#JS_ENGINE = V8_ENGINE
Building.COMPILER_TEST_OPTS = []
- POST_OPTIMIZATIONS = [['js-optimizer', 'loopOptimizer'], 'eliminator', 'closure', ['js-optimizer', 'unGlobalize', 'removeAssignsToUndefined', 'simplifyNotComps']]
+ POST_OPTIMIZATIONS = [['js-optimizer', 'loopOptimizer'], 'eliminator', 'closure', ['js-optimizer', 'unGlobalize', 'removeAssignsToUndefined', 'simplifyExpressions']]
TEST_REPS = 10
TOTAL_TESTS = 7
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 869ca77b..e889c7a3 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -254,28 +254,35 @@ function removeUnneededLabelSettings(ast) {
});
}
-// We often have branchings that are simplified so one end vanishes, and
-// we then get
-// if (!(x < 5))
-// or such. Simplifying these saves space and time.
-function simplifyNotComps(ast) {
- traverse(ast, function(node, type) {
- if (type == 'unary-prefix' && node[1] == '!' && node[2][0] == 'binary') {
- if (node[2][1] == '<') {
- return ['binary', '>=', node[2][2], node[2][3]];
- } else if (node[2][1] == '>') {
- return ['binary', '<=', node[2][2], node[2][3]];
- } else if (node[2][1] == '==') {
- return ['binary', '!=', node[2][2], node[2][3]];
- } else if (node[2][1] == '!=') {
- return ['binary', '==', node[2][2], node[2][3]];
- } else if (node[2][1] == '===') {
- return ['binary', '!==', node[2][2], node[2][3]];
- } else if (node[2][1] == '!==') {
- return ['binary', '===', node[2][2], node[2][3]];
+// Various expression simplifications
+function simplifyExpressions(ast) {
+ // We often have branchings that are simplified so one end vanishes, and
+ // we then get
+ // if (!(x < 5))
+ // or such. Simplifying these saves space and time.
+ function simplifyNotComps(ast) {
+ traverse(ast, function(node, type) {
+ if (type == 'unary-prefix' && node[1] == '!' && node[2][0] == 'binary') {
+ if (node[2][1] == '<') {
+ return ['binary', '>=', node[2][2], node[2][3]];
+ } else if (node[2][1] == '>') {
+ return ['binary', '<=', node[2][2], node[2][3]];
+ } else if (node[2][1] == '==') {
+ return ['binary', '!=', node[2][2], node[2][3]];
+ } else if (node[2][1] == '!=') {
+ return ['binary', '==', node[2][2], node[2][3]];
+ } else if (node[2][1] == '===') {
+ return ['binary', '!==', node[2][2], node[2][3]];
+ } else if (node[2][1] == '!==') {
+ return ['binary', '===', node[2][2], node[2][3]];
+ }
}
- }
- });
+ });
+ }
+
+ // Go
+
+ simplifyNotComps(ast);
}
function loopOptimizer(ast) {
@@ -361,7 +368,7 @@ var passes = {
unGlobalize: unGlobalize,
removeAssignsToUndefined: removeAssignsToUndefined,
//removeUnneededLabelSettings: removeUnneededLabelSettings,
- simplifyNotComps: simplifyNotComps,
+ simplifyExpressions: simplifyExpressions,
loopOptimizer: loopOptimizer
};