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 /tools/js-optimizer.js | |
parent | 22dc3bb223334137a3b7c77906b8960a9197be7a (diff) |
improve side effect detection in js optimizer
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 15 |
1 files changed, 7 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 |