diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-09 13:22:24 -0400 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-09 13:22:24 -0400 |
commit | 028a3210fc61df40fae2854be6ad8b65e49ba633 (patch) | |
tree | 7ca87e0f4137cc520ffb6b7c7359adfec8380780 /tools/js-optimizer.js | |
parent | e10ee6c5cb0aa89bbae465a1e667a03c0e13aa39 (diff) |
avoid X-(-Y) in js optimizer; fixes #1685
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index e5e0d287..022bdf47 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3788,11 +3788,27 @@ function asmLastOpts(ast) { node[1] = simplifyNotCompsDirect(['unary-prefix', '!', conditionToBreak]); return node; } - } else if (type == 'binary' && node[1] == '&' && node[3][0] == 'unary-prefix' && node[3][1] == '-' && node[3][2][0] == 'num' && node[3][2][1] == 1) { - // Change &-1 into |0, at this point the hint is no longer needed - node[1] = '|'; - node[3] = node[3][2]; - node[3][1] = 0; + } else if (type == 'binary') { + if (node[1] === '&') { + if (node[3][0] === 'unary-prefix' && node[3][1] === '-' && node[3][2][0] === 'num' && node[3][2][1] === 1) { + // Change &-1 into |0, at this point the hint is no longer needed + node[1] = '|'; + node[3] = node[3][2]; + node[3][1] = 0; + } + } else if (node[1] === '-' && node[3][0] === 'unary-prefix') { + // avoid X - (-Y) because some minifiers buggily emit X--Y which is invalid as -- can be a unary. Transform to + // X + Y + if (node[3][1] === '-') { // integer + node[1] = '+'; + node[3] = node[3][2]; + } else if (node[3][1] === '+') { // float + if (node[3][2][0] === 'unary-prefix' && node[3][2][1] === '-') { + node[1] = '+'; + node[3][2] = node[3][2][2]; + } + } + } } }); }); |