fix corner cases in join_vars (#5852)

fixes #5849
fixes #5850
This commit is contained in:
Alex Lam S.L
2024-06-17 09:11:11 +03:00
committed by GitHub
parent f31311e439
commit 23d74bedeb
3 changed files with 57 additions and 17 deletions

View File

@@ -4300,18 +4300,18 @@ Compressor.prototype.compress = function(node) {
if (prop instanceof AST_Node) return; if (prop instanceof AST_Node) return;
if (!RE_POSITIVE_INTEGER.test("" + prop)) return; if (!RE_POSITIVE_INTEGER.test("" + prop)) return;
prop = +prop; prop = +prop;
var len = value.elements.length; var elements = value.elements;
var len = elements.length;
if (prop > len + 4) return; if (prop > len + 4) return;
for (var i = Math.min(len, prop + 1); --i >= 0;) {
if (elements[i] instanceof AST_Spread) return;
}
if (prop < len) { if (prop < len) {
var element = value.elements[prop]; var element = elements[prop].drop_side_effect_free(compressor);
if (element instanceof AST_Hole) { elements[prop] = element ? make_sequence(node, [ element, node.right ]) : node.right;
value.elements[prop] = node.right;
} else {
value.elements[prop] = make_sequence(node, [ element, node.right ]).optimize(compressor);
}
} else { } else {
while (prop > len) value.elements[len++] = make_node(AST_Hole, value); while (prop > len) elements[len++] = make_node(AST_Hole, value);
value.elements[prop] = node.right; elements[prop] = node.right;
} }
return true; return true;
} }

View File

@@ -23,7 +23,7 @@ join_array_assignments_1: {
} }
input: { input: {
console.log(function () { console.log(function () {
var a = ["foo", , "bar"]; var a = [ "foo", , "bar" ];
a[1] = "baz"; a[1] = "baz";
a[7] = "moo"; a[7] = "moo";
a[0] = "moz"; a[0] = "moz";
@@ -32,7 +32,7 @@ join_array_assignments_1: {
} }
expect: { expect: {
console.log(function () { console.log(function () {
var a = [("foo", "moz"), "baz", "bar", , , , , "moo"]; var a = [ "moz", "baz", "bar", , , , , "moo" ];
return a; return a;
}().join()); }().join());
} }
@@ -46,7 +46,7 @@ join_array_assignments_2: {
} }
input: { input: {
console.log(function () { console.log(function () {
var a = ["foo"]; var a = [ "foo" ];
a[1] = "bar"; a[1] = "bar";
a[7] = "baz"; a[7] = "baz";
a[2] = "moo"; a[2] = "moo";
@@ -55,7 +55,7 @@ join_array_assignments_2: {
} }
expect: { expect: {
console.log(function () { console.log(function () {
var a = ["foo", "bar"]; var a = [ "foo", "bar" ];
a[7] = "baz"; a[7] = "baz";
a[2] = "moo"; a[2] = "moo";
return a; return a;
@@ -71,7 +71,7 @@ join_array_assignments_3: {
} }
input: { input: {
console.log(function () { console.log(function () {
var a = ["foo"]; var a = [ "foo" ];
a[1] = "bar"; a[1] = "bar";
a.b = "baz"; a.b = "baz";
a[2] = "moo"; a[2] = "moo";
@@ -80,7 +80,7 @@ join_array_assignments_3: {
} }
expect: { expect: {
console.log(function () { console.log(function () {
var a = ["foo", "bar"]; var a = [ "foo", "bar" ];
a.b = "baz"; a.b = "baz";
a[2] = "moo"; a[2] = "moo";
return a; return a;
@@ -97,7 +97,7 @@ join_array_assignments_4: {
} }
input: { input: {
console.log(function () { console.log(function () {
var a = ["foo"]; var a = [ "foo" ];
a[0] = "bar"; a[0] = "bar";
a[1] = a; a[1] = a;
a[2] = "baz"; a[2] = "baz";
@@ -106,7 +106,7 @@ join_array_assignments_4: {
} }
expect: { expect: {
console.log(function () { console.log(function () {
var a = ["bar"]; var a = [ "bar" ];
a[1] = a; a[1] = a;
a[2] = "baz"; a[2] = "baz";
return a; return a;
@@ -1508,3 +1508,22 @@ issue_5831: {
} }
expect_stdout: "PASS" expect_stdout: "PASS"
} }
issue_5849: {
options = {
evaluate: true,
join_vars: true,
side_effects: true,
}
input: {
var a;
a = [ 42 ];
a[0] = "PASS";
console.log(a.join(""));
}
expect: {
var a, a = [ "PASS" ];
console.log(a.join(""));
}
expect_stdout: "PASS"
}

View File

@@ -1253,3 +1253,24 @@ issue_5602: {
] ]
node_version: ">=6" node_version: ">=6"
} }
issue_5850: {
options = {
evaluate: true,
join_vars: true,
unused: true,
}
input: {
var a = [ ..."FAIL" ];
a[0] = "P";
a[2] = a[3] = "S";
console.log(a.join(""));
}
expect: {
var a = [ ..."FAIL" ];
a[0] = "P";
a[2] = a[3] = "S";
console.log(a.join(""));
}
node_version: ">=6"
}