| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 857f8178b58e4b28fbd4190186c5cf7d12845af6..4ef83c71ed5983b03365f69bb564fe6c6fecc54b 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -3214,100 +3214,6 @@ TEST(TwoPassPhantomCallbacksNestedGc) {
|
| }
|
|
|
|
|
| -template <typename K, typename V>
|
| -class WeakStdMapTraits : public v8::StdMapTraits<K, V> {
|
| - public:
|
| - typedef typename v8::PersistentValueMap<K, V, WeakStdMapTraits<K, V>> MapType;
|
| - static const v8::PersistentContainerCallbackType kCallbackType = v8::kWeak;
|
| - struct WeakCallbackDataType {
|
| - MapType* map;
|
| - K key;
|
| - };
|
| - static WeakCallbackDataType* WeakCallbackParameter(MapType* map, const K& key,
|
| - Local<V> value) {
|
| - WeakCallbackDataType* data = new WeakCallbackDataType;
|
| - data->map = map;
|
| - data->key = key;
|
| - return data;
|
| - }
|
| - static MapType* MapFromWeakCallbackData(
|
| - const v8::WeakCallbackData<V, WeakCallbackDataType>& data) {
|
| - return data.GetParameter()->map;
|
| - }
|
| - static K KeyFromWeakCallbackData(
|
| - const v8::WeakCallbackData<V, WeakCallbackDataType>& data) {
|
| - return data.GetParameter()->key;
|
| - }
|
| - static void DisposeCallbackData(WeakCallbackDataType* data) { delete data; }
|
| - static void Dispose(v8::Isolate* isolate, v8::Global<V> value, K key) {}
|
| -};
|
| -
|
| -
|
| -template <typename Map>
|
| -static void TestPersistentValueMap() {
|
| - LocalContext env;
|
| - v8::Isolate* isolate = env->GetIsolate();
|
| - Map map(isolate);
|
| - v8::internal::GlobalHandles* global_handles =
|
| - reinterpret_cast<v8::internal::Isolate*>(isolate)->global_handles();
|
| - int initial_handle_count = global_handles->global_handles_count();
|
| - CHECK_EQ(0, static_cast<int>(map.Size()));
|
| - {
|
| - HandleScope scope(isolate);
|
| - Local<v8::Object> obj = map.Get(7);
|
| - CHECK(obj.IsEmpty());
|
| - Local<v8::Object> expected = v8::Object::New(isolate);
|
| - map.Set(7, expected);
|
| - CHECK_EQ(1, static_cast<int>(map.Size()));
|
| - obj = map.Get(7);
|
| - CHECK(expected->Equals(obj));
|
| - {
|
| - typename Map::PersistentValueReference ref = map.GetReference(7);
|
| - CHECK(expected->Equals(ref.NewLocal(isolate)));
|
| - }
|
| - v8::Global<v8::Object> removed = map.Remove(7);
|
| - CHECK_EQ(0, static_cast<int>(map.Size()));
|
| - CHECK(expected == removed);
|
| - removed = map.Remove(7);
|
| - CHECK(removed.IsEmpty());
|
| - map.Set(8, expected);
|
| - CHECK_EQ(1, static_cast<int>(map.Size()));
|
| - map.Set(8, expected);
|
| - CHECK_EQ(1, static_cast<int>(map.Size()));
|
| - {
|
| - typename Map::PersistentValueReference ref;
|
| - Local<v8::Object> expected2 = v8::Object::New(isolate);
|
| - removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref);
|
| - CHECK_EQ(1, static_cast<int>(map.Size()));
|
| - CHECK(expected == removed);
|
| - CHECK(expected2->Equals(ref.NewLocal(isolate)));
|
| - }
|
| - }
|
| - CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count());
|
| - if (map.IsWeak()) {
|
| - reinterpret_cast<v8::internal::Isolate*>(isolate)
|
| - ->heap()
|
| - ->CollectAllGarbage();
|
| - } else {
|
| - map.Clear();
|
| - }
|
| - CHECK_EQ(0, static_cast<int>(map.Size()));
|
| - CHECK_EQ(initial_handle_count, global_handles->global_handles_count());
|
| -}
|
| -
|
| -
|
| -TEST(PersistentValueMap) {
|
| - // Default case, w/o weak callbacks:
|
| - TestPersistentValueMap<v8::StdPersistentValueMap<int, v8::Object>>();
|
| -
|
| - // Custom traits with weak callbacks:
|
| - typedef v8::PersistentValueMap<int, v8::Object,
|
| - WeakStdMapTraits<int, v8::Object>>
|
| - WeakPersistentValueMap;
|
| - TestPersistentValueMap<WeakPersistentValueMap>();
|
| -}
|
| -
|
| -
|
| namespace {
|
|
|
| void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); }
|
| @@ -3568,7 +3474,7 @@ struct WeakCallCounterAndPersistent {
|
|
|
| template <typename T>
|
| static void WeakPointerCallback(
|
| - const v8::WeakCallbackData<T, WeakCallCounterAndPersistent<T>>& data) {
|
| + const v8::WeakCallbackInfo<WeakCallCounterAndPersistent<T>>& data) {
|
| CHECK_EQ(1234, data.GetParameter()->counter->id());
|
| data.GetParameter()->counter->increment();
|
| data.GetParameter()->handle.Reset();
|
| @@ -3600,16 +3506,22 @@ THREADED_TEST(ApiObjectGroups) {
|
| 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);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback);
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback);
|
| + 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);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback);
|
| + 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);
|
| @@ -3643,7 +3555,8 @@ THREADED_TEST(ApiObjectGroups) {
|
| CHECK_EQ(0, counter.NumberOfWeakCalls());
|
|
|
| // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback);
|
| + 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();
|
| @@ -3667,8 +3580,10 @@ THREADED_TEST(ApiObjectGroups) {
|
| CHECK_EQ(5, counter.NumberOfWeakCalls());
|
|
|
| // And now make children weak again and collect them.
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback);
|
| + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| heap->CollectAllGarbage();
|
| CHECK_EQ(7, counter.NumberOfWeakCalls());
|
| @@ -3694,16 +3609,22 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) {
|
| g1s1.handle.Reset(iso, Object::New(iso));
|
| 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);
|
| + 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, 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);
|
| + 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);
|
| @@ -3737,7 +3658,8 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) {
|
| CHECK_EQ(0, counter.NumberOfWeakCalls());
|
|
|
| // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback);
|
| + 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();
|
| @@ -3761,8 +3683,10 @@ THREADED_TEST(ApiObjectGroupsForSubtypes) {
|
| CHECK_EQ(5, counter.NumberOfWeakCalls());
|
|
|
| // And now make children weak again and collect them.
|
| - g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback);
|
| - g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback);
|
| + g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| heap->CollectAllGarbage();
|
| CHECK_EQ(7, counter.NumberOfWeakCalls());
|
| @@ -3789,29 +3713,37 @@ THREADED_TEST(ApiObjectGroupsCycle) {
|
| HandleScope scope(iso);
|
| g1s1.handle.Reset(iso, Object::New(iso));
|
| g1s2.handle.Reset(iso, Object::New(iso));
|
| - g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback);
|
| + 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);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback);
|
| + 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);
|
| - g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback);
|
| + 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);
|
| - g4s2.handle.SetWeak(&g4s2, &WeakPointerCallback);
|
| + g4s1.handle.SetWeak(&g4s1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g4s2.handle.SetWeak(&g4s2, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| CHECK(g4s1.handle.IsWeak());
|
| CHECK(g4s2.handle.IsWeak());
|
| }
|
| @@ -3849,7 +3781,8 @@ THREADED_TEST(ApiObjectGroupsCycle) {
|
| CHECK_EQ(0, counter.NumberOfWeakCalls());
|
|
|
| // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback);
|
| + root.handle.SetWeak(&root, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| // Groups are deleted, rebuild groups.
|
| {
|
| @@ -3878,45 +3811,6 @@ THREADED_TEST(ApiObjectGroupsCycle) {
|
| }
|
|
|
|
|
| -THREADED_TEST(WeakRootsSurviveTwoRoundsOfGC) {
|
| - LocalContext env;
|
| - v8::Isolate* iso = env->GetIsolate();
|
| - HandleScope scope(iso);
|
| -
|
| - WeakCallCounter counter(1234);
|
| -
|
| - WeakCallCounterAndPersistent<Value> weak_obj(&counter);
|
| -
|
| - // Create a weak object that references a internalized string.
|
| - {
|
| - HandleScope scope(iso);
|
| - weak_obj.handle.Reset(iso, Object::New(iso));
|
| - weak_obj.handle.SetWeak(&weak_obj, &WeakPointerCallback);
|
| - CHECK(weak_obj.handle.IsWeak());
|
| - Local<Object>::New(iso, weak_obj.handle.As<Object>())
|
| - ->Set(v8_str("x"), String::NewFromUtf8(iso, "magic cookie",
|
| - String::kInternalizedString));
|
| - }
|
| - // Do a single full GC
|
| - i::Isolate* i_iso = reinterpret_cast<v8::internal::Isolate*>(iso);
|
| - i::Heap* heap = i_iso->heap();
|
| - heap->CollectAllGarbage();
|
| -
|
| - // We should have received the weak callback.
|
| - CHECK_EQ(1, counter.NumberOfWeakCalls());
|
| -
|
| - // Check that the string is still alive.
|
| - {
|
| - HandleScope scope(iso);
|
| - i::MaybeHandle<i::String> magic_string =
|
| - i::StringTable::LookupStringIfExists(
|
| - i_iso,
|
| - v8::Utils::OpenHandle(*String::NewFromUtf8(iso, "magic cookie")));
|
| - magic_string.Check();
|
| - }
|
| -}
|
| -
|
| -
|
| // TODO(mstarzinger): This should be a THREADED_TEST but causes failures
|
| // on the buildbots, so was made non-threaded for the time being.
|
| TEST(ApiObjectGroupsCycleForScavenger) {
|
| @@ -3939,18 +3833,24 @@ TEST(ApiObjectGroupsCycleForScavenger) {
|
| HandleScope scope(iso);
|
| g1s1.handle.Reset(iso, Object::New(iso));
|
| g1s2.handle.Reset(iso, Object::New(iso));
|
| - g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback);
|
| - g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback);
|
| + g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| g2s1.handle.Reset(iso, Object::New(iso));
|
| g2s2.handle.Reset(iso, Object::New(iso));
|
| - g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback);
|
| - g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback);
|
| + g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| g3s1.handle.Reset(iso, Object::New(iso));
|
| g3s2.handle.Reset(iso, Object::New(iso));
|
| - g3s1.handle.SetWeak(&g3s1, &WeakPointerCallback);
|
| - g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback);
|
| + g3s1.handle.SetWeak(&g3s1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + g3s2.handle.SetWeak(&g3s2, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| }
|
|
|
| // Make a root.
|
| @@ -3991,7 +3891,8 @@ TEST(ApiObjectGroupsCycleForScavenger) {
|
| CHECK_EQ(0, counter.NumberOfWeakCalls());
|
|
|
| // Weaken the root.
|
| - root.handle.SetWeak(&root, &WeakPointerCallback);
|
| + root.handle.SetWeak(&root, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| root.handle.MarkPartiallyDependent();
|
|
|
| // Groups are deleted, rebuild groups.
|
| @@ -4286,9 +4187,12 @@ TEST(NativeWeakMap) {
|
| CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, s1.handle))));
|
| }
|
|
|
| - o1.handle.SetWeak(&o1, &WeakPointerCallback);
|
| - o2.handle.SetWeak(&o2, &WeakPointerCallback);
|
| - s1.handle.SetWeak(&s1, &WeakPointerCallback);
|
| + o1.handle.SetWeak(&o1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + o2.handle.SetWeak(&o2, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + s1.handle.SetWeak(&s1, &WeakPointerCallback,
|
| + v8::WeakCallbackType::kParameter);
|
|
|
| CcTest::heap()->CollectAllGarbage();
|
| CHECK_EQ(3, counter.NumberOfWeakCalls());
|
| @@ -6681,11 +6585,10 @@ THREADED_TEST(InternalFieldCallback) {
|
|
|
|
|
| static void ResetUseValueAndSetFlag(
|
| - const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) {
|
| + const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
|
| // Blink will reset the handle, and then use the other handle, so they
|
| // can't use the same backing slot.
|
| data.GetParameter()->handle.Reset();
|
| - data.GetValue()->IsBoolean(); // Make sure the handle still works.
|
| data.GetParameter()->flag = true;
|
| }
|
|
|
| @@ -6714,8 +6617,10 @@ static void ResetWeakHandle(bool global_gc) {
|
|
|
| object_a.flag = false;
|
| object_b.flag = false;
|
| - object_a.handle.SetWeak(&object_a, &ResetUseValueAndSetFlag);
|
| - object_b.handle.SetWeak(&object_b, &ResetUseValueAndSetFlag);
|
| + object_a.handle.SetWeak(&object_a, &ResetUseValueAndSetFlag,
|
| + v8::WeakCallbackType::kParameter);
|
| + object_b.handle.SetWeak(&object_b, &ResetUseValueAndSetFlag,
|
| + v8::WeakCallbackType::kParameter);
|
| if (!global_gc) {
|
| object_a.handle.MarkIndependent();
|
| object_b.handle.MarkIndependent();
|
| @@ -6744,21 +6649,31 @@ static void InvokeScavenge() { CcTest::heap()->CollectGarbage(i::NEW_SPACE); }
|
| static void InvokeMarkSweep() { CcTest::heap()->CollectAllGarbage(); }
|
|
|
|
|
| -static void ForceScavenge(
|
| - const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) {
|
| - data.GetParameter()->handle.Reset();
|
| +static void ForceScavenge2(
|
| + const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
|
| data.GetParameter()->flag = true;
|
| InvokeScavenge();
|
| }
|
|
|
| -
|
| -static void ForceMarkSweep(
|
| - const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) {
|
| +static void ForceScavenge1(
|
| + const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
|
| data.GetParameter()->handle.Reset();
|
| + data.SetSecondPassCallback(ForceScavenge2);
|
| +}
|
| +
|
| +
|
| +static void ForceMarkSweep2(
|
| + const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
|
| data.GetParameter()->flag = true;
|
| InvokeMarkSweep();
|
| }
|
|
|
| +static void ForceMarkSweep1(
|
| + const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
|
| + data.GetParameter()->handle.Reset();
|
| + data.SetSecondPassCallback(ForceMarkSweep2);
|
| +}
|
| +
|
|
|
| THREADED_TEST(GCFromWeakCallbacks) {
|
| v8::Isolate* isolate = CcTest::isolate();
|
| @@ -6767,10 +6682,9 @@ THREADED_TEST(GCFromWeakCallbacks) {
|
| Context::Scope context_scope(context);
|
|
|
| static const int kNumberOfGCTypes = 2;
|
| - typedef v8::WeakCallbackData<v8::Object, FlagAndPersistent>::Callback
|
| - Callback;
|
| - Callback gc_forcing_callback[kNumberOfGCTypes] =
|
| - {&ForceScavenge, &ForceMarkSweep};
|
| + typedef v8::WeakCallbackInfo<FlagAndPersistent>::Callback Callback;
|
| + Callback gc_forcing_callback[kNumberOfGCTypes] = {&ForceScavenge1,
|
| + &ForceMarkSweep1};
|
|
|
| typedef void (*GCInvoker)();
|
| GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep};
|
| @@ -6783,7 +6697,8 @@ THREADED_TEST(GCFromWeakCallbacks) {
|
| object.handle.Reset(isolate, v8::Object::New(isolate));
|
| }
|
| object.flag = false;
|
| - object.handle.SetWeak(&object, gc_forcing_callback[inner_gc]);
|
| + object.handle.SetWeak(&object, gc_forcing_callback[inner_gc],
|
| + v8::WeakCallbackType::kParameter);
|
| object.handle.MarkIndependent();
|
| invoke_gc[outer_gc]();
|
| CHECK(object.flag);
|
| @@ -6792,45 +6707,6 @@ THREADED_TEST(GCFromWeakCallbacks) {
|
| }
|
|
|
|
|
| -static void RevivingCallback(
|
| - const v8::WeakCallbackData<v8::Object, FlagAndPersistent>& data) {
|
| - data.GetParameter()->handle.ClearWeak();
|
| - data.GetParameter()->flag = true;
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(IndependentHandleRevival) {
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::HandleScope scope(isolate);
|
| - v8::Handle<Context> context = Context::New(isolate);
|
| - Context::Scope context_scope(context);
|
| -
|
| - FlagAndPersistent object;
|
| - {
|
| - v8::HandleScope handle_scope(isolate);
|
| - v8::Local<v8::Object> o = v8::Object::New(isolate);
|
| - object.handle.Reset(isolate, o);
|
| - o->Set(v8_str("x"), v8::Integer::New(isolate, 1));
|
| - v8::Local<String> y_str = v8_str("y");
|
| - o->Set(y_str, y_str);
|
| - }
|
| - object.flag = false;
|
| - object.handle.SetWeak(&object, &RevivingCallback);
|
| - object.handle.MarkIndependent();
|
| - CcTest::heap()->CollectGarbage(i::NEW_SPACE);
|
| - CHECK(object.flag);
|
| - CcTest::heap()->CollectAllGarbage();
|
| - {
|
| - v8::HandleScope handle_scope(isolate);
|
| - v8::Local<v8::Object> o =
|
| - v8::Local<v8::Object>::New(isolate, object.handle);
|
| - v8::Local<String> y_str = v8_str("y");
|
| - CHECK(v8::Integer::New(isolate, 1)->Equals(o->Get(v8_str("x"))));
|
| - CHECK(o->Get(y_str)->Equals(y_str));
|
| - }
|
| -}
|
| -
|
| -
|
| v8::Handle<Function> args_fun;
|
|
|
|
|
| @@ -11799,9 +11675,7 @@ TEST(CopyablePersistent) {
|
|
|
|
|
| static void WeakApiCallback(
|
| - const v8::WeakCallbackData<v8::Object, Persistent<v8::Object> >& data) {
|
| - Local<Value> value = data.GetValue()->Get(v8_str("key"));
|
| - CHECK_EQ(231, static_cast<int32_t>(Local<v8::Integer>::Cast(value)->Value()));
|
| + const v8::WeakCallbackInfo<Persistent<v8::Object>>& data) {
|
| data.GetParameter()->Reset();
|
| delete data.GetParameter();
|
| }
|
| @@ -11819,8 +11693,8 @@ TEST(WeakCallbackApi) {
|
| obj->Set(v8_str("key"), v8::Integer::New(isolate, 231));
|
| v8::Persistent<v8::Object>* handle =
|
| new v8::Persistent<v8::Object>(isolate, obj);
|
| - handle->SetWeak<v8::Object, v8::Persistent<v8::Object> >(handle,
|
| - WeakApiCallback);
|
| + handle->SetWeak<v8::Persistent<v8::Object>>(
|
| + handle, WeakApiCallback, v8::WeakCallbackType::kParameter);
|
| }
|
| reinterpret_cast<i::Isolate*>(isolate)->heap()->CollectAllGarbage(
|
| i::Heap::kAbortIncrementalMarkingMask);
|
| @@ -11832,11 +11706,18 @@ TEST(WeakCallbackApi) {
|
| v8::Persistent<v8::Object> some_object;
|
| v8::Persistent<v8::Object> bad_handle;
|
|
|
| -void NewPersistentHandleCallback(
|
| - const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) {
|
| +
|
| +void NewPersistentHandleCallback2(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| v8::HandleScope scope(data.GetIsolate());
|
| bad_handle.Reset(data.GetIsolate(), some_object);
|
| +}
|
| +
|
| +
|
| +void NewPersistentHandleCallback1(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| data.GetParameter()->Reset();
|
| + data.SetSecondPassCallback(NewPersistentHandleCallback2);
|
| }
|
|
|
|
|
| @@ -11855,7 +11736,8 @@ THREADED_TEST(NewPersistentHandleFromWeakCallback) {
|
| // global handle nodes are processed by PostGarbageCollectionProcessing
|
| // in reverse allocation order, so if second allocated handle is deleted,
|
| // weak callback of the first handle would be able to 'reallocate' it.
|
| - handle1.SetWeak(&handle1, NewPersistentHandleCallback);
|
| + handle1.SetWeak(&handle1, NewPersistentHandleCallback1,
|
| + v8::WeakCallbackType::kParameter);
|
| handle2.Reset();
|
| CcTest::heap()->CollectAllGarbage();
|
| }
|
| @@ -11863,11 +11745,18 @@ THREADED_TEST(NewPersistentHandleFromWeakCallback) {
|
|
|
| v8::Persistent<v8::Object> to_be_disposed;
|
|
|
| -void DisposeAndForceGcCallback(
|
| - const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) {
|
| +
|
| +void DisposeAndForceGcCallback2(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| to_be_disposed.Reset();
|
| CcTest::heap()->CollectAllGarbage();
|
| +}
|
| +
|
| +
|
| +void DisposeAndForceGcCallback1(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| data.GetParameter()->Reset();
|
| + data.SetSecondPassCallback(DisposeAndForceGcCallback2);
|
| }
|
|
|
|
|
| @@ -11881,22 +11770,28 @@ THREADED_TEST(DoNotUseDeletedNodesInSecondLevelGc) {
|
| handle1.Reset(isolate, v8::Object::New(isolate));
|
| handle2.Reset(isolate, v8::Object::New(isolate));
|
| }
|
| - handle1.SetWeak(&handle1, DisposeAndForceGcCallback);
|
| + handle1.SetWeak(&handle1, DisposeAndForceGcCallback1,
|
| + v8::WeakCallbackType::kParameter);
|
| to_be_disposed.Reset(isolate, handle2);
|
| CcTest::heap()->CollectAllGarbage();
|
| }
|
|
|
| void DisposingCallback(
|
| - const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) {
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| data.GetParameter()->Reset();
|
| }
|
|
|
| -void HandleCreatingCallback(
|
| - const v8::WeakCallbackData<v8::Object, v8::Persistent<v8::Object> >& data) {
|
| +void HandleCreatingCallback2(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| v8::HandleScope scope(data.GetIsolate());
|
| - v8::Persistent<v8::Object>(data.GetIsolate(),
|
| - v8::Object::New(data.GetIsolate()));
|
| + v8::Global<v8::Object>(data.GetIsolate(), v8::Object::New(data.GetIsolate()));
|
| +}
|
| +
|
| +
|
| +void HandleCreatingCallback1(
|
| + const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
|
| data.GetParameter()->Reset();
|
| + data.SetSecondPassCallback(HandleCreatingCallback2);
|
| }
|
|
|
|
|
| @@ -11911,8 +11806,10 @@ THREADED_TEST(NoGlobalHandlesOrphaningDueToWeakCallback) {
|
| handle2.Reset(isolate, v8::Object::New(isolate));
|
| handle1.Reset(isolate, v8::Object::New(isolate));
|
| }
|
| - handle2.SetWeak(&handle2, DisposingCallback);
|
| - handle3.SetWeak(&handle3, HandleCreatingCallback);
|
| + handle2.SetWeak(&handle2, DisposingCallback,
|
| + v8::WeakCallbackType::kParameter);
|
| + handle3.SetWeak(&handle3, HandleCreatingCallback1,
|
| + v8::WeakCallbackType::kParameter);
|
| CcTest::heap()->CollectAllGarbage();
|
| }
|
|
|
|
|