aboutsummaryrefslogtreecommitdiff
path: root/tools/js-optimizer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-09 13:22:24 -0400
committerAlon Zakai <alonzakai@gmail.com>2013-10-09 13:22:24 -0400
commit028a3210fc61df40fae2854be6ad8b65e49ba633 (patch)
tree7ca87e0f4137cc520ffb6b7c7359adfec8380780 /tools/js-optimizer.js
parente10ee6c5cb0aa89bbae465a1e667a03c0e13aa39 (diff)
avoid X-(-Y) in js optimizer; fixes #1685
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r--tools/js-optimizer.js26
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];
+ }
+ }
+ }
}
});
});