diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-01-16 10:06:30 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-01-16 10:06:30 -0800 |
commit | 58132ad51111bcb024f7a9f2bdce970324c05e00 (patch) | |
tree | 0a509eb56ead2fed56e4f4f2432387ed1b75903e | |
parent | 22dc3bb223334137a3b7c77906b8960a9197be7a (diff) |
improve side effect detection in js optimizer
-rw-r--r-- | tools/js-optimizer.js | 15 | ||||
-rw-r--r-- | tools/test-js-optimizer-output.js | 2 | ||||
-rw-r--r-- | tools/test-js-optimizer.js | 10 |
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() { |