Index: src/global-handles.cc |
diff --git a/src/global-handles.cc b/src/global-handles.cc |
index 8ed6fc9e93b9722f720bc48d01fc0a2d15480f1e..20a258c5b4899bd8ca01cf752696cb57d51fb634 100644 |
--- a/src/global-handles.cc |
+++ b/src/global-handles.cc |
@@ -92,7 +92,7 @@ class GlobalHandles::Node { |
set_partially_dependent(false); |
set_in_new_space_list(false); |
parameter_or_next_free_.next_free = NULL; |
- near_death_callback_ = NULL; |
+ weak_reference_callback_ = NULL; |
} |
#endif |
@@ -113,7 +113,7 @@ class GlobalHandles::Node { |
set_partially_dependent(false); |
set_state(NORMAL); |
parameter_or_next_free_.parameter = NULL; |
- near_death_callback_ = NULL; |
+ weak_reference_callback_ = NULL; |
IncreaseBlockUses(); |
} |
@@ -126,7 +126,7 @@ class GlobalHandles::Node { |
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId; |
set_independent(false); |
set_partially_dependent(false); |
- near_death_callback_ = NULL; |
+ weak_reference_callback_ = NULL; |
#endif |
DecreaseBlockUses(); |
} |
@@ -232,19 +232,11 @@ class GlobalHandles::Node { |
} |
void MakeWeak(void* parameter, |
- RevivableCallback weak_reference_callback, |
- NearDeathCallback near_death_callback) { |
+ RevivableCallback weak_reference_callback) { |
ASSERT(state() != FREE); |
set_state(WEAK); |
set_parameter(parameter); |
- 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; |
- } |
+ weak_reference_callback_ = weak_reference_callback; |
} |
void ClearWeakness() { |
@@ -255,7 +247,7 @@ class GlobalHandles::Node { |
bool PostGarbageCollectionProcessing(Isolate* isolate) { |
if (state() != Node::PENDING) return false; |
- if (near_death_callback_ == NULL) { |
+ if (weak_reference_callback_ == NULL) { |
Release(); |
return false; |
} |
@@ -263,7 +255,7 @@ class GlobalHandles::Node { |
set_state(NEAR_DEATH); |
set_parameter(NULL); |
- v8::Persistent<v8::Value> object = ToApi<v8::Value>(handle()); |
+ Object** object = location(); |
{ |
// Check that we are not passing a finalized external string to |
// the callback. |
@@ -273,19 +265,9 @@ class GlobalHandles::Node { |
ExternalTwoByteString::cast(object_)->resource() != NULL); |
// Leaving V8. |
VMState<EXTERNAL> state(isolate); |
- if (near_death_callback_ != NULL) { |
- if (IsWeakCallback::decode(flags_)) { |
- RevivableCallback callback = |
- reinterpret_cast<RevivableCallback>(near_death_callback_); |
- callback(reinterpret_cast<v8::Isolate*>(isolate), |
- &object, |
- par); |
- } else { |
- near_death_callback_(reinterpret_cast<v8::Isolate*>(isolate), |
- object, |
+ weak_reference_callback_(reinterpret_cast<v8::Isolate*>(isolate), |
+ reinterpret_cast<Persistent<Value>*>(&object), |
par); |
- } |
- } |
} |
// Absence of explicit cleanup or revival of weak handle |
// in most of the cases would lead to memory leak. |
@@ -318,12 +300,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 - might be a weak reference in disguise. |
- NearDeathCallback near_death_callback_; |
+ RevivableCallback weak_reference_callback_; |
// Provided data for callback. In FREE state, this is used for |
// the free list link. |
@@ -509,12 +490,9 @@ void GlobalHandles::Destroy(Object** location) { |
void GlobalHandles::MakeWeak(Object** location, |
void* parameter, |
- RevivableCallback weak_reference_callback, |
- NearDeathCallback near_death_callback) { |
- ASSERT((weak_reference_callback == NULL) != (near_death_callback == NULL)); |
- Node::FromLocation(location)->MakeWeak(parameter, |
- weak_reference_callback, |
- near_death_callback); |
+ RevivableCallback weak_reference_callback) { |
+ ASSERT(weak_reference_callback != NULL); |
+ Node::FromLocation(location)->MakeWeak(parameter, weak_reference_callback); |
} |