OLD | NEW |
---|---|
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 10 matching lines...) Expand all Loading... | |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 // Test dictionary -> double elements -> dictionary elements round trip | 28 // Test dictionary -> double elements -> dictionary elements round trip |
29 | 29 |
30 // Flags: --allow-natives-syntax --unbox-double-arrays --expose-gc | 30 // Flags: --allow-natives-syntax --unbox-double-arrays --expose-gc |
31 var large_array_size = 500000; | 31 var large_array_size = 100000; |
32 var approx_dict_to_elements_threshold = 69000; | 32 var approx_dict_to_elements_threshold = 69000; |
33 | 33 |
34 var name = 0; | 34 var name = 0; |
35 | 35 |
36 function expected_array_value(i) { | 36 function expected_array_value(i) { |
37 if ((i % 2) == 0) { | 37 if ((i % 2) == 0) { |
38 return i; | 38 return i; |
39 } else { | 39 } else { |
40 return i + 0.5; | 40 return i + 0.5; |
41 } | 41 } |
42 } | 42 } |
43 | 43 |
44 function force_to_fast_double_array(a) { | 44 function force_to_fast_double_array(a) { |
45 a[large_array_size - 1] = 1; | |
45 for (var i= 0; i < approx_dict_to_elements_threshold; ++i ) { | 46 for (var i= 0; i < approx_dict_to_elements_threshold; ++i ) { |
46 a[i] = expected_array_value(i); | 47 a[i] = expected_array_value(i); |
47 } | 48 } |
48 assertTrue(%HasFastDoubleElements(a)); | 49 assertTrue(%HasFastDoubleElements(a)); |
49 } | 50 } |
50 | 51 |
51 function flush_compiled_code() { | 52 function flush_compiled_code() { |
52 gc(); | 53 gc(); |
53 } | 54 } |
54 | 55 |
56 function make_object_like_array(size) { | |
57 obj = new Object(); | |
58 obj.length = size; | |
59 return obj; | |
60 } | |
61 | |
55 function testOneArrayType(allocator) { | 62 function testOneArrayType(allocator) { |
56 var large_array = new allocator(500000); | 63 var large_array = new allocator(large_array_size); |
57 force_to_fast_double_array(large_array); | 64 force_to_fast_double_array(large_array); |
58 | 65 |
59 for (var i= 0; i < approx_dict_to_elements_threshold; i += 501 ) { | 66 for (var i= 0; i < approx_dict_to_elements_threshold; i += 501 ) { |
60 assertEquals(expected_array_value(i), large_array[i]); | 67 assertEquals(expected_array_value(i), large_array[i]); |
61 } | 68 } |
62 | 69 |
63 // Multiple versions of the test function makes sure that IC/Crankshaft state | 70 // Multiple versions of the test function makes sure that IC/Crankshaft state |
64 // doesn't get reused. | 71 // doesn't get reused. |
65 function test_various_loads(a, value_5, value_6, value_7) { | 72 function test_various_loads(a, value_5, value_6, value_7) { |
66 assertTrue(%HasFastDoubleElements(a)); | 73 assertTrue(%HasFastDoubleElements(a)); |
67 assertEquals(value_5, a[5]); | 74 assertEquals(value_5, a[5]); |
68 assertEquals(value_6, a[6]); | 75 assertEquals(value_6, a[6]); |
69 assertEquals(value_7, a[7]); | 76 assertEquals(value_7, a[7]); |
70 assertEquals(undefined, a[large_array_size-1]); | 77 assertEquals(undefined, a[large_array_size-2]); |
71 assertEquals(undefined, a[-1]); | 78 assertEquals(undefined, a[-1]); |
72 assertEquals(large_array_size, a.length); | 79 assertEquals(large_array_size, a.length); |
73 assertTrue(%HasFastDoubleElements(a)); | 80 assertTrue(%HasFastDoubleElements(a)); |
74 } | 81 } |
75 | 82 |
76 function test_various_loads2(a, value_5, value_6, value_7) { | 83 function test_various_loads2(a, value_5, value_6, value_7) { |
77 assertTrue(%HasFastDoubleElements(a)); | 84 assertTrue(%HasFastDoubleElements(a)); |
78 assertEquals(value_5, a[5]); | 85 assertEquals(value_5, a[5]); |
79 assertEquals(value_6, a[6]); | 86 assertEquals(value_6, a[6]); |
80 assertEquals(value_7, a[7]); | 87 assertEquals(value_7, a[7]); |
81 assertEquals(undefined, a[large_array_size-1]); | 88 assertEquals(undefined, a[large_array_size-2]); |
82 assertEquals(undefined, a[-1]); | 89 assertEquals(undefined, a[-1]); |
83 assertEquals(large_array_size, a.length); | 90 assertEquals(large_array_size, a.length); |
84 assertTrue(%HasFastDoubleElements(a)); | 91 assertTrue(%HasFastDoubleElements(a)); |
85 } | 92 } |
86 | 93 |
87 function test_various_loads3(a, value_5, value_6, value_7) { | 94 function test_various_loads3(a, value_5, value_6, value_7) { |
88 assertTrue(%HasFastDoubleElements(a)); | 95 assertTrue(%HasFastDoubleElements(a)); |
89 assertEquals(value_5, a[5]); | 96 assertEquals(value_5, a[5]); |
90 assertEquals(value_6, a[6]); | 97 assertEquals(value_6, a[6]); |
91 assertEquals(value_7, a[7]); | 98 assertEquals(value_7, a[7]); |
92 assertEquals(undefined, a[large_array_size-1]); | 99 assertEquals(undefined, a[large_array_size-2]); |
93 assertEquals(undefined, a[-1]); | 100 assertEquals(undefined, a[-1]); |
94 assertEquals(large_array_size, a.length); | 101 assertEquals(large_array_size, a.length); |
95 assertTrue(%HasFastDoubleElements(a)); | 102 assertTrue(%HasFastDoubleElements(a)); |
96 } | 103 } |
97 | 104 |
98 function test_various_loads4(a, value_5, value_6, value_7) { | 105 function test_various_loads4(a, value_5, value_6, value_7) { |
99 assertTrue(%HasFastDoubleElements(a)); | 106 assertTrue(%HasFastDoubleElements(a)); |
100 assertEquals(value_5, a[5]); | 107 assertEquals(value_5, a[5]); |
101 assertEquals(value_6, a[6]); | 108 assertEquals(value_6, a[6]); |
102 assertEquals(value_7, a[7]); | 109 assertEquals(value_7, a[7]); |
103 assertEquals(undefined, a[large_array_size-1]); | 110 assertEquals(undefined, a[large_array_size-2]); |
104 assertEquals(undefined, a[-1]); | 111 assertEquals(undefined, a[-1]); |
105 assertEquals(large_array_size, a.length); | 112 assertEquals(large_array_size, a.length); |
106 assertTrue(%HasFastDoubleElements(a)); | 113 assertTrue(%HasFastDoubleElements(a)); |
107 } | 114 } |
108 | 115 |
109 function test_various_loads5(a, value_5, value_6, value_7) { | 116 function test_various_loads5(a, value_5, value_6, value_7) { |
110 assertTrue(%HasFastDoubleElements(a)); | 117 assertTrue(%HasFastDoubleElements(a)); |
111 assertEquals(value_5, a[5]); | 118 assertEquals(value_5, a[5]); |
112 assertEquals(value_6, a[6]); | 119 assertEquals(value_6, a[6]); |
113 assertEquals(value_7, a[7]); | 120 assertEquals(value_7, a[7]); |
114 assertEquals(undefined, a[large_array_size-1]); | 121 assertEquals(undefined, a[large_array_size-2]); |
115 assertEquals(undefined, a[-1]); | 122 assertEquals(undefined, a[-1]); |
116 assertEquals(large_array_size, a.length); | 123 assertEquals(large_array_size, a.length); |
117 assertTrue(%HasFastDoubleElements(a)); | 124 assertTrue(%HasFastDoubleElements(a)); |
118 } | 125 } |
119 | 126 |
120 function test_various_loads6(a, value_5, value_6, value_7) { | 127 function test_various_loads6(a, value_5, value_6, value_7) { |
121 assertTrue(%HasFastDoubleElements(a)); | 128 assertTrue(%HasFastDoubleElements(a)); |
122 assertEquals(value_5, a[5]); | 129 assertEquals(value_5, a[5]); |
123 assertEquals(value_6, a[6]); | 130 assertEquals(value_6, a[6]); |
124 assertEquals(value_7, a[7]); | 131 assertEquals(value_7, a[7]); |
125 assertEquals(undefined, a[large_array_size-1]); | 132 assertEquals(undefined, a[large_array_size-2]); |
126 assertEquals(undefined, a[-1]); | 133 assertEquals(undefined, a[-1]); |
127 assertEquals(large_array_size, a.length); | 134 assertEquals(large_array_size, a.length); |
128 assertTrue(%HasFastDoubleElements(a)); | 135 assertTrue(%HasFastDoubleElements(a)); |
129 } | 136 } |
130 | 137 |
131 function test_various_stores(a, value_5, value_6, value_7) { | 138 function test_various_stores(a, value_5, value_6, value_7) { |
132 assertTrue(%HasFastDoubleElements(a)); | 139 assertTrue(%HasFastDoubleElements(a)); |
133 a[5] = value_5; | 140 a[5] = value_5; |
134 a[6] = value_6; | 141 a[6] = value_6; |
135 a[7] = value_7; | 142 a[7] = value_7; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
310 test_various_stores(large_array, | 317 test_various_stores(large_array, |
311 Infinity, | 318 Infinity, |
312 -Infinity, | 319 -Infinity, |
313 expected_array_value(7)); | 320 expected_array_value(7)); |
314 | 321 |
315 test_various_loads6(large_array, | 322 test_various_loads6(large_array, |
316 Infinity, | 323 Infinity, |
317 -Infinity, | 324 -Infinity, |
318 expected_array_value(7)); | 325 expected_array_value(7)); |
319 | 326 |
327 // Test apply | |
320 assertTrue(%GetOptimizationStatus(test_various_stores) != 2); | 328 assertTrue(%GetOptimizationStatus(test_various_stores) != 2); |
321 | |
322 // Make sure that we haven't converted from fast double. | |
323 assertTrue(%HasFastDoubleElements(large_array)); | |
324 // Cause the array to grow beyond it's JSArray length. This will double the | |
325 // size of the capacity and force the array into "slow" dictionary case. | |
326 large_array[large_array_size+1] = 50; | |
327 assertTrue(%HasDictionaryElements(large_array)); | |
328 assertEquals(50, large_array[large_array_size+1]); | |
329 assertEquals(large_array_size+2, large_array.length); | |
330 assertEquals(Infinity, large_array[5]); | |
331 assertEquals(undefined, large_array[large_array_size-1]); | |
332 assertEquals(undefined, large_array[-1]); | |
333 assertEquals(large_array_size+2, large_array.length); | |
334 | |
335 // Test dictionary -> double elements -> fast elements. | |
336 var large_array2 = new allocator(large_array_size); | |
337 force_to_fast_double_array(large_array2); | |
338 delete large_array2[5]; | |
339 | |
340 // Convert back to fast elements and make sure the contents of the array are | |
341 // unchanged. | |
342 large_array2[25] = new Object(); | |
343 assertTrue(%HasFastElements(large_array2)); | |
344 for (var i= 0; i < approx_dict_to_elements_threshold; i += 500 ) { | |
345 if (i != 25 && i != 5) { | |
346 assertEquals(expected_array_value(i), large_array2[i]); | |
347 } | |
348 } | |
349 assertEquals(undefined, large_array2[5]) | |
350 assertEquals(undefined, large_array2[large_array_size-1]) | |
351 assertEquals(undefined, large_array2[-1]) | |
352 assertEquals(large_array_size, large_array2.length); | |
353 } | 329 } |
354 | 330 |
331 testOneArrayType(make_object_like_array); | |
355 testOneArrayType(Array); | 332 testOneArrayType(Array); |
333 | |
334 var large_array = new Array(large_array_size); | |
335 force_to_fast_double_array(large_array); | |
336 assertTrue(%HasFastDoubleElements(large_array)); | |
337 | |
338 // Cause the array to grow beyond it's JSArray length. This will double the | |
339 // size of the capacity and force the array into "slow" dictionary case. | |
340 large_array[5] = Infinity; | |
341 large_array[large_array_size+10001] = 50; | |
342 assertTrue(%HasDictionaryElements(large_array)); | |
343 assertEquals(50, large_array[large_array_size+10001]); | |
344 assertEquals(large_array_size+10002, large_array.length); | |
345 assertEquals(Infinity, large_array[5]); | |
346 assertEquals(undefined, large_array[large_array_size-2]); | |
347 assertEquals(undefined, large_array[-1]); | |
348 assertEquals(large_array_size+10002, large_array.length); | |
349 | |
350 // Test dictionary -> double elements -> fast elements. | |
351 var large_array2 = new Array(large_array_size); | |
352 force_to_fast_double_array(large_array2); | |
353 delete large_array2[5]; | |
354 | |
355 // Convert back to fast elements and make sure the contents of the array are | |
356 // unchanged. | |
357 large_array2[25] = new Object(); | |
358 assertTrue(%HasFastElements(large_array2)); | |
359 for (var i= 0; i < approx_dict_to_elements_threshold; i += 500 ) { | |
360 if (i != 25 && i != 5) { | |
361 assertEquals(expected_array_value(i), large_array2[i]); | |
362 } | |
363 } | |
364 assertEquals(undefined, large_array2[5]); | |
365 assertEquals(undefined, large_array2[large_array_size-2]); | |
366 assertEquals(undefined, large_array2[-1]); | |
367 assertEquals(large_array_size, large_array2.length); | |
368 | |
369 // Make sure it's possible to change the array's length and that array is still | |
370 // intact after the resize. | |
371 var large_array3 = new Array(large_array_size); | |
372 force_to_fast_double_array(large_array3); | |
373 large_array3.length = 60000; | |
374 assertEquals(60000, large_array3.length); | |
375 assertEquals(undefined, large_array3[60000]); | |
376 assertTrue(%HasFastDoubleElements(large_array3)); | |
377 assertEquals(expected_array_value(5), large_array3[5]); | |
378 assertEquals(expected_array_value(6), large_array3[6]); | |
379 assertEquals(expected_array_value(7), large_array3[7]); | |
Mads Ager (chromium)
2011/07/19 09:23:06
Test the element at "length - 1"?
danno
2011/07/19 15:47:19
Done.
| |
380 assertEquals(undefined, large_array3[large_array_size-2]); | |
381 assertEquals(undefined, large_array3[-1]); | |
382 | |
383 large_array3.length = 25; | |
384 assertEquals(25, large_array3.length); | |
385 assertTrue(%HasFastDoubleElements(large_array3)); | |
386 assertEquals(undefined, large_array3[25]); | |
387 assertEquals(expected_array_value(5), large_array3[5]); | |
388 assertEquals(expected_array_value(6), large_array3[6]); | |
389 assertEquals(expected_array_value(7), large_array3[7]); | |
390 assertEquals(undefined, large_array3[large_array_size-2]); | |
391 assertEquals(undefined, large_array3[-1]); | |
392 | |
393 large_array3.length = 100; | |
394 assertEquals(100, large_array3.length); | |
395 large_array3[95] = 95; | |
396 assertTrue(%HasFastDoubleElements(large_array3)); | |
397 assertEquals(undefined, large_array3[100]); | |
398 assertEquals(95, large_array3[95]); | |
399 assertEquals(expected_array_value(5), large_array3[5]); | |
400 assertEquals(expected_array_value(6), large_array3[6]); | |
401 assertEquals(expected_array_value(7), large_array3[7]); | |
402 assertEquals(undefined, large_array3[large_array_size-2]); | |
403 assertEquals(undefined, large_array3[-1]); | |
OLD | NEW |