Index: src/global-handles.cc |
diff --git a/src/global-handles.cc b/src/global-handles.cc |
index 23b3918329a564332a8d4622cd11e567e25f7cbd..6377af6e6c39e5437307286f95357b1ba3961323 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. |
+ // 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,16 @@ 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) { |
+ ASSERT((weak_reference_callback != NULL) != |
+ (near_death_callback != NULL)); |
+ Node::FromLocation(location)->MakeWeak(this, |
+ parameter, |
+ weak_reference_callback, |
+ near_death_callback); |
} |