Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: test/mjsunit/unbox-double-arrays.js

Issue 8416014: Force transition to FAST_ELEMENTS on out-of-bounds KeyedLoads. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 } 70 }
71 71
72 // Multiple versions of the test function makes sure that IC/Crankshaft state 72 // Multiple versions of the test function makes sure that IC/Crankshaft state
73 // doesn't get reused. 73 // doesn't get reused.
74 function test_various_loads(a, value_5, value_6, value_7) { 74 function test_various_loads(a, value_5, value_6, value_7) {
75 assertTrue(%HasFastDoubleElements(a)); 75 assertTrue(%HasFastDoubleElements(a));
76 assertEquals(value_5, a[5]); 76 assertEquals(value_5, a[5]);
77 assertEquals(value_6, a[6]); 77 assertEquals(value_6, a[6]);
78 assertEquals(value_6, a[computed_6()]); // Test non-constant key 78 assertEquals(value_6, a[computed_6()]); // Test non-constant key
79 assertEquals(value_7, a[7]); 79 assertEquals(value_7, a[7]);
80 assertEquals(undefined, a[large_array_size-1]);
81 assertEquals(undefined, a[-1]);
82 assertEquals(large_array_size, a.length); 80 assertEquals(large_array_size, a.length);
83 assertTrue(%HasFastDoubleElements(a)); 81 assertTrue(%HasFastDoubleElements(a));
84 } 82 }
85 83
86 function test_various_loads2(a, value_5, value_6, value_7) { 84 function test_various_loads2(a, value_5, value_6, value_7) {
87 assertTrue(%HasFastDoubleElements(a)); 85 assertTrue(%HasFastDoubleElements(a));
88 assertEquals(value_5, a[5]); 86 assertEquals(value_5, a[5]);
89 assertEquals(value_6, a[6]); 87 assertEquals(value_6, a[6]);
90 assertEquals(value_6, a[computed_6()]); // Test non-constant key 88 assertEquals(value_6, a[computed_6()]); // Test non-constant key
91 assertEquals(value_7, a[7]); 89 assertEquals(value_7, a[7]);
92 assertEquals(undefined, a[large_array_size-1]);
93 assertEquals(undefined, a[-1]);
94 assertEquals(large_array_size, a.length); 90 assertEquals(large_array_size, a.length);
95 assertTrue(%HasFastDoubleElements(a)); 91 assertTrue(%HasFastDoubleElements(a));
96 } 92 }
97 93
98 function test_various_loads3(a, value_5, value_6, value_7) { 94 function test_various_loads3(a, value_5, value_6, value_7) {
99 assertTrue(%HasFastDoubleElements(a)); 95 assertTrue(%HasFastDoubleElements(a));
100 assertEquals(value_5, a[5]); 96 assertEquals(value_5, a[5]);
101 assertEquals(value_6, a[6]); 97 assertEquals(value_6, a[6]);
102 assertEquals(value_6, a[computed_6()]); // Test non-constant key 98 assertEquals(value_6, a[computed_6()]); // Test non-constant key
103 assertEquals(value_7, a[7]); 99 assertEquals(value_7, a[7]);
104 assertEquals(undefined, a[large_array_size-1]);
105 assertEquals(undefined, a[-1]);
106 assertEquals(large_array_size, a.length); 100 assertEquals(large_array_size, a.length);
107 assertTrue(%HasFastDoubleElements(a)); 101 assertTrue(%HasFastDoubleElements(a));
108 } 102 }
109 103
110 function test_various_loads4(a, value_5, value_6, value_7) { 104 function test_various_loads4(a, value_5, value_6, value_7) {
111 assertTrue(%HasFastDoubleElements(a)); 105 assertTrue(%HasFastDoubleElements(a));
112 assertEquals(value_5, a[5]); 106 assertEquals(value_5, a[5]);
113 assertEquals(value_6, a[6]); 107 assertEquals(value_6, a[6]);
114 assertEquals(value_6, a[computed_6()]); // Test non-constant key 108 assertEquals(value_6, a[computed_6()]); // Test non-constant key
115 assertEquals(value_7, a[7]); 109 assertEquals(value_7, a[7]);
116 assertEquals(undefined, a[large_array_size-1]);
117 assertEquals(undefined, a[-1]);
118 assertEquals(large_array_size, a.length); 110 assertEquals(large_array_size, a.length);
119 assertTrue(%HasFastDoubleElements(a)); 111 assertTrue(%HasFastDoubleElements(a));
120 } 112 }
121 113
122 function test_various_loads5(a, value_5, value_6, value_7) { 114 function test_various_loads5(a, value_5, value_6, value_7) {
123 assertTrue(%HasFastDoubleElements(a)); 115 assertTrue(%HasFastDoubleElements(a));
124 assertEquals(value_5, a[5]); 116 if (value_5 != undefined) {
125 assertEquals(value_6, a[6]); 117 assertEquals(value_5, a[5]);
126 assertEquals(value_6, a[computed_6()]); // Test non-constant key 118 };
119 if (value_6 != undefined) {
120 assertEquals(value_6, a[6]);
121 assertEquals(value_6, a[computed_6()]); // Test non-constant key
122 }
127 assertEquals(value_7, a[7]); 123 assertEquals(value_7, a[7]);
128 assertEquals(undefined, a[large_array_size-1]);
129 assertEquals(undefined, a[-1]);
130 assertEquals(large_array_size, a.length); 124 assertEquals(large_array_size, a.length);
131 assertTrue(%HasFastDoubleElements(a)); 125 assertTrue(%HasFastDoubleElements(a));
132 } 126 }
133 127
134 function test_various_loads6(a, value_5, value_6, value_7) { 128 function test_various_loads6(a, value_5, value_6, value_7) {
135 assertTrue(%HasFastDoubleElements(a)); 129 assertTrue(%HasFastDoubleElements(a));
136 assertEquals(value_5, a[5]); 130 assertEquals(value_5, a[5]);
137 assertEquals(value_6, a[6]); 131 assertEquals(value_6, a[6]);
138 assertEquals(value_6, a[computed_6()]); // Test non-constant key 132 assertEquals(value_6, a[computed_6()]); // Test non-constant key
139 assertEquals(value_7, a[7]); 133 assertEquals(value_7, a[7]);
140 assertEquals(undefined, a[large_array_size-1]);
141 assertEquals(undefined, a[-1]);
142 assertEquals(large_array_size, a.length); 134 assertEquals(large_array_size, a.length);
143 assertTrue(%HasFastDoubleElements(a)); 135 assertTrue(%HasFastDoubleElements(a));
144 } 136 }
137
138 function test_various_loads7(a, value_5, value_6, value_7) {
139 assertTrue(%HasFastDoubleElements(a));
140 assertEquals(value_5, a[5]);
141 assertEquals(value_6, a[6]);
142 assertEquals(value_6, a[computed_6()]); // Test non-constant key
143 assertEquals(value_7, a[7]);
144 assertEquals(large_array_size, a.length);
145 assertTrue(%HasFastDoubleElements(a));
146 }
145 147
146 function test_various_stores(a, value_5, value_6, value_7) { 148 function test_various_stores(a, value_5, value_6, value_7) {
147 assertTrue(%HasFastDoubleElements(a)); 149 assertTrue(%HasFastDoubleElements(a));
148 a[5] = value_5; 150 a[5] = value_5;
149 a[computed_6()] = value_6; 151 a[computed_6()] = value_6;
150 a[7] = value_7; 152 a[7] = value_7;
151 assertTrue(%HasFastDoubleElements(a)); 153 assertTrue(%HasFastDoubleElements(a));
152 } 154 }
153 155
154 // Test double and integer values 156 // Test double and integer values
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 test_various_loads5(large_array, 243 test_various_loads5(large_array,
242 undefined, 244 undefined,
243 undefined, 245 undefined,
244 expected_array_value(7)); 246 expected_array_value(7));
245 test_various_loads5(large_array, 247 test_various_loads5(large_array,
246 undefined, 248 undefined,
247 undefined, 249 undefined,
248 expected_array_value(7)); 250 expected_array_value(7));
249 251
250 // Make sure Crankshaft code handles the hole correctly (bailout) 252 // Make sure Crankshaft code handles the hole correctly (bailout)
253 var large_array = new allocator(large_array_size);
254 force_to_fast_double_array(large_array);
251 test_various_stores(large_array, 255 test_various_stores(large_array,
252 expected_array_value(5), 256 expected_array_value(5),
253 expected_array_value(6), 257 expected_array_value(6),
254 expected_array_value(7)); 258 expected_array_value(7));
255 test_various_loads6(large_array, 259 test_various_loads6(large_array,
256 expected_array_value(5), 260 expected_array_value(5),
257 expected_array_value(6), 261 expected_array_value(6),
258 expected_array_value(7)); 262 expected_array_value(7));
259 test_various_loads6(large_array, 263 test_various_loads6(large_array,
260 expected_array_value(5), 264 expected_array_value(5),
261 expected_array_value(6), 265 expected_array_value(6),
262 expected_array_value(7)); 266 expected_array_value(7));
263 %OptimizeFunctionOnNextCall(test_various_loads6); 267 %OptimizeFunctionOnNextCall(test_various_loads6);
264 test_various_loads6(large_array, 268 test_various_loads6(large_array,
265 expected_array_value(5), 269 expected_array_value(5),
266 expected_array_value(6), 270 expected_array_value(6),
267 expected_array_value(7)); 271 expected_array_value(7));
268 272
269 delete large_array[5]; 273 delete large_array[5];
270 delete large_array[6]; 274 delete large_array[6];
271 test_various_loads6(large_array, 275 test_various_loads6(large_array,
272 undefined, 276 undefined,
273 undefined, 277 undefined,
274 expected_array_value(7)); 278 expected_array_value(7));
275 279
280 %DeoptimizeFunction(test_various_loads6);
281 gc();
282
276 // Test stores for non-NaN. 283 // Test stores for non-NaN.
284 var large_array = new allocator(large_array_size);
285 force_to_fast_double_array(large_array);
277 %OptimizeFunctionOnNextCall(test_various_stores); 286 %OptimizeFunctionOnNextCall(test_various_stores);
278 test_various_stores(large_array, 287 test_various_stores(large_array,
279 expected_array_value(5), 288 expected_array_value(5),
280 expected_array_value(6), 289 expected_array_value(6),
281 expected_array_value(7)); 290 expected_array_value(7));
282 291
283 test_various_stores(large_array, 292 test_various_stores(large_array,
284 expected_array_value(5), 293 expected_array_value(5),
285 expected_array_value(6), 294 expected_array_value(6),
286 expected_array_value(7)); 295 expected_array_value(7));
287 296
288 test_various_loads6(large_array, 297 test_various_loads7(large_array,
289 expected_array_value(5), 298 expected_array_value(5),
290 expected_array_value(6), 299 expected_array_value(6),
291 expected_array_value(7)); 300 expected_array_value(7));
301
302 test_various_loads7(large_array,
303 expected_array_value(5),
304 expected_array_value(6),
305 expected_array_value(7));
306
307 %OptimizeFunctionOnNextCall(test_various_loads7);
308
309 test_various_loads7(large_array,
310 expected_array_value(5),
311 expected_array_value(6),
312 expected_array_value(7));
292 313
293 // Test NaN behavior for stores. 314 // Test NaN behavior for stores.
294 test_various_stores(large_array, 315 test_various_stores(large_array,
295 NaN, 316 NaN,
296 -NaN, 317 -NaN,
297 expected_array_value(7)); 318 expected_array_value(7));
298 319
299 test_various_stores(large_array, 320 test_various_stores(large_array,
300 NaN, 321 NaN,
301 -NaN, 322 -NaN,
302 expected_array_value(7)); 323 expected_array_value(7));
303 324
304 test_various_loads6(large_array, 325 test_various_loads7(large_array,
305 NaN, 326 NaN,
306 -NaN, 327 -NaN,
307 expected_array_value(7)); 328 expected_array_value(7));
308 329
309 // Test Infinity behavior for stores. 330 // Test Infinity behavior for stores.
310 test_various_stores(large_array, 331 test_various_stores(large_array,
311 Infinity, 332 Infinity,
312 -Infinity, 333 -Infinity,
313 expected_array_value(7)); 334 expected_array_value(7));
314 335
315 test_various_stores(large_array, 336 test_various_stores(large_array,
316 Infinity, 337 Infinity,
317 -Infinity, 338 -Infinity,
318 expected_array_value(7)); 339 expected_array_value(7));
319 340
320 test_various_loads6(large_array, 341 test_various_loads7(large_array,
321 Infinity, 342 Infinity,
322 -Infinity, 343 -Infinity,
323 expected_array_value(7)); 344 expected_array_value(7));
324 345
325 assertTrue(%GetOptimizationStatus(test_various_stores) != 2); 346 assertTrue(%GetOptimizationStatus(test_various_stores) != 2);
326 347
327 // Make sure that we haven't converted from fast double. 348 // Make sure that we haven't converted from fast double.
328 assertTrue(%HasFastDoubleElements(large_array)); 349 assertTrue(%HasFastDoubleElements(large_array));
329 } 350 }
330 351
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 assertEquals(-Infinity, arg4); 448 assertEquals(-Infinity, arg4);
428 assertEquals(expected_array_value(5), arg5); 449 assertEquals(expected_array_value(5), arg5);
429 } 450 }
430 451
431 large_array3[1] = NaN; 452 large_array3[1] = NaN;
432 large_array3[2] = -NaN; 453 large_array3[2] = -NaN;
433 large_array3[3] = Infinity; 454 large_array3[3] = Infinity;
434 large_array3[4] = -Infinity; 455 large_array3[4] = -Infinity;
435 456
436 function call_apply() { 457 function call_apply() {
437 assertTrue(%HasFastDoubleElements(large_array3));
438 called_by_apply.apply({}, large_array3); 458 called_by_apply.apply({}, large_array3);
439 } 459 }
440 460
441 call_apply(); 461 call_apply();
442 call_apply(); 462 call_apply();
443 call_apply(); 463 call_apply();
444 %OptimizeFunctionOnNextCall(call_apply); 464 %OptimizeFunctionOnNextCall(call_apply);
445 call_apply(); 465 call_apply();
446 call_apply(); 466 call_apply();
447 call_apply(); 467 call_apply();
448 468
449 function test_for_in() { 469 function test_for_in() {
450 // Due to previous tests, keys 0..25 and 95 should be present. 470 // Due to previous tests, keys 0..25 and 95 should be present.
451 next_expected = 0; 471 next_expected = 0;
452 assertTrue(%HasFastDoubleElements(large_array3));
453 for (x in large_array3) { 472 for (x in large_array3) {
454 assertTrue(next_expected++ == x); 473 assertTrue(next_expected++ == x);
455 if (next_expected == 25) { 474 if (next_expected == 25) {
456 next_expected = 95; 475 next_expected = 95;
457 } 476 }
458 } 477 }
459 assertTrue(next_expected == 96); 478 assertTrue(next_expected == 96);
460 } 479 }
461 480
462 test_for_in(); 481 test_for_in();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 assertEquals(expected_array_value(2), large_array4[2]); 537 assertEquals(expected_array_value(2), large_array4[2]);
519 } 538 }
520 539
521 test_setter(); 540 test_setter();
522 test_setter(); 541 test_setter();
523 test_setter(); 542 test_setter();
524 %OptimizeFunctionOnNextCall(test_setter); 543 %OptimizeFunctionOnNextCall(test_setter);
525 test_setter(); 544 test_setter();
526 test_setter(); 545 test_setter();
527 test_setter(); 546 test_setter();
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698