| 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..312955bde94df50688c6b84e76a3bd666c9d0888 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;
|
| @@ -49,40 +51,100 @@ function force_to_fast_double_array(a) {
|
| function testOneArrayType(allocator) {
|
| var large_array = new allocator(500000);
|
| force_to_fast_double_array(large_array);
|
| + var six = 6;
|
|
|
| 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));
|
| - }
|
| + // This function has a constant and won't get inlined.
|
| + function computed_6() {
|
| + return six;
|
| }
|
|
|
| - 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));
|
| - }
|
| + // 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_6, a[computed_6()]); // Test non-constant key
|
| + 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_loads2(a, value_5, value_6, value_7) {
|
| + assertTrue(%HasFastDoubleElements(a));
|
| + assertEquals(value_5, a[5]);
|
| + assertEquals(value_6, a[6]);
|
| + assertEquals(value_6, a[computed_6()]); // Test non-constant key
|
| + 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_6, a[computed_6()]); // Test non-constant key
|
| + 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_6, a[computed_6()]); // Test non-constant key
|
| + 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_6, a[computed_6()]); // Test non-constant key
|
| + 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_6, a[computed_6()]); // Test non-constant key
|
| + 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[computed_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 +157,165 @@ 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));
|
|
|
| // 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));
|
|
|
| // 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));
|
|
|
| // 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));
|
|
|
| // 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();
|
| + // 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_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));
|
| - 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();
|
| + delete large_array[5];
|
| + delete large_array[6];
|
| + test_various_loads6(large_array,
|
| + undefined,
|
| + undefined,
|
| + expected_array_value(7));
|
| +
|
| + // 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 +325,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);
|
|
|