From 23d74bedeb91742cd8bc090cb96812ef99dda0c5 Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Mon, 17 Jun 2024 09:11:11 +0300 Subject: [PATCH] fix corner cases in `join_vars` (#5852) fixes #5849 fixes #5850 --- lib/compress.js | 18 +++++++++--------- test/compress/join_vars.js | 35 +++++++++++++++++++++++++++-------- test/compress/spreads.js | 21 +++++++++++++++++++++ 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 26dc1505dfd..ce5c898277f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4300,18 +4300,18 @@ Compressor.prototype.compress = function(node) { if (prop instanceof AST_Node) return; if (!RE_POSITIVE_INTEGER.test("" + prop)) return; prop = +prop; - var len = value.elements.length; + var elements = value.elements; + var len = elements.length; 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) { - var element = value.elements[prop]; - if (element instanceof AST_Hole) { - value.elements[prop] = node.right; - } else { - value.elements[prop] = make_sequence(node, [ element, node.right ]).optimize(compressor); - } + var element = elements[prop].drop_side_effect_free(compressor); + elements[prop] = element ? make_sequence(node, [ element, node.right ]) : node.right; } else { - while (prop > len) value.elements[len++] = make_node(AST_Hole, value); - value.elements[prop] = node.right; + while (prop > len) elements[len++] = make_node(AST_Hole, value); + elements[prop] = node.right; } return true; } diff --git a/test/compress/join_vars.js b/test/compress/join_vars.js index 80c89f330cc..cbf8137a8a1 100644 --- a/test/compress/join_vars.js +++ b/test/compress/join_vars.js @@ -23,7 +23,7 @@ join_array_assignments_1: { } input: { console.log(function () { - var a = ["foo", , "bar"]; + var a = [ "foo", , "bar" ]; a[1] = "baz"; a[7] = "moo"; a[0] = "moz"; @@ -32,7 +32,7 @@ join_array_assignments_1: { } expect: { console.log(function () { - var a = [("foo", "moz"), "baz", "bar", , , , , "moo"]; + var a = [ "moz", "baz", "bar", , , , , "moo" ]; return a; }().join()); } @@ -46,7 +46,7 @@ join_array_assignments_2: { } input: { console.log(function () { - var a = ["foo"]; + var a = [ "foo" ]; a[1] = "bar"; a[7] = "baz"; a[2] = "moo"; @@ -55,7 +55,7 @@ join_array_assignments_2: { } expect: { console.log(function () { - var a = ["foo", "bar"]; + var a = [ "foo", "bar" ]; a[7] = "baz"; a[2] = "moo"; return a; @@ -71,7 +71,7 @@ join_array_assignments_3: { } input: { console.log(function () { - var a = ["foo"]; + var a = [ "foo" ]; a[1] = "bar"; a.b = "baz"; a[2] = "moo"; @@ -80,7 +80,7 @@ join_array_assignments_3: { } expect: { console.log(function () { - var a = ["foo", "bar"]; + var a = [ "foo", "bar" ]; a.b = "baz"; a[2] = "moo"; return a; @@ -97,7 +97,7 @@ join_array_assignments_4: { } input: { console.log(function () { - var a = ["foo"]; + var a = [ "foo" ]; a[0] = "bar"; a[1] = a; a[2] = "baz"; @@ -106,7 +106,7 @@ join_array_assignments_4: { } expect: { console.log(function () { - var a = ["bar"]; + var a = [ "bar" ]; a[1] = a; a[2] = "baz"; return a; @@ -1508,3 +1508,22 @@ issue_5831: { } 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" +} diff --git a/test/compress/spreads.js b/test/compress/spreads.js index 82f69120e61..9ab23b4adcc 100644 --- a/test/compress/spreads.js +++ b/test/compress/spreads.js @@ -1253,3 +1253,24 @@ issue_5602: { ] 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" +}