Index: test/mjsunit/array-feedback.js |
diff --git a/test/mjsunit/array-feedback.js b/test/mjsunit/array-feedback.js |
index 4129be1f880cb7974ec15d784707b1e2412fea0f..75a5358a4fd849eeab51cbff2353eb3d82a837cf 100644 |
--- a/test/mjsunit/array-feedback.js |
+++ b/test/mjsunit/array-feedback.js |
@@ -85,69 +85,86 @@ 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(); |
- // 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(); |
- // create3(); |
- // a = create3(1,2,3); |
- // a[0] = 3.5; |
- // b = create3(1,2,3); |
- // assertKind(elements_kind.fast_double, b); |
- // assertFalse(isHoley(b)); |
- // })(); |
+ (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 the IC can't be spoofed by patching |
+ (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(); |
@@ -156,41 +173,40 @@ if (support_smi_only_arrays) { |
create0(); |
create0(); |
a = create0(); |
- assertKind(elements_kind.fast_smi_only, a); |
- var oldArray = this.Array; |
- this.Array = function() { return ["hi"]; }; |
+ a[0] = 3.5; |
+ %OptimizeFunctionOnNextCall(create0); |
+ create0(); |
+ create0(); |
b = create0(); |
- assertEquals(["hi"], b); |
- this.Array = oldArray; |
- })(); |
+ assertKind(elements_kind.fast_double, b); |
+ assertOptimized(create0); |
- // Verify that calls are still made through an IC after crankshaft, |
- // though the type information is reset. |
- // TODO(mvstanton): instead, consume the type feedback gathered up |
- // until crankshaft time. |
- // (function (){ |
- // function create0() { |
- // return Array(); |
- // } |
- |
- // create0(); |
- // create0(); |
- // a = create0(); |
- // a[0] = 3.5; |
- // %OptimizeFunctionOnNextCall(create0); |
- // create0(); |
- // // This test only makes sense if crankshaft is allowed |
- // if (4 != %GetOptimizationStatus(create0)) { |
- // create0(); |
- // b = create0(); |
- // assertKind(elements_kind.fast_smi_only, b); |
- // b[0] = 3.5; |
- // c = create0(); |
- // assertKind(elements_kind.fast_double, c); |
- // 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; |
+ %OptimizeFunctionOnNextCall(createN); |
+ b = createN(1, 2, 3); |
+ assertKind(elements_kind.fast_double, b); |
+ assertOptimized(createN); |
+ })(); |
// Verify that cross context calls work |
(function (){ |