| Index: test/mjsunit/array-literal-transitions.js
|
| diff --git a/test/mjsunit/array-literal-transitions.js b/test/mjsunit/array-literal-transitions.js
|
| index 321340c4b63c7102c7890b0321d027b275c26e05..519c12d6fc9e6727a43a7efbc1e1f6d9251d6cb3 100644
|
| --- a/test/mjsunit/array-literal-transitions.js
|
| +++ b/test/mjsunit/array-literal-transitions.js
|
| @@ -122,4 +122,76 @@ if (support_smi_only_arrays) {
|
| }
|
| %OptimizeFunctionOnNextCall(test_large_literal);
|
| test_large_literal();
|
| +
|
| + function deopt_array(use_literal) {
|
| + if (use_literal) {
|
| + return [.5, 3, 4];
|
| + } else {
|
| + return new Array();
|
| + }
|
| + }
|
| +
|
| + deopt_array(false);
|
| + deopt_array(false);
|
| + deopt_array(false);
|
| + %OptimizeFunctionOnNextCall(deopt_array);
|
| + var array = deopt_array(false);
|
| + assertTrue(2 != %GetOptimizationStatus(deopt_array));
|
| + deopt_array(true);
|
| + assertTrue(1 != %GetOptimizationStatus(deopt_array));
|
| + array = deopt_array(false);
|
| + assertTrue(1 != %GetOptimizationStatus(deopt_array));
|
| +
|
| + // Check that unexpected changes in the objects stored into the boilerplate
|
| + // also force a deopt.
|
| + function deopt_array_literal_all_smis(a) {
|
| + return [0, 1, a];
|
| + }
|
| +
|
| + deopt_array_literal_all_smis(2);
|
| + deopt_array_literal_all_smis(3);
|
| + deopt_array_literal_all_smis(4);
|
| + array = deopt_array_literal_all_smis(4);
|
| + assertEquals(0, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(4, array[2]);
|
| + %OptimizeFunctionOnNextCall(deopt_array_literal_all_smis);
|
| + array = deopt_array_literal_all_smis(5);
|
| + array = deopt_array_literal_all_smis(6);
|
| + assertTrue(2 != %GetOptimizationStatus(deopt_array_literal_all_smis));
|
| + assertEquals(0, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(6, array[2]);
|
| +
|
| + array = deopt_array_literal_all_smis(.5);
|
| + assertTrue(1 != %GetOptimizationStatus(deopt_array_literal_all_smis));
|
| + assertEquals(0, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(.5, array[2]);
|
| +
|
| + function deopt_array_literal_all_doubles(a) {
|
| + return [0.5, 1, a];
|
| + }
|
| +
|
| + deopt_array_literal_all_doubles(.5);
|
| + deopt_array_literal_all_doubles(.5);
|
| + deopt_array_literal_all_doubles(.5);
|
| + array = deopt_array_literal_all_doubles(0.5);
|
| + assertEquals(0.5, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(0.5, array[2]);
|
| + %OptimizeFunctionOnNextCall(deopt_array_literal_all_doubles);
|
| + array = deopt_array_literal_all_doubles(5);
|
| + array = deopt_array_literal_all_doubles(6);
|
| + assertTrue(2 != %GetOptimizationStatus(deopt_array_literal_all_doubles));
|
| + assertEquals(0.5, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(6, array[2]);
|
| +
|
| + var foo = new Object();
|
| + array = deopt_array_literal_all_doubles(foo);
|
| + assertTrue(1 != %GetOptimizationStatus(deopt_array_literal_all_doubles));
|
| + assertEquals(0.5, array[0]);
|
| + assertEquals(1, array[1]);
|
| + assertEquals(foo, array[2]);
|
| }
|
|
|