| Index: test/mjsunit/array-feedback.js
|
| diff --git a/test/mjsunit/array-feedback.js b/test/mjsunit/array-feedback.js
|
| index 75a5358a4fd849eeab51cbff2353eb3d82a837cf..bae6046305b87dfbdd11ef02ba62298baf58e73b 100644
|
| --- a/test/mjsunit/array-feedback.js
|
| +++ b/test/mjsunit/array-feedback.js
|
| @@ -25,25 +25,9 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| -// Flags: --allow-natives-syntax --smi-only-arrays --expose-gc
|
| +// Flags: --allow-natives-syntax --expose-gc
|
| // Flags: --noalways-opt
|
|
|
| -// Test element kind of objects.
|
| -// Since --smi-only-arrays affects builtins, its default setting at compile
|
| -// time sticks if built with snapshot. If --smi-only-arrays is deactivated
|
| -// by default, only a no-snapshot build actually has smi-only arrays enabled
|
| -// in this test case. Depending on whether smi-only arrays are actually
|
| -// enabled, this test takes the appropriate code path to check smi-only arrays.
|
| -
|
| -// support_smi_only_arrays = %HasFastSmiElements(new Array(1,2,3,4,5,6,7,8));
|
| -support_smi_only_arrays = true;
|
| -
|
| -if (support_smi_only_arrays) {
|
| - print("Tests include smi-only arrays.");
|
| -} else {
|
| - print("Tests do NOT include smi-only arrays.");
|
| -}
|
| -
|
| var elements_kind = {
|
| fast_smi_only : 'fast smi only elements',
|
| fast : 'fast elements',
|
| @@ -73,160 +57,153 @@ function isHoley(obj) {
|
| }
|
|
|
| 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);
|
| }
|
|
|
| -if (support_smi_only_arrays) {
|
| -
|
| - // Verify that basic elements kind feedback works for non-constructor
|
| - // array calls (as long as the call is made through an IC, and not
|
| - // a CallStub).
|
| - (function (){
|
| - function create0() {
|
| - return Array();
|
| - }
|
| -
|
| - // Calls through ICs need warm up through uninitialized, then
|
| - // premonomorphic first.
|
| - create0();
|
| - a = create0();
|
| - assertKind(elements_kind.fast_smi_only, a);
|
| - a[0] = 3.5;
|
| - b = create0();
|
| - assertKind(elements_kind.fast_double, b);
|
| -
|
| - function create1(arg) {
|
| - return Array(arg);
|
| - }
|
| -
|
| - create1(0);
|
| - create1(0);
|
| - a = create1(0);
|
| - assertFalse(isHoley(a));
|
| - assertKind(elements_kind.fast_smi_only, a);
|
| - a[0] = "hello";
|
| - b = create1(10);
|
| - assertTrue(isHoley(b));
|
| - assertKind(elements_kind.fast, b);
|
| -
|
| - a = create1(100000);
|
| - assertKind(elements_kind.dictionary, a);
|
| -
|
| - function create3(arg1, arg2, arg3) {
|
| - return Array(arg1, arg2, arg3);
|
| - }
|
| -
|
| - create3(1,2,3);
|
| - create3(1,2,3);
|
| - a = create3(1,2,3);
|
| - a[0] = 3.035;
|
| - assertKind(elements_kind.fast_double, a);
|
| - b = create3(1,2,3);
|
| - assertKind(elements_kind.fast_double, b);
|
| - assertFalse(isHoley(b));
|
| - })();
|
| -
|
| -
|
| - // Verify that keyed calls work
|
| - (function (){
|
| - function create0(name) {
|
| - return this[name]();
|
| - }
|
| -
|
| - name = "Array";
|
| - create0(name);
|
| - create0(name);
|
| - a = create0(name);
|
| - a[0] = 3.5;
|
| - b = create0(name);
|
| - assertKind(elements_kind.fast_double, b);
|
| - })();
|
| -
|
| -
|
| - // Verify that feedback is turned off if the call site goes megamorphic.
|
| - (function (){
|
| - function foo(arg) { return arg(); }
|
| - foo(Array);
|
| - foo(function() {});
|
| - foo(Array);
|
| -
|
| - gc();
|
| -
|
| - a = foo(Array);
|
| - a[0] = 3.5;
|
| - b = foo(Array);
|
| - // b doesn't benefit from elements kind feedback at a megamorphic site.
|
| - assertKind(elements_kind.fast_smi_only, b);
|
| - })();
|
| -
|
| -
|
| - // Verify that crankshaft consumes type feedback.
|
| - (function (){
|
| - function create0() {
|
| - return Array();
|
| - }
|
| -
|
| - create0();
|
| - create0();
|
| - a = create0();
|
| - a[0] = 3.5;
|
| +// Verify that basic elements kind feedback works for non-constructor
|
| +// array calls (as long as the call is made through an IC, and not
|
| +// a CallStub).
|
| +(function (){
|
| + function create0() {
|
| + return Array();
|
| + }
|
| +
|
| + // Calls through ICs need warm up through uninitialized, then
|
| + // premonomorphic first.
|
| + create0();
|
| + a = create0();
|
| + assertKind(elements_kind.fast_smi_only, a);
|
| + a[0] = 3.5;
|
| + b = create0();
|
| + assertKind(elements_kind.fast_double, b);
|
| +
|
| + function create1(arg) {
|
| + return Array(arg);
|
| + }
|
| +
|
| + create1(0);
|
| + create1(0);
|
| + a = create1(0);
|
| + assertFalse(isHoley(a));
|
| + assertKind(elements_kind.fast_smi_only, a);
|
| + a[0] = "hello";
|
| + b = create1(10);
|
| + assertTrue(isHoley(b));
|
| + assertKind(elements_kind.fast, b);
|
| +
|
| + a = create1(100000);
|
| + assertKind(elements_kind.dictionary, a);
|
| +
|
| + function create3(arg1, arg2, arg3) {
|
| + return Array(arg1, arg2, arg3);
|
| + }
|
| +
|
| + create3(1,2,3);
|
| + create3(1,2,3);
|
| + a = create3(1,2,3);
|
| + a[0] = 3.035;
|
| + assertKind(elements_kind.fast_double, a);
|
| + b = create3(1,2,3);
|
| + assertKind(elements_kind.fast_double, b);
|
| + assertFalse(isHoley(b));
|
| +})();
|
| +
|
| +
|
| +// Verify that keyed calls work
|
| +(function (){
|
| + function create0(name) {
|
| + return this[name]();
|
| + }
|
| +
|
| + name = "Array";
|
| + create0(name);
|
| + create0(name);
|
| + a = create0(name);
|
| + a[0] = 3.5;
|
| + b = create0(name);
|
| + assertKind(elements_kind.fast_double, b);
|
| +})();
|
| +
|
| +
|
| +// Verify that feedback is turned off if the call site goes megamorphic.
|
| +(function (){
|
| + function foo(arg) { return arg(); }
|
| + foo(Array);
|
| + foo(function() {});
|
| + foo(Array);
|
| +
|
| + gc();
|
| +
|
| + a = foo(Array);
|
| + a[0] = 3.5;
|
| + b = foo(Array);
|
| + // b doesn't benefit from elements kind feedback at a megamorphic site.
|
| + assertKind(elements_kind.fast_smi_only, b);
|
| +})();
|
| +
|
| +
|
| +// Verify that crankshaft consumes type feedback.
|
| +(function (){
|
| + function create0() {
|
| + return Array();
|
| + }
|
| +
|
| + create0();
|
| + create0();
|
| + a = create0();
|
| + a[0] = 3.5;
|
| %OptimizeFunctionOnNextCall(create0);
|
| - create0();
|
| - create0();
|
| - b = create0();
|
| - assertKind(elements_kind.fast_double, b);
|
| - assertOptimized(create0);
|
| -
|
| - function create1(arg) {
|
| - return Array(arg);
|
| - }
|
| -
|
| - create1(8);
|
| - create1(8);
|
| - a = create1(8);
|
| - a[0] = 3.5;
|
| + create0();
|
| + create0();
|
| + b = create0();
|
| + assertKind(elements_kind.fast_double, b);
|
| + assertOptimized(create0);
|
| +
|
| + function create1(arg) {
|
| + return Array(arg);
|
| + }
|
| +
|
| + create1(8);
|
| + create1(8);
|
| + a = create1(8);
|
| + a[0] = 3.5;
|
| %OptimizeFunctionOnNextCall(create1);
|
| - b = create1(8);
|
| - assertKind(elements_kind.fast_double, b);
|
| - assertOptimized(create1);
|
| -
|
| - function createN(arg1, arg2, arg3) {
|
| - return Array(arg1, arg2, arg3);
|
| - }
|
| -
|
| - createN(1, 2, 3);
|
| - createN(1, 2, 3);
|
| - a = createN(1, 2, 3);
|
| - a[0] = 3.5;
|
| + b = create1(8);
|
| + assertKind(elements_kind.fast_double, b);
|
| + assertOptimized(create1);
|
| +
|
| + function createN(arg1, arg2, arg3) {
|
| + return Array(arg1, arg2, arg3);
|
| + }
|
| +
|
| + createN(1, 2, 3);
|
| + createN(1, 2, 3);
|
| + a = createN(1, 2, 3);
|
| + a[0] = 3.5;
|
| %OptimizeFunctionOnNextCall(createN);
|
| - b = createN(1, 2, 3);
|
| - assertKind(elements_kind.fast_double, b);
|
| - assertOptimized(createN);
|
| - })();
|
| -
|
| - // Verify that cross context calls work
|
| - (function (){
|
| - var realmA = Realm.current();
|
| - var realmB = Realm.create();
|
| - assertEquals(0, realmA);
|
| - assertEquals(1, realmB);
|
| -
|
| - function instanceof_check(type) {
|
| - assertTrue(type() instanceof type);
|
| - assertTrue(type(5) instanceof type);
|
| - assertTrue(type(1,2,3) instanceof type);
|
| - }
|
| -
|
| - var realmBArray = Realm.eval(realmB, "Array");
|
| - instanceof_check(Array);
|
| - instanceof_check(Array);
|
| - instanceof_check(Array);
|
| - instanceof_check(realmBArray);
|
| - instanceof_check(realmBArray);
|
| - instanceof_check(realmBArray);
|
| - })();
|
| -}
|
| + b = createN(1, 2, 3);
|
| + assertKind(elements_kind.fast_double, b);
|
| + assertOptimized(createN);
|
| +})();
|
| +
|
| +// Verify that cross context calls work
|
| +(function (){
|
| + var realmA = Realm.current();
|
| + var realmB = Realm.create();
|
| + assertEquals(0, realmA);
|
| + assertEquals(1, realmB);
|
| +
|
| + function instanceof_check(type) {
|
| + assertTrue(type() instanceof type);
|
| + assertTrue(type(5) instanceof type);
|
| + assertTrue(type(1,2,3) instanceof type);
|
| + }
|
| +
|
| + var realmBArray = Realm.eval(realmB, "Array");
|
| + instanceof_check(Array);
|
| + instanceof_check(Array);
|
| + instanceof_check(Array);
|
| + instanceof_check(realmBArray);
|
| + instanceof_check(realmBArray);
|
| + instanceof_check(realmBArray);
|
| +})();
|
|
|