| Index: src/global-handles.cc
|
| diff --git a/src/global-handles.cc b/src/global-handles.cc
|
| index a6347bbf8afbd9743a2861bfef424170a8324ad8..14c00f1997e2e2f3f83d31a79b5598142d988974 100644
|
| --- a/src/global-handles.cc
|
| +++ b/src/global-handles.cc
|
| @@ -83,7 +83,6 @@ class GlobalHandles::Node {
|
| set_partially_dependent(false);
|
| set_in_new_space_list(false);
|
| parameter_or_next_free_.next_free = NULL;
|
| - weak_reference_callback_ = NULL;
|
| near_death_callback_ = NULL;
|
| }
|
| #endif
|
| @@ -105,7 +104,6 @@ class GlobalHandles::Node {
|
| set_partially_dependent(false);
|
| set_state(NORMAL);
|
| parameter_or_next_free_.parameter = NULL;
|
| - weak_reference_callback_ = NULL;
|
| near_death_callback_ = NULL;
|
| IncreaseBlockUses(global_handles);
|
| }
|
| @@ -120,7 +118,6 @@ class GlobalHandles::Node {
|
| class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
|
| set_independent(false);
|
| set_partially_dependent(false);
|
| - weak_reference_callback_ = NULL;
|
| near_death_callback_ = NULL;
|
| #endif
|
| parameter_or_next_free_.next_free = global_handles->first_free_;
|
| @@ -235,8 +232,14 @@ class GlobalHandles::Node {
|
| ASSERT(state() != FREE);
|
| set_state(WEAK);
|
| set_parameter(parameter);
|
| - weak_reference_callback_ = weak_reference_callback;
|
| - near_death_callback_ = near_death_callback;
|
| + if (weak_reference_callback != NULL) {
|
| + flags_ = IsWeakCallback::update(flags_, true);
|
| + near_death_callback_ =
|
| + reinterpret_cast<NearDeathCallback>(weak_reference_callback);
|
| + } else {
|
| + flags_ = IsWeakCallback::update(flags_, false);
|
| + near_death_callback_ = near_death_callback;
|
| + }
|
| }
|
|
|
| void ClearWeakness(GlobalHandles* global_handles) {
|
| @@ -248,8 +251,7 @@ class GlobalHandles::Node {
|
| bool PostGarbageCollectionProcessing(Isolate* isolate,
|
| GlobalHandles* global_handles) {
|
| if (state() != Node::PENDING) return false;
|
| - if (weak_reference_callback_ == NULL &&
|
| - near_death_callback_ == NULL) {
|
| + if (near_death_callback_ == NULL) {
|
| Release(global_handles);
|
| return false;
|
| }
|
| @@ -267,13 +269,16 @@ class GlobalHandles::Node {
|
| ExternalTwoByteString::cast(object_)->resource() != NULL);
|
| // Leaving V8.
|
| VMState state(isolate, EXTERNAL);
|
| - if (weak_reference_callback_ != NULL) {
|
| - weak_reference_callback_(object, par);
|
| - }
|
| if (near_death_callback_ != NULL) {
|
| - near_death_callback_(reinterpret_cast<v8::Isolate*>(isolate),
|
| - object,
|
| - par);
|
| + if (IsWeakCallback::decode(flags_)) {
|
| + WeakReferenceCallback callback =
|
| + reinterpret_cast<WeakReferenceCallback>(near_death_callback_);
|
| + callback(object, par);
|
| + } else {
|
| + near_death_callback_(reinterpret_cast<v8::Isolate*>(isolate),
|
| + object,
|
| + par);
|
| + }
|
| }
|
| }
|
| // Absence of explicit cleanup or revival of weak handle
|
| @@ -306,11 +311,11 @@ class GlobalHandles::Node {
|
| class IsIndependent: public BitField<bool, 4, 1> {};
|
| class IsPartiallyDependent: public BitField<bool, 5, 1> {};
|
| class IsInNewSpaceList: public BitField<bool, 6, 1> {};
|
| + class IsWeakCallback: public BitField<bool, 7, 1> {};
|
|
|
| uint8_t flags_;
|
|
|
| - // Handle specific callback.
|
| - WeakReferenceCallback weak_reference_callback_;
|
| + // Handle specific callback - might be a weak reference in disguise.
|
| NearDeathCallback near_death_callback_;
|
|
|
| // Provided data for callback. In FREE state, this is used for
|
| @@ -481,8 +486,7 @@ void GlobalHandles::MakeWeak(Object** location,
|
| void* parameter,
|
| WeakReferenceCallback weak_reference_callback,
|
| NearDeathCallback near_death_callback) {
|
| - ASSERT((weak_reference_callback != NULL) !=
|
| - (near_death_callback != NULL));
|
| + ASSERT(near_death_callback != NULL);
|
| Node::FromLocation(location)->MakeWeak(this,
|
| parameter,
|
| weak_reference_callback,
|
|
|