Chromium Code Reviews| Index: test/mjsunit/unbox-double-arrays.js |
| diff --git a/test/mjsunit/unbox-double-arrays.js b/test/mjsunit/unbox-double-arrays.js |
| index 53d6b875575c2fdecf36255737bd19bd682bed94..a603e00c05ddba73638cca4153036710f9215006 100644 |
| --- a/test/mjsunit/unbox-double-arrays.js |
| +++ b/test/mjsunit/unbox-double-arrays.js |
| @@ -27,10 +27,12 @@ |
| // Test dictionary -> double elements -> dictionary elements round trip |
| -// Flags: --allow-natives-syntax --unbox-double-arrays |
| +// Flags: --allow-natives-syntax --unbox-double-arrays --expose-gc |
| var large_array_size = 500000; |
| var approx_dict_to_elements_threshold = 69000; |
| +var name = 0; |
| + |
| function expected_array_value(i) { |
| if ((i % 2) == 0) { |
| return i; |
| @@ -46,6 +48,10 @@ function force_to_fast_double_array(a) { |
| assertTrue(%HasFastDoubleElements(a)); |
| } |
| +function flush_compiled_code() { |
|
Mads Ager (chromium)
2011/07/19 08:03:51
Do you need both flush_compiled_code and multiple
danno
2011/07/19 12:50:17
Done.
|
| + gc(); |
| +} |
| + |
| function testOneArrayType(allocator) { |
| var large_array = new allocator(500000); |
| force_to_fast_double_array(large_array); |
| @@ -54,35 +60,83 @@ function testOneArrayType(allocator) { |
| 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)); |
| - } |
| + // Multiple versions of the test function makes sure that IC/Crankshaft state |
| + // doesn't get reused. |
| + 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)); |
| - } |
| + function test_various_loads2(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 test_various_loads3(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 test_various_loads4(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)); |
| } |
| - // Run tests up to three times to make sure both runtime and IC implementation |
| - // (premonomorphic and monomorphic) of KeyedLoad access works in various |
| - // cases. |
| + function test_various_loads5(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 test_various_loads6(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 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)); |
| + } |
| // 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), |
| @@ -95,155 +149,175 @@ function testOneArrayType(allocator) { |
| expected_array_value(5), |
| expected_array_value(6), |
| expected_array_value(7)); |
| + %OptimizeFunctionOnNextCall(test_various_loads); |
| + test_various_loads(large_array, |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + |
| + flush_compiled_code(); |
| // 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_various_loads2(large_array, |
| + NaN, |
| + -NaN, |
| + expected_array_value(7)); |
| + test_various_loads2(large_array, |
| + NaN, |
| + -NaN, |
| + expected_array_value(7)); |
| + test_various_loads2(large_array, |
| + NaN, |
| + -NaN, |
| + expected_array_value(7)); |
| + %OptimizeFunctionOnNextCall(test_various_loads2); |
| + test_various_loads2(large_array, |
| + NaN, |
| + -NaN, |
| + expected_array_value(7)); |
| + |
| + flush_compiled_code(); |
| // 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_various_loads3(large_array, |
| + Infinity, |
| + -Infinity, |
| + expected_array_value(7)); |
| + test_various_loads3(large_array, |
| + Infinity, |
| + -Infinity, |
| + expected_array_value(7)); |
| + test_various_loads3(large_array, |
| + Infinity, |
| + -Infinity, |
| + expected_array_value(7)); |
| + %OptimizeFunctionOnNextCall(test_various_loads3); |
| + test_various_loads3(large_array, |
| + Infinity, |
| + -Infinity, |
| + expected_array_value(7)); |
| + |
| + flush_compiled_code(); |
| // 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_various_loads4(large_array, |
| + undefined, |
| + undefined, |
| + expected_array_value(7)); |
| + |
| + flush_compiled_code(); |
| // 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)); |
| + test_various_loads5(large_array, |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + test_various_loads5(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_various_loads5(large_array, |
| + undefined, |
| + undefined, |
| + expected_array_value(7)); |
| + test_various_loads5(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(); |
| + flush_compiled_code(); |
| + |
| + // Make sure Crankshaft code handles the hole correctly (bailout) |
| 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(6), |
| + expected_array_value(7)); |
| + test_various_loads6(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_loads6(large_array, |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + %OptimizeFunctionOnNextCall(test_various_loads6); |
| + test_various_loads6(large_array, |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + |
| + delete large_array[5]; |
| + delete large_array[6]; |
| + test_various_loads6(large_array, |
| + undefined, |
| + undefined, |
| + 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 stores for non-NaN. |
| + %OptimizeFunctionOnNextCall(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)); |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + |
| 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_loads6(large_array, |
| + expected_array_value(5), |
| + expected_array_value(6), |
| + expected_array_value(7)); |
| + |
| + // Test NaN behavior for stores. |
| test_various_stores(large_array, |
| NaN, |
| -NaN, |
| expected_array_value(7)); |
| - test_various_loads(large_array, |
| + |
| + test_various_stores(large_array, |
| NaN, |
| -NaN, |
| - expected_array_value(7)); |
| + expected_array_value(7)); |
| + |
| + test_various_loads6(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 Infinity behavior for 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, |
| + |
| + test_various_loads6(large_array, |
| Infinity, |
| -Infinity, |
| - expected_array_value(7)); |
| + expected_array_value(7)); |
| - delete large_array[5]; |
| + assertTrue(%GetOptimizationStatus(test_various_stores) != 2); |
| // Make sure that we haven't converted from fast double. |
| assertTrue(%HasFastDoubleElements(large_array)); |
| @@ -253,7 +327,7 @@ function testOneArrayType(allocator) { |
| 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(Infinity, large_array[5]); |
| assertEquals(undefined, large_array[large_array_size-1]); |
| assertEquals(undefined, large_array[-1]); |
| assertEquals(large_array_size+2, large_array.length); |