diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-06-30 12:49:32 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-06-30 12:49:32 -0700 |
commit | 547b13cf5bbf81ca8946d19e8e45b9c2a870a235 (patch) | |
tree | fdd1eb61940e562c46d0d5453c49995f5f32bce2 /tools/js-optimizer.js | |
parent | 6e3a916b14d0e101efc2e7880949c81fbfe144c0 (diff) |
do not optimize while into do-while if there are continues; fixes #1337
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 3cd1b229..d04807a7 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -2807,6 +2807,23 @@ function asmLoopOptimizer(ast) { var stats = node[2][1]; var last = stats[stats.length-1]; if (last && last[0] === 'if' && !last[3] && last[2][0] === 'block' && last[2][1][0] && last[2][1][0][0] === 'break' && !last[2][1][0][1]) { + var abort = false; + var stack = 0; + traverse(stats, function(node, type) { + if (type == 'continue') { + if (stack == 0 || node[1]) { // abort if labeled (we do not analyze labels here yet), or a continue directly on us + abort = true; + return true; + } + } else if (type in LOOP) { + stack++; + } + }, function(node, type) { + if (type in LOOP) { + stack--; + } + }); + if (abort) return; var conditionToBreak = last[1]; stats.pop(); node[0] = 'do'; |