Skip to content

Commit

Permalink
fix corner case in unsafe_math (#3548)
Browse files Browse the repository at this point in the history
fixes #3547
  • Loading branch information
alexlamsl authored Oct 29, 2019
1 parent bad664c commit 22a09ea
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 15 deletions.
37 changes: 22 additions & 15 deletions lib/compress.js
Original file line number Diff line number Diff line change
Expand Up @@ -6024,9 +6024,12 @@ merge(Compressor.prototype, {
if (self.right instanceof AST_Constant
&& self.left instanceof AST_Binary
&& self.left.operator != "%"
&& PRECEDENCE[self.left.operator] == PRECEDENCE[self.operator]) {
&& PRECEDENCE[self.left.operator] == PRECEDENCE[self.operator]
&& self.left.is_number(compressor)) {
if (self.left.left instanceof AST_Constant
&& (self.left.operator != "+" || self.left.right.is_number(compressor))) {
&& (self.operator != "+"
|| self.left.left.is_boolean(compressor)
|| self.left.left.is_number(compressor))) {
self = make_node(AST_Binary, self, {
operator: self.left.operator,
left: make_node(AST_Binary, self.left, {
Expand All @@ -6038,19 +6041,23 @@ merge(Compressor.prototype, {
}),
right: self.left.right
});
} else if (self.left.right instanceof AST_Constant
&& (self.left.operator != "+" || self.left.left.is_number(compressor))) {
self = make_node(AST_Binary, self, {
operator: self.left.operator,
left: self.left.left,
right: make_node(AST_Binary, self.left, {
operator: align(self.left.operator, self.operator),
left: self.left.right,
right: self.right,
start: self.left.right.start,
end: self.right.end
})
});
} else if (self.left.right instanceof AST_Constant) {
var op = align(self.left.operator, self.operator);
if (op != "+"
|| self.left.right.is_boolean(compressor)
|| self.left.right.is_number(compressor)) {
self = make_node(AST_Binary, self, {
operator: self.left.operator,
left: self.left.left,
right: make_node(AST_Binary, self.left, {
operator: op,
left: self.left.right,
right: self.right,
start: self.left.right.start,
end: self.right.end
})
});
}
}
}
break;
Expand Down
136 changes: 136 additions & 0 deletions test/compress/numbers.js
Original file line number Diff line number Diff line change
Expand Up @@ -781,3 +781,139 @@ issue_3539: {
}
expect_stdout: "NaN -Infinity Infinity"
}

issue_3547_1: {
options = {
evaluate: true,
unsafe_math: true,
}
input: {
[
1/0 + "1" + 0,
1/0 + "1" - 0,
1/0 - "1" + 0,
1/0 - "1" - 0,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect: {
[
1/0 + "10",
NaN,
1/0,
1/0,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect_stdout: [
"string Infinity10",
"number NaN",
"number Infinity",
"number Infinity",
]
}

issue_3547_2: {
options = {
evaluate: true,
unsafe_math: true,
}
input: {
[
"1" + 1/0 + 0,
"1" + 1/0 - 0,
"1" - 1/0 + 0,
"1" - 1/0 - 0,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect: {
[
"1" + 1/0 + 0,
NaN,
-1/0,
-1/0,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect_stdout: [
"string 1Infinity0",
"number NaN",
"number -Infinity",
"number -Infinity",
]
}

issue_3547_3: {
options = {
evaluate: true,
unsafe_math: true,
}
input: {
var a = "3";
[
a + "2" + 1,
a + "2" - 1,
a - "2" + 1,
a - "2" - 1,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect: {
var a = "3";
[
a + "21",
a + "2" - 1,
a - 1,
a - "2" - 1,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect_stdout: [
"string 321",
"number 31",
"number 2",
"number 0",
]
}

issue_3547_4: {
options = {
evaluate: true,
unsafe_math: true,
}
input: {
var a = "2";
[
"3" + a + 1,
"3" + a - 1,
"3" - a + 1,
"3" - a - 1,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect: {
var a = "2";
[
"3" + a + 1,
"3" + a - 1,
"3" - a + 1,
2 - a,
].forEach(function(n) {
console.log(typeof n, n);
});
}
expect_stdout: [
"string 321",
"number 31",
"number 2",
"number 0",
]
}

0 comments on commit 22a09ea

Please sign in to comment.