blob: 60e051b3fad5bb23a5cd9771227b72cd8aa46842 [file] [log] [blame]
Ben Murdoch3ef787d2012-04-12 10:51:47 +01001// 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 --smi-only-arrays
29
30support_smi_only_arrays = %HasFastSmiOnlyElements(new Array(1,2,3,4,5,6,7,8));
31
32if (support_smi_only_arrays) {
33 print("Tests include smi-only arrays.");
34} else {
35 print("Tests do NOT include smi-only arrays.");
36}
37
38if (support_smi_only_arrays) {
39 function test(test_double, test_object, set, length) {
40 // We apply the same operations to two identical arrays. The first array
41 // triggers an IC miss, upon which the conversion stub is generated, but the
42 // actual conversion is done in runtime. The second array, arriving at
43 // the previously patched IC, is then converted using the conversion stub.
44 var array_1 = new Array(length);
45 var array_2 = new Array(length);
46
47 assertTrue(%HasFastSmiOnlyElements(array_1));
48 assertTrue(%HasFastSmiOnlyElements(array_2));
49 for (var i = 0; i < length; i++) {
50 if (i == length - 5 && test_double) {
51 // Trigger conversion to fast double elements at length-5.
52 set(array_1, i, 0.5);
53 set(array_2, i, 0.5);
54 assertTrue(%HasFastDoubleElements(array_1));
55 assertTrue(%HasFastDoubleElements(array_2));
56 } else if (i == length - 3 && test_object) {
57 // Trigger conversion to fast object elements at length-3.
58 set(array_1, i, 'object');
59 set(array_2, i, 'object');
60 assertTrue(%HasFastElements(array_1));
61 assertTrue(%HasFastElements(array_2));
62 } else if (i != length - 7) {
63 // Set the element to an integer but leave a hole at length-7.
64 set(array_1, i, 2*i+1);
65 set(array_2, i, 2*i+1);
66 }
67 }
68
69 for (var i = 0; i < length; i++) {
70 if (i == length - 5 && test_double) {
71 assertEquals(0.5, array_1[i]);
72 assertEquals(0.5, array_2[i]);
73 } else if (i == length - 3 && test_object) {
74 assertEquals('object', array_1[i]);
75 assertEquals('object', array_2[i]);
76 } else if (i != length - 7) {
77 assertEquals(2*i+1, array_1[i]);
78 assertEquals(2*i+1, array_2[i]);
79 } else {
80 assertEquals(undefined, array_1[i]);
81 assertEquals(undefined, array_2[i]);
82 }
83 }
84
85 assertEquals(length, array_1.length);
86 assertEquals(length, array_2.length);
87 }
88
89 test(false, false, function(a,i,v){ a[i] = v; }, 20);
90 test(true, false, function(a,i,v){ a[i] = v; }, 20);
91 test(false, true, function(a,i,v){ a[i] = v; }, 20);
92 test(true, true, function(a,i,v){ a[i] = v; }, 20);
93
94 test(false, false, function(a,i,v){ a[i] = v; }, 10000);
95 test(true, false, function(a,i,v){ a[i] = v; }, 10000);
96 test(false, true, function(a,i,v){ a[i] = v; }, 10000);
97 test(true, true, function(a,i,v){ a[i] = v; }, 10000);
98
99 // Check COW arrays
100 function get_cow() { return [1, 2, 3]; }
101
102 function transition(x) { x[0] = 1.5; }
103
104 var ignore = get_cow();
105 transition(ignore); // Handled by runtime.
106 var a = get_cow();
107 var b = get_cow();
108 transition(a); // Handled by IC.
109 assertEquals(1.5, a[0]);
110 assertEquals(1, b[0]);
111} else {
112 print("Test skipped because smi only arrays are not supported.");
113}