1e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Redistribution and use in source and binary forms, with or without 3e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// modification, are permitted provided that the following conditions are 4e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// met: 5e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// 6e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// * Redistributions of source code must retain the above copyright 7e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// notice, this list of conditions and the following disclaimer. 8e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// * Redistributions in binary form must reproduce the above 9e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// copyright notice, this list of conditions and the following 10e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// disclaimer in the documentation and/or other materials provided 11e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// with the distribution. 12e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// * Neither the name of Google Inc. nor the names of its 13e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// contributors may be used to endorse or promote products derived 14e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// from this software without specific prior written permission. 15e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// 16e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 28bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org// Flags: --allow-natives-syntax --noenable-sse2 29e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 30e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Helper 31e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction assertInstance(o, f) { 32e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertSame(o.constructor, f); 33e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertInstanceof(o, f); 34e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 35e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 36e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// This is a regression test for overlapping key and value registers. 37e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction f(a) { 38e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[0] = 0; 39e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[1] = 0; 40e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 41e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 42e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a = new Int32Array(2); 43e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfor (var i = 0; i < 5; i++) { 44e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f(a); 45e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 46e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(f); 47e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgf(a); 48e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 49e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a[0]); 50e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a[1]); 51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 52e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test derivation from an ArrayBuffer 53e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar ab = new ArrayBuffer(12); 54e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(ab, ArrayBuffer); 55e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_uint8 = new Uint8Array(ab); 56e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_uint8, Uint8Array); 57e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_uint8.buffer); 58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, derived_uint8.length); 59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, derived_uint8.byteLength); 60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, derived_uint8.byteOffset); 61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, derived_uint8.BYTES_PER_ELEMENT); 62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_uint8_2 = new Uint8Array(ab,7); 63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_uint8_2, Uint8Array); 64e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_uint8_2.buffer); 65e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(5, derived_uint8_2.length); 66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(5, derived_uint8_2.byteLength); 67e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(7, derived_uint8_2.byteOffset); 68e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, derived_uint8_2.BYTES_PER_ELEMENT); 69e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_int16 = new Int16Array(ab); 70e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_int16, Int16Array); 71e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_int16.buffer); 72e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, derived_int16.length); 73e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, derived_int16.byteLength); 74e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, derived_int16.byteOffset); 75e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, derived_int16.BYTES_PER_ELEMENT); 76e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_int16_2 = new Int16Array(ab,6); 77e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_int16_2, Int16Array); 78e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_int16_2.buffer); 79e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, derived_int16_2.length); 80e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, derived_int16_2.byteLength); 81e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, derived_int16_2.byteOffset); 82e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, derived_int16_2.BYTES_PER_ELEMENT); 83e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_uint32 = new Uint32Array(ab); 84e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_uint32, Uint32Array); 85e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_uint32.buffer); 86e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, derived_uint32.length); 87e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, derived_uint32.byteLength); 88e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, derived_uint32.byteOffset); 89e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32.BYTES_PER_ELEMENT); 90e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_uint32_2 = new Uint32Array(ab,4); 91e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_uint32_2, Uint32Array); 92e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_uint32_2.buffer); 93e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, derived_uint32_2.length); 94e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(8, derived_uint32_2.byteLength); 95e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32_2.byteOffset); 96e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32_2.BYTES_PER_ELEMENT); 97e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_uint32_3 = new Uint32Array(ab,4,1); 98e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_uint32_3, Uint32Array); 99e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_uint32_3.buffer); 100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, derived_uint32_3.length); 101e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32_3.byteLength); 102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32_3.byteOffset); 103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, derived_uint32_3.BYTES_PER_ELEMENT); 104e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar derived_float64 = new Float64Array(ab,0,1); 105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(derived_float64, Float64Array); 106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(ab, derived_float64.buffer); 107e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, derived_float64.length); 108e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(8, derived_float64.byteLength); 109e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, derived_float64.byteOffset); 110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(8, derived_float64.BYTES_PER_ELEMENT); 111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 112e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// If a given byteOffset and length references an area beyond the end of the 113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// ArrayBuffer an exception is raised. 114e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction abfunc3() { 115e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org new Uint32Array(ab,4,3); 116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(abfunc3); 118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction abfunc4() { 119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org new Uint32Array(ab,16); 120e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(abfunc4); 122e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// The given byteOffset must be a multiple of the element size of the specific 124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// type, otherwise an exception is raised. 125e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction abfunc5() { 126e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org new Uint32Array(ab,5); 127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(abfunc5); 129e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 130e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// If length is not explicitly specified, the length of the ArrayBuffer minus 131e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// the byteOffset must be a multiple of the element size of the specific type, 132e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// or an exception is raised. 133e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar ab2 = new ArrayBuffer(13); 134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction abfunc6() { 135e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org new Uint32Array(ab2,4); 136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(abfunc6); 138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test that an array constructed without an array buffer creates one properly. 140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint8Array(31); 141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.byteLength, a.buffer.byteLength); 142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.length, a.buffer.byteLength); 143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.length * a.BYTES_PER_ELEMENT, a.buffer.byteLength); 144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Int16Array(5); 145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.byteLength, a.buffer.byteLength); 146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.length * a.BYTES_PER_ELEMENT, a.buffer.byteLength); 147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Float64Array(7); 148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.byteLength, a.buffer.byteLength); 149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(a.length * a.BYTES_PER_ELEMENT, a.buffer.byteLength); 150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test that an implicitly created buffer is a valid buffer. 152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Float64Array(7); 153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, (new Uint16Array(a.buffer)).buffer); 154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, (new Float32Array(a.buffer,4)).buffer); 155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, (new Int8Array(a.buffer,3,51)).buffer); 156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a.buffer, ArrayBuffer); 157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 15857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// Test the correct behavior of the |BYTES_PER_ELEMENT| property. 159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Int32Array(2); 160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, a.BYTES_PER_ELEMENT); 161e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga.BYTES_PER_ELEMENT = 42; 162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint8Array(2); 163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, a.BYTES_PER_ELEMENT); 164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Int16Array(2); 165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, a.BYTES_PER_ELEMENT); 166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test Float64Arrays. 168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction get(a, index) { 169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return a[index]; 170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction set(a, index, value) { 172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[index] = value; 173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction temp() { 175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar array = new Float64Array(2); 176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfor (var i = 0; i < 5; i++) { 177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org set(array, 0, 2.5); 178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(2.5, array[0]); 179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(set); 181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgset(array, 0, 2.5); 182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2.5, array[0]); 183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgset(array, 1, 3.5); 184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3.5, array[1]); 185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfor (var i = 0; i < 5; i++) { 186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(2.5, get(array, 0)); 187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(3.5, array[1]); 188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(get); 190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2.5, get(array, 0)); 191e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3.5, get(array, 1)); 192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test non-number parameters. 195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar array_with_length_from_non_number = new Int32Array("2"); 196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, array_with_length_from_non_number.length); 197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test loads and stores. 199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtypes = [Array, Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, 200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Uint32Array, Uint8ClampedArray, Float32Array, Float64Array]; 201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_nan = [NaN, 0, 0, 0, 0, 0, 0, 0, NaN, NaN]; 203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_low_int = [-1, -1, 255, -1, 65535, -1, 0xFFFFFFFF, 0, -1, -1]; 204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_low_double = [-1.25, -1, 255, -1, 65535, -1, 0xFFFFFFFF, 0, -1.25, -1.25]; 205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_middle = [253.75, -3, 253, 253, 253, 253, 253, 254, 253.75, 253.75]; 206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_high_int = [256, 0, 0, 256, 256, 256, 256, 255, 256, 256]; 207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtest_result_high_double = [256.25, 0, 0, 256, 256, 256, 256, 255, 256.25, 256.25]; 208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgconst kElementCount = 40; 210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_load(array, sum) { 212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < kElementCount; i++) { 213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[i]; 214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return sum; 216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_load_const_key(array, sum) { 219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[0]; 220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[1]; 221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[2]; 222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return sum; 223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store(array, sum) { 226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < kElementCount; i++) { 227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[i] = i+1; 228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return sum; 230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_const_key(array, sum) { 233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[0] = 1; 234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[1] = 2; 235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum += array[2] = 3; 236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return sum; 237e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 238e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 239e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction zero() { 240e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0.0; 241e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 243e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_middle_tagged(array, sum) { 244e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 253.75; 245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 246e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 247e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 248e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_high_tagged(array, sum) { 249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 256.25; 250e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 251e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_middle_double(array, sum) { 254e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 253.75 + zero(); // + forces double type feedback 255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 256e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 257e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 258e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_high_double(array, sum) { 259e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 256.25 + zero(); // + forces double type feedback 260e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 261e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 262e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_high_double(array, sum) { 264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 256.25; 265e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 266e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 267e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_low_int(array, sum) { 269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = -1; 270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_low_tagged(array, sum) { 274e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = -1.25; 275e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 277e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 278e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_low_double(array, sum) { 279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = -1.25 + zero(); // + forces double type feedback 280e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 281e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 282e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 283e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_high_int(array, sum) { 284e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = 256; 285e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 286e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 287e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 288e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction test_store_nan(array, sum) { 289e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array[0] = NaN; 290e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return array[0]; 291e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 292e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 293e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgconst kRuns = 10; 294e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 295e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction run_test(test_func, array, expected_result) { 296e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < 5; i++) test_func(array, 0); 297e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %OptimizeFunctionOnNextCall(test_func); 298e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org var sum = 0; 299e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < kRuns; i++) { 300e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org sum = test_func(array, sum); 301e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 302e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(expected_result, sum); 303e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %DeoptimizeFunction(test_func); 304bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org %ClearFunctionTypeFeedback(test_func); 305e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 307e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction run_bounds_test(test_func, array, expected_result) { 308e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(undefined, a[kElementCount]); 309e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[kElementCount] = 456; 310e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(undefined, a[kElementCount]); 311e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(undefined, a[kElementCount+1]); 312e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[kElementCount+1] = 456; 313e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(undefined, a[kElementCount+1]); 314e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 315e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfor (var t = 0; t < types.length; t++) { 317e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org var type = types[t]; 318e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org var a = new type(kElementCount); 319e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 320e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < kElementCount; i++) { 321e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a[i] = i; 322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Run test functions defined above. 325e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_load, a, 780 * kRuns); 326e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_load_const_key, a, 3 * kRuns); 327e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store, a, 820 * kRuns); 328e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_const_key, a, 6 * kRuns); 329e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_low_int, a, test_result_low_int[t]); 330e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_low_double, a, test_result_low_double[t]); 331e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_low_tagged, a, test_result_low_double[t]); 332e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_high_int, a, test_result_high_int[t]); 333e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_nan, a, test_result_nan[t]); 334e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_middle_double, a, test_result_middle[t]); 335e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_middle_tagged, a, test_result_middle[t]); 336e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_high_double, a, test_result_high_double[t]); 337e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_test(test_store_high_tagged, a, test_result_high_double[t]); 338e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 339e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Test the correct behavior of the |length| property (which is read-only). 340e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (t != 0) { 341e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(kElementCount, a.length); 342e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org a.length = 2; 343e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(kElementCount, a.length); 344e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertTrue(delete a.length); 345e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 346e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Make sure bounds checks are handled correctly for external arrays. 347e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_bounds_test(a); 348e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_bounds_test(a); 349e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_bounds_test(a); 350e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %OptimizeFunctionOnNextCall(run_bounds_test); 351e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org run_bounds_test(a); 352e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %DeoptimizeFunction(run_bounds_test); 353bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org %ClearFunctionTypeFeedback(run_bounds_test); 354e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 355e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 356e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org function array_load_set_smi_check(a) { 357e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return a[0] = a[0] = 1; 358e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 359e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 360e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array_load_set_smi_check(a); 361e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array_load_set_smi_check(0); 362e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 363e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org function array_load_set_smi_check2(a) { 364e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return a[0] = a[0] = 1; 365e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 366e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 367e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array_load_set_smi_check2(a); 368e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %OptimizeFunctionOnNextCall(array_load_set_smi_check2); 369e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array_load_set_smi_check2(a); 370e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org array_load_set_smi_check2(0); 371e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %DeoptimizeFunction(array_load_set_smi_check2); 372bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org %ClearFunctionTypeFeedback(array_load_set_smi_check2); 373e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 374e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 375e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Check handling of undefined in 32- and 64-bit external float arrays. 376e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 377e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction store_float32_undefined(ext_array) { 378e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ext_array[0] = undefined; 379e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 380e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 381e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar float32_array = new Float32Array(1); 382e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure runtime does it right 383e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float32_undefined(float32_array); 384e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float32_array[0])); 385e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure the ICs do it right 386e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float32_undefined(float32_array); 387e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float32_array[0])); 388e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure that Cranskshft does it right. 389e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(store_float32_undefined); 390e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float32_undefined(float32_array); 391e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float32_array[0])); 392e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 393e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction store_float64_undefined(ext_array) { 394e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ext_array[0] = undefined; 395e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 396e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 397e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar float64_array = new Float64Array(1); 398e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure runtime does it right 399e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float64_undefined(float64_array); 400e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float64_array[0])); 401e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure the ICs do it right 402e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float64_undefined(float64_array); 403e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float64_array[0])); 404e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Make sure that Cranskshft does it right. 405e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(store_float64_undefined); 406e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstore_float64_undefined(float64_array); 407e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertTrue(isNaN(float64_array[0])); 408e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 409e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 410e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Check handling of 0-sized buffers and arrays. 411e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgab = new ArrayBuffer(0); 412e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(ab, ArrayBuffer); 413e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, ab.byteLength); 414e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Int8Array(ab); 415e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Int8Array); 416e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.byteLength); 417e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.length); 418e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga[0] = 1; 419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(undefined, a[0]); 420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgab = new ArrayBuffer(16); 421e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(ab, ArrayBuffer); 422e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Float32Array(ab,4,0); 423e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Float32Array); 424e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.byteLength); 425e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.length); 426e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga[0] = 1; 427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(undefined, a[0]); 428e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint16Array(0); 429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Uint16Array); 430e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.byteLength); 431e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.length); 432e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga[0] = 1; 433e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(undefined, a[0]); 434e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 435e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 436e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Check construction from arrays. 437e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint32Array([]); 438e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Uint32Array); 439e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.length); 440e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.byteLength); 441e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, a.buffer.byteLength); 442e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, a.BYTES_PER_ELEMENT); 443e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a.buffer, ArrayBuffer); 444e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint16Array([1,2,3]); 445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Uint16Array); 446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, a.length); 447e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, a.byteLength); 448e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, a.buffer.byteLength); 449e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, a.BYTES_PER_ELEMENT); 450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, a[0]); 451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, a[2]); 452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a.buffer, ArrayBuffer); 453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint32Array(a); 454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a, Uint32Array); 455e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, a.length); 456e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, a.byteLength); 457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(12, a.buffer.byteLength); 458e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, a.BYTES_PER_ELEMENT); 459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, a[0]); 460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, a[2]); 461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(a.buffer, ArrayBuffer); 462e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 463e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Check subarrays. 464e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga = new Uint16Array([1,2,3,4,5,6]); 465e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(3); 466e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 467e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(3, aa.length); 468e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(6, aa.byteLength); 469e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 470e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 471e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(3,5); 472e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 473e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.length); 474e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, aa.byteLength); 475e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 476e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 477e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(4,8); 478e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 479e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.length); 480e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, aa.byteLength); 481e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 482e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 483e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(9); 484e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 485e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.length); 486e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.byteLength); 487e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 488e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 489e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(-4); 490e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 491e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, aa.length); 492e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(8, aa.byteLength); 493e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 494e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 495e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(-3,-1); 496e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 497e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.length); 498e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(4, aa.byteLength); 499e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 500e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 501e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(3,2); 502e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 503e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.length); 504e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.byteLength); 505e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 506e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 507e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(-3,-4); 508e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 509e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.length); 510e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.byteLength); 511e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 512e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 513e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgaa = a.subarray(0,-8); 514e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertInstance(aa, Uint16Array); 515e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.length); 516e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(0, aa.byteLength); 517e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, aa.BYTES_PER_ELEMENT); 518e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertSame(a.buffer, aa.buffer); 519e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 520e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(function(){ a.subarray.call({}, 0) }); 521e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(function(){ a.subarray.call([], 0) }); 522e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Try to call constructors directly as functions, and through .call 5241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// and .apply. Should fail. 525e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { ArrayBuffer(100); }, TypeError); 5271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { Int8Array(b, 5, 77); }, TypeError); 5281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { ArrayBuffer.call(null, 10); }, TypeError); 5291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { Uint16Array.call(null, b, 2, 4); }, TypeError); 5301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { ArrayBuffer.apply(null, [1000]); }, TypeError); 5311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertThrows(function() { Float32Array.apply(null, [b, 128, 1]); }, TypeError); 532e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 533e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test array.set in different combinations. 534e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 535e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction assertArrayPrefix(expected, array) { 536e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (var i = 0; i < expected.length; ++i) { 537e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(expected[i], array[i]); 538e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 539e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 540e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 541e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a11 = new Int16Array([1, 2, 3, 4, 0, -1]) 542e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a12 = new Uint16Array(15) 543e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga12.set(a11, 3) 544e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0, 0, 0, 1, 2, 3, 4, 0, 0xffff, 0, 0], a12) 545e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertThrows(function(){ a11.set(a12) }) 546e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 547e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a21 = [1, undefined, 10, NaN, 0, -1, {valueOf: function() {return 3}}] 548e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a22 = new Int32Array(12) 549e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga22.set(a21, 2) 550e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0, 0, 1, 0, 10, 0, 0, -1, 3, 0], a22) 551e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 552e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a31 = new Float32Array([2, 4, 6, 8, 11, NaN, 1/0, -3]) 553e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a32 = a31.subarray(2, 6) 554e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga31.set(a32, 4) 555e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([2, 4, 6, 8, 6, 8, 11, NaN], a31) 556e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([6, 8, 6, 8], a32) 557e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 558e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a4 = new Uint8ClampedArray([3,2,5,6]) 559e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga4.set(a4) 560e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([3, 2, 5, 6], a4) 561e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 562e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Cases with overlapping backing store but different element sizes. 563e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar b = new ArrayBuffer(4) 564e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a5 = new Int16Array(b) 565e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a50 = new Int8Array(b) 566e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a51 = new Int8Array(b, 0, 2) 567e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a52 = new Int8Array(b, 1, 2) 568e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a53 = new Int8Array(b, 2, 2) 569e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 570e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga5.set([0x5050, 0x0a0a]) 571e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50) 572e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x50], a51) 573e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x0a], a52) 574e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x0a, 0x0a], a53) 575e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 576e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x50, 0x0a, 0x0a]) 577e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga51.set(a5) 578e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x0a, 0x0a, 0x0a], a50) 579e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 580e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x50, 0x0a, 0x0a]) 581e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga52.set(a5) 582e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x50, 0x0a, 0x0a], a50) 583e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 584e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x50, 0x0a, 0x0a]) 585e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga53.set(a5) 586e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x50, 0x50, 0x50, 0x0a], a50) 587e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 588e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x51, 0x0a, 0x0b]) 589e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga5.set(a51) 590e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x0050, 0x0051], a5) 591e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 592e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x51, 0x0a, 0x0b]) 593e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga5.set(a52) 594e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x0051, 0x000a], a5) 595e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 596e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga50.set([0x50, 0x51, 0x0a, 0x0b]) 597e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga5.set(a53) 598e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([0x000a, 0x000b], a5) 599e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 600e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Mixed types of same size. 601e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a61 = new Float32Array([1.2, 12.3]) 602e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a62 = new Int32Array(2) 603e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga62.set(a61) 604e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([1, 12], a62) 605e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orga61.set(a62) 606e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertArrayPrefix([1, 12], a61) 607e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 608e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Invalid source 60910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgassertThrows(function() { a.set(0); }, TypeError); 610169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgassertArrayPrefix([1,2,3,4,5,6], a); 611169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orga.set({}); // does not throw 612169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgassertArrayPrefix([1,2,3,4,5,6], a); 613e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 614e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 615e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Test arraybuffer.slice 616e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 617e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar a0 = new Int8Array([1, 2, 3, 4, 5, 6]) 618e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar b0 = a0.buffer 619e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 620e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar b1 = b0.slice(0) 621e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(b0.byteLength, b1.byteLength) 6221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertArrayPrefix([1, 2, 3, 4, 5, 6], new Int8Array(b1)) 623e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 624e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar b2 = b0.slice(3) 625e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(b0.byteLength - 3, b2.byteLength) 6261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertArrayPrefix([4, 5, 6], new Int8Array(b2)) 627e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 628e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar b3 = b0.slice(2, 4) 629e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2, b3.byteLength) 6301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgassertArrayPrefix([3, 4], new Int8Array(b3)) 631e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 632e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction goo(a, i) { 633e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return a[i]; 634e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 635e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 636e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction boo(a, i, v) { 637e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return a[i] = v; 638e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 639e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 640e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgfunction do_tagged_index_external_array_test(constructor) { 641e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org var t_array = new constructor([1, 2, 3, 4, 5, 6]); 642e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(1, goo(t_array, 0)); 643e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(1, goo(t_array, 0)); 644e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org boo(t_array, 0, 13); 645e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(13, goo(t_array, 0)); 646e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %OptimizeFunctionOnNextCall(goo); 647e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %OptimizeFunctionOnNextCall(boo); 648e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org boo(t_array, 0, 15); 649e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org assertEquals(15, goo(t_array, 0)); 650e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %ClearFunctionTypeFeedback(goo); 651e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org %ClearFunctionTypeFeedback(boo); 652e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 653e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 654e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Int8Array); 655e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Uint8Array); 656e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Int16Array); 657e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Uint16Array); 658e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Int32Array); 659e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Uint32Array); 660e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Float32Array); 661e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgdo_tagged_index_external_array_test(Float64Array); 662e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 663e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvar built_in_array = new Array(1, 2, 3, 4, 5, 6); 664e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, goo(built_in_array, 0)); 665e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1, goo(built_in_array, 0)); 666e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(goo); 667e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(boo); 668e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgboo(built_in_array, 0, 11); 669e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(11, goo(built_in_array, 0)); 670e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%ClearFunctionTypeFeedback(goo); 671e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%ClearFunctionTypeFeedback(boo); 672e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbuilt_in_array = new Array(1.5, 2, 3, 4, 5, 6); 674e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1.5, goo(built_in_array, 0)); 675e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(1.5, goo(built_in_array, 0)); 676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(goo); 677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%OptimizeFunctionOnNextCall(boo); 678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgboo(built_in_array, 0, 2.5); 679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgassertEquals(2.5, goo(built_in_array, 0)); 680e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%ClearFunctionTypeFeedback(goo); 681e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org%ClearFunctionTypeFeedback(boo); 6828fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 6838fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org// Check all int range edge cases 6848fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.orgfunction checkRange() { 6858fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var e32 = Math.pow(2,32); var e31 = Math.pow(2,31); 6868fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var e16 = Math.pow(2,16); var e15 = Math.pow(2,15); 6878fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var e8 = Math.pow(2,8); var e7 = Math.pow(2,7); 6888fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var a7 = new Uint32Array(2); var a71 = new Int32Array(2); 6898fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var a72 = new Uint16Array(2); var a73 = new Int16Array(2); 6908fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var a74 = new Uint8Array(2); var a75 = new Int8Array(2); 6918fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org for (i = 1; i <= Math.pow(2,33); i *= 2) { 6928fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org var j = i-1; 6938fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org a7[0] = i; a71[0] = i; a72[0] = i; a73[0] = i; a74[0] = i; a75[0] = i; 6948fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org a7[1] = j; a71[1] = j; a72[1] = j; a73[1] = j; a74[1] = j; a75[1] = j; 6958fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 6968fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e32) { assertEquals(a7[0], i); } else { assertEquals(a7[0], 0); } 6978fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e32) { assertEquals(a7[1], j); } else { assertEquals(a7[1],e32-1); } 6988fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e31) { assertEquals(a71[0], i); } else { 6998fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org assertEquals(a71[0], (i < e32) ? -e31 : 0 ); } 7008fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e31) { assertEquals(a71[1], j); } else { assertEquals(a71[1], -1); } 7018fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 7028fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e16) { assertEquals(a72[0], i); } else { assertEquals(a72[0], 0); } 7038fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e16) { assertEquals(a72[1], j); } else { assertEquals(a72[1], e16-1); } 7048fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e15) { assertEquals(a73[0], i); } else { 7058fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org assertEquals(a73[0], (i < e16) ? -e15 : 0 ); } 7068fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e15) { assertEquals(a73[1], j); } else { assertEquals(a73[1], -1); } 7078fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 7088fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e8) { assertEquals(a74[0], i); } else { assertEquals(a74[0], 0); } 7098fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e8) { assertEquals(a74[1], j); } else { assertEquals(a74[1], e8-1); } 7108fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (i < e7) { assertEquals(a75[0], i); } else { 7118fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org assertEquals(a75[0], (i < e8) ? -e7 : 0); } 7128fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (j < e7) { assertEquals(a75[1], j); } else { assertEquals(a75[1], -1); } 7138fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org } 7148fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org} 7158fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.orgcheckRange(); 716