Skip to content

Commit 23d74be

Browse files
authored
fix corner cases in join_vars (#5852)
fixes #5849 fixes #5850
1 parent f31311e commit 23d74be

File tree

3 files changed

+57
-17
lines changed

3 files changed

+57
-17
lines changed

lib/compress.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4300,18 +4300,18 @@ Compressor.prototype.compress = function(node) {
43004300
if (prop instanceof AST_Node) return;
43014301
if (!RE_POSITIVE_INTEGER.test("" + prop)) return;
43024302
prop = +prop;
4303-
var len = value.elements.length;
4303+
var elements = value.elements;
4304+
var len = elements.length;
43044305
if (prop > len + 4) return;
4306+
for (var i = Math.min(len, prop + 1); --i >= 0;) {
4307+
if (elements[i] instanceof AST_Spread) return;
4308+
}
43054309
if (prop < len) {
4306-
var element = value.elements[prop];
4307-
if (element instanceof AST_Hole) {
4308-
value.elements[prop] = node.right;
4309-
} else {
4310-
value.elements[prop] = make_sequence(node, [ element, node.right ]).optimize(compressor);
4311-
}
4310+
var element = elements[prop].drop_side_effect_free(compressor);
4311+
elements[prop] = element ? make_sequence(node, [ element, node.right ]) : node.right;
43124312
} else {
4313-
while (prop > len) value.elements[len++] = make_node(AST_Hole, value);
4314-
value.elements[prop] = node.right;
4313+
while (prop > len) elements[len++] = make_node(AST_Hole, value);
4314+
elements[prop] = node.right;
43154315
}
43164316
return true;
43174317
}

test/compress/join_vars.js

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ join_array_assignments_1: {
2323
}
2424
input: {
2525
console.log(function () {
26-
var a = ["foo", , "bar"];
26+
var a = [ "foo", , "bar" ];
2727
a[1] = "baz";
2828
a[7] = "moo";
2929
a[0] = "moz";
@@ -32,7 +32,7 @@ join_array_assignments_1: {
3232
}
3333
expect: {
3434
console.log(function () {
35-
var a = [("foo", "moz"), "baz", "bar", , , , , "moo"];
35+
var a = [ "moz", "baz", "bar", , , , , "moo" ];
3636
return a;
3737
}().join());
3838
}
@@ -46,7 +46,7 @@ join_array_assignments_2: {
4646
}
4747
input: {
4848
console.log(function () {
49-
var a = ["foo"];
49+
var a = [ "foo" ];
5050
a[1] = "bar";
5151
a[7] = "baz";
5252
a[2] = "moo";
@@ -55,7 +55,7 @@ join_array_assignments_2: {
5555
}
5656
expect: {
5757
console.log(function () {
58-
var a = ["foo", "bar"];
58+
var a = [ "foo", "bar" ];
5959
a[7] = "baz";
6060
a[2] = "moo";
6161
return a;
@@ -71,7 +71,7 @@ join_array_assignments_3: {
7171
}
7272
input: {
7373
console.log(function () {
74-
var a = ["foo"];
74+
var a = [ "foo" ];
7575
a[1] = "bar";
7676
a.b = "baz";
7777
a[2] = "moo";
@@ -80,7 +80,7 @@ join_array_assignments_3: {
8080
}
8181
expect: {
8282
console.log(function () {
83-
var a = ["foo", "bar"];
83+
var a = [ "foo", "bar" ];
8484
a.b = "baz";
8585
a[2] = "moo";
8686
return a;
@@ -97,7 +97,7 @@ join_array_assignments_4: {
9797
}
9898
input: {
9999
console.log(function () {
100-
var a = ["foo"];
100+
var a = [ "foo" ];
101101
a[0] = "bar";
102102
a[1] = a;
103103
a[2] = "baz";
@@ -106,7 +106,7 @@ join_array_assignments_4: {
106106
}
107107
expect: {
108108
console.log(function () {
109-
var a = ["bar"];
109+
var a = [ "bar" ];
110110
a[1] = a;
111111
a[2] = "baz";
112112
return a;
@@ -1508,3 +1508,22 @@ issue_5831: {
15081508
}
15091509
expect_stdout: "PASS"
15101510
}
1511+
1512+
issue_5849: {
1513+
options = {
1514+
evaluate: true,
1515+
join_vars: true,
1516+
side_effects: true,
1517+
}
1518+
input: {
1519+
var a;
1520+
a = [ 42 ];
1521+
a[0] = "PASS";
1522+
console.log(a.join(""));
1523+
}
1524+
expect: {
1525+
var a, a = [ "PASS" ];
1526+
console.log(a.join(""));
1527+
}
1528+
expect_stdout: "PASS"
1529+
}

test/compress/spreads.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,3 +1253,24 @@ issue_5602: {
12531253
]
12541254
node_version: ">=6"
12551255
}
1256+
1257+
issue_5850: {
1258+
options = {
1259+
evaluate: true,
1260+
join_vars: true,
1261+
unused: true,
1262+
}
1263+
input: {
1264+
var a = [ ..."FAIL" ];
1265+
a[0] = "P";
1266+
a[2] = a[3] = "S";
1267+
console.log(a.join(""));
1268+
}
1269+
expect: {
1270+
var a = [ ..."FAIL" ];
1271+
a[0] = "P";
1272+
a[2] = a[3] = "S";
1273+
console.log(a.join(""));
1274+
}
1275+
node_version: ">=6"
1276+
}

0 commit comments

Comments
 (0)