blob: 7b61422a4415fd52eb1851c7dae6605896fddd4e [file] [log] [blame]
Ben Murdochc5610432016-08-08 18:44:38 +01001// 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 SetProperty(receiver, key, value) {
18 receiver[key] = value;
19}
20
21// Force the Keyed Store IC in SetProperty to be generic.
22var receiver = {};
23for (var i = 0; i < 100; i++) {
24 SetProperty(receiver, 'prop'+i, 'value');
25}
26
27function testConcatDefaults() {
28 assertEquals(array, [].concat(array));
29 assertEquals(array, array.concat([]));
30 assertEquals([1, 2, 3, 1, 2, 3], array.concat(array));
31 assertEquals([object], [].concat(object));
32 assertEquals([1, 2, 3, object], array.concat(object));
33 assertEquals([object], Array.prototype.concat.call(object,[]));
34 assertEquals([object, 1, 2, 3], Array.prototype.concat.call(object, array));
35 assertEquals([object, object], Array.prototype.concat.call(object, object));
36}
37
38testConcatDefaults();
39
40// Use a generic IC to set @@isConcatSpreadable
41SetProperty(Object.prototype, Symbol.isConcatSpreadable, false);
42
43assertEquals([[], array], [].concat(array));
44assertEquals([array, []], array.concat([]));
45assertEquals([array, array], array.concat(array));
46assertEquals([[], object], [].concat(object));
47assertEquals([array, object], array.concat(object));
48assertEquals([object, []], Array.prototype.concat.call(object,[]));
49assertEquals([object, array], Array.prototype.concat.call(object, array));
50assertEquals([object, object], Array.prototype.concat.call(object, object));
51
52// Use a generic IC to set @@isConcatSpreadable
53SetProperty(Object.prototype, Symbol.isConcatSpreadable, true);
54
55assertEquals(array, [].concat(array));
56assertEquals(array, array.concat([]));
57assertEquals([1, 2, 3, 1, 2, 3], array.concat(array));
58assertEquals(['a'], [].concat(object));
59assertEquals([1, 2, 3, 'a'], array.concat(object));
60assertEquals(['a'], Array.prototype.concat.call(object,[]));
61assertEquals(['a', 1, 2, 3], Array.prototype.concat.call(object, array));
62assertEquals(['a', 'a'], Array.prototype.concat.call(object, object));
63
64delete Object.prototype[Symbol.isConcatSpreadable];
65testConcatDefaults();