Index: test/cctest/test-heap.cc |
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc |
index 825c8223852692fb51c4b8f2e9a3c34cab4c104a..a21f5416d0bf826f30116f782c4a98313adb049c 100644 |
--- a/test/cctest/test-heap.cc |
+++ b/test/cctest/test-heap.cc |
@@ -3423,6 +3423,44 @@ TEST(IncrementalMarkingClearsMonomorphicIC) { |
} |
+TEST(IncrementalMarkingPreservesPolymorphicIC) { |
+ if (i::FLAG_always_opt) return; |
+ CcTest::InitializeVM(); |
+ v8::HandleScope scope(CcTest::isolate()); |
+ v8::Local<v8::Value> obj1, obj2; |
+ |
+ { |
+ LocalContext env; |
+ CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
+ obj1 = env->Global()->Get(v8_str("obj")); |
+ } |
+ |
+ { |
+ LocalContext env; |
+ CompileRun("function fun() { this.x = 2; }; var obj = new fun();"); |
+ obj2 = env->Global()->Get(v8_str("obj")); |
+ } |
+ |
+ // Prepare function f that contains a polymorphic IC for objects |
+ // originating from two different native contexts. |
+ CcTest::global()->Set(v8_str("obj1"), obj1); |
+ CcTest::global()->Set(v8_str("obj2"), obj2); |
+ CompileRun("function f(o) { return o.x; } f(obj1); f(obj1); f(obj2);"); |
+ Handle<JSFunction> f = v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); |
+ |
+ Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
+ CHECK(ic_before->ic_state() == POLYMORPHIC); |
+ |
+ // Fire context dispose notification. |
+ SimulateIncrementalMarking(CcTest::heap()); |
+ CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
+ |
+ Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
+ CHECK(ic_after->ic_state() == POLYMORPHIC); |
+} |
+ |
+ |
TEST(IncrementalMarkingClearsPolymorphicIC) { |
if (i::FLAG_always_opt) return; |
CcTest::InitializeVM(); |
@@ -4380,6 +4418,25 @@ TEST(WeakMapInMonomorphicLoadIC) { |
} |
+TEST(WeakMapInPolymorphicLoadIC) { |
+ CheckWeakness( |
+ "function loadIC(obj) {" |
+ " return obj.name;" |
+ "}" |
+ " (function() {" |
+ " var proto = {'name' : 'weak'};" |
+ " var obj = Object.create(proto);" |
+ " loadIC(obj);" |
+ " loadIC(obj);" |
+ " loadIC(obj);" |
+ " var poly = Object.create(proto);" |
+ " poly.x = true;" |
+ " loadIC(poly);" |
+ " return proto;" |
+ " })();"); |
+} |
+ |
+ |
TEST(WeakMapInMonomorphicKeyedLoadIC) { |
// TODO(mvstanton): vector ics need weak support! |
if (FLAG_vector_ics) return; |
@@ -4397,6 +4454,25 @@ TEST(WeakMapInMonomorphicKeyedLoadIC) { |
} |
+TEST(WeakMapInPolymorphicKeyedLoadIC) { |
+ CheckWeakness( |
+ "function keyedLoadIC(obj, field) {" |
+ " return obj[field];" |
+ "}" |
+ " (function() {" |
+ " var proto = {'name' : 'weak'};" |
+ " var obj = Object.create(proto);" |
+ " keyedLoadIC(obj, 'name');" |
+ " keyedLoadIC(obj, 'name');" |
+ " keyedLoadIC(obj, 'name');" |
+ " var poly = Object.create(proto);" |
+ " poly.x = true;" |
+ " keyedLoadIC(poly, 'name');" |
+ " return proto;" |
+ " })();"); |
+} |
+ |
+ |
TEST(WeakMapInMonomorphicStoreIC) { |
CheckWeakness("function storeIC(obj, value) {" |
" obj.name = value;" |
@@ -4412,6 +4488,25 @@ TEST(WeakMapInMonomorphicStoreIC) { |
} |
+TEST(WeakMapInPolymorphicStoreIC) { |
+ CheckWeakness( |
+ "function storeIC(obj, value) {" |
+ " obj.name = value;" |
+ "}" |
+ " (function() {" |
+ " var proto = {'name' : 'weak'};" |
+ " var obj = Object.create(proto);" |
+ " storeIC(obj, 'x');" |
+ " storeIC(obj, 'x');" |
+ " storeIC(obj, 'x');" |
+ " var poly = Object.create(proto);" |
+ " poly.x = true;" |
+ " storeIC(poly, 'x');" |
+ " return proto;" |
+ " })();"); |
+} |
+ |
+ |
TEST(WeakMapInMonomorphicKeyedStoreIC) { |
CheckWeakness("function keyedStoreIC(obj, field, value) {" |
" obj[field] = value;" |
@@ -4427,6 +4522,25 @@ TEST(WeakMapInMonomorphicKeyedStoreIC) { |
} |
+TEST(WeakMapInPolymorphicKeyedStoreIC) { |
+ CheckWeakness( |
+ "function keyedStoreIC(obj, field, value) {" |
+ " obj[field] = value;" |
+ "}" |
+ " (function() {" |
+ " var proto = {'name' : 'weak'};" |
+ " var obj = Object.create(proto);" |
+ " keyedStoreIC(obj, 'x');" |
+ " keyedStoreIC(obj, 'x');" |
+ " keyedStoreIC(obj, 'x');" |
+ " var poly = Object.create(proto);" |
+ " poly.x = true;" |
+ " keyedStoreIC(poly, 'x');" |
+ " return proto;" |
+ " })();"); |
+} |
+ |
+ |
TEST(WeakMapInMonomorphicCompareNilIC) { |
CheckWeakness("function compareNilIC(obj) {" |
" return obj == null;" |