| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 927f74c135ba0afe1504c20877dd66ae2d3fdaf9..8f4a947a7d0e95c13aa2807706d35e05573a2696 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -4483,335 +4483,6 @@ static void WeakPointerCallback(
|
| data.GetParameter()->handle.Reset();
|
| }
|
|
|
| -
|
| -template <typename T>
|
| -static UniqueId MakeUniqueId(const Persistent<T>& p) {
|
| - return UniqueId(reinterpret_cast<uintptr_t>(*v8::Utils::OpenPersistent(p)));
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(ApiObjectGroups) {
|
| - LocalContext env;
|
| - v8::Isolate* iso = env->GetIsolate();
|
| - HandleScope scope(iso);
|
| -
|
| - WeakCallCounter counter(1234);
|
| -
|
| - WeakCallCounterAndPersistent<Value> g1s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g1s2(&counter);
|
| - WeakCallCounterAndPersistent<Value> g1c1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g2s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g2s2(&counter);
|
| - WeakCallCounterAndPersistent<Value> g2c1(&counter);
|
| -
|
| - {
|
| - HandleScope scope(iso);
|
| - g1s1.handle.Reset(iso, Object::New(iso));
|
| - g1s2.handle.Reset(iso, Object::New(iso));
|
| - g1c1.handle.Reset(iso, Object::New(iso));
|
| - g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| -
|
| - g2s1.handle.Reset(iso, Object::New(iso));
|
| - g2s2.handle.Reset(iso, Object::New(iso));
|
| - g2c1.handle.Reset(iso, Object::New(iso));
|
| - g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - }
|
| -
|
| - WeakCallCounterAndPersistent<Value> root(&counter);
|
| - root.handle.Reset(iso, g1s1.handle); // make a root.
|
| -
|
| - // Connect group 1 and 2, make a cycle.
|
| - {
|
| - HandleScope scope(iso);
|
| - CHECK(Local<Object>::New(iso, g1s2.handle.As<Object>())
|
| - ->Set(env.local(), 0, Local<Value>::New(iso, g2s2.handle))
|
| - .FromJust());
|
| - CHECK(Local<Object>::New(iso, g2s1.handle.As<Object>())
|
| - ->Set(env.local(), 0, Local<Value>::New(iso, g1s1.handle))
|
| - .FromJust());
|
| - }
|
| -
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s2.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReferenceFromGroup(id1, g1c1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g2c1.handle);
|
| - }
|
| - // Do a single full GC, ensure incremental marking is stopped.
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All object should be alive.
|
| - CHECK_EQ(0, counter.NumberOfWeakCalls());
|
| -
|
| - // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - // But make children strong roots---all the objects (except for children)
|
| - // should be collectable now.
|
| - g1c1.handle.ClearWeak();
|
| - g2c1.handle.ClearWeak();
|
| -
|
| - // Groups are deleted, rebuild groups.
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s2.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReferenceFromGroup(id1, g1c1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g2c1.handle);
|
| - }
|
| -
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All objects should be gone. 5 global handles in total.
|
| - CHECK_EQ(5, counter.NumberOfWeakCalls());
|
| -
|
| - // And now make children weak again and collect them.
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| -
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| - CHECK_EQ(7, counter.NumberOfWeakCalls());
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(ApiObjectGroupsForSubtypes) {
|
| - LocalContext env;
|
| - v8::Isolate* iso = env->GetIsolate();
|
| - HandleScope scope(iso);
|
| -
|
| - WeakCallCounter counter(1234);
|
| -
|
| - WeakCallCounterAndPersistent<Object> g1s1(&counter);
|
| - WeakCallCounterAndPersistent<String> g1s2(&counter);
|
| - WeakCallCounterAndPersistent<String> g1c1(&counter);
|
| - WeakCallCounterAndPersistent<Object> g2s1(&counter);
|
| - WeakCallCounterAndPersistent<String> g2s2(&counter);
|
| - WeakCallCounterAndPersistent<String> g2c1(&counter);
|
| -
|
| - {
|
| - HandleScope scope(iso);
|
| - g1s1.handle.Reset(iso, Object::New(iso));
|
| - g1s2.handle.Reset(iso, v8_str("foo1"));
|
| - g1c1.handle.Reset(iso, v8_str("foo2"));
|
| - g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| -
|
| - g2s1.handle.Reset(iso, Object::New(iso));
|
| - g2s2.handle.Reset(iso, v8_str("foo3"));
|
| - g2c1.handle.Reset(iso, v8_str("foo4"));
|
| - g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - }
|
| -
|
| - WeakCallCounterAndPersistent<Value> root(&counter);
|
| - root.handle.Reset(iso, g1s1.handle); // make a root.
|
| -
|
| - // Connect group 1 and 2, make a cycle.
|
| - {
|
| - HandleScope scope(iso);
|
| - CHECK(Local<Object>::New(iso, g1s1.handle)
|
| - ->Set(env.local(), 0, Local<Object>::New(iso, g2s1.handle))
|
| - .FromJust());
|
| - CHECK(Local<Object>::New(iso, g2s1.handle)
|
| - ->Set(env.local(), 0, Local<Object>::New(iso, g1s1.handle))
|
| - .FromJust());
|
| - }
|
| -
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s2.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReference(g1s1.handle, g1c1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g2c1.handle);
|
| - }
|
| - // Do a single full GC, ensure incremental marking is stopped.
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All object should be alive.
|
| - CHECK_EQ(0, counter.NumberOfWeakCalls());
|
| -
|
| - // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - // But make children strong roots---all the objects (except for children)
|
| - // should be collectable now.
|
| - g1c1.handle.ClearWeak();
|
| - g2c1.handle.ClearWeak();
|
| -
|
| - // Groups are deleted, rebuild groups.
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s2.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReference(g1s1.handle, g1c1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g2c1.handle);
|
| - }
|
| -
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All objects should be gone. 5 global handles in total.
|
| - CHECK_EQ(5, counter.NumberOfWeakCalls());
|
| -
|
| - // And now make children weak again and collect them.
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| -
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| - CHECK_EQ(7, counter.NumberOfWeakCalls());
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(ApiObjectGroupsCycle) {
|
| - LocalContext env;
|
| - v8::Isolate* iso = env->GetIsolate();
|
| - HandleScope scope(iso);
|
| -
|
| - WeakCallCounter counter(1234);
|
| -
|
| - WeakCallCounterAndPersistent<Value> g1s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g1s2(&counter);
|
| - WeakCallCounterAndPersistent<Value> g2s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g2s2(&counter);
|
| - WeakCallCounterAndPersistent<Value> g3s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g3s2(&counter);
|
| - WeakCallCounterAndPersistent<Value> g4s1(&counter);
|
| - WeakCallCounterAndPersistent<Value> g4s2(&counter);
|
| -
|
| - {
|
| - HandleScope scope(iso);
|
| - g1s1.handle.Reset(iso, Object::New(iso));
|
| - g1s2.handle.Reset(iso, Object::New(iso));
|
| - g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - CHECK(g1s1.handle.IsWeak());
|
| - CHECK(g1s2.handle.IsWeak());
|
| -
|
| - g2s1.handle.Reset(iso, Object::New(iso));
|
| - g2s2.handle.Reset(iso, Object::New(iso));
|
| - g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - CHECK(g2s1.handle.IsWeak());
|
| - CHECK(g2s2.handle.IsWeak());
|
| -
|
| - g3s1.handle.Reset(iso, Object::New(iso));
|
| - g3s2.handle.Reset(iso, Object::New(iso));
|
| - g3s1.handle.SetWeak(&g3s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - CHECK(g3s1.handle.IsWeak());
|
| - CHECK(g3s2.handle.IsWeak());
|
| -
|
| - g4s1.handle.Reset(iso, Object::New(iso));
|
| - g4s2.handle.Reset(iso, Object::New(iso));
|
| - g4s1.handle.SetWeak(&g4s1, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - g4s2.handle.SetWeak(&g4s2, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| - CHECK(g4s1.handle.IsWeak());
|
| - CHECK(g4s2.handle.IsWeak());
|
| - }
|
| -
|
| - WeakCallCounterAndPersistent<Value> root(&counter);
|
| - root.handle.Reset(iso, g1s1.handle); // make a root.
|
| -
|
| - // Connect groups. We're building the following cycle:
|
| - // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other
|
| - // groups.
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s1.handle);
|
| - UniqueId id3 = MakeUniqueId(g3s1.handle);
|
| - UniqueId id4 = MakeUniqueId(g4s1.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReferenceFromGroup(id1, g2s1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g3s1.handle);
|
| - iso->SetObjectGroupId(g3s1.handle, id3);
|
| - iso->SetObjectGroupId(g3s2.handle, id3);
|
| - iso->SetReferenceFromGroup(id3, g4s1.handle);
|
| - iso->SetObjectGroupId(g4s1.handle, id4);
|
| - iso->SetObjectGroupId(g4s2.handle, id4);
|
| - iso->SetReferenceFromGroup(id4, g1s1.handle);
|
| - }
|
| - // Do a single full GC
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All object should be alive.
|
| - CHECK_EQ(0, counter.NumberOfWeakCalls());
|
| -
|
| - // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback,
|
| - v8::WeakCallbackType::kParameter);
|
| -
|
| - // Groups are deleted, rebuild groups.
|
| - {
|
| - UniqueId id1 = MakeUniqueId(g1s1.handle);
|
| - UniqueId id2 = MakeUniqueId(g2s1.handle);
|
| - UniqueId id3 = MakeUniqueId(g3s1.handle);
|
| - UniqueId id4 = MakeUniqueId(g4s1.handle);
|
| - iso->SetObjectGroupId(g1s1.handle, id1);
|
| - iso->SetObjectGroupId(g1s2.handle, id1);
|
| - iso->SetReferenceFromGroup(id1, g2s1.handle);
|
| - iso->SetObjectGroupId(g2s1.handle, id2);
|
| - iso->SetObjectGroupId(g2s2.handle, id2);
|
| - iso->SetReferenceFromGroup(id2, g3s1.handle);
|
| - iso->SetObjectGroupId(g3s1.handle, id3);
|
| - iso->SetObjectGroupId(g3s2.handle, id3);
|
| - iso->SetReferenceFromGroup(id3, g4s1.handle);
|
| - iso->SetObjectGroupId(g4s1.handle, id4);
|
| - iso->SetObjectGroupId(g4s2.handle, id4);
|
| - iso->SetReferenceFromGroup(id4, g1s1.handle);
|
| - }
|
| -
|
| - CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask);
|
| -
|
| - // All objects should be gone. 9 global handles in total.
|
| - CHECK_EQ(9, counter.NumberOfWeakCalls());
|
| -}
|
| -
|
| -
|
| THREADED_TEST(ScriptException) {
|
| LocalContext env;
|
| v8::HandleScope scope(env->GetIsolate());
|
|
|