Changeset 82866 in webkit
- Timestamp:
- Apr 4, 2011 1:40:35 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r82858 r82866 1 2011-04-04 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Oliver Hunt. 4 5 Renamed Finalizer => WeakHandleOwner (in preparation for adding a reachability callback) 6 https://bugs.webkit.org/show_bug.cgi?id=57775 7 8 Also renamed noFinalizer => emptyWeakOwner, since this is really an 9 optimization for a weak owner with empty callbacks. 10 11 * collector/handles/HandleHeap.cpp: 12 (JSC::HandleHeap::clearWeakPointers): Updated for renames. Removed 13 redundant initialization of m_nextToFinalize. Moved deletion check inside 14 weak owner check, since the weak owner can't delete the node if there is 15 no weak owner! 16 17 * collector/handles/HandleHeap.h: 18 (JSC::WeakHandleOwner::~WeakHandleOwner): 19 (JSC::HandleHeap::makeWeak): Updated for renames. 20 21 (JSC::HandleHeap::hasWeakOwner): Changed getFinalizer to hasWeakOwner, 22 to clarify this function's role in assertions. 23 24 (JSC::HandleHeap::Node::Node): 25 (JSC::HandleHeap::Node::makeWeak): 26 (JSC::HandleHeap::Node::isWeak): 27 (JSC::HandleHeap::Node::weakOwner): 28 (JSC::HandleHeap::Node::weakOwnerContext): 29 (JSC::HandleHeap::Node::emptyWeakOwner): 30 * interpreter/RegisterFile.cpp: 31 (JSC::RegisterFile::globalObjectCollectedNotifier): 32 * interpreter/RegisterFile.h: 33 * runtime/WeakGCMap.h: 34 * runtime/WeakGCPtr.h: 35 (JSC::WeakGCPtr::WeakGCPtr): 36 (JSC::WeakGCPtr::set): Updated for renames. 37 1 38 2011-04-04 Oliver Hunt <oliver@apple.com> 2 39 -
trunk/Source/JavaScriptCore/collector/handles/HandleHeap.cpp
r82718 r82866 87 87 continue; 88 88 89 m_nextToFinalize = node->next(); 90 if (Finalizer* finalizer = node->finalizer()) 91 finalizer->finalize(Handle<Unknown>::wrapSlot(node->slot()), node->finalizerContext()); 92 93 if (m_nextToFinalize != node->next()) // Finalizer deallocated node. 94 continue; 89 if (WeakHandleOwner* weakOwner = node->weakOwner()) { 90 weakOwner->finalize(Handle<Unknown>::wrapSlot(node->slot()), node->weakOwnerContext()); 91 if (m_nextToFinalize != node->next()) // Owner deallocated node. 92 continue; 93 } 95 94 96 95 *node->slot() = JSValue(); -
trunk/Source/JavaScriptCore/collector/handles/HandleHeap.h
r82718 r82866 39 39 class HeapRootMarker; 40 40 41 class Finalizer {41 class WeakHandleOwner { 42 42 public: 43 43 virtual void finalize(Handle<Unknown>, void*) = 0; 44 virtual ~ Finalizer() {}44 virtual ~WeakHandleOwner() {} 45 45 }; 46 46 … … 54 54 void deallocate(HandleSlot); 55 55 56 void makeWeak(HandleSlot, Finalizer* = 0, void* context = 0);56 void makeWeak(HandleSlot, WeakHandleOwner* = 0, void* context = 0); 57 57 58 58 void markStrongHandles(HeapRootMarker&); … … 65 65 66 66 #if !ASSERT_DISABLED 67 Finalizer* getFinalizer(HandleSlot handle) 68 { 69 return toNode(handle)->finalizer(); 70 } 67 bool hasWeakOwner(HandleSlot, WeakHandleOwner*); 71 68 #endif 72 69 … … 82 79 HandleHeap* handleHeap(); 83 80 84 void makeWeak( Finalizer*, void* context);81 void makeWeak(WeakHandleOwner*, void* context); 85 82 bool isWeak(); 86 83 87 Finalizer* finalizer();88 void* finalizerContext();84 WeakHandleOwner* weakOwner(); 85 void* weakOwnerContext(); 89 86 90 87 void setPrev(Node*); … … 95 92 96 93 private: 97 Finalizer* noFinalizer();94 WeakHandleOwner* emptyWeakOwner(); 98 95 99 96 JSValue m_value; 100 97 HandleHeap* m_handleHeap; 101 Finalizer* m_finalizer;102 void* m_ finalizerContext;98 WeakHandleOwner* m_weakOwner; 99 void* m_weakOwnerContext; 103 100 Node* m_prev; 104 101 Node* m_next; … … 161 158 } 162 159 163 inline void HandleHeap::makeWeak(HandleSlot handle, Finalizer* finalizer, void* context)160 inline void HandleHeap::makeWeak(HandleSlot handle, WeakHandleOwner* weakOwner, void* context) 164 161 { 165 162 Node* node = toNode(handle); 166 163 SentinelLinkedList<Node>::remove(node); 167 node->makeWeak( finalizer, context);164 node->makeWeak(weakOwner, context); 168 165 if (handle->isCell() && *handle) 169 166 m_weakList.push(node); … … 172 169 } 173 170 171 #if !ASSERT_DISABLED 172 inline bool HandleHeap::hasWeakOwner(HandleSlot handle, WeakHandleOwner* weakOwner) 173 { 174 return toNode(handle)->weakOwner() == weakOwner; 175 } 176 #endif 177 174 178 inline HandleHeap::Node::Node(HandleHeap* handleHeap) 175 179 : m_handleHeap(handleHeap) 176 , m_ finalizer(0)177 , m_ finalizerContext(0)180 , m_weakOwner(0) 181 , m_weakOwnerContext(0) 178 182 { 179 183 } … … 181 185 inline HandleHeap::Node::Node(WTF::SentinelTag) 182 186 : m_handleHeap(0) 183 , m_ finalizer(0)184 , m_ finalizerContext(0)187 , m_weakOwner(0) 188 , m_weakOwnerContext(0) 185 189 { 186 190 } … … 196 200 } 197 201 198 inline void HandleHeap::Node::makeWeak( Finalizer* finalizer, void* context)199 { 200 m_ finalizer = finalizer ? finalizer : noFinalizer();201 m_ finalizerContext = context;202 inline void HandleHeap::Node::makeWeak(WeakHandleOwner* weakOwner, void* context) 203 { 204 m_weakOwner = weakOwner ? weakOwner : emptyWeakOwner(); 205 m_weakOwnerContext = context; 202 206 } 203 207 204 208 inline bool HandleHeap::Node::isWeak() 205 209 { 206 return m_ finalizer; // True for noFinalizer().207 } 208 209 inline Finalizer* HandleHeap::Node::finalizer()210 { 211 return m_ finalizer == noFinalizer() ? 0 : m_finalizer;212 } 213 214 inline void* HandleHeap::Node:: finalizerContext()215 { 216 ASSERT( finalizer());217 return m_ finalizerContext;210 return m_weakOwner; // True for emptyWeakOwner(). 211 } 212 213 inline WeakHandleOwner* HandleHeap::Node::weakOwner() 214 { 215 return m_weakOwner == emptyWeakOwner() ? 0 : m_weakOwner; // 0 for emptyWeakOwner(). 216 } 217 218 inline void* HandleHeap::Node::weakOwnerContext() 219 { 220 ASSERT(weakOwner()); 221 return m_weakOwnerContext; 218 222 } 219 223 … … 238 242 } 239 243 240 inline Finalizer* HandleHeap::Node::noFinalizer() 241 { 242 return reinterpret_cast<Finalizer*>(-1); // Sentinel to indicate a node is weak but has no real finalizer. 243 } 244 245 } 246 247 #endif 244 // Sentinel to indicate that a node is weak, but its owner has no meaningful 245 // callbacks. This allows us to optimize by skipping such nodes. 246 inline WeakHandleOwner* HandleHeap::Node::emptyWeakOwner() 247 { 248 return reinterpret_cast<WeakHandleOwner*>(-1); 249 } 250 251 } 252 253 #endif -
trunk/Source/JavaScriptCore/interpreter/RegisterFile.cpp
r81262 r82866 76 76 } 77 77 78 class GlobalObjectNotifier : public Finalizer {78 class GlobalObjectNotifier : public WeakHandleOwner { 79 79 public: 80 80 void finalize(Handle<Unknown> value, void*) … … 85 85 }; 86 86 87 Finalizer* RegisterFile::globalObjectCollectedNotifier()87 WeakHandleOwner* RegisterFile::globalObjectCollectedNotifier() 88 88 { 89 89 // This will leak alas, but we only create one of them, and it doesn't -
trunk/Source/JavaScriptCore/interpreter/RegisterFile.h
r81262 r82866 136 136 static void initializeThreading(); 137 137 138 static Finalizer* globalObjectCollectedNotifier();138 static WeakHandleOwner* globalObjectCollectedNotifier(); 139 139 140 140 Register* const * addressOfEnd() const -
trunk/Source/JavaScriptCore/runtime/WeakGCMap.h
r82703 r82866 35 35 // A HashMap for GC'd values that removes entries when the associated value 36 36 // dies. 37 template<typename KeyType, typename MappedType> class WeakGCMap : private Finalizer {37 template<typename KeyType, typename MappedType> class WeakGCMap : private WeakHandleOwner { 38 38 WTF_MAKE_FAST_ALLOCATED; 39 39 WTF_MAKE_NONCOPYABLE(WeakGCMap); -
trunk/Source/JavaScriptCore/runtime/WeakGCPtr.h
r79601 r82866 44 44 } 45 45 46 WeakGCPtr(JSGlobalData& globalData, Finalizer* finalizer = 0, void* context = 0)46 WeakGCPtr(JSGlobalData& globalData, WeakHandleOwner* weakOwner = 0, void* context = 0) 47 47 : m_slot(globalData.allocateGlobalHandle()) 48 48 { 49 HandleHeap::heapFor(m_slot)->makeWeak(m_slot, finalizer, context);49 HandleHeap::heapFor(m_slot)->makeWeak(m_slot, weakOwner, context); 50 50 } 51 51 52 WeakGCPtr(JSGlobalData& globalData, ExternalType value, Finalizer* finalizer = 0, void* context = 0)52 WeakGCPtr(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner = 0, void* context = 0) 53 53 : m_slot(globalData.allocateGlobalHandle()) 54 54 { 55 HandleHeap::heapFor(m_slot)->makeWeak(m_slot, finalizer, context);55 HandleHeap::heapFor(m_slot)->makeWeak(m_slot, weakOwner, context); 56 56 internalSet(value); 57 57 } … … 78 78 } 79 79 80 void set(JSGlobalData& globalData, ExternalType value, Finalizer* finalizer)80 void set(JSGlobalData& globalData, ExternalType value, WeakHandleOwner* weakOwner) 81 81 { 82 82 if (!this->m_slot) { 83 83 this->m_slot = globalData.allocateGlobalHandle(); 84 HandleHeap::heapFor(this->m_slot)->makeWeak(this->m_slot, finalizer, 0);85 } else86 ASSERT(HandleHeap::heapFor(this->m_slot)->getFinalizer(this->m_slot) == finalizer);84 HandleHeap::heapFor(this->m_slot)->makeWeak(this->m_slot, weakOwner); 85 } 86 ASSERT(HandleHeap::heapFor(this->m_slot)->hasWeakOwner(this->m_slot, weakOwner)); 87 87 this->internalSet(value); 88 88 }
Note: See TracChangeset
for help on using the changeset viewer.