aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-11-20 00:11:47 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-11-20 00:11:47 -0800
commita1dce8a3413e8a72e4f2ecba4d6b4f771c8216e6 (patch)
tree2bb76e436745a6206509d553f1c7ae86dc65c06b
parentb27d8da1c798d2a4cfbf8d63585004ce77cf2c71 (diff)
improve js optimizer removal of assigns of undefined
-rw-r--r--tools/js-optimizer.js20
-rw-r--r--tools/test-js-optimizer-output.js12
2 files changed, 22 insertions, 10 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index f88b7d95..bc993eae 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -26,6 +26,11 @@ eval(read('utility.js'));
var FUNCTION = set('defun', 'function');
+var NULL_NODE = ['name', 'null'];
+var UNDEFINED_NODE = ['unary-prefix', 'void', ['num', 0]];
+var TRUE_NODE = ['unary-prefix', '!', ['num', 0]];
+var FALSE_NODE = ['unary-prefix', '!', ['num', 1]];
+
// Traverses a JavaScript syntax tree rooted at the given node calling the given
// callback for each node.
// @arg node: The root of the AST.
@@ -112,10 +117,10 @@ function unGlobalize(ast) {
var value = varItem[1];
if (!value) return true;
var possible = false;
- if (jsonCompare(value, ['name', 'null']) ||
- jsonCompare(value, ['unary-prefix', 'void', ['num', 0]]) ||
- jsonCompare(value, ['unary-prefix', '!', ['num', 0]]) ||
- jsonCompare(value, ['unary-prefix', '!', ['num', 1]])) {
+ if (jsonCompare(value, NULL_NODE) ||
+ jsonCompare(value, UNDEFINED_NODE) ||
+ jsonCompare(value, TRUE_NODE) ||
+ jsonCompare(value, FALSE_NODE)) {
possible = true;
}
if (!possible) return true;
@@ -159,6 +164,13 @@ function removeAssignsToUndefined(ast) {
traverse(ast, function(node, type) {
if (type == 'assign' && jsonCompare(node[3], ['unary-prefix', 'void', ['num', 0]])) {
return emptyNode();
+ } else if (type == 'var') {
+ node[1] = node[1].map(function(varItem, j) {
+ var ident = varItem[0];
+ var value = varItem[1];
+ if (jsonCompare(value, UNDEFINED_NODE)) return [ident];
+ return [ident, value];
+ });
}
});
}
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index a08be0ca..19b6c87c 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -6,11 +6,11 @@ function abc() {
var cheez = [ void 0 ];
var fleefl;
cheez = 10;
- var waka = void 0, flake = void 0, marfoosh = void 0;
- var waka2 = 5, flake2 = void 0, marfoosh2 = void 0;
- var waka3 = void 0, flake3 = 5, marfoosh3 = void 0;
- var waka4 = void 0, flake4 = void 0, marfoosh4 = 5;
- var test1 = !0, test2 = !1, test3 = null, test4 = z, test5 = b, test6 = void 0;
+ var waka, flake, marfoosh;
+ var waka2 = 5, flake2, marfoosh2;
+ var waka3, flake3 = 5, marfoosh3;
+ var waka4, flake4, marfoosh4 = 5;
+ var test1 = !0, test2 = !1, test3 = null, test4 = z, test5 = b, test6;
s3 = 9;
}
function xyz() {
@@ -31,5 +31,5 @@ function xyz2(x) {
var cheez = x;
}
zzz = (function(nada) {
- var cheez = void 0;
+ var cheez;
});