Changeset 113141 in webkit for trunk/Source/JavaScriptCore/heap/HandleHeap.h
- Timestamp:
- Apr 3, 2012, 10:28:13 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/HandleHeap.h
r110033 r113141 41 41 class SlotVisitor; 42 42 43 class JS_EXPORT_PRIVATE WeakHandleOwner {44 public:45 virtual ~WeakHandleOwner();46 virtual bool isReachableFromOpaqueRoots(Handle<Unknown>, void* context, SlotVisitor&);47 virtual void finalize(Handle<Unknown>, void* context);48 };49 50 43 class HandleHeap { 51 44 public: … … 59 52 void deallocate(HandleSlot); 60 53 61 void makeWeak(HandleSlot, WeakHandleOwner* = 0, void* context = 0);62 HandleSlot copyWeak(HandleSlot);63 64 54 void visitStrongHandles(HeapRootVisitor&); 65 void visitWeakHandles(HeapRootVisitor&);66 void finalizeWeakHandles();67 55 68 56 JS_EXPORT_PRIVATE void writeBarrier(HandleSlot, const JSValue&); 69 70 #if !ASSERT_DISABLED71 bool hasWeakOwner(HandleSlot, WeakHandleOwner*);72 bool hasFinalizer(HandleSlot);73 #endif74 57 75 58 unsigned protectedGlobalObjectCount(); … … 86 69 HandleHeap* handleHeap(); 87 70 88 void makeWeak(WeakHandleOwner*, void* context);89 bool isWeak();90 91 WeakHandleOwner* weakOwner();92 void* weakOwnerContext();93 94 71 void setPrev(Node*); 95 72 Node* prev(); … … 99 76 100 77 private: 101 WeakHandleOwner* emptyWeakOwner();102 103 78 JSValue m_value; 104 79 HandleHeap* m_handleHeap; 105 WeakHandleOwner* m_weakOwner;106 void* m_weakOwnerContext;107 80 Node* m_prev; 108 81 Node* m_next; … … 115 88 116 89 #if ENABLE(GC_VALIDATION) || !ASSERT_DISABLED 117 bool isValidWeakNode(Node*);118 90 bool isLiveNode(Node*); 119 91 #endif … … 123 95 124 96 SentinelLinkedList<Node> m_strongList; 125 SentinelLinkedList<Node> m_weakList;126 97 SentinelLinkedList<Node> m_immediateList; 127 98 SinglyLinkedList<Node> m_freeList; … … 176 147 } 177 148 178 inline HandleSlot HandleHeap::copyWeak(HandleSlot other)179 {180 Node* node = toNode(allocate());181 node->makeWeak(toNode(other)->weakOwner(), toNode(other)->weakOwnerContext());182 writeBarrier(node->slot(), *other);183 *node->slot() = *other;184 return toHandle(node);185 }186 187 inline void HandleHeap::makeWeak(HandleSlot handle, WeakHandleOwner* weakOwner, void* context)188 {189 // Forbid assignment to handles during the finalization phase, since it would violate many GC invariants.190 // File a bug with stack trace if you hit this.191 if (m_nextToFinalize)192 CRASH();193 Node* node = toNode(handle);194 node->makeWeak(weakOwner, context);195 196 SentinelLinkedList<Node>::remove(node);197 if (!*handle || !handle->isCell()) {198 m_immediateList.push(node);199 return;200 }201 202 m_weakList.push(node);203 }204 205 #if !ASSERT_DISABLED206 inline bool HandleHeap::hasWeakOwner(HandleSlot handle, WeakHandleOwner* weakOwner)207 {208 return toNode(handle)->weakOwner() == weakOwner;209 }210 211 inline bool HandleHeap::hasFinalizer(HandleSlot handle)212 {213 return toNode(handle)->weakOwner();214 }215 #endif216 217 149 inline HandleHeap::Node::Node(HandleHeap* handleHeap) 218 150 : m_handleHeap(handleHeap) 219 , m_weakOwner(0)220 , m_weakOwnerContext(0)221 151 , m_prev(0) 222 152 , m_next(0) … … 226 156 inline HandleHeap::Node::Node(WTF::SentinelTag) 227 157 : m_handleHeap(0) 228 , m_weakOwner(0)229 , m_weakOwnerContext(0)230 158 , m_prev(0) 231 159 , m_next(0) … … 243 171 } 244 172 245 inline void HandleHeap::Node::makeWeak(WeakHandleOwner* weakOwner, void* context)246 {247 m_weakOwner = weakOwner ? weakOwner : emptyWeakOwner();248 m_weakOwnerContext = context;249 }250 251 inline bool HandleHeap::Node::isWeak()252 {253 return m_weakOwner; // True for emptyWeakOwner().254 }255 256 inline WeakHandleOwner* HandleHeap::Node::weakOwner()257 {258 return m_weakOwner == emptyWeakOwner() ? 0 : m_weakOwner; // 0 for emptyWeakOwner().259 }260 261 inline void* HandleHeap::Node::weakOwnerContext()262 {263 ASSERT(weakOwner());264 return m_weakOwnerContext;265 }266 267 173 inline void HandleHeap::Node::setPrev(Node* prev) 268 174 { … … 283 189 { 284 190 return m_next; 285 }286 287 // Sentinel to indicate that a node is weak, but its owner has no meaningful288 // callbacks. This allows us to optimize by skipping such nodes.289 inline WeakHandleOwner* HandleHeap::Node::emptyWeakOwner()290 {291 return reinterpret_cast<WeakHandleOwner*>(-1);292 191 } 293 192
Note:
See TracChangeset
for help on using the changeset viewer.