fix corner cases related to AST_Hole (#3994)
This commit is contained in:
@@ -3369,9 +3369,10 @@ merge(Compressor.prototype, {
|
|||||||
var elements = [];
|
var elements = [];
|
||||||
for (var i = 0; i < this.elements.length; i++) {
|
for (var i = 0; i < this.elements.length; i++) {
|
||||||
var element = this.elements[i];
|
var element = this.elements[i];
|
||||||
|
if (element instanceof AST_Hole) continue;
|
||||||
var value = element._eval(compressor, ignore_side_effects, cached, depth);
|
var value = element._eval(compressor, ignore_side_effects, cached, depth);
|
||||||
if (element === value) return this;
|
if (element === value) return this;
|
||||||
elements.push(value);
|
elements[i] = value;
|
||||||
}
|
}
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
@@ -8446,7 +8447,8 @@ merge(Compressor.prototype, {
|
|||||||
var elements = expr.elements;
|
var elements = expr.elements;
|
||||||
var retValue = elements[index];
|
var retValue = elements[index];
|
||||||
if (safe_to_flatten(retValue, compressor)) {
|
if (safe_to_flatten(retValue, compressor)) {
|
||||||
var flatten = true;
|
var is_hole = retValue instanceof AST_Hole;
|
||||||
|
var flatten = !is_hole;
|
||||||
var values = [];
|
var values = [];
|
||||||
for (var i = elements.length; --i > index;) {
|
for (var i = elements.length; --i > index;) {
|
||||||
var value = elements[i].drop_side_effect_free(compressor);
|
var value = elements[i].drop_side_effect_free(compressor);
|
||||||
@@ -8455,12 +8457,16 @@ merge(Compressor.prototype, {
|
|||||||
if (flatten && value.has_side_effects(compressor)) flatten = false;
|
if (flatten && value.has_side_effects(compressor)) flatten = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue;
|
|
||||||
if (!flatten) values.unshift(retValue);
|
if (!flatten) values.unshift(retValue);
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
var value = elements[i].drop_side_effect_free(compressor);
|
var value = elements[i].drop_side_effect_free(compressor);
|
||||||
if (value) values.unshift(value);
|
if (value) {
|
||||||
else index--;
|
values.unshift(value);
|
||||||
|
} else if (is_hole) {
|
||||||
|
values.unshift(make_node(AST_Hole, elements[i]));
|
||||||
|
} else {
|
||||||
|
index--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (flatten) {
|
if (flatten) {
|
||||||
values.push(retValue);
|
values.push(retValue);
|
||||||
|
|||||||
@@ -558,34 +558,45 @@ unsafe_array: {
|
|||||||
unsafe: true,
|
unsafe: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
var a = "PASS";
|
||||||
[1, , 3][1],
|
Array.prototype[1] = a;
|
||||||
[1, 2, 3, a] + 1,
|
console.log([1, , 3][1]);
|
||||||
[1, 2, 3, 4] + 1,
|
console.log([1, 2, 3, a] + 1);
|
||||||
[1, 2, 3, a][0] + 1,
|
console.log([1, 2, 3, 4] + 1);
|
||||||
[1, 2, 3, 4][0] + 1,
|
console.log([1, 2, 3, a][0] + 1);
|
||||||
[1, 2, 3, 4][6 - 5] + 1,
|
console.log([1, 2, 3, 4][0] + 1);
|
||||||
[1, , 3, 4][6 - 5] + 1,
|
console.log([1, 2, 3, 4][6 - 5] + 1);
|
||||||
[[1, 2], [3, 4]][0] + 1,
|
console.log([1, , 3, 4][6 - 5] + 1);
|
||||||
[[1, 2], [3, 4]][6 - 5][1] + 1,
|
console.log([[1, 2], [3, 4]][0] + 1);
|
||||||
[[1, 2], , [3, 4]][6 - 5][1] + 1
|
console.log([[1, 2], [3, 4]][6 - 5][1] + 1);
|
||||||
);
|
console.log([[1, 2], , [3, 4]][6 - 5][1] + 1);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(
|
var a = "PASS";
|
||||||
void 0,
|
Array.prototype[1] = a;
|
||||||
[1, 2, 3, a] + 1,
|
console.log([1, , 3][1]);
|
||||||
"1,2,3,41",
|
console.log([1, 2, 3, a] + 1);
|
||||||
[1, 2, 3, a][0] + 1,
|
console.log("1,2,3,41");
|
||||||
2,
|
console.log([1, 2, 3, a][0] + 1);
|
||||||
3,
|
console.log(2);
|
||||||
NaN,
|
console.log(3);
|
||||||
"1,21",
|
console.log([1, , 3, 4][1] + 1);
|
||||||
5,
|
console.log("1,21");
|
||||||
(void 0)[1] + 1
|
console.log(5);
|
||||||
);
|
console.log([[1, 2], , [3, 4]][1][1] + 1);
|
||||||
}
|
}
|
||||||
expect_stdout: true
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"1,2,3,PASS1",
|
||||||
|
"1,2,3,41",
|
||||||
|
"2",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"PASS1",
|
||||||
|
"1,21",
|
||||||
|
"5",
|
||||||
|
"A1",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe_string: {
|
unsafe_string: {
|
||||||
|
|||||||
@@ -1046,16 +1046,22 @@ array_hole: {
|
|||||||
side_effects: true,
|
side_effects: true,
|
||||||
}
|
}
|
||||||
input: {
|
input: {
|
||||||
console.log(
|
Array.prototype[2] = "PASS";
|
||||||
[ 1, 2, , 3][1],
|
console.log([ 1, 2, , 3 ][1]);
|
||||||
[ 1, 2, , 3][2],
|
console.log([ 1, 2, , 3 ][2]);
|
||||||
[ 1, 2, , 3][3]
|
console.log([ 1, 2, , 3 ][3]);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(2, void 0, 3);
|
Array.prototype[2] = "PASS";
|
||||||
|
console.log(2);
|
||||||
|
console.log([ , , , ][2]);
|
||||||
|
console.log(3);
|
||||||
}
|
}
|
||||||
expect_stdout: "2 undefined 3"
|
expect_stdout: [
|
||||||
|
"2",
|
||||||
|
"PASS",
|
||||||
|
"3",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
new_this: {
|
new_this: {
|
||||||
|
|||||||
Reference in New Issue
Block a user