| Index: test/mjsunit/array-constructor-feedback.js
|
| diff --git a/test/mjsunit/regress/regress-crbug-245480.js b/test/mjsunit/array-constructor-feedback.js
|
| similarity index 54%
|
| copy from test/mjsunit/regress/regress-crbug-245480.js
|
| copy to test/mjsunit/array-constructor-feedback.js
|
| index 4769486403cc43c39b243b499c763eadaaed9578..d723121eef4ac6ea5c4410f98660a0d8deaadc6c 100644
|
| --- a/test/mjsunit/regress/regress-crbug-245480.js
|
| +++ b/test/mjsunit/array-constructor-feedback.js
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2013 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -37,6 +37,7 @@
|
|
|
| // support_smi_only_arrays = %HasFastSmiElements(new Array(1,2,3,4,5,6,7,8));
|
| support_smi_only_arrays = true;
|
| +optimize_constructed_arrays = true;
|
|
|
| if (support_smi_only_arrays) {
|
| print("Tests include smi-only arrays.");
|
| @@ -44,47 +45,62 @@ if (support_smi_only_arrays) {
|
| print("Tests do NOT include smi-only arrays.");
|
| }
|
|
|
| -function isHoley(obj) {
|
| - if (%HasFastHoleyElements(obj)) return true;
|
| - return false;
|
| +if (optimize_constructed_arrays) {
|
| + print("Tests include constructed array optimizations.");
|
| +} else {
|
| + print("Tests do NOT include constructed array optimizations.");
|
| }
|
|
|
| -function assertHoley(obj, name_opt) {
|
| - assertEquals(true, isHoley(obj), name_opt);
|
| +var elements_kind = {
|
| + fast_smi_only : 'fast smi only elements',
|
| + fast : 'fast elements',
|
| + fast_double : 'fast double elements',
|
| + dictionary : 'dictionary elements',
|
| + external_byte : 'external byte elements',
|
| + external_unsigned_byte : 'external unsigned byte elements',
|
| + external_short : 'external short elements',
|
| + external_unsigned_short : 'external unsigned short elements',
|
| + external_int : 'external int elements',
|
| + external_unsigned_int : 'external unsigned int elements',
|
| + external_float : 'external float elements',
|
| + external_double : 'external double elements',
|
| + external_pixel : 'external pixel elements'
|
| }
|
|
|
| -function assertNotHoley(obj, name_opt) {
|
| - assertEquals(false, isHoley(obj), name_opt);
|
| +function getKind(obj) {
|
| + if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only;
|
| + if (%HasFastObjectElements(obj)) return elements_kind.fast;
|
| + if (%HasFastDoubleElements(obj)) return elements_kind.fast_double;
|
| + if (%HasDictionaryElements(obj)) return elements_kind.dictionary;
|
| }
|
|
|
| -if (support_smi_only_arrays) {
|
| - function create_array(arg) {
|
| - return new Array(arg);
|
| - }
|
| -
|
| - obj = create_array(0);
|
| - assertNotHoley(obj);
|
| - create_array(0);
|
| - %OptimizeFunctionOnNextCall(create_array);
|
| - obj = create_array(10);
|
| - assertHoley(obj);
|
| +function isHoley(obj) {
|
| + if (%HasFastHoleyElements(obj)) return true;
|
| + return false;
|
| }
|
|
|
| -// The code below would assert in debug or crash in release
|
| -function f(length) {
|
| - return new Array(length)
|
| +function assertKind(expected, obj, name_opt) {
|
| + if (!support_smi_only_arrays &&
|
| + expected == elements_kind.fast_smi_only) {
|
| + expected = elements_kind.fast;
|
| + }
|
| + assertEquals(expected, getKind(obj), name_opt);
|
| }
|
|
|
| -f(0);
|
| -f(0);
|
| -%OptimizeFunctionOnNextCall(f);
|
| -var a = f(10);
|
| +if (support_smi_only_arrays && optimize_constructed_arrays) {
|
| + function bar0(t) {
|
| + return new t();
|
| + }
|
|
|
| -function g(a) {
|
| - return a[0];
|
| + a = bar0(Array);
|
| + a[0] = 3.5;
|
| + b = bar0(Array);
|
| + assertKind(elements_kind.fast_double, b);
|
| + %OptimizeFunctionOnNextCall(bar0);
|
| + b = bar0(Array);
|
| + assertKind(elements_kind.fast_double, b);
|
| + assertTrue(2 != %GetOptimizationStatus(bar0));
|
| + // bar0 should deopt
|
| + b = bar0(Object);
|
| + assertTrue(1 != %GetOptimizationStatus(bar0));
|
| }
|
| -
|
| -var b = [0];
|
| -g(b);
|
| -g(b);
|
| -assertEquals(undefined, g(a));
|
|
|