1// Copyright 2016 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Check that @@isConcatSpreadable is checked when set on Object.prototype 6// with a dictionary backing store. 7 8// Force Object.prototype into dictionary backing store by adding many 9// properties. 10for (var i = 0; i < 10*1000; i++) { 11 Object.prototype['generatedProperty'+i] = true; 12} 13 14var array = [1, 2, 3]; 15var object = {length: 1, '0': 'a'}; 16 17function testConcatDefaults() { 18 assertEquals(array, [].concat(array)); 19 assertEquals(array, array.concat([])); 20 assertEquals([1, 2, 3, 1, 2, 3], array.concat(array)); 21 assertEquals([object], [].concat(object)); 22 assertEquals([1, 2, 3, object], array.concat(object)); 23 assertEquals([object], Array.prototype.concat.call(object,[])); 24 assertEquals([object, 1, 2, 3], Array.prototype.concat.call(object, array)); 25 assertEquals([object, object], Array.prototype.concat.call(object, object)); 26} 27 28testConcatDefaults(); 29 30Object.prototype[Symbol.isConcatSpreadable] = false; 31 32assertEquals([[], array], [].concat(array)); 33assertEquals([array, []], array.concat([])); 34assertEquals([array, array], array.concat(array)); 35assertEquals([[], object], [].concat(object)); 36assertEquals([array, object], array.concat(object)); 37assertEquals([object, []], Array.prototype.concat.call(object,[])); 38assertEquals([object, array], Array.prototype.concat.call(object, array)); 39assertEquals([object, object], Array.prototype.concat.call(object, object)); 40 41Object.prototype[Symbol.isConcatSpreadable] = true; 42 43assertEquals(array, [].concat(array)); 44assertEquals(array, array.concat([])); 45assertEquals([1, 2, 3, 1, 2, 3], array.concat(array)); 46assertEquals(['a'], [].concat(object)); 47assertEquals([1, 2, 3, 'a'], array.concat(object)); 48assertEquals(['a'], Array.prototype.concat.call(object,[])); 49assertEquals(['a', 1, 2, 3], Array.prototype.concat.call(object, array)); 50assertEquals(['a', 'a'], Array.prototype.concat.call(object, object)); 51 52delete Object.prototype[Symbol.isConcatSpreadable]; 53testConcatDefaults(); 54