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