Chromium Code Reviews| Index: src/global-handles.cc |
| diff --git a/src/global-handles.cc b/src/global-handles.cc |
| index 427eae0a9ecdd51c452463cc5f31af2891f49aad..5eceae009d527c72ae0c90185d4b5d490b54a0ce 100644 |
| --- a/src/global-handles.cc |
| +++ b/src/global-handles.cc |
| @@ -60,12 +60,16 @@ class GlobalHandles::Node { |
| } |
| Node() { |
| - ASSERT(OFFSET_OF(Node, flags_) == Internals::kNodeFlagsOffset); |
| - ASSERT(OFFSET_OF(Node, class_id_) == Internals::kNodeClassIdOffset); |
| - ASSERT(static_cast<int>(IsIndependent::kShift) == |
| - Internals::kNodeIsIndependentShift); |
| - ASSERT(static_cast<int>(IsPartiallyDependent::kShift) == |
| - Internals::kNodeIsPartiallyDependentShift); |
| + STATIC_ASSERT(offsetof(Node, class_id_) == Internals::kNodeClassIdOffset); |
| + STATIC_ASSERT(offsetof(Node, flags_) == Internals::kNodeFlagsOffset); |
| + STATIC_ASSERT(static_cast<int>(NodeState::kMask) == |
| + Internals::kNodeStateMask); |
| + STATIC_ASSERT(WEAK == Internals::kNodeStateIsWeakValue); |
| + STATIC_ASSERT(NEAR_DEATH == Internals::kNodeStateIsNearDeathValue); |
| + STATIC_ASSERT(static_cast<int>(IsIndependent::kShift) == |
| + Internals::kNodeIsIndependentShift); |
| + STATIC_ASSERT(static_cast<int>(IsPartiallyDependent::kShift) == |
| + Internals::kNodeIsPartiallyDependentShift); |
| } |
| #ifdef DEBUG |
| @@ -79,7 +83,8 @@ class GlobalHandles::Node { |
| set_partially_dependent(false); |
| set_in_new_space_list(false); |
| parameter_or_next_free_.next_free = NULL; |
| - callback_ = NULL; |
| + weak_reference_callback_ = NULL; |
| + near_death_callback_ = NULL; |
| } |
| #endif |
| @@ -100,7 +105,8 @@ class GlobalHandles::Node { |
| set_partially_dependent(false); |
| set_state(NORMAL); |
| parameter_or_next_free_.parameter = NULL; |
| - callback_ = NULL; |
| + weak_reference_callback_ = NULL; |
| + near_death_callback_ = NULL; |
| IncreaseBlockUses(global_handles); |
| } |
| @@ -189,7 +195,8 @@ class GlobalHandles::Node { |
| void clear_partially_dependent() { set_partially_dependent(false); } |
| // Callback accessor. |
| - WeakReferenceCallback callback() { return callback_; } |
| + // TODO(svenpanne) Re-enable or nuke later. |
|
Michael Starzinger
2013/01/24 13:09:05
Definitely re-enable, but I am fine with this inte
|
| + // WeakReferenceCallback callback() { return callback_; } |
| // Callback parameter accessors. |
| void set_parameter(void* parameter) { |
| @@ -213,11 +220,13 @@ class GlobalHandles::Node { |
| void MakeWeak(GlobalHandles* global_handles, |
| void* parameter, |
| - WeakReferenceCallback callback) { |
| + WeakReferenceCallback weak_reference_callback, |
| + NearDeathCallback near_death_callback) { |
| ASSERT(state() != FREE); |
| set_state(WEAK); |
| set_parameter(parameter); |
| - callback_ = callback; |
| + weak_reference_callback_ = weak_reference_callback; |
| + near_death_callback_ = near_death_callback; |
| } |
| void ClearWeakness(GlobalHandles* global_handles) { |
| @@ -229,8 +238,8 @@ class GlobalHandles::Node { |
| bool PostGarbageCollectionProcessing(Isolate* isolate, |
| GlobalHandles* global_handles) { |
| if (state() != Node::PENDING) return false; |
| - WeakReferenceCallback func = callback(); |
| - if (func == NULL) { |
| + if (weak_reference_callback_ == NULL && |
| + near_death_callback_ == NULL) { |
| Release(global_handles); |
| return false; |
| } |
| @@ -248,7 +257,14 @@ class GlobalHandles::Node { |
| ExternalTwoByteString::cast(object_)->resource() != NULL); |
| // Leaving V8. |
| VMState state(isolate, EXTERNAL); |
| - func(object, par); |
| + 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); |
| + } |
| } |
| // Absence of explicit cleanup or revival of weak handle |
| // in most of the cases would lead to memory leak. |
| @@ -284,7 +300,8 @@ class GlobalHandles::Node { |
| uint8_t flags_; |
| // Handle specific callback. |
| - WeakReferenceCallback callback_; |
| + WeakReferenceCallback weak_reference_callback_; |
| + NearDeathCallback near_death_callback_; |
| // Provided data for callback. In FREE state, this is used for |
| // the free list link. |
| @@ -450,10 +467,14 @@ void GlobalHandles::Destroy(Object** location) { |
| } |
| -void GlobalHandles::MakeWeak(Object** location, void* parameter, |
| - WeakReferenceCallback callback) { |
| - ASSERT(callback != NULL); |
| - Node::FromLocation(location)->MakeWeak(this, parameter, callback); |
| +void GlobalHandles::MakeWeak(Object** location, |
| + void* parameter, |
| + WeakReferenceCallback weak_reference_callback, |
| + NearDeathCallback near_death_callback) { |
|
Michael Starzinger
2013/01/24 13:09:05
Add an assertion similar to the following:
ASSERT
Sven Panne
2013/01/25 08:28:40
Done.
|
| + Node::FromLocation(location)->MakeWeak(this, |
| + parameter, |
| + weak_reference_callback, |
| + near_death_callback); |
| } |