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