| 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(); | 
| } | 
|  | 
|  |