From: adamk Date: Tue, 15 Sep 2015 16:43:29 +0000 (-0700) Subject: Fix spread operator in ArrayLiterals when nested in other literals X-Git-Tag: upstream/4.7.83~286 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f44efd6b3156a3322cc514b76a67aff447da7e9b;p=platform%2Fupstream%2Fv8.git Fix spread operator in ArrayLiterals when nested in other literals 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} --- diff --git a/src/ast.cc b/src/ast.cc index 1b39e31..e2d24f9 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -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 index 0000000..fb773f5 --- /dev/null +++ b/test/mjsunit/harmony/regress/regress-4417.js @@ -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]]]);