Changeset 295036 in webkit for trunk/Source/JavaScriptCore/heap
- Timestamp:
- May 30, 2022, 4:41:10 PM (3 years ago)
- Location:
- trunk/Source/JavaScriptCore/heap
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/HandleSet.cpp
r290705 r295036 71 71 template void HandleSet::visitStrongHandles(SlotVisitor&); 72 72 73 void HandleSet::writeBarrier(HandleSlot slot, const JSValue& value)74 {75 if (!value == !*slot && slot->isCell() == value.isCell())76 return;77 78 Node* node = toNode(slot);79 #if ENABLE(GC_VALIDATION)80 RELEASE_ASSERT(isLiveNode(node));81 #endif82 SentinelLinkedList<Node>::remove(node);83 if (!value || !value.isCell()) {84 m_immediateList.push(node);85 return;86 }87 88 m_strongList.push(node);89 #if ENABLE(GC_VALIDATION)90 RELEASE_ASSERT(isLiveNode(node));91 #endif92 }93 94 73 unsigned HandleSet::protectedGlobalObjectCount() 95 74 { -
trunk/Source/JavaScriptCore/heap/HandleSet.h
r290705 r295036 40 40 class JSValue; 41 41 42 class HandleNode {42 class HandleNode final : public BasicRawSentinelNode<HandleNode> { 43 43 public: 44 HandleNode(WTF::SentinelTag); 45 HandleNode(); 44 HandleNode() = default; 46 45 47 46 HandleSlot slot(); 48 47 HandleSet* handleSet(); 49 48 50 void setPrev(HandleNode*); 51 HandleNode* prev(); 52 53 void setNext(HandleNode*); 54 HandleNode* next(); 49 static HandleNode* toHandleNode(HandleSlot slot) 50 { 51 return bitwise_cast<HandleNode*>(bitwise_cast<uintptr_t>(slot) - OBJECT_OFFSETOF(HandleNode, m_value)); 52 } 55 53 56 54 private: 57 JSValue m_value; 58 HandleNode* m_prev; 59 HandleNode* m_next; 55 JSValue m_value { }; 60 56 }; 61 57 … … 75 71 template<typename Visitor> void visitStrongHandles(Visitor&); 76 72 77 JS_EXPORT_PRIVATE void writeBarrier(HandleSlot, const JSValue&); 73 template<bool isCellOnly> 74 void writeBarrier(HandleSlot, JSValue); 78 75 79 76 unsigned protectedGlobalObjectCount(); … … 83 80 private: 84 81 typedef HandleNode Node; 85 static HandleSlot toHandle(Node*);86 static Node* toNode(HandleSlot);87 82 88 83 JS_EXPORT_PRIVATE void grow(); 89 84 90 85 #if ENABLE(GC_VALIDATION) || ASSERT_ENABLED 91 bool isLiveNode(Node*);86 JS_EXPORT_PRIVATE bool isLiveNode(Node*); 92 87 #endif 93 88 … … 95 90 DoublyLinkedList<HandleBlock> m_blockList; 96 91 97 SentinelLinkedList<Node> m_strongList;98 SentinelLinkedList<Node> m_immediateList;92 using NodeList = SentinelLinkedList<Node, BasicRawSentinelNode<Node>>; 93 NodeList m_strongList; 99 94 SinglyLinkedList<Node> m_freeList; 100 95 }; … … 102 97 inline HandleSet* HandleSet::heapFor(HandleSlot handle) 103 98 { 104 return toNode(handle)->handleSet();99 return HandleNode::toHandleNode(handle)->handleSet(); 105 100 } 106 101 … … 108 103 { 109 104 return m_vm; 110 }111 112 inline HandleSlot HandleSet::toHandle(HandleSet::Node* node)113 {114 return reinterpret_cast<HandleSlot>(node);115 }116 117 inline HandleSet::Node* HandleSet::toNode(HandleSlot handle)118 {119 return reinterpret_cast<HandleSet::Node*>(handle);120 105 } 121 106 … … 127 112 HandleSet::Node* node = m_freeList.pop(); 128 113 new (NotNull, node) HandleSet::Node(); 129 m_immediateList.push(node); 130 return toHandle(node); 114 return node->slot(); 131 115 } 132 116 133 117 inline void HandleSet::deallocate(HandleSlot handle) 134 118 { 135 HandleSet::Node* node = toNode(handle); 136 SentinelLinkedList<HandleSet::Node>::remove(node); 119 HandleSet::Node* node = HandleNode::toHandleNode(handle); 120 if (node->isOnList()) 121 NodeList::remove(node); 137 122 m_freeList.push(node); 138 }139 140 inline HandleNode::HandleNode()141 : m_prev(nullptr)142 , m_next(nullptr)143 {144 }145 146 inline HandleNode::HandleNode(WTF::SentinelTag)147 : m_prev(nullptr)148 , m_next(nullptr)149 {150 123 } 151 124 … … 158 131 { 159 132 return HandleBlock::blockFor(this)->handleSet(); 160 }161 162 inline void HandleNode::setPrev(HandleNode* prev)163 {164 m_prev = prev;165 }166 167 inline HandleNode* HandleNode::prev()168 {169 return m_prev;170 }171 172 inline void HandleNode::setNext(HandleNode* next)173 {174 m_next = next;175 }176 177 inline HandleNode* HandleNode::next()178 {179 return m_next;180 133 } 181 134 … … 192 145 } 193 146 147 template<bool isCellOnly> 148 inline void HandleSet::writeBarrier(HandleSlot slot, JSValue value) 149 { 150 bool valueIsNonEmptyCell = value && (isCellOnly || value.isCell()); 151 bool slotIsNonEmptyCell = *slot && (isCellOnly || slot->isCell()); 152 if (valueIsNonEmptyCell == slotIsNonEmptyCell) 153 return; 154 155 Node* node = HandleNode::toHandleNode(slot); 156 #if ENABLE(GC_VALIDATION) 157 if (node->isOnList()) 158 RELEASE_ASSERT(isLiveNode(node)); 159 #endif 160 if (!valueIsNonEmptyCell) { 161 ASSERT(slotIsNonEmptyCell); 162 ASSERT(node->isOnList()); 163 NodeList::remove(node); 164 return; 165 } 166 167 ASSERT(!slotIsNonEmptyCell); 168 ASSERT(!node->isOnList()); 169 m_strongList.push(node); 170 171 #if ENABLE(GC_VALIDATION) 172 RELEASE_ASSERT(isLiveNode(node)); 173 #endif 174 } 175 194 176 } // namespace JSC -
trunk/Source/JavaScriptCore/heap/Strong.h
r283851 r295036 142 142 ASSERT(slot()); 143 143 JSValue value = HandleTypes<T>::toJSValue(externalType); 144 HandleSet::heapFor(slot())-> writeBarrier(slot(), value);144 HandleSet::heapFor(slot())->template writeBarrier<std::is_base_of_v<JSCell, T>>(slot(), value); 145 145 *slot() = value; 146 146 }
Note:
See TracChangeset
for help on using the changeset viewer.