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

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

Issue 7400020: Implement setting the length of FixedDoubleArrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix nits Created 9 years, 5 months 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
« src/objects.cc ('K') | « src/objects-inl.h ('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 10 matching lines...) Expand all
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
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]);
OLDNEW
« src/objects.cc ('K') | « src/objects-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698