Index: test/mjsunit/unbox-double-arrays.js |
diff --git a/test/mjsunit/unbox-double-arrays.js b/test/mjsunit/unbox-double-arrays.js |
index 31918b3767b3afca85755466e3756662d57d37fd..53d6b875575c2fdecf36255737bd19bd682bed94 100644 |
--- a/test/mjsunit/unbox-double-arrays.js |
+++ b/test/mjsunit/unbox-double-arrays.js |
@@ -27,52 +27,255 @@ |
// Test dictionary -> double elements -> dictionary elements round trip |
-var foo = new Array(500000); |
+// Flags: --allow-natives-syntax --unbox-double-arrays |
+var large_array_size = 500000; |
+var approx_dict_to_elements_threshold = 69000; |
-function func(a) { |
- for (var i= 0; i < 100000; ++i ) { |
- a[i] = i+0.5; |
+function expected_array_value(i) { |
+ if ((i % 2) == 0) { |
+ return i; |
+ } else { |
+ return i + 0.5; |
} |
} |
-func(foo); |
- |
-for (var i= 0; i < 100000; i += 500 ) { |
- assertEquals(i+0.5, foo[i]); |
+function force_to_fast_double_array(a) { |
+ for (var i= 0; i < approx_dict_to_elements_threshold; ++i ) { |
+ a[i] = expected_array_value(i); |
+ } |
+ assertTrue(%HasFastDoubleElements(a)); |
} |
-delete foo[5]; |
-// Don't use assertEquals for comparison to undefined due to |
-assertTrue(undefined === foo[5]); |
-assertTrue(undefined === foo[500000-1]); |
-assertTrue(undefined === foo[-1]); |
-assertEquals(500000, foo.length); |
- |
-// Cause the array to grow beyond it's JSArray length. This will double the |
-// size of the capacity and force the array into "slow" dictionary case. |
-foo[500001] = 50; |
-assertEquals(50, foo[500001]); |
-assertEquals(500002, foo.length); |
-assertTrue(undefined === foo[5]) |
-assertTrue(undefined === foo[500000-1]) |
-assertTrue(undefined === foo[-1]) |
-assertEquals(500002, foo.length); |
- |
-// Test dictionary -> double elements -> fast elements. |
- |
-var foo2 = new Array(500000); |
-func(foo2); |
-delete foo2[5]; |
- |
-// Convert back to fast elements and make sure the contents of the array are |
-// unchanged. |
-foo2[25] = new Object(); |
-for (var i= 0; i < 100000; i += 500 ) { |
- if (i != 25 && i != 5) { |
- assertEquals(i+0.5, foo2[i]); |
+function testOneArrayType(allocator) { |
+ var large_array = new allocator(500000); |
+ force_to_fast_double_array(large_array); |
+ |
+ for (var i= 0; i < approx_dict_to_elements_threshold; i += 501 ) { |
+ assertEquals(expected_array_value(i), large_array[i]); |
+ } |
+ |
+ function get_test_various_loads() { |
+ return function test_various_loads(a, value_5, value_6, value_7) { |
+ assertTrue(%HasFastDoubleElements(a)); |
+ assertEquals(value_5, a[5]); |
+ assertEquals(value_6, a[6]); |
+ assertEquals(value_7, a[7]); |
+ assertEquals(undefined, a[large_array_size-1]); |
+ assertEquals(undefined, a[-1]); |
+ assertEquals(large_array_size, a.length); |
+ assertTrue(%HasFastDoubleElements(a)); |
+ } |
+ } |
+ |
+ function get_test_various_stores() { |
+ return function test_various_stores(a, value_5, value_6, value_7) { |
+ assertTrue(%HasFastDoubleElements(a)); |
+ a[5] = value_5; |
+ a[6] = value_6; |
+ a[7] = value_7; |
+ assertTrue(%HasFastDoubleElements(a)); |
+ } |
+ } |
+ |
+ // Run tests up to three times to make sure both runtime and IC implementation |
+ // (premonomorphic and monomorphic) of KeyedLoad access works in various |
+ // cases. |
+ |
+ // Test double and integer values |
+ test_various_loads = get_test_various_loads(); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ |
+ // Test NaN values |
+ test_various_stores = get_test_various_stores(); |
+ test_various_stores(large_array, NaN, -NaN, expected_array_value(7)); |
+ |
+ test_various_loads(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(7)); |
+ |
+ // Test Infinity values |
+ test_various_stores = get_test_various_stores(); |
+ test_various_stores(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ |
+ test_various_loads(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ |
+ // Test the hole for the default runtime implementation. |
+ delete large_array[5]; |
+ delete large_array[6]; |
+ test_various_loads = get_test_various_loads(); |
+ test_various_loads(large_array, |
+ undefined, |
+ undefined, |
+ expected_array_value(7)); |
+ |
+ // Test the keyed load IC implementation when the value is the hole. |
+ test_various_loads = get_test_various_loads(); |
+ test_various_stores(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ delete large_array[5]; |
+ delete large_array[6]; |
+ test_various_loads(large_array, |
+ undefined, |
+ undefined, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ undefined, |
+ undefined, |
+ expected_array_value(7)); |
+ |
+ // Test both runtime and IC variants of double array stores for normal |
+ // values (double and integer). |
+ test_various_stores = get_test_various_stores(); |
+ test_various_stores(large_array, |
+ expected_array_value(4), |
+ expected_array_value(5), |
+ expected_array_value(6)); |
+ test_various_loads(large_array, |
+ expected_array_value(4), |
+ expected_array_value(5), |
+ expected_array_value(6)); |
+ test_various_stores(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ |
+ // Test stores of NaN to make sure they don't get mistaken for the |
+ // hole. Test both runtime and IC implementation. |
+ test_various_stores = get_test_various_stores(); |
+ test_various_stores(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(6)); |
+ test_various_loads(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(6)); |
+ test_various_stores(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_stores(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ NaN, |
+ -NaN, |
+ expected_array_value(7)); |
+ |
+ // Test stores of Infinity to make sure they don't get mistaken for the |
+ // hole. Test both runtime and IC implementation. |
+ test_various_stores = get_test_various_stores(); |
+ test_various_stores(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(6)); |
+ test_various_loads(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(6)); |
+ test_various_stores(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ expected_array_value(5), |
+ expected_array_value(6), |
+ expected_array_value(7)); |
+ test_various_stores(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ test_various_loads(large_array, |
+ Infinity, |
+ -Infinity, |
+ expected_array_value(7)); |
+ |
+ delete large_array[5]; |
+ |
+ // Make sure that we haven't converted from fast double. |
+ assertTrue(%HasFastDoubleElements(large_array)); |
+ // Cause the array to grow beyond it's JSArray length. This will double the |
+ // size of the capacity and force the array into "slow" dictionary case. |
+ large_array[large_array_size+1] = 50; |
+ assertTrue(%HasDictionaryElements(large_array)); |
+ assertEquals(50, large_array[large_array_size+1]); |
+ assertEquals(large_array_size+2, large_array.length); |
+ assertEquals(undefined, large_array[5]); |
+ assertEquals(undefined, large_array[large_array_size-1]); |
+ assertEquals(undefined, large_array[-1]); |
+ assertEquals(large_array_size+2, large_array.length); |
+ |
+ // Test dictionary -> double elements -> fast elements. |
+ var large_array2 = new allocator(large_array_size); |
+ force_to_fast_double_array(large_array2); |
+ delete large_array2[5]; |
+ |
+ // Convert back to fast elements and make sure the contents of the array are |
+ // unchanged. |
+ large_array2[25] = new Object(); |
+ assertTrue(%HasFastElements(large_array2)); |
+ for (var i= 0; i < approx_dict_to_elements_threshold; i += 500 ) { |
+ if (i != 25 && i != 5) { |
+ assertEquals(expected_array_value(i), large_array2[i]); |
+ } |
} |
+ assertEquals(undefined, large_array2[5]) |
+ assertEquals(undefined, large_array2[large_array_size-1]) |
+ assertEquals(undefined, large_array2[-1]) |
+ assertEquals(large_array_size, large_array2.length); |
} |
-assertTrue(undefined === foo2[5]) |
-assertTrue(undefined === foo2[500000-1]) |
-assertTrue(undefined === foo2[-1]) |
-assertEquals(500000, foo2.length); |
+ |
+testOneArrayType(Array); |