1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ArrayBuffer 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestByteLength(param, expectedByteLength) { 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(param); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(expectedByteLength, ab.byteLength); 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArrayBufferCreation() { 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestByteLength(1, 1); 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestByteLength(256, 256); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestByteLength(2.567, 2); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestByteLength("abc", 0); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestByteLength(0, 0); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new ArrayBuffer(-10); }, RangeError); 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new ArrayBuffer(-2.567); }, RangeError); 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* TODO[dslomov]: Reenable the test 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab1 = new ArrayBuffer(0xFFFFFFFFFFFF) 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }, RangeError); 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch*/ 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(); 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, ab.byteLength); 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArrayBufferCreation(); 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestByteLengthNotWritable() { 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(1024); 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(1024, ab.byteLength); 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { "use strict"; ab.byteLength = 42; }, TypeError); 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestByteLengthNotWritable(); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSlice(expectedResultLen, initialLen, start, end) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(initialLen); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a1 = new Uint8Array(ab); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < a1.length; i++) { 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a1[i] = 0xCA; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var slice = ab.slice(start, end); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(expectedResultLen, slice.byteLength); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a2 = new Uint8Array(slice); 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < a2.length; i++) { 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0xCA, a2[i]); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArrayBufferSlice() { 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(1024); 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab1 = ab.slice(512, 1024); 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(512, ab1.byteLength); 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(512, 1024, 512, 1024); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(512, 1024, 512); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(0, 0, 1, 20); 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(100, 100, 0, 100); 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(100, 100, 0, 1000); 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(0, 100, 5, 1); 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(1, 100, -11, -10); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(9, 100, -10, 99); 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(0, 100, -10, 80); 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 80, -10); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 90, "100"); 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, "90", "100"); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(0, 100, 90, "abc"); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, "abc", 10); 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 0.96, 10.96); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 0.96, 10.01); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 0.01, 10.01); 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 0.01, 10.96); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, 90); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestSlice(10, 100, -10); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArrayBufferSlice(); 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Typed arrays 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArray(constr, elementSize, typicalElement) { 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, constr.BYTES_PER_ELEMENT); 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(256*elementSize); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a0 = new constr(30); 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(ArrayBuffer.isView(a0)); 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, a0.BYTES_PER_ELEMENT); 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30, a0.length); 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, a0.byteLength); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, a0.byteOffset); 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, a0.buffer.byteLength); 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aLen0 = new constr(0); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aLen0.BYTES_PER_ELEMENT); 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aLen0.length); 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aLen0.byteLength); 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aLen0.byteOffset); 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aLen0.buffer.byteLength); 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aOverBufferLen0 = new constr(ab, 128*elementSize, 0); 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, aOverBufferLen0.buffer); 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aOverBufferLen0.BYTES_PER_ELEMENT); 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aOverBufferLen0.length); 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aOverBufferLen0.byteLength); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128*elementSize, aOverBufferLen0.byteOffset); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a1 = new constr(ab, 128*elementSize, 128); 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, a1.buffer); 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, a1.BYTES_PER_ELEMENT); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128, a1.length); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128*elementSize, a1.byteLength); 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128*elementSize, a1.byteOffset); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a2 = new constr(ab, 64*elementSize, 128); 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, a2.buffer); 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, a2.BYTES_PER_ELEMENT); 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128, a2.length); 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(128*elementSize, a2.byteLength); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(64*elementSize, a2.byteOffset); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a3 = new constr(ab, 192*elementSize); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, a3.buffer); 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(64, a3.length); 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(64*elementSize, a3.byteLength); 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(192*elementSize, a3.byteOffset); 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a4 = new constr(ab); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, a4.buffer); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256, a4.length); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256*elementSize, a4.byteLength); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, a4.byteOffset); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var i; 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 128; i++) { 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a1[i] = typicalElement; 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 128; i++) { 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(typicalElement, a1[i]); 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 64; i++) { 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, a2[i]); 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 64; i < 128; i++) { 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(typicalElement, a2[i]); 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 64; i++) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(typicalElement, a3[i]); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 128; i++) { 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, a4[i]); 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 128; i < 256; i++) { 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(typicalElement, a4[i]); 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aAtTheEnd = new constr(ab, 256*elementSize); 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aAtTheEnd.BYTES_PER_ELEMENT); 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aAtTheEnd.length); 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aAtTheEnd.byteLength); 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256*elementSize, aAtTheEnd.byteOffset); 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function () { new constr(ab, 257*elementSize); }, RangeError); 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows( 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function () { new constr(ab, 128*elementSize, 192); }, 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeError); 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (elementSize !== 1) { 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new constr(ab, 128*elementSize - 1, 10); }, 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeError); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var unalignedArrayBuffer = new ArrayBuffer(10*elementSize + 1); 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var goodArray = new constr(unalignedArrayBuffer, 0, 10); 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(10, goodArray.length); 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(10*elementSize, goodArray.byteLength); 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new constr(unalignedArrayBuffer)}, RangeError); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new constr(unalignedArrayBuffer, 5*elementSize)}, 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RangeError); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aFromString = new constr("30"); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aFromString.BYTES_PER_ELEMENT); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30, aFromString.length); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, aFromString.byteLength); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aFromString.byteOffset); 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, aFromString.buffer.byteLength); 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var jsArray = []; 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 30; i++) { 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jsArray.push(typicalElement); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aFromArray = new constr(jsArray); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aFromArray.BYTES_PER_ELEMENT); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30, aFromArray.length); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, aFromArray.byteLength); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aFromArray.byteOffset); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(30*elementSize, aFromArray.buffer.byteLength); 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 30; i++) { 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(typicalElement, aFromArray[i]); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var abLen0 = new ArrayBuffer(0); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aOverAbLen0 = new constr(abLen0); 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(abLen0, aOverAbLen0.buffer); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aOverAbLen0.BYTES_PER_ELEMENT); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aOverAbLen0.length); 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aOverAbLen0.byteLength); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aOverAbLen0.byteOffset); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var aNoParam = new constr(); 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(elementSize, aNoParam.BYTES_PER_ELEMENT); 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aNoParam.length); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aNoParam.byteLength); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, aNoParam.byteOffset); 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint8Array, 1, 0xFF); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int8Array, 1, -0x7F); 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint16Array, 2, 0xFFFF); 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int16Array, 2, -0x7FFF); 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint32Array, 4, 0xFFFFFFFF); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Int32Array, 4, -0x7FFFFFFF); 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Float32Array, 4, 0.5); 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Float64Array, 8, 0.5); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArray(Uint8ClampedArray, 1, 0xFF); 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction SubarrayTestCase(constructor, item, expectedResultLen, expectedStartIndex, 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch initialLen, start, end) { 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = new constructor(initialLen); 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var s = a.subarray(start, end); 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(constructor, s.constructor); 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(expectedResultLen, s.length); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (s.length > 0) { 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch s[0] = item; 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(item, a[expectedStartIndex]); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSubArray(constructor, item) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 512, 512, 1024, 512, 1024); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 512, 512, 1024, 512); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 0, undefined, 0, 1, 20); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 100, 0, 100, 0, 100); 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 100, 0, 100, 0, 1000); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 0, undefined, 100, 5, 1); 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 1, 89, 100, -11, -10); 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 9, 90, 100, -10, 99); 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 0, undefined, 100, -10, 80); 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,80, 100, 80, -10); 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,90, 100, 90, "100"); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,90, 100, "90", "100"); 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 0, undefined, 100, 90, "abc"); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,0, 100, "abc", 10); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,0, 100, 0.96, 10.96); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,0, 100, 0.96, 10.01); 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,0, 100, 0.01, 10.01); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,0, 100, 0.01, 10.96); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,90, 100, 90); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SubarrayTestCase(constructor, item, 10,90, 100, -10); 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var method = constructor.prototype.subarray; 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch method.call(new constructor(100), 0, 100); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var o = {}; 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { method.call(o, 0, 100); }, TypeError); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint8Array, 0xFF); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int8Array, -0x7F); 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint16Array, 0xFFFF); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int16Array, -0x7FFF); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint32Array, 0xFFFFFFFF); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Int32Array, -0x7FFFFFFF); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Float32Array, 0.5); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Float64Array, 0.5); 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSubArray(Uint8ClampedArray, 0xFF); 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArrayOutOfRange(constructor, value, result) { 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = new constructor(1); 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a[0] = value; 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(result, a[0]); 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8Array, 0x1FA, 0xFA); 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8Array, -1, 0xFF); 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int8Array, 0x1FA, 0x7A - 0x80); 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint16Array, 0x1FFFA, 0xFFFA); 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint16Array, -1, 0xFFFF); 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int16Array, 0x1FFFA, 0x7FFA - 0x8000); 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint32Array, 0x1FFFFFFFA, 0xFFFFFFFA); 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint32Array, -1, 0xFFFFFFFF); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Int32Array, 0x1FFFFFFFA, 0x7FFFFFFA - 0x80000000); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8ClampedArray, 0x1FA, 0xFF); 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArrayOutOfRange(Uint8ClampedArray, -1, 0); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar typedArrayConstructors = [ 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint8Array, 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int8Array, 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint16Array, 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int16Array, 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint32Array, 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Int32Array, 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Uint8ClampedArray, 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float32Array, 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Float64Array]; 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestPropertyTypeChecks(constructor) { 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = new constructor(); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function CheckProperty(name) { 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d = Object.getOwnPropertyDescriptor(constructor.prototype, name); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var o = {} 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() {d.get.call(o);}, TypeError); 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch d.get.call(a); // shouldn't throw 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0 ; i < typedArrayConstructors.length; i++) { 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch d.get.call(new typedArrayConstructors[i](10)); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("buffer"); 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("byteOffset"); 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("byteLength"); 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("length"); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) { 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestPropertyTypeChecks(typedArrayConstructors[i]); 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestTypedArraySet() { 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test array.set in different combinations. 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function assertArrayPrefix(expected, array) { 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < expected.length; ++i) { 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(expected[i], array[i]); 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a11 = new Int16Array([1, 2, 3, 4, 0, -1]) 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a12 = new Uint16Array(15) 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a12.set(a11, 3) 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0, 0, 0, 1, 2, 3, 4, 0, 0xffff, 0, 0], a12) 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function(){ a11.set(a12) }) 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a21 = [1, undefined, 10, NaN, 0, -1, {valueOf: function() {return 3}}] 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a22 = new Int32Array(12) 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a22.set(a21, 2) 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0, 0, 1, 0, 10, 0, 0, -1, 3, 0], a22) 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a31 = new Float32Array([2, 4, 6, 8, 11, NaN, 1/0, -3]) 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a32 = a31.subarray(2, 6) 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a31.set(a32, 4) 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([2, 4, 6, 8, 6, 8, 11, NaN], a31) 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([6, 8, 6, 8], a32) 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a4 = new Uint8ClampedArray([3,2,5,6]) 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a4.set(a4) 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([3, 2, 5, 6], a4) 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Cases with overlapping backing store but different element sizes. 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var b = new ArrayBuffer(4) 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a5 = new Int16Array(b) 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a50 = new Int8Array(b) 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a51 = new Int8Array(b, 0, 2) 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a52 = new Int8Array(b, 1, 2) 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a53 = new Int8Array(b, 2, 2) 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a5.set([0x5050, 0x0a0a]) 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50) 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x50], a51) 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x0a], a52) 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x0a, 0x0a], a53) 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x50, 0x0a, 0x0a]) 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a51.set(a5) 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x0a, 0x0a, 0x0a], a50) 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x50, 0x0a, 0x0a]) 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a52.set(a5) 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50) 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x50, 0x0a, 0x0a]) 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a53.set(a5) 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x50, 0x50, 0x50, 0x0a], a50) 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x51, 0x0a, 0x0b]) 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a5.set(a51) 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x0050, 0x0051], a5) 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x51, 0x0a, 0x0b]) 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a5.set(a52) 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x0051, 0x000a], a5) 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a50.set([0x50, 0x51, 0x0a, 0x0b]) 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a5.set(a53) 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([0x000a, 0x000b], a5) 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mixed types of same size. 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a61 = new Float32Array([1.2, 12.3]) 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a62 = new Int32Array(2) 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a62.set(a61) 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([1, 12], a62) 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a61.set(a62) 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix([1, 12], a61) 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Invalid source 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = new Uint16Array(50); 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var expected = []; 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (i = 0; i < 50; i++) { 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a[i] = i; 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected.push(i); 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch a.set({}); 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayPrefix(expected, a); 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { a.set.call({}) }, TypeError); 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { a.set.call([]) }, TypeError); 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { a.set(0); }, TypeError); 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { a.set(0, 1); }, TypeError); 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestTypedArraySet(); 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DataView 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDataViewConstructor() { 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var ab = new ArrayBuffer(256); 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d1 = new DataView(ab, 1, 255); 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertTrue(ArrayBuffer.isView(d1)); 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d1.buffer); 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(1, d1.byteOffset); 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(255, d1.byteLength); 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d2 = new DataView(ab, 2); 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d2.buffer); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(2, d2.byteOffset); 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(254, d2.byteLength); 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d3 = new DataView(ab); 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d3.buffer); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, d3.byteOffset); 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256, d3.byteLength); 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d3a = new DataView(ab, 1, 0); 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d3a.buffer); 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(1, d3a.byteOffset); 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, d3a.byteLength); 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d3b = new DataView(ab, 256, 0); 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d3b.buffer); 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256, d3b.byteOffset); 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, d3b.byteLength); 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d3c = new DataView(ab, 256); 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d3c.buffer); 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(256, d3c.byteOffset); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(0, d3c.byteLength); 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d4 = new DataView(ab, 1, 3.1415926); 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(ab, d4.buffer); 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(1, d4.byteOffset); 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertSame(3, d4.byteLength); 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // error cases 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView(ab, -1); }, RangeError); 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView(ab, 1, -1); }, RangeError); 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView(); }, TypeError); 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView([]); }, TypeError); 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView(ab, 257); }, RangeError); 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() { new DataView(ab, 1, 1024); }, RangeError); 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDataViewConstructor(); 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDataViewPropertyTypeChecks() { 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var a = new DataView(new ArrayBuffer(10)); 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function CheckProperty(name) { 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var d = Object.getOwnPropertyDescriptor(DataView.prototype, name); 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var o = {} 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertThrows(function() {d.get.call(o);}, TypeError); 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch d.get.call(a); // shouldn't throw 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("buffer"); 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("byteOffset"); 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CheckProperty("byteLength"); 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDataViewPropertyTypeChecks(); 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// General tests for properties 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test property attribute [[Enumerable]] 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestEnumerable(func, obj) { 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function props(x) { 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch var array = []; 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var p in x) array.push(p); 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return array.sort(); 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayEquals([], props(func)); 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayEquals([], props(func.prototype)); 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (obj) 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertArrayEquals([], props(obj)); 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(ArrayBuffer, new ArrayBuffer()); 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) { 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestEnumerable(typedArrayConstructors[i]); 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(DataView, new DataView(new ArrayBuffer())); 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test arbitrary properties on ArrayBuffer 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArbitrary(m) { 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function TestProperty(map, property, value) { 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map[property] = value; 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assertEquals(value, map[property]); 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (var i = 0; i < 20; i++) { 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestProperty(m, i, 'val' + i); 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestProperty(m, 'foo' + i, 'bar' + i); 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new ArrayBuffer(256)); 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor(i = 0; i < typedArrayConstructors.lenght; i++) { 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TestArbitary(new typedArrayConstructors[i](10)); 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new DataView(new ArrayBuffer(256))); 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test direct constructor call 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { ArrayBuffer(); }, TypeError); 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { DataView(new ArrayBuffer()); }, TypeError); 590