aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-16 10:06:30 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-16 10:06:30 -0800
commit58132ad51111bcb024f7a9f2bdce970324c05e00 (patch)
tree0a509eb56ead2fed56e4f4f2432387ed1b75903e
parent22dc3bb223334137a3b7c77906b8960a9197be7a (diff)
improve side effect detection in js optimizer
-rw-r--r--tools/js-optimizer.js15
-rw-r--r--tools/test-js-optimizer-output.js2
-rw-r--r--tools/test-js-optimizer.js10
3 files changed, 19 insertions, 8 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index da6fe982..ed936f5f 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -783,14 +783,13 @@ function simplifyExpressionsPost(ast) {
simplifyNotComps(ast);
}
-function hasSideEffects(node) { // this is 99% incomplete and wrong! It just works on __label__ == X and number literals
- if (node[0] == 'num') return false;
- if (node[0] == 'binary' && (node[1] == '==' || node[1] == '!=') && node[2][0] == 'name' &&
- node[3][0] == 'num') {
- return false;
- } else {
- return true;
- }
+var NO_SIDE_EFFECTS = set('num', 'name');
+
+function hasSideEffects(node) { // this is 99% incomplete!
+ if (node[0] in NO_SIDE_EFFECTS) return false;
+ if (node[0] == 'unary-prefix' && node[1] == '!') return hasSideEffects(node[2]);
+ if (node[0] == 'binary') return hasSideEffects(node[2]) || hasSideEffects(node[3]);
+ return true;
}
// Clear out empty ifs and blocks, and redundant blocks/stats and so forth
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index acf48008..17c06a95 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -173,6 +173,8 @@ function hoisting() {
if (__label__ == 38) {
var $79 = $_pr6;
}
+ pause(9);
+ var $cmp70 = ($call69 | 0) != 0;
}
function innerShouldAlsoBeHoisted() {
function hoisting() {
diff --git a/tools/test-js-optimizer.js b/tools/test-js-optimizer.js
index f9c499f4..95985bc8 100644
--- a/tools/test-js-optimizer.js
+++ b/tools/test-js-optimizer.js
@@ -216,6 +216,16 @@ function hoisting() {
var $79 = $_pr6;
}
} while (0);
+ pause(9);
+ var $cmp70 = ($call69 | 0) != 0;
+ if ($cmp70) {
+ __label__ = 40;
+ } else {
+ __label__ = 41;
+ }
+ $if_then72$$if_end73$126 : do {
+ if (__label__ == 40) {} else if (__label__ == 41) {}
+ } while (0);
}
function innerShouldAlsoBeHoisted() {
function hoisting() {