Fix spread operator in ArrayLiterals when nested in other literals
authoradamk <adamk@chromium.org>
Tue, 15 Sep 2015 16:43:29 +0000 (09:43 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 15 Sep 2015 16:43:39 +0000 (16:43 +0000)
Mark ArrayLiterals utilizing the spread operator as non-simple.
This causes them to return false for IsCompileTimeValue, and thus
causes spread to work as expected in nested literals.

BUG=v8:4417
LOG=y

Review URL: https://codereview.chromium.org/1336123002

Cr-Commit-Position: refs/heads/master@{#30754}

src/ast.cc
test/mjsunit/harmony/regress/regress-4417.js [new file with mode: 0644]

index 1b39e31..e2d24f9 100644 (file)
@@ -556,7 +556,7 @@ void ArrayLiteral::BuildConstantElements(Isolate* isolate) {
       Strength::WEAK, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
 
   // Fill in the literals.
-  bool is_simple = true;
+  bool is_simple = (first_spread_index_ < 0);
   int depth_acc = 1;
   bool is_holey = false;
   int array_index = 0;
diff --git a/test/mjsunit/harmony/regress/regress-4417.js b/test/mjsunit/harmony/regress/regress-4417.js
new file mode 100644 (file)
index 0000000..fb773f5
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Flags: --harmony-spread-arrays
+
+var arr = [1, 2, 3];
+assertEquals({arr: [1, 2, 3]}, {arr: [...arr]});
+assertEquals([[1, 2, 3]], [[...arr]]);
+
+assertEquals({arr: [6, 5, [1, 2, 3]]}, {arr: [6, 5, [...arr]]});
+assertEquals([8, 7, [6, 5, [1, 2, 3]]], [8, 7, [6, 5, [...arr]]]);