| // Copyright (c) 2014 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. |
| |
| |
| /*--- |
| esid: sec-array.prototype.concat |
| description: Array.prototype.concat large typed array |
| includes: [compareArray.js] |
| features: [Symbol.isConcatSpreadable] |
| ---*/ |
| function concatTypedArray(type, elems, modulo) { |
| var items = new Array(elems); |
| var ta_by_len = new type(elems); |
| for (var i = 0; i < elems; ++i) { |
| ta_by_len[i] = items[i] = modulo === false ? i : elems % modulo; |
| } |
| var ta = new type(items); |
| assert(compareArray([].concat(ta, ta), [ta, ta])); |
| ta[Symbol.isConcatSpreadable] = true; |
| assert(compareArray([].concat(ta), items)); |
| |
| assert(compareArray([].concat(ta_by_len, ta_by_len), [ta_by_len, ta_by_len])); |
| ta_by_len[Symbol.isConcatSpreadable] = true; |
| assert(compareArray([].concat(ta_by_len), items)); |
| |
| // TypedArray with fake `length`. |
| ta = new type(1); |
| var defValue = ta[0]; |
| var expected = new Array(4000); |
| expected[0] = defValue; |
| |
| Object.defineProperty(ta, "length", { |
| value: 4000 |
| }); |
| ta[Symbol.isConcatSpreadable] = true; |
| assert(compareArray([].concat(ta), expected)); |
| } |
| |
| var max = [Math.pow(2, 8), Math.pow(2, 16), Math.pow(2, 32), false, false]; |
| [ |
| Uint8Array, |
| Uint16Array, |
| Uint32Array, |
| Float32Array, |
| Float64Array |
| ].forEach(function(ctor, i) { |
| concatTypedArray(ctor, 4000, max[i]); |
| }); |