From 8565d3e966ea52a9658148a8179a070b360edc2a Mon Sep 17 00:00:00 2001 From: "jochen@chromium.org" Date: Tue, 3 Dec 2013 10:40:13 +0000 Subject: [PATCH] Remove deprecated Persistent::MakeWeak usage from V8 BUG=none LOG=n R=dcarney@chromium.org, ulan@chromium.org Review URL: https://codereview.chromium.org/101523002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18227 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/d8.cc | 34 ++- test/cctest/test-api.cc | 624 ++++++++++++++++++++------------------ test/cctest/test-heap-profiler.cc | 13 +- 3 files changed, 349 insertions(+), 322 deletions(-) diff --git a/src/d8.cc b/src/d8.cc index 7c5df46..2fdbe0c 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -1097,16 +1097,22 @@ static char* ReadChars(Isolate* isolate, const char* name, int* size_out) { return chars; } -static void ReadBufferWeakCallback(v8::Isolate* isolate, - Persistent* array_buffer, - uint8_t* data) { - size_t byte_length = - Local::New(isolate, *array_buffer)->ByteLength(); - isolate->AdjustAmountOfExternalAllocatedMemory( + +struct DataAndPersistent { + uint8_t* data; + Persistent handle; +}; + + +static void ReadBufferWeakCallback( + const v8::WeakCallbackData& data) { + size_t byte_length = data.GetValue()->ByteLength(); + data.GetIsolate()->AdjustAmountOfExternalAllocatedMemory( -static_cast(byte_length)); - delete[] data; - array_buffer->Reset(); + delete[] data.GetParameter()->data; + data.GetParameter()->handle.Reset(); + delete data.GetParameter(); } @@ -1120,16 +1126,18 @@ void Shell::ReadBuffer(const v8::FunctionCallbackInfo& args) { } Isolate* isolate = args.GetIsolate(); - uint8_t* data = reinterpret_cast( + DataAndPersistent* data = new DataAndPersistent; + data->data = reinterpret_cast( ReadChars(args.GetIsolate(), *filename, &length)); - if (data == NULL) { + if (data->data == NULL) { + delete data; Throw(args.GetIsolate(), "Error reading file"); return; } Handle buffer = ArrayBuffer::New(isolate, data, length); - v8::Persistent weak_handle(isolate, buffer); - weak_handle.MakeWeak(data, ReadBufferWeakCallback); - weak_handle.MarkIndependent(); + data->handle.Reset(isolate, buffer); + data->handle.SetWeak(data, ReadBufferWeakCallback); + data->handle.MarkIndependent(); isolate->AdjustAmountOfExternalAllocatedMemory(length); args.GetReturnValue().Set(buffer); diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 2e457d0..fe87b2d 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -3445,12 +3445,20 @@ class WeakCallCounter { template -static void WeakPointerCallback(v8::Isolate* isolate, - Persistent* handle, - WeakCallCounter* counter) { - CHECK_EQ(1234, counter->id()); - counter->increment(); - handle->Reset(); +struct WeakCallCounterAndPersistent { + explicit WeakCallCounterAndPersistent(WeakCallCounter* counter) + : counter(counter) {} + WeakCallCounter* counter; + v8::Persistent handle; +}; + + +template +static void WeakPointerCallback( + const v8::WeakCallbackData >& data) { + CHECK_EQ(1234, data.GetParameter()->counter->id()); + data.GetParameter()->counter->increment(); + data.GetParameter()->handle.Reset(); } @@ -3465,52 +3473,53 @@ THREADED_TEST(ApiObjectGroups) { v8::Isolate* iso = env->GetIsolate(); HandleScope scope(iso); - Persistent g1s1; - Persistent g1s2; - Persistent g1c1; - Persistent g2s1; - Persistent g2s2; - Persistent g2c1; - WeakCallCounter counter(1234); + WeakCallCounterAndPersistent g1s1(&counter); + WeakCallCounterAndPersistent g1s2(&counter); + WeakCallCounterAndPersistent g1c1(&counter); + WeakCallCounterAndPersistent g2s1(&counter); + WeakCallCounterAndPersistent g2s2(&counter); + WeakCallCounterAndPersistent g2c1(&counter); + { HandleScope scope(iso); - g1s1.Reset(iso, Object::New()); - g1s2.Reset(iso, Object::New()); - g1c1.Reset(iso, Object::New()); - g1s1.MakeWeak(&counter, &WeakPointerCallback); - g1s2.MakeWeak(&counter, &WeakPointerCallback); - g1c1.MakeWeak(&counter, &WeakPointerCallback); + g1s1.handle.Reset(iso, Object::New()); + g1s2.handle.Reset(iso, Object::New()); + g1c1.handle.Reset(iso, Object::New()); + g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback); + g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback); + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback); - g2s1.Reset(iso, Object::New()); - g2s2.Reset(iso, Object::New()); - g2c1.Reset(iso, Object::New()); - g2s1.MakeWeak(&counter, &WeakPointerCallback); - g2s2.MakeWeak(&counter, &WeakPointerCallback); - g2c1.MakeWeak(&counter, &WeakPointerCallback); + g2s1.handle.Reset(iso, Object::New()); + g2s2.handle.Reset(iso, Object::New()); + g2c1.handle.Reset(iso, Object::New()); + g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback); + g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback); + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback); } - Persistent root(iso, g1s1); // make a root. + WeakCallCounterAndPersistent root(&counter); + root.handle.Reset(iso, g1s1.handle); // make a root. // Connect group 1 and 2, make a cycle. { HandleScope scope(iso); - CHECK(Local::New(iso, g1s2.As())-> - Set(0, Local::New(iso, g2s2))); - CHECK(Local::New(iso, g2s1.As())-> - Set(0, Local::New(iso, g1s1))); + CHECK(Local::New(iso, g1s2.handle.As())-> + Set(0, Local::New(iso, g2s2.handle))); + CHECK(Local::New(iso, g2s1.handle.As())-> + Set(0, Local::New(iso, g1s1.handle))); } { - UniqueId id1 = MakeUniqueId(g1s1); - UniqueId id2 = MakeUniqueId(g2s2); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReferenceFromGroup(id1, g1c1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g2c1); + 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. v8::internal::Heap* heap = reinterpret_cast( @@ -3521,22 +3530,22 @@ THREADED_TEST(ApiObjectGroups) { CHECK_EQ(0, counter.NumberOfWeakCalls()); // Weaken the root. - root.MakeWeak(&counter, &WeakPointerCallback); + root.handle.SetWeak(&root, &WeakPointerCallback); // But make children strong roots---all the objects (except for children) // should be collectable now. - g1c1.ClearWeak(); - g2c1.ClearWeak(); + g1c1.handle.ClearWeak(); + g2c1.handle.ClearWeak(); // Groups are deleted, rebuild groups. { - UniqueId id1 = MakeUniqueId(g1s1); - UniqueId id2 = MakeUniqueId(g2s2); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReferenceFromGroup(id1, g1c1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g2c1); + 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); } heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); @@ -3545,8 +3554,8 @@ THREADED_TEST(ApiObjectGroups) { CHECK_EQ(5, counter.NumberOfWeakCalls()); // And now make children weak again and collect them. - g1c1.MakeWeak(&counter, &WeakPointerCallback); - g2c1.MakeWeak(&counter, &WeakPointerCallback); + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback); + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback); heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); CHECK_EQ(7, counter.NumberOfWeakCalls()); @@ -3558,50 +3567,53 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) { v8::Isolate* iso = env->GetIsolate(); HandleScope scope(iso); - Persistent g1s1; - Persistent g1s2; - Persistent g1c1; - Persistent g2s1; - Persistent g2s2; - Persistent g2c1; - WeakCallCounter counter(1234); + WeakCallCounterAndPersistent g1s1(&counter); + WeakCallCounterAndPersistent g1s2(&counter); + WeakCallCounterAndPersistent g1c1(&counter); + WeakCallCounterAndPersistent g2s1(&counter); + WeakCallCounterAndPersistent g2s2(&counter); + WeakCallCounterAndPersistent g2c1(&counter); + { HandleScope scope(iso); - g1s1.Reset(iso, Object::New()); - g1s2.Reset(iso, String::NewFromUtf8(iso, "foo1")); - g1c1.Reset(iso, String::NewFromUtf8(iso, "foo2")); - g1s1.MakeWeak(&counter, &WeakPointerCallback); - g1s2.MakeWeak(&counter, &WeakPointerCallback); - g1c1.MakeWeak(&counter, &WeakPointerCallback); + g1s1.handle.Reset(iso, Object::New()); + g1s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo1")); + g1c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo2")); + g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback); + g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback); + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback); - g2s1.Reset(iso, Object::New()); - g2s2.Reset(iso, String::NewFromUtf8(iso, "foo3")); - g2c1.Reset(iso, String::NewFromUtf8(iso, "foo4")); - g2s1.MakeWeak(&counter, &WeakPointerCallback); - g2s2.MakeWeak(&counter, &WeakPointerCallback); - g2c1.MakeWeak(&counter, &WeakPointerCallback); + g2s1.handle.Reset(iso, Object::New()); + g2s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo3")); + g2c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo4")); + g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback); + g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback); + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback); } - Persistent root(iso, g1s1); // make a root. + WeakCallCounterAndPersistent root(&counter); + root.handle.Reset(iso, g1s1.handle); // make a root. // Connect group 1 and 2, make a cycle. { HandleScope scope(iso); - CHECK(Local::New(iso, g1s1)->Set(0, Local::New(iso, g2s1))); - CHECK(Local::New(iso, g2s1)->Set(0, Local::New(iso, g1s1))); + CHECK(Local::New(iso, g1s1.handle) + ->Set(0, Local::New(iso, g2s1.handle))); + CHECK(Local::New(iso, g2s1.handle) + ->Set(0, Local::New(iso, g1s1.handle))); } { - UniqueId id1 = MakeUniqueId(g1s1); - UniqueId id2 = MakeUniqueId(g2s2); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReference(g1s1, g1c1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g2c1); + 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. v8::internal::Heap* heap = reinterpret_cast( @@ -3612,22 +3624,22 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) { CHECK_EQ(0, counter.NumberOfWeakCalls()); // Weaken the root. - root.MakeWeak(&counter, &WeakPointerCallback); + root.handle.SetWeak(&root, &WeakPointerCallback); // But make children strong roots---all the objects (except for children) // should be collectable now. - g1c1.ClearWeak(); - g2c1.ClearWeak(); + g1c1.handle.ClearWeak(); + g2c1.handle.ClearWeak(); // Groups are deleted, rebuild groups. { - UniqueId id1 = MakeUniqueId(g1s1); - UniqueId id2 = MakeUniqueId(g2s2); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReference(g1s1, g1c1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g2c1); + 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); } heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); @@ -3636,8 +3648,8 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) { CHECK_EQ(5, counter.NumberOfWeakCalls()); // And now make children weak again and collect them. - g1c1.MakeWeak(&counter, &WeakPointerCallback); - g2c1.MakeWeak(&counter, &WeakPointerCallback); + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback); + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback); heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); CHECK_EQ(7, counter.NumberOfWeakCalls()); @@ -3651,68 +3663,69 @@ THREADED_TEST(ApiObjectGroupsCycle) { WeakCallCounter counter(1234); - Persistent g1s1; - Persistent g1s2; - Persistent g2s1; - Persistent g2s2; - Persistent g3s1; - Persistent g3s2; - Persistent g4s1; - Persistent g4s2; + WeakCallCounterAndPersistent g1s1(&counter); + WeakCallCounterAndPersistent g1s2(&counter); + WeakCallCounterAndPersistent g2s1(&counter); + WeakCallCounterAndPersistent g2s2(&counter); + WeakCallCounterAndPersistent g3s1(&counter); + WeakCallCounterAndPersistent g3s2(&counter); + WeakCallCounterAndPersistent g4s1(&counter); + WeakCallCounterAndPersistent g4s2(&counter); { HandleScope scope(iso); - g1s1.Reset(iso, Object::New()); - g1s2.Reset(iso, Object::New()); - g1s1.MakeWeak(&counter, &WeakPointerCallback); - g1s2.MakeWeak(&counter, &WeakPointerCallback); - CHECK(g1s1.IsWeak()); - CHECK(g1s2.IsWeak()); - - g2s1.Reset(iso, Object::New()); - g2s2.Reset(iso, Object::New()); - g2s1.MakeWeak(&counter, &WeakPointerCallback); - g2s2.MakeWeak(&counter, &WeakPointerCallback); - CHECK(g2s1.IsWeak()); - CHECK(g2s2.IsWeak()); - - g3s1.Reset(iso, Object::New()); - g3s2.Reset(iso, Object::New()); - g3s1.MakeWeak(&counter, &WeakPointerCallback); - g3s2.MakeWeak(&counter, &WeakPointerCallback); - CHECK(g3s1.IsWeak()); - CHECK(g3s2.IsWeak()); - - g4s1.Reset(iso, Object::New()); - g4s2.Reset(iso, Object::New()); - g4s1.MakeWeak(&counter, &WeakPointerCallback); - g4s2.MakeWeak(&counter, &WeakPointerCallback); - CHECK(g4s1.IsWeak()); - CHECK(g4s2.IsWeak()); - } - - Persistent root(iso, g1s1); // make a root. + g1s1.handle.Reset(iso, Object::New()); + g1s2.handle.Reset(iso, Object::New()); + g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback); + g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback); + CHECK(g1s1.handle.IsWeak()); + CHECK(g1s2.handle.IsWeak()); + + g2s1.handle.Reset(iso, Object::New()); + g2s2.handle.Reset(iso, Object::New()); + g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback); + g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback); + CHECK(g2s1.handle.IsWeak()); + CHECK(g2s2.handle.IsWeak()); + + g3s1.handle.Reset(iso, Object::New()); + g3s2.handle.Reset(iso, Object::New()); + g3s1.handle.SetWeak(&g3s1, &WeakPointerCallback); + g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback); + CHECK(g3s1.handle.IsWeak()); + CHECK(g3s2.handle.IsWeak()); + + g4s1.handle.Reset(iso, Object::New()); + g4s2.handle.Reset(iso, Object::New()); + g4s1.handle.SetWeak(&g4s1, &WeakPointerCallback); + g4s2.handle.SetWeak(&g4s2, &WeakPointerCallback); + CHECK(g4s1.handle.IsWeak()); + CHECK(g4s2.handle.IsWeak()); + } + + WeakCallCounterAndPersistent 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); - UniqueId id2 = MakeUniqueId(g2s1); - UniqueId id3 = MakeUniqueId(g3s1); - UniqueId id4 = MakeUniqueId(g4s1); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReferenceFromGroup(id1, g2s1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g3s1); - iso->SetObjectGroupId(g3s1, id3); - iso->SetObjectGroupId(g3s2, id3); - iso->SetReferenceFromGroup(id3, g4s1); - iso->SetObjectGroupId(g4s1, id4); - iso->SetObjectGroupId(g4s2, id4); - iso->SetReferenceFromGroup(id4, g1s1); + 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 v8::internal::Heap* heap = reinterpret_cast( @@ -3723,26 +3736,26 @@ THREADED_TEST(ApiObjectGroupsCycle) { CHECK_EQ(0, counter.NumberOfWeakCalls()); // Weaken the root. - root.MakeWeak(&counter, &WeakPointerCallback); + root.handle.SetWeak(&root, &WeakPointerCallback); // Groups are deleted, rebuild groups. { - UniqueId id1 = MakeUniqueId(g1s1); - UniqueId id2 = MakeUniqueId(g2s1); - UniqueId id3 = MakeUniqueId(g3s1); - UniqueId id4 = MakeUniqueId(g4s1); - iso->SetObjectGroupId(g1s1, id1); - iso->SetObjectGroupId(g1s2, id1); - iso->SetReferenceFromGroup(id1, g2s1); - iso->SetObjectGroupId(g2s1, id2); - iso->SetObjectGroupId(g2s2, id2); - iso->SetReferenceFromGroup(id2, g3s1); - iso->SetObjectGroupId(g3s1, id3); - iso->SetObjectGroupId(g3s2, id3); - iso->SetReferenceFromGroup(id3, g4s1); - iso->SetObjectGroupId(g4s1, id4); - iso->SetObjectGroupId(g4s2, id4); - iso->SetReferenceFromGroup(id4, g1s1); + 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); } heap->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); @@ -3763,58 +3776,59 @@ TEST(ApiObjectGroupsCycleForScavenger) { WeakCallCounter counter(1234); - Persistent g1s1; - Persistent g1s2; - Persistent g2s1; - Persistent g2s2; - Persistent g3s1; - Persistent g3s2; + WeakCallCounterAndPersistent g1s1(&counter); + WeakCallCounterAndPersistent g1s2(&counter); + WeakCallCounterAndPersistent g2s1(&counter); + WeakCallCounterAndPersistent g2s2(&counter); + WeakCallCounterAndPersistent g3s1(&counter); + WeakCallCounterAndPersistent g3s2(&counter); { HandleScope scope(iso); - g1s1.Reset(iso, Object::New()); - g1s2.Reset(iso, Object::New()); - g1s1.MakeWeak(&counter, &WeakPointerCallback); - g1s2.MakeWeak(&counter, &WeakPointerCallback); + g1s1.handle.Reset(iso, Object::New()); + g1s2.handle.Reset(iso, Object::New()); + g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback); + g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback); - g2s1.Reset(iso, Object::New()); - g2s2.Reset(iso, Object::New()); - g2s1.MakeWeak(&counter, &WeakPointerCallback); - g2s2.MakeWeak(&counter, &WeakPointerCallback); + g2s1.handle.Reset(iso, Object::New()); + g2s2.handle.Reset(iso, Object::New()); + g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback); + g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback); - g3s1.Reset(iso, Object::New()); - g3s2.Reset(iso, Object::New()); - g3s1.MakeWeak(&counter, &WeakPointerCallback); - g3s2.MakeWeak(&counter, &WeakPointerCallback); + g3s1.handle.Reset(iso, Object::New()); + g3s2.handle.Reset(iso, Object::New()); + g3s1.handle.SetWeak(&g3s1, &WeakPointerCallback); + g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback); } // Make a root. - Persistent root(iso, g1s1); - root.MarkPartiallyDependent(); + WeakCallCounterAndPersistent root(&counter); + root.handle.Reset(iso, g1s1.handle); + root.handle.MarkPartiallyDependent(); // Connect groups. We're building the following cycle: // G1: { g1s1, g2s1 }, g1s1 implicitly references g2s1, ditto for other // groups. { HandleScope handle_scope(iso); - g1s1.MarkPartiallyDependent(); - g1s2.MarkPartiallyDependent(); - g2s1.MarkPartiallyDependent(); - g2s2.MarkPartiallyDependent(); - g3s1.MarkPartiallyDependent(); - g3s2.MarkPartiallyDependent(); - iso->SetObjectGroupId(g1s1, UniqueId(1)); - iso->SetObjectGroupId(g1s2, UniqueId(1)); - Local::New(iso, g1s1.As())->Set( - v8_str("x"), Local::New(iso, g2s1)); - iso->SetObjectGroupId(g2s1, UniqueId(2)); - iso->SetObjectGroupId(g2s2, UniqueId(2)); - Local::New(iso, g2s1.As())->Set( - v8_str("x"), Local::New(iso, g3s1)); - iso->SetObjectGroupId(g3s1, UniqueId(3)); - iso->SetObjectGroupId(g3s2, UniqueId(3)); - Local::New(iso, g3s1.As())->Set( - v8_str("x"), Local::New(iso, g1s1)); + g1s1.handle.MarkPartiallyDependent(); + g1s2.handle.MarkPartiallyDependent(); + g2s1.handle.MarkPartiallyDependent(); + g2s2.handle.MarkPartiallyDependent(); + g3s1.handle.MarkPartiallyDependent(); + g3s2.handle.MarkPartiallyDependent(); + iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); + iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); + Local::New(iso, g1s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g2s1.handle)); + iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); + iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); + Local::New(iso, g2s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g3s1.handle)); + iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); + iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); + Local::New(iso, g3s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g1s1.handle)); } v8::internal::Heap* heap = reinterpret_cast( @@ -3825,30 +3839,30 @@ TEST(ApiObjectGroupsCycleForScavenger) { CHECK_EQ(0, counter.NumberOfWeakCalls()); // Weaken the root. - root.MakeWeak(&counter, &WeakPointerCallback); - root.MarkPartiallyDependent(); + root.handle.SetWeak(&root, &WeakPointerCallback); + root.handle.MarkPartiallyDependent(); // Groups are deleted, rebuild groups. { HandleScope handle_scope(iso); - g1s1.MarkPartiallyDependent(); - g1s2.MarkPartiallyDependent(); - g2s1.MarkPartiallyDependent(); - g2s2.MarkPartiallyDependent(); - g3s1.MarkPartiallyDependent(); - g3s2.MarkPartiallyDependent(); - iso->SetObjectGroupId(g1s1, UniqueId(1)); - iso->SetObjectGroupId(g1s2, UniqueId(1)); - Local::New(iso, g1s1.As())->Set( - v8_str("x"), Local::New(iso, g2s1)); - iso->SetObjectGroupId(g2s1, UniqueId(2)); - iso->SetObjectGroupId(g2s2, UniqueId(2)); - Local::New(iso, g2s1.As())->Set( - v8_str("x"), Local::New(iso, g3s1)); - iso->SetObjectGroupId(g3s1, UniqueId(3)); - iso->SetObjectGroupId(g3s2, UniqueId(3)); - Local::New(iso, g3s1.As())->Set( - v8_str("x"), Local::New(iso, g1s1)); + g1s1.handle.MarkPartiallyDependent(); + g1s2.handle.MarkPartiallyDependent(); + g2s1.handle.MarkPartiallyDependent(); + g2s2.handle.MarkPartiallyDependent(); + g3s1.handle.MarkPartiallyDependent(); + g3s2.handle.MarkPartiallyDependent(); + iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); + iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); + Local::New(iso, g1s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g2s1.handle)); + iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); + iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); + Local::New(iso, g2s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g3s1.handle)); + iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); + iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); + Local::New(iso, g3s1.handle.As())->Set( + v8_str("x"), Local::New(iso, g1s1.handle)); } heap->CollectGarbage(i::NEW_SPACE); @@ -6947,9 +6961,13 @@ THREADED_TEST(ErrorWithMissingScriptInfo) { int global_index = 0; +template class Snorkel { public: - Snorkel() { index_ = global_index++; } + explicit Snorkel(v8::Persistent* handle) : handle_(handle) { + index_ = global_index++; + } + v8::Persistent* handle_; int index_; }; @@ -6970,11 +6988,10 @@ class Whammy { v8::Persistent