diff options
author | Timothy J Fontaine <tjfontaine@gmail.com> | 2013-10-22 15:14:25 -0700 |
---|---|---|
committer | Timothy J Fontaine <tjfontaine@gmail.com> | 2013-10-23 09:17:31 -0700 |
commit | a53c763c16eeabb0901a05dbcf38a72fa96d2f26 (patch) | |
tree | 309bf250e1521cedf0e945d7a7629db511e64498 /deps/v8/src/global-handles.cc | |
parent | 54910044b33a6405c72ad085915a55c575c027fc (diff) | |
download | node-new-a53c763c16eeabb0901a05dbcf38a72fa96d2f26.tar.gz |
v8: upgrade 3.21.18.3
Diffstat (limited to 'deps/v8/src/global-handles.cc')
-rw-r--r-- | deps/v8/src/global-handles.cc | 74 |
1 files changed, 54 insertions, 20 deletions
diff --git a/deps/v8/src/global-handles.cc b/deps/v8/src/global-handles.cc index 5df9dd4c6c..1a98e49ff3 100644 --- a/deps/v8/src/global-handles.cc +++ b/deps/v8/src/global-handles.cc @@ -90,7 +90,7 @@ class GlobalHandles::Node { set_partially_dependent(false); set_in_new_space_list(false); parameter_or_next_free_.next_free = NULL; - weak_reference_callback_ = NULL; + weak_callback_ = NULL; } #endif @@ -111,21 +111,19 @@ class GlobalHandles::Node { set_partially_dependent(false); set_state(NORMAL); parameter_or_next_free_.parameter = NULL; - weak_reference_callback_ = NULL; + weak_callback_ = NULL; IncreaseBlockUses(); } void Release() { ASSERT(state() != FREE); set_state(FREE); -#ifdef ENABLE_EXTRA_CHECKS // Zap the values for eager trapping. object_ = reinterpret_cast<Object*>(kGlobalHandleZapValue); class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId; set_independent(false); set_partially_dependent(false); - weak_reference_callback_ = NULL; -#endif + weak_callback_ = NULL; DecreaseBlockUses(); } @@ -171,6 +169,13 @@ class GlobalHandles::Node { flags_ = IsInNewSpaceList::update(flags_, v); } + bool is_revivable_callback() { + return IsRevivableCallback::decode(flags_); + } + void set_revivable_callback(bool v) { + flags_ = IsRevivableCallback::update(flags_, v); + } + bool IsNearDeath() const { // Check for PENDING to ensure correct answer when processing callbacks. return state() == PENDING || state() == NEAR_DEATH; @@ -230,11 +235,20 @@ class GlobalHandles::Node { } void MakeWeak(void* parameter, - RevivableCallback weak_reference_callback) { + WeakCallback weak_callback, + RevivableCallback revivable_callback) { + ASSERT((weak_callback == NULL) != (revivable_callback == NULL)); ASSERT(state() != FREE); set_state(WEAK); set_parameter(parameter); - weak_reference_callback_ = weak_reference_callback; + if (weak_callback != NULL) { + weak_callback_ = weak_callback; + set_revivable_callback(false); + } else { + weak_callback_ = + reinterpret_cast<WeakCallback>(revivable_callback); + set_revivable_callback(true); + } } void ClearWeakness() { @@ -245,7 +259,7 @@ class GlobalHandles::Node { bool PostGarbageCollectionProcessing(Isolate* isolate) { if (state() != Node::PENDING) return false; - if (weak_reference_callback_ == NULL) { + if (weak_callback_ == NULL) { Release(); return false; } @@ -264,9 +278,20 @@ class GlobalHandles::Node { // Leaving V8. VMState<EXTERNAL> state(isolate); HandleScope handle_scope(isolate); - weak_reference_callback_(reinterpret_cast<v8::Isolate*>(isolate), - reinterpret_cast<Persistent<Value>*>(&object), - par); + if (is_revivable_callback()) { + RevivableCallback revivable = + reinterpret_cast<RevivableCallback>(weak_callback_); + revivable(reinterpret_cast<v8::Isolate*>(isolate), + reinterpret_cast<Persistent<Value>*>(&object), + par); + } else { + Handle<Object> handle(*object, isolate); + v8::WeakCallbackData<v8::Value, void> data( + reinterpret_cast<v8::Isolate*>(isolate), + v8::Utils::ToLocal(handle), + par); + weak_callback_(data); + } } // Absence of explicit cleanup or revival of weak handle // in most of the cases would lead to memory leak. @@ -274,9 +299,10 @@ class GlobalHandles::Node { return true; } + inline GlobalHandles* GetGlobalHandles(); + private: inline NodeBlock* FindBlock(); - inline GlobalHandles* GetGlobalHandles(); inline void IncreaseBlockUses(); inline void DecreaseBlockUses(); @@ -299,11 +325,12 @@ 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 IsRevivableCallback: public BitField<bool, 7, 1> {}; uint8_t flags_; // Handle specific callback - might be a weak reference in disguise. - RevivableCallback weak_reference_callback_; + WeakCallback weak_callback_; // Provided data for callback. In FREE state, this is used for // the free list link. @@ -482,6 +509,12 @@ Handle<Object> GlobalHandles::Create(Object* value) { } +Handle<Object> GlobalHandles::CopyGlobal(Object** location) { + ASSERT(location != NULL); + return Node::FromLocation(location)->GetGlobalHandles()->Create(*location); +} + + void GlobalHandles::Destroy(Object** location) { if (location != NULL) Node::FromLocation(location)->Release(); } @@ -489,9 +522,10 @@ void GlobalHandles::Destroy(Object** location) { void GlobalHandles::MakeWeak(Object** location, void* parameter, - RevivableCallback weak_reference_callback) { - ASSERT(weak_reference_callback != NULL); - Node::FromLocation(location)->MakeWeak(parameter, weak_reference_callback); + WeakCallback weak_callback, + RevivableCallback revivable_callback) { + Node::FromLocation(location)->MakeWeak( + parameter, weak_callback, revivable_callback); } @@ -1020,7 +1054,6 @@ void GlobalHandles::ComputeObjectGroupsAndImplicitReferences() { EternalHandles::EternalHandles() : size_(0) { - STATIC_ASSERT(v8::kUninitializedEternalIndex == kInvalidIndex); for (unsigned i = 0; i < ARRAY_SIZE(singleton_handles_); i++) { singleton_handles_[i] = kInvalidIndex; } @@ -1062,8 +1095,9 @@ void EternalHandles::PostGarbageCollectionProcessing(Heap* heap) { } -int EternalHandles::Create(Isolate* isolate, Object* object) { - if (object == NULL) return kInvalidIndex; +void EternalHandles::Create(Isolate* isolate, Object* object, int* index) { + ASSERT_EQ(kInvalidIndex, *index); + if (object == NULL) return; ASSERT_NE(isolate->heap()->the_hole_value(), object); int block = size_ >> kShift; int offset = size_ & kMask; @@ -1079,7 +1113,7 @@ int EternalHandles::Create(Isolate* isolate, Object* object) { if (isolate->heap()->InNewSpace(object)) { new_space_indices_.Add(size_); } - return size_++; + *index = size_++; } |