blob: ff0c433bd76a398b1679ebe51437365735495074 [file] [log] [blame]
Ben Murdoch3fb3ca82011-12-02 17:19:32 +00001// Copyright 2011 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
29function init_array(a) {
30 for (var i = 0; i < 10; ++i ){
31 a[i] = i;
32 }
33}
34
35function init_sparse_array(a) {
36 for (var i = 0; i < 10; ++i ){
37 a[i] = i;
38 }
39 a[5000000] = 256;
40 assertTrue(%HasDictionaryElements(a));
41}
42
43function testPolymorphicLoads() {
44 function make_polymorphic_load_function() {
45 function load(a, i) {
46 return a[i];
47 }
48
49 var object_array = new Object;
50 var sparse_object_array = new Object;
51 var js_array = new Array(10);
52 var sparse_js_array = new Array(5000001);
53
54 init_array(object_array);
55 init_array(js_array);
56 init_sparse_array(sparse_object_array);
57 init_sparse_array(sparse_js_array);
58
59 assertEquals(1, load(object_array, 1));
60 assertEquals(1, load(js_array, 1));
61 assertEquals(1, load(sparse_object_array, 1));
62 assertEquals(1, load(sparse_js_array, 1));
63
64 return load;
65 }
66
67 var object_array = new Object;
68 var sparse_object_array = new Object;
69 var js_array = new Array(10);
70 var sparse_js_array = new Array(5000001);
71
72 init_array(object_array);
73 init_array(js_array);
74 init_sparse_array(sparse_object_array);
75 init_sparse_array(sparse_js_array);
76
77 load = make_polymorphic_load_function();
78 assertEquals(undefined, load(js_array, new Object()));
79 load = make_polymorphic_load_function();
80 assertEquals(undefined, load(object_array, new Object()));
81 load = make_polymorphic_load_function();
82 assertEquals(undefined, load(sparse_js_array, new Object()));
83 load = make_polymorphic_load_function();
84 assertEquals(undefined, load(sparse_object_array, new Object()));
85
86 // Try with crankshaft.
87 load = make_polymorphic_load_function();
88 %OptimizeFunctionOnNextCall(load);
89 assertEquals(1, load(object_array, 1));
90 assertEquals(1, load(js_array, 1));
91 assertEquals(1, load(sparse_object_array, 1));
92 assertEquals(1, load(sparse_js_array, 1));
93
94 load = make_polymorphic_load_function();
95 %OptimizeFunctionOnNextCall(load);
96 assertEquals(undefined, load(js_array, new Object()));
97 load = make_polymorphic_load_function();
98 %OptimizeFunctionOnNextCall(load);
99 assertEquals(undefined, load(object_array, new Object()));
100 load = make_polymorphic_load_function();
101 %OptimizeFunctionOnNextCall(load);
102 assertEquals(undefined, load(sparse_js_array, new Object()));
103 load = make_polymorphic_load_function();
104 %OptimizeFunctionOnNextCall(load);
105 assertEquals(undefined, load(sparse_object_array, new Object()));
106}
107
108function testPolymorphicStores() {
109 function make_polymorphic_store_function() {
110 function store(a, i, val) {
111 a[i] = val;
112 }
113
114 var object_array = new Object;
115 var sparse_object_array = new Object;
116 var js_array = new Array(10);
117 var sparse_js_array = new Array(5000001);
118
119 init_array(object_array);
120 init_array(js_array);
121 init_sparse_array(sparse_object_array);
122 init_sparse_array(sparse_js_array);
123
124 store(object_array, 1, 256);
125 store(js_array, 1, 256);
126 store(sparse_object_array, 1, 256);
127 store(sparse_js_array, 1, 256);
128
129 return store;
130 }
131
132 var object_array = new Object;
133 var sparse_object_array = new Object;
134 var js_array = new Array(10);
135 var sparse_js_array = new Array(5000001);
136
137 init_array(object_array);
138 init_array(js_array);
139 init_sparse_array(sparse_object_array);
140 init_sparse_array(sparse_js_array);
141
142 store = make_polymorphic_store_function();
143 store(object_array, 2, 257);
144 store = make_polymorphic_store_function();
145 store(js_array, 2, 257);
146 store = make_polymorphic_store_function();
147 store(sparse_object_array, 2, 257);
148 store = make_polymorphic_store_function();
149 store(sparse_js_array, 2, 257);
150
151 assertEquals(257, object_array[2]);
152 assertEquals(257, js_array[2]);
153 assertEquals(257, sparse_js_array[2]);
154 assertEquals(257, sparse_object_array[2]);
155
156 // Now try Crankshaft optimized polymorphic stores
157 store = make_polymorphic_store_function();
158 %OptimizeFunctionOnNextCall(store);
159 store(object_array, 3, 258);
160 store = make_polymorphic_store_function();
161 %OptimizeFunctionOnNextCall(store);
162 store(js_array, 3, 258);
163 store = make_polymorphic_store_function();
164 %OptimizeFunctionOnNextCall(store);
165 store(sparse_object_array, 3, 258);
166 store = make_polymorphic_store_function();
167 %OptimizeFunctionOnNextCall(store);
168 store(sparse_js_array, 3, 258);
169
170 assertEquals(258, object_array[3]);
171 assertEquals(258, js_array[3]);
172 assertEquals(258, sparse_js_array[3]);
173 assertEquals(258, sparse_object_array[3]);
174}
175
176testPolymorphicLoads();
177testPolymorphicStores();