| Index: test/mjsunit/allocation-site-info.js
|
| diff --git a/test/mjsunit/allocation-site-info.js b/test/mjsunit/allocation-site-info.js
|
| index d57fd321e43c4b71bcc2a827629ac403ed144bd7..a9b9838e4396dd1917f3237c26fea03b5710fc6a 100644
|
| --- a/test/mjsunit/allocation-site-info.js
|
| +++ b/test/mjsunit/allocation-site-info.js
|
| @@ -26,7 +26,8 @@
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| // Flags: --allow-natives-syntax --smi-only-arrays --expose-gc
|
| -// Flags: --track-allocation-sites --nooptimize-constructed-arrays
|
| +// Flags: --track-allocation-sites --noalways-opt
|
| +// Flags: --nooptimize-constructed-arrays
|
|
|
| // TODO(mvstanton): remove --nooptimize-constructed-arrays and enable
|
| // the constructed array code below when the feature is turned on
|
| @@ -146,12 +147,17 @@ if (support_smi_only_arrays) {
|
| obj = fastliteralcase(get_standard_literal(), 2);
|
| assertKind(elements_kind.fast_double, obj);
|
|
|
| - obj = fastliteralcase([5, 3, 2], 1.5);
|
| - assertKind(elements_kind.fast_double, obj);
|
| - obj = fastliteralcase([3, 6, 2], 1.5);
|
| - assertKind(elements_kind.fast_double, obj);
|
| - obj = fastliteralcase([2, 6, 3], 2);
|
| - assertKind(elements_kind.fast_smi_only, obj);
|
| + // The test below is in a loop because arrays that live
|
| + // at global scope without the chance of being recreated
|
| + // don't have allocation site information attached.
|
| + for(i=0;i<2;i++) {
|
| + obj = fastliteralcase([5, 3, 2], 1.5);
|
| + assertKind(elements_kind.fast_double, obj);
|
| + obj = fastliteralcase([3, 6, 2], 1.5);
|
| + assertKind(elements_kind.fast_double, obj);
|
| + obj = fastliteralcase([2, 6, 3], 2);
|
| + assertKind(elements_kind.fast_smi_only, obj);
|
| + }
|
|
|
| // Verify that we will not pretransition the double->fast path.
|
| obj = fastliteralcase(get_standard_literal(), "elliot");
|
| @@ -162,6 +168,12 @@ if (support_smi_only_arrays) {
|
| // obj = fastliteralcase(3);
|
| // assertKind(elements_kind.fast_double, obj);
|
|
|
| + // Make sure this works in crankshafted code too.
|
| + %OptimizeFunctionOnNextCall(get_standard_literal);
|
| + get_standard_literal();
|
| + obj = get_standard_literal();
|
| + assertKind(elements_kind.fast_double, obj);
|
| +
|
| function fastliteralcase_smifast(value) {
|
| var literal = [1, 2, 3, 4];
|
| literal[0] = value;
|
| @@ -269,4 +281,89 @@ if (support_smi_only_arrays) {
|
| obj = newarraycase_list_smiobj(2);
|
| assertKind(elements_kind.fast, obj);
|
| }
|
| +
|
| + // Make sure we handle nested arrays
|
| + function get_nested_literal() {
|
| + var literal = [[1,2,3,4], [2], [3]];
|
| + return literal;
|
| + }
|
| +
|
| + obj = get_nested_literal();
|
| + assertKind(elements_kind.fast, obj);
|
| + assertKind(elements_kind.fast_smi_only, obj[0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[1]);
|
| + assertKind(elements_kind.fast_smi_only, obj[2]);
|
| + obj[0][0] = 3.5;
|
| + obj[2][0] = "hello";
|
| + assertKind(elements_kind.fast_double, obj[0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[1]);
|
| + assertKind(elements_kind.fast, obj[2]);
|
| + obj = get_nested_literal();
|
| + assertKind(elements_kind.fast, obj);
|
| + assertKind(elements_kind.fast_double, obj[0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[1]);
|
| + assertKind(elements_kind.fast, obj[2]);
|
| +
|
| + // A more complex nested literal case.
|
| + function get_deep_nested_literal() {
|
| + var literal = [[1], [[2], "hello"], 3, [4]];
|
| + return literal;
|
| + }
|
| +
|
| + obj = get_deep_nested_literal();
|
| + assertKind(elements_kind.fast_smi_only, obj[0]);
|
| + assertKind(elements_kind.fast, obj[1]);
|
| + assertKind(elements_kind.fast_smi_only, obj[1][0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[3]);
|
| + obj[0][0] = 3.5;
|
| + obj[1][0][0] = "goodbye";
|
| +
|
| + assertKind(elements_kind.fast_double, obj[0]);
|
| + assertKind(elements_kind.fast, obj[1]);
|
| + assertKind(elements_kind.fast, obj[1][0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[3]);
|
| +
|
| + obj = get_deep_nested_literal();
|
| +
|
| + assertKind(elements_kind.fast_double, obj[0]);
|
| + assertKind(elements_kind.fast, obj[1]);
|
| + assertKind(elements_kind.fast, obj[1][0]);
|
| + assertKind(elements_kind.fast_smi_only, obj[3]);
|
| +
|
| + // A literal in an object
|
| + function get_object_literal() {
|
| + var literal = {
|
| + array: [1,2,3],
|
| + data: 3.5
|
| + };
|
| + return literal;
|
| + }
|
| +
|
| + obj = get_object_literal();
|
| + assertKind(elements_kind.fast_smi_only, obj.array);
|
| + obj.array[1] = 3.5;
|
| + assertKind(elements_kind.fast_double, obj.array);
|
| + obj = get_object_literal();
|
| + assertKind(elements_kind.fast_double, obj.array);
|
| +
|
| + function get_nested_object_literal() {
|
| + var literal = {
|
| + array: [[1],[2],[3]],
|
| + data: 3.5
|
| + };
|
| + return literal;
|
| + }
|
| +
|
| + obj = get_nested_object_literal();
|
| + assertKind(elements_kind.fast, obj.array);
|
| + assertKind(elements_kind.fast_smi_only, obj.array[1]);
|
| + obj.array[1][0] = 3.5;
|
| + assertKind(elements_kind.fast_double, obj.array[1]);
|
| + obj = get_nested_object_literal();
|
| + assertKind(elements_kind.fast_double, obj.array[1]);
|
| +
|
| + %OptimizeFunctionOnNextCall(get_nested_object_literal);
|
| + get_nested_object_literal();
|
| + obj = get_nested_object_literal();
|
| + assertKind(elements_kind.fast_double, obj.array[1]);
|
| }
|
|
|