Changeset 248807 in webkit
- Timestamp:
- Aug 16, 2019, 5:41:04 PM (7 years ago)
- Location:
- trunk/Source
- Files:
-
- 12 edited
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/CompactPointerTuple.h (modified) (2 diffs)
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/cssjit/SelectorCompiler.cpp (modified) (1 diff)
-
WebCore/dom/Element.cpp (modified) (3 diffs)
-
WebCore/dom/Element.h (modified) (3 diffs)
-
WebCore/dom/ElementRareData.h (modified) (8 diffs)
-
WebCore/dom/Node.cpp (modified) (3 diffs)
-
WebCore/dom/Node.h (modified) (8 diffs)
-
WebCore/dom/NodeRareData.cpp (modified) (1 diff)
-
WebCore/dom/NodeRareData.h (modified) (4 diffs)
-
WebCore/rendering/RenderObject.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r248759 r248807 1 2019-08-15 Ryosuke Niwa <rniwa@webkit.org> 2 3 Don't use union to store NodeRareData* and RenderObject* 4 https://bugs.webkit.org/show_bug.cgi?id=200744 5 6 Reviewed by Antti Koivisto. 7 8 Moved the static assert which requires the type of the object to which the pointer type points 9 into setPointer so that we can use CompactPointerTuple<T*, U> as a member variable 10 with just a forward declaration of T. 11 12 * wtf/CompactPointerTuple.h: 13 (WTF::CompactPointerTuple::setPointer): 14 1 15 2019-08-15 Zalan Bujtas <zalan@apple.com> 2 16 -
trunk/Source/WTF/wtf/CompactPointerTuple.h
r248546 r248807 41 41 static_assert(sizeof(Type) == 1, ""); 42 42 static_assert(std::is_pointer<PointerType>::value, ""); 43 static_assert(alignof(typename std::remove_pointer<PointerType>::type) >= alignof(void*), "");44 43 static_assert(std::is_integral<Type>::value || std::is_enum<Type>::value, ""); 45 44 … … 72 71 void setPointer(PointerType pointer) 73 72 { 73 static_assert(alignof(typename std::remove_pointer<PointerType>::type) >= alignof(void*), ""); 74 74 ASSERT((bitwise_cast<uint64_t>(pointer) & 0b111) == 0x0); 75 75 m_data = CompactPointerTuple(pointer, type()).m_data; -
trunk/Source/WebCore/ChangeLog
r248805 r248807 1 2019-08-15 Ryosuke Niwa <rniwa@webkit.org> 2 3 Don't use union to store NodeRareData* and RenderObject* 4 https://bugs.webkit.org/show_bug.cgi?id=200744 5 6 Reviewed by Antti Koivisto. 7 8 This patch undoes unioning of NodeRareData* and RenderObject* in Node introduced in r133372 in order 9 to eliminate any possibility of type confusion bugs. Instead of re-introducing the global map, which 10 is known to be slow, this patch simply adds an extra pointer for NodeRareData: Node::m_rareData. 11 12 To compensate for the increased memory usage due to a new pointer type in Node, this patch also packs 13 the style related flags in ElementRareData, which is the most common reason for which ElementRareData 14 is created, into RenderObject* pointer using CompactPointerTuple as Node::m_rendererWithStyleFlags. 15 16 Unfortunately, there are 9 style related flags and they won't all fit into the single byte provided 17 by CompactPointerTuple. Luckily, this patch also eliminates the need for HasRareDataFlag as m_rareData 18 knows whether a node has rare data or not so we re-use that bitflag space for the extra one flag. 19 20 No new tests since there should be no observable behavioral change from this. 21 22 * cssjit/SelectorCompiler.cpp: 23 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild): Check the nullity of 24 m_rareData directly instead of checking HasRareDataFlag, which has been removed. 25 * dom/Element.cpp: 26 (WebCore::Element::setStyleAffectedByEmpty): Deleted. 27 (WebCore::Element::setStyleAffectedByFocusWithin): Deleted. 28 (WebCore::Element::setStyleAffectedByActive): Deleted. 29 (WebCore::Element::setChildrenAffectedByDrag): Deleted. 30 (WebCore::Element::setChildrenAffectedByForwardPositionalRules): Deleted. 31 (WebCore::Element::setDescendantsAffectedByForwardPositionalRules): Deleted. 32 (WebCore::Element::setChildrenAffectedByBackwardPositionalRules): Deleted. 33 (WebCore::Element::setDescendantsAffectedByBackwardPositionalRules): Deleted. 34 (WebCore::Element::setChildrenAffectedByPropertyBasedBackwardPositionalRules): Deleted. 35 (WebCore::Element::hasFlagsSetDuringStylingOfChildren const): 36 (WebCore::Element::resetStyleRelations): Clear the flags in m_rendererWithStyleFlags and m_nodeFlags. 37 (WebCore::Element::rareDataStyleAffectedByEmpty const): Deleted. 38 (WebCore::Element::rareDataStyleAffectedByFocusWithin const): Deleted. 39 (WebCore::Element::rareDataStyleAffectedByActive const): Deleted. 40 (WebCore::Element::rareDataChildrenAffectedByDrag const): Deleted. 41 (WebCore::Element::rareDataChildrenAffectedByForwardPositionalRules const): Deleted. 42 (WebCore::Element::rareDataDescendantsAffectedByForwardPositionalRules const): Deleted. 43 (WebCore::Element::rareDataChildrenAffectedByBackwardPositionalRules const): Deleted. 44 (WebCore::Element::rareDataDescendantsAffectedByBackwardPositionalRules const): Deleted. 45 (WebCore::Element::rareDataChildrenAffectedByPropertyBasedBackwardPositionalRules const): Deleted. 46 * dom/Element.h: 47 (WebCore::Element::styleAffectedByActive const): Now uses m_rendererWithStyleFlags. 48 (WebCore::Element::styleAffectedByEmpty const): Ditto. 49 (WebCore::Element::styleAffectedByFocusWithin const): Now uses m_nodeFlags. 50 (WebCore::Element::childrenAffectedByDrag const): Now uses m_rendererWithStyleFlags. 51 (WebCore::Element::childrenAffectedByForwardPositionalRules const): Ditto. 52 (WebCore::Element::descendantsAffectedByForwardPositionalRules const): Ditto. 53 (WebCore::Element::childrenAffectedByBackwardPositionalRules const): Ditto. 54 (WebCore::Element::descendantsAffectedByBackwardPositionalRules const): Ditto. 55 (WebCore::Element::childrenAffectedByPropertyBasedBackwardPositionalRules const): Ditto. 56 (WebCore::Element::setStyleAffectedByEmpty): Now stores into m_rendererWithStyleFlags. 57 (WebCore::Element::setStyleAffectedByFocusWithin): Now uses m_nodeFlags. 58 (WebCore::Element::setDescendantsAffectedByPreviousSibling): Removed const qualifier & useless return. 59 (WebCore::Element::setStyleAffectedByActive): Now stores into m_rendererWithStyleFlags. 60 (WebCore::Element::setChildrenAffectedByDrag): Ditto. 61 (WebCore::Element::setChildrenAffectedByForwardPositionalRules): Ditto. 62 (WebCore::Element::setDescendantsAffectedByForwardPositionalRules): Ditto. 63 (WebCore::Element::setChildrenAffectedByBackwardPositionalRules): Ditto. 64 (WebCore::Element::setDescendantsAffectedByBackwardPositionalRules): Ditto. 65 (WebCore::Element::setChildrenAffectedByPropertyBasedBackwardPositionalRules): Ditto. 66 * dom/ElementRareData.h: 67 (WebCore::ElementRareData::styleAffectedByActive const): Deleted. 68 (WebCore::ElementRareData::setStyleAffectedByActive): Deleted. 69 (WebCore::ElementRareData::styleAffectedByEmpty const): Deleted. 70 (WebCore::ElementRareData::setStyleAffectedByEmpty): Deleted. 71 (WebCore::ElementRareData::styleAffectedByFocusWithin const): Deleted. 72 (WebCore::ElementRareData::setStyleAffectedByFocusWithin): Deleted. 73 (WebCore::ElementRareData::childrenAffectedByDrag const): Deleted. 74 (WebCore::ElementRareData::setChildrenAffectedByDrag): Deleted. 75 (WebCore::ElementRareData::childrenAffectedByLastChildRules const): Deleted. 76 (WebCore::ElementRareData::setChildrenAffectedByLastChildRules): Deleted. 77 (WebCore::ElementRareData::childrenAffectedByForwardPositionalRules const): Deleted. 78 (WebCore::ElementRareData::setChildrenAffectedByForwardPositionalRules): Deleted. 79 (WebCore::ElementRareData::descendantsAffectedByForwardPositionalRules const): Deleted. 80 (WebCore::ElementRareData::setDescendantsAffectedByForwardPositionalRules): Deleted. 81 (WebCore::ElementRareData::childrenAffectedByBackwardPositionalRules const): Deleted. 82 (WebCore::ElementRareData::setChildrenAffectedByBackwardPositionalRules): Deleted. 83 (WebCore::ElementRareData::descendantsAffectedByBackwardPositionalRules const): Deleted. 84 (WebCore::ElementRareData::setDescendantsAffectedByBackwardPositionalRules): Deleted. 85 (WebCore::ElementRareData::childrenAffectedByPropertyBasedBackwardPositionalRules const): Deleted. 86 (WebCore::ElementRareData::setChildrenAffectedByPropertyBasedBackwardPositionalRules): Deleted. 87 (WebCore::ElementRareData::useTypes const): Removed UseType::StyleFlags. 88 (WebCore::ElementRareData::ElementRareData): No longer takes RenderElement*. 89 (WebCore::ElementRareData::resetStyleRelations): Only re-sets child index now since that's all left. 90 * dom/Node.cpp: 91 (WebCore::stringForRareDataUseType): Removed UseType::StyleFlags since there is no style related 92 flags in ElementRareData. 93 (WebCore::Node::materializeRareData): Simplified now that m_rareData is not a union. 94 (WebCore::Node::clearRareData): Ditto. 95 * dom/Node.h: 96 (WebCore::NodeRareDataBase): Deleted. 97 (WebCore::Node::renderer const): 98 (WebCore::Node::rareDataMemoryOffset): 99 (WebCore::Node::flagHasRareData): Deleted. 100 (WebCore::Node::NodeFlags): Replaced HasRareDataFlag with StyleAffectedByFocusWithinFlag. 101 (WebCore::Node::ElementStyleFlag): Added. 102 (WebCore::Node::hasStyleFlag const): Added. Checks a reprense of a flag in m_rendererWithStyleFlags. 103 (WebCore::Node::setStyleFlag): Ditto for setting a flag. 104 (WebCore::Node::clearStyleFlags): Ditto for clearing all flags. 105 (WebCore::Node::hasRareData const): Now checks the nullity of m_rareData directly. 106 (WebCore::Node::rareData const): 107 * dom/NodeRareData.cpp: The size of NodeRareData is shrunk by one pointer. 108 * dom/NodeRareData.h: 109 (WebCore::NodeRareData::NodeRareData): No longer inherits from NodeRareDataBase which was needed to 110 to store RenderObject*. 111 (WebCore::Node::rareData const): Moved to Node.h. 112 * rendering/RenderObject.h: 113 (WebCore::Node::setRenderer): Moved from Node.h since CompactPointerTuple::setPointer has the 114 aforementioned static_assert which requires the definition of RenderObject. 115 1 116 2019-08-16 Saam Barati <sbarati@apple.com> 2 117 -
trunk/Source/WebCore/cssjit/SelectorCompiler.cpp
r248373 r248807 3603 3603 Assembler::JumpList noCachedChildIndexCases; 3604 3604 generateWalkToPreviousAdjacentElement(noMoreSiblingsCases, previousSibling); 3605 noCachedChildIndexCases.append(m_assembler.branchTest32(Assembler::Zero, Assembler::Address(previousSibling, Node::nodeFlagsMemoryOffset()), Assembler::TrustedImm32(Node::flagHasRareData()))); 3605 3606 LocalRegister elementRareData(m_registerAllocator); 3607 m_assembler.loadPtr(Assembler::Address(previousSibling, Node::rareDataMemoryOffset()), elementRareData); 3608 3609 noCachedChildIndexCases.append(m_assembler.branchTestPtr(Assembler::Zero, elementRareData)); 3606 3610 { 3607 LocalRegister elementRareData(m_registerAllocator);3608 m_assembler.loadPtr(Assembler::Address(previousSibling, Node::rareDataMemoryOffset()), elementRareData);3609 3611 LocalRegister cachedChildIndex(m_registerAllocator); 3610 3612 m_assembler.load16(Assembler::Address(elementRareData, ElementRareData::childIndexMemoryOffset()), cachedChildIndex); -
trunk/Source/WebCore/dom/Element.cpp
r248784 r248807 3220 3220 } 3221 3221 3222 void Element::setStyleAffectedByEmpty()3223 {3224 ensureElementRareData().setStyleAffectedByEmpty(true);3225 }3226 3227 void Element::setStyleAffectedByFocusWithin()3228 {3229 ensureElementRareData().setStyleAffectedByFocusWithin(true);3230 }3231 3232 void Element::setStyleAffectedByActive()3233 {3234 ensureElementRareData().setStyleAffectedByActive(true);3235 }3236 3237 void Element::setChildrenAffectedByDrag()3238 {3239 ensureElementRareData().setChildrenAffectedByDrag(true);3240 }3241 3242 void Element::setChildrenAffectedByForwardPositionalRules()3243 {3244 ensureElementRareData().setChildrenAffectedByForwardPositionalRules(true);3245 }3246 3247 void Element::setDescendantsAffectedByForwardPositionalRules()3248 {3249 ensureElementRareData().setDescendantsAffectedByForwardPositionalRules(true);3250 }3251 3252 void Element::setChildrenAffectedByBackwardPositionalRules()3253 {3254 ensureElementRareData().setChildrenAffectedByBackwardPositionalRules(true);3255 }3256 3257 void Element::setDescendantsAffectedByBackwardPositionalRules()3258 {3259 ensureElementRareData().setDescendantsAffectedByBackwardPositionalRules(true);3260 }3261 3262 void Element::setChildrenAffectedByPropertyBasedBackwardPositionalRules()3263 {3264 ensureElementRareData().setChildrenAffectedByPropertyBasedBackwardPositionalRules(true);3265 }3266 3267 3222 void Element::setChildIndex(unsigned index) 3268 3223 { … … 3273 3228 bool Element::hasFlagsSetDuringStylingOfChildren() const 3274 3229 { 3275 if (childrenAffectedByHover() || childrenAffectedByFirstChildRules() || childrenAffectedByLastChildRules()) 3276 return true; 3277 3278 if (!hasRareData()) 3279 return false; 3280 return rareDataStyleAffectedByActive() 3281 || rareDataChildrenAffectedByDrag() 3282 || rareDataChildrenAffectedByForwardPositionalRules() 3283 || rareDataDescendantsAffectedByForwardPositionalRules() 3284 || rareDataChildrenAffectedByBackwardPositionalRules() 3285 || rareDataDescendantsAffectedByBackwardPositionalRules() 3286 || rareDataChildrenAffectedByPropertyBasedBackwardPositionalRules(); 3287 } 3288 3289 bool Element::rareDataStyleAffectedByEmpty() const 3290 { 3291 ASSERT(hasRareData()); 3292 return elementRareData()->styleAffectedByEmpty(); 3293 } 3294 3295 bool Element::rareDataStyleAffectedByFocusWithin() const 3296 { 3297 ASSERT(hasRareData()); 3298 return elementRareData()->styleAffectedByFocusWithin(); 3299 } 3300 3301 bool Element::rareDataStyleAffectedByActive() const 3302 { 3303 ASSERT(hasRareData()); 3304 return elementRareData()->styleAffectedByActive(); 3305 } 3306 3307 bool Element::rareDataChildrenAffectedByDrag() const 3308 { 3309 ASSERT(hasRareData()); 3310 return elementRareData()->childrenAffectedByDrag(); 3311 } 3312 3313 bool Element::rareDataChildrenAffectedByForwardPositionalRules() const 3314 { 3315 ASSERT(hasRareData()); 3316 return elementRareData()->childrenAffectedByForwardPositionalRules(); 3317 } 3318 3319 bool Element::rareDataDescendantsAffectedByForwardPositionalRules() const 3320 { 3321 ASSERT(hasRareData()); 3322 return elementRareData()->descendantsAffectedByForwardPositionalRules(); 3323 } 3324 3325 bool Element::rareDataChildrenAffectedByBackwardPositionalRules() const 3326 { 3327 ASSERT(hasRareData()); 3328 return elementRareData()->childrenAffectedByBackwardPositionalRules(); 3329 } 3330 3331 bool Element::rareDataDescendantsAffectedByBackwardPositionalRules() const 3332 { 3333 ASSERT(hasRareData()); 3334 return elementRareData()->descendantsAffectedByBackwardPositionalRules(); 3335 } 3336 3337 bool Element::rareDataChildrenAffectedByPropertyBasedBackwardPositionalRules() const 3338 { 3339 ASSERT(hasRareData()); 3340 return elementRareData()->childrenAffectedByPropertyBasedBackwardPositionalRules(); 3230 return styleAffectedByActive() 3231 || childrenAffectedByHover() 3232 || childrenAffectedByFirstChildRules() 3233 || childrenAffectedByLastChildRules() 3234 || childrenAffectedByDrag() 3235 || childrenAffectedByForwardPositionalRules() 3236 || descendantsAffectedByForwardPositionalRules() 3237 || childrenAffectedByBackwardPositionalRules() 3238 || descendantsAffectedByBackwardPositionalRules() 3239 || childrenAffectedByPropertyBasedBackwardPositionalRules(); 3341 3240 } 3342 3241 … … 3971 3870 void Element::resetStyleRelations() 3972 3871 { 3872 // FIXME: Make this code more consistent. 3873 clearFlag(StyleAffectedByFocusWithinFlag); 3874 clearStyleFlags(); 3973 3875 if (!hasRareData()) 3974 3876 return; -
trunk/Source/WebCore/dom/Element.h
r248784 r248807 341 341 342 342 // Methods for indicating the style is affected by dynamic updates (e.g., children changing, our position changing in our sibling list, etc.) 343 bool styleAffectedByActive() const { return has RareData() && rareDataStyleAffectedByActive(); }344 bool styleAffectedByEmpty() const { return has RareData() && rareDataStyleAffectedByEmpty(); }345 bool styleAffectedByFocusWithin() const { return hasRareData() && rareDataStyleAffectedByFocusWithin(); }343 bool styleAffectedByActive() const { return hasStyleFlag(ElementStyleFlag::StyleAffectedByActive); } 344 bool styleAffectedByEmpty() const { return hasStyleFlag(ElementStyleFlag::StyleAffectedByEmpty); } 345 bool styleAffectedByFocusWithin() const { return getFlag(StyleAffectedByFocusWithinFlag); } 346 346 bool descendantsAffectedByPreviousSibling() const { return getFlag(DescendantsAffectedByPreviousSiblingFlag); } 347 347 bool childrenAffectedByHover() const { return getFlag(ChildrenAffectedByHoverRulesFlag); } 348 bool childrenAffectedByDrag() const { return has RareData() && rareDataChildrenAffectedByDrag(); }348 bool childrenAffectedByDrag() const { return hasStyleFlag(ElementStyleFlag::ChildrenAffectedByDrag); } 349 349 bool childrenAffectedByFirstChildRules() const { return getFlag(ChildrenAffectedByFirstChildRulesFlag); } 350 350 bool childrenAffectedByLastChildRules() const { return getFlag(ChildrenAffectedByLastChildRulesFlag); } 351 bool childrenAffectedByForwardPositionalRules() const { return has RareData() && rareDataChildrenAffectedByForwardPositionalRules(); }352 bool descendantsAffectedByForwardPositionalRules() const { return has RareData() && rareDataDescendantsAffectedByForwardPositionalRules(); }353 bool childrenAffectedByBackwardPositionalRules() const { return has RareData() && rareDataChildrenAffectedByBackwardPositionalRules(); }354 bool descendantsAffectedByBackwardPositionalRules() const { return has RareData() && rareDataDescendantsAffectedByBackwardPositionalRules(); }355 bool childrenAffectedByPropertyBasedBackwardPositionalRules() const { return has RareData() && rareDataChildrenAffectedByPropertyBasedBackwardPositionalRules(); }351 bool childrenAffectedByForwardPositionalRules() const { return hasStyleFlag(ElementStyleFlag::ChildrenAffectedByForwardPositionalRules); } 352 bool descendantsAffectedByForwardPositionalRules() const { return hasStyleFlag(ElementStyleFlag::DescendantsAffectedByForwardPositionalRules); } 353 bool childrenAffectedByBackwardPositionalRules() const { return hasStyleFlag(ElementStyleFlag::ChildrenAffectedByBackwardPositionalRules); } 354 bool descendantsAffectedByBackwardPositionalRules() const { return hasStyleFlag(ElementStyleFlag::DescendantsAffectedByBackwardPositionalRules); } 355 bool childrenAffectedByPropertyBasedBackwardPositionalRules() const { return hasStyleFlag(ElementStyleFlag::ChildrenAffectedByPropertyBasedBackwardPositionalRules); } 356 356 bool affectsNextSiblingElementStyle() const { return getFlag(AffectsNextSiblingElementStyle); } 357 357 unsigned childIndex() const { return hasRareData() ? rareDataChildIndex() : 0; } … … 359 359 bool hasFlagsSetDuringStylingOfChildren() const; 360 360 361 void setStyleAffectedByEmpty() ;362 void setStyleAffectedByFocusWithin() ;363 void setDescendantsAffectedByPreviousSibling() const { returnsetFlag(DescendantsAffectedByPreviousSiblingFlag); }361 void setStyleAffectedByEmpty() { setStyleFlag(ElementStyleFlag::StyleAffectedByEmpty); } 362 void setStyleAffectedByFocusWithin() { setFlag(StyleAffectedByFocusWithinFlag); } 363 void setDescendantsAffectedByPreviousSibling() { setFlag(DescendantsAffectedByPreviousSiblingFlag); } 364 364 void setChildrenAffectedByHover() { setFlag(ChildrenAffectedByHoverRulesFlag); } 365 void setStyleAffectedByActive() ;366 void setChildrenAffectedByDrag() ;365 void setStyleAffectedByActive() { setStyleFlag(ElementStyleFlag::StyleAffectedByActive); } 366 void setChildrenAffectedByDrag() { setStyleFlag(ElementStyleFlag::ChildrenAffectedByDrag); } 367 367 void setChildrenAffectedByFirstChildRules() { setFlag(ChildrenAffectedByFirstChildRulesFlag); } 368 368 void setChildrenAffectedByLastChildRules() { setFlag(ChildrenAffectedByLastChildRulesFlag); } 369 void setChildrenAffectedByForwardPositionalRules() ;370 void setDescendantsAffectedByForwardPositionalRules() ;371 void setChildrenAffectedByBackwardPositionalRules() ;372 void setDescendantsAffectedByBackwardPositionalRules() ;373 void setChildrenAffectedByPropertyBasedBackwardPositionalRules() ;369 void setChildrenAffectedByForwardPositionalRules() { setStyleFlag(ElementStyleFlag::ChildrenAffectedByForwardPositionalRules); } 370 void setDescendantsAffectedByForwardPositionalRules() { setStyleFlag(ElementStyleFlag::DescendantsAffectedByForwardPositionalRules); } 371 void setChildrenAffectedByBackwardPositionalRules() { setStyleFlag(ElementStyleFlag::ChildrenAffectedByBackwardPositionalRules); } 372 void setDescendantsAffectedByBackwardPositionalRules() { setStyleFlag(ElementStyleFlag::DescendantsAffectedByBackwardPositionalRules); } 373 void setChildrenAffectedByPropertyBasedBackwardPositionalRules() { setStyleFlag(ElementStyleFlag::ChildrenAffectedByPropertyBasedBackwardPositionalRules); } 374 374 void setAffectsNextSiblingElementStyle() { setFlag(AffectsNextSiblingElementStyle); } 375 375 void setStyleIsAffectedByPreviousSibling() { setFlag(StyleIsAffectedByPreviousSibling); } … … 696 696 const RenderStyle& resolvePseudoElementStyle(PseudoId); 697 697 698 bool rareDataStyleAffectedByEmpty() const;699 bool rareDataStyleAffectedByFocusWithin() const;700 bool rareDataChildrenAffectedByHover() const;701 bool rareDataStyleAffectedByActive() const;702 bool rareDataChildrenAffectedByDrag() const;703 bool rareDataChildrenAffectedByLastChildRules() const;704 bool rareDataChildrenAffectedByForwardPositionalRules() const;705 bool rareDataDescendantsAffectedByForwardPositionalRules() const;706 bool rareDataChildrenAffectedByBackwardPositionalRules() const;707 bool rareDataDescendantsAffectedByBackwardPositionalRules() const;708 bool rareDataChildrenAffectedByPropertyBasedBackwardPositionalRules() const;709 698 unsigned rareDataChildIndex() const; 710 699 -
trunk/Source/WebCore/dom/ElementRareData.h
r248784 r248807 43 43 class ElementRareData : public NodeRareData { 44 44 public: 45 explicit ElementRareData( RenderElement*);45 explicit ElementRareData(); 46 46 ~ElementRareData(); 47 47 … … 60 60 void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; } 61 61 62 bool styleAffectedByActive() const { return m_styleAffectedByActive; }63 void setStyleAffectedByActive(bool value) { m_styleAffectedByActive = value; }64 65 bool styleAffectedByEmpty() const { return m_styleAffectedByEmpty; }66 void setStyleAffectedByEmpty(bool value) { m_styleAffectedByEmpty = value; }67 68 bool styleAffectedByFocusWithin() const { return m_styleAffectedByFocusWithin; }69 void setStyleAffectedByFocusWithin(bool value) { m_styleAffectedByFocusWithin = value; }70 71 62 #if ENABLE(FULLSCREEN_API) 72 63 bool containsFullScreenElement() { return m_containsFullScreenElement; } 73 64 void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; } 74 65 #endif 75 76 bool childrenAffectedByDrag() const { return m_childrenAffectedByDrag; }77 void setChildrenAffectedByDrag(bool value) { m_childrenAffectedByDrag = value; }78 79 bool childrenAffectedByLastChildRules() const { return m_childrenAffectedByLastChildRules; }80 void setChildrenAffectedByLastChildRules(bool value) { m_childrenAffectedByLastChildRules = value; }81 bool childrenAffectedByForwardPositionalRules() const { return m_childrenAffectedByForwardPositionalRules; }82 void setChildrenAffectedByForwardPositionalRules(bool value) { m_childrenAffectedByForwardPositionalRules = value; }83 bool descendantsAffectedByForwardPositionalRules() const { return m_descendantsAffectedByForwardPositionalRules; }84 void setDescendantsAffectedByForwardPositionalRules(bool value) { m_descendantsAffectedByForwardPositionalRules = value; }85 bool childrenAffectedByBackwardPositionalRules() const { return m_childrenAffectedByBackwardPositionalRules; }86 void setChildrenAffectedByBackwardPositionalRules(bool value) { m_childrenAffectedByBackwardPositionalRules = value; }87 bool descendantsAffectedByBackwardPositionalRules() const { return m_descendantsAffectedByBackwardPositionalRules; }88 void setDescendantsAffectedByBackwardPositionalRules(bool value) { m_descendantsAffectedByBackwardPositionalRules = value; }89 bool childrenAffectedByPropertyBasedBackwardPositionalRules() const { return m_childrenAffectedByPropertyBasedBackwardPositionalRules; }90 void setChildrenAffectedByPropertyBasedBackwardPositionalRules(bool value) { m_childrenAffectedByPropertyBasedBackwardPositionalRules = value; }91 66 92 67 unsigned childIndex() const { return m_childIndex; } … … 149 124 if (m_tabIndexWasSetExplicitly) 150 125 result.add(UseType::TabIndex); 151 if (m_styleAffectedByActive || m_styleAffectedByEmpty || m_styleAffectedByFocusWithin || m_childrenAffectedByHover152 || m_childrenAffectedByDrag || m_childrenAffectedByLastChildRules || m_childrenAffectedByForwardPositionalRules153 || m_descendantsAffectedByForwardPositionalRules || m_childrenAffectedByBackwardPositionalRules154 || m_descendantsAffectedByBackwardPositionalRules || m_childrenAffectedByPropertyBasedBackwardPositionalRules)155 result.add(UseType::StyleFlags);156 126 if (m_minimumSizeForResizing != defaultMinimumSizeForResizing()) 157 127 result.add(UseType::MinimumSize); … … 186 156 unsigned short m_childIndex; 187 157 unsigned m_tabIndexWasSetExplicitly : 1; 188 unsigned m_styleAffectedByActive : 1;189 unsigned m_styleAffectedByEmpty : 1;190 unsigned m_styleAffectedByFocusWithin : 1;191 158 #if ENABLE(FULLSCREEN_API) 192 159 unsigned m_containsFullScreenElement : 1; … … 195 162 unsigned m_hasCSSAnimation : 1; 196 163 unsigned m_hasElementIdentifier : 1; 197 unsigned m_childrenAffectedByHover : 1;198 unsigned m_childrenAffectedByDrag : 1;199 // Bits for dynamic child matching.200 // We optimize for :first-child and :last-child. The other positional child selectors like nth-child or201 // *-child-of-type, we will just give up and re-evaluate whenever children change at all.202 unsigned m_childrenAffectedByLastChildRules : 1;203 unsigned m_childrenAffectedByForwardPositionalRules : 1;204 unsigned m_descendantsAffectedByForwardPositionalRules : 1;205 unsigned m_childrenAffectedByBackwardPositionalRules : 1;206 unsigned m_descendantsAffectedByBackwardPositionalRules : 1;207 unsigned m_childrenAffectedByPropertyBasedBackwardPositionalRules : 1;208 164 209 165 LayoutSize m_minimumSizeForResizing; … … 234 190 }; 235 191 236 inline ElementRareData::ElementRareData(RenderElement* renderer) 237 : NodeRareData(renderer) 238 , m_tabIndex(0) 192 inline ElementRareData::ElementRareData() 193 : m_tabIndex(0) 239 194 , m_childIndex(0) 240 195 , m_tabIndexWasSetExplicitly(false) 241 , m_styleAffectedByActive(false)242 , m_styleAffectedByEmpty(false)243 , m_styleAffectedByFocusWithin(false)244 196 #if ENABLE(FULLSCREEN_API) 245 197 , m_containsFullScreenElement(false) … … 248 200 , m_hasCSSAnimation(false) 249 201 , m_hasElementIdentifier(false) 250 , m_childrenAffectedByHover(false)251 , m_childrenAffectedByDrag(false)252 , m_childrenAffectedByLastChildRules(false)253 , m_childrenAffectedByForwardPositionalRules(false)254 , m_descendantsAffectedByForwardPositionalRules(false)255 , m_childrenAffectedByBackwardPositionalRules(false)256 , m_descendantsAffectedByBackwardPositionalRules(false)257 , m_childrenAffectedByPropertyBasedBackwardPositionalRules(false)258 202 , m_minimumSizeForResizing(defaultMinimumSizeForResizing()) 259 203 { … … 286 230 inline void ElementRareData::resetStyleRelations() 287 231 { 288 setStyleAffectedByEmpty(false);289 setStyleAffectedByFocusWithin(false);290 232 setChildIndex(0); 291 setStyleAffectedByActive(false);292 setChildrenAffectedByDrag(false);293 setChildrenAffectedByLastChildRules(false);294 setChildrenAffectedByForwardPositionalRules(false);295 setDescendantsAffectedByForwardPositionalRules(false);296 setChildrenAffectedByBackwardPositionalRules(false);297 setDescendantsAffectedByBackwardPositionalRules(false);298 setChildrenAffectedByPropertyBasedBackwardPositionalRules(false);299 233 } 300 234 -
trunk/Source/WebCore/dom/Node.cpp
r248173 r248807 109 109 case NodeRareData::UseType::TabIndex: 110 110 return "TabIndex"; 111 case NodeRareData::UseType::StyleFlags:112 return "StyleFlags";113 111 case NodeRareData::UseType::MinimumSize: 114 112 return "MinimumSize"; … … 397 395 void Node::materializeRareData() 398 396 { 399 NodeRareData* data;400 397 if (is<Element>(*this)) 401 data = std::make_unique<ElementRareData>(downcast<RenderElement>(m_data.m_renderer)).release();398 m_rareData = std::make_unique<ElementRareData>(); 402 399 else 403 data = std::make_unique<NodeRareData>(m_data.m_renderer).release(); 404 ASSERT(data); 405 406 m_data.m_rareData = data; 407 setFlag(HasRareDataFlag); 400 m_rareData = std::make_unique<NodeRareData>(); 408 401 } 409 402 … … 413 406 ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty()); 414 407 415 RenderObject* renderer = m_data.m_rareData->renderer(); 416 if (isElementNode()) 417 delete static_cast<ElementRareData*>(m_data.m_rareData); 418 else 419 delete static_cast<NodeRareData*>(m_data.m_rareData); 420 m_data.m_renderer = renderer; 421 clearFlag(HasRareDataFlag); 408 m_rareData = nullptr; 422 409 } 423 410 -
trunk/Source/WebCore/dom/Node.h
r247860 r248807 32 32 #include "StyleValidity.h" 33 33 #include "TreeScope.h" 34 #include <wtf/CompactPointerTuple.h> 34 35 #include <wtf/Forward.h> 35 36 #include <wtf/IsoMalloc.h> … … 64 65 65 66 using NodeOrString = Variant<RefPtr<Node>, String>; 66 67 class NodeRareDataBase {68 public:69 RenderObject* renderer() const { return m_renderer; }70 void setRenderer(RenderObject* renderer) { m_renderer = renderer; }71 72 protected:73 NodeRareDataBase(RenderObject* renderer)74 : m_renderer(renderer)75 { }76 77 private:78 RenderObject* m_renderer;79 };80 67 81 68 class Node : public EventTarget { … … 411 398 412 399 // As renderer() includes a branch you should avoid calling it repeatedly in hot code paths. 413 RenderObject* renderer() const { return hasRareData() ? m_data.m_rareData->renderer() : m_data.m_renderer; }; 414 void setRenderer(RenderObject* renderer) 415 { 416 if (hasRareData()) 417 m_data.m_rareData->setRenderer(renderer); 418 else 419 m_data.m_renderer = renderer; 420 } 400 RenderObject* renderer() const { return m_rendererWithStyleFlags.pointer(); } 401 void setRenderer(RenderObject*); // Defined in RenderObject.h 421 402 422 403 // Use these two methods with caution. … … 529 510 #if ENABLE(JIT) 530 511 static ptrdiff_t nodeFlagsMemoryOffset() { return OBJECT_OFFSETOF(Node, m_nodeFlags); } 531 static ptrdiff_t rareDataMemoryOffset() { return OBJECT_OFFSETOF(Node, m_ data.m_rareData); }512 static ptrdiff_t rareDataMemoryOffset() { return OBJECT_OFFSETOF(Node, m_rareData); } 532 513 static int32_t flagIsText() { return IsTextFlag; } 533 514 static int32_t flagIsContainer() { return IsContainerFlag; } … … 537 518 static int32_t flagIsLink() { return IsLinkFlag; } 538 519 static int32_t flagHasFocusWithin() { return HasFocusWithin; } 539 static int32_t flagHasRareData() { return HasRareDataFlag; }540 520 static int32_t flagIsParsingChildrenFinished() { return IsParsingChildrenFinishedFlag; } 541 521 static int32_t flagChildrenAffectedByFirstChildRulesFlag() { return ChildrenAffectedByFirstChildRulesFlag; } … … 558 538 IsConnectedFlag = 1 << 8, 559 539 IsInShadowTreeFlag = 1 << 9, 560 HasRareDataFlag = 1 << 10,540 StyleAffectedByFocusWithinFlag = 1 << 10, 561 541 HasEventTargetDataFlag = 1 << 11, 562 542 … … 621 601 static constexpr uint32_t s_refCountMask = ~static_cast<uint32_t>(1); 622 602 603 enum class ElementStyleFlag : uint8_t { 604 StyleAffectedByActive = 1 << 0, 605 StyleAffectedByEmpty = 1 << 1, 606 ChildrenAffectedByDrag = 1 << 2, 607 608 // Bits for dynamic child matching. 609 // We optimize for :first-child and :last-child. The other positional child selectors like nth-child or 610 // *-child-of-type, we will just give up and re-evaluate whenever children change at all. 611 ChildrenAffectedByForwardPositionalRules = 1 << 3, 612 DescendantsAffectedByForwardPositionalRules = 1 << 4, 613 ChildrenAffectedByBackwardPositionalRules = 1 << 5, 614 DescendantsAffectedByBackwardPositionalRules = 1 << 6, 615 ChildrenAffectedByPropertyBasedBackwardPositionalRules = 1 << 7, 616 }; 617 618 bool hasStyleFlag(ElementStyleFlag state) const { return m_rendererWithStyleFlags.type() & static_cast<uint8_t>(state); } 619 void setStyleFlag(ElementStyleFlag state) { m_rendererWithStyleFlags.setType(m_rendererWithStyleFlags.type() | static_cast<uint8_t>(state)); } 620 void clearStyleFlags() { m_rendererWithStyleFlags.setType(0); } 621 623 622 virtual void addSubresourceAttributeURLs(ListHashSet<URL>&) const { } 624 623 625 bool hasRareData() const { return getFlag(HasRareDataFlag); } 626 627 NodeRareData* rareData() const; 624 bool hasRareData() const { return !!m_rareData; } 625 NodeRareData* rareData() const { return m_rareData.get(); } 628 626 NodeRareData& ensureRareData(); 629 627 void clearRareData(); … … 674 672 Node* m_previous { nullptr }; 675 673 Node* m_next { nullptr }; 676 // When a node has rare data we move the renderer into the rare data. 677 union DataUnion { 678 RenderObject* m_renderer; 679 NodeRareDataBase* m_rareData; 680 } m_data { nullptr }; 674 CompactPointerTuple<RenderObject*, uint8_t> m_rendererWithStyleFlags; 675 std::unique_ptr<NodeRareData> m_rareData; 681 676 }; 682 677 -
trunk/Source/WebCore/dom/NodeRareData.cpp
r243887 r248807 38 38 struct SameSizeAsNodeRareData { 39 39 unsigned m_bitfields : 20; 40 void* m_pointer[ 3];40 void* m_pointer[2]; 41 41 }; 42 42 -
trunk/Source/WebCore/dom/NodeRareData.h
r248173 r248807 248 248 }; 249 249 250 class NodeRareData : public NodeRareDataBase{250 class NodeRareData { 251 251 WTF_MAKE_NONCOPYABLE(NodeRareData); WTF_MAKE_FAST_ALLOCATED; 252 252 public: … … 258 258 259 259 TabIndex = 1 << 3, 260 StyleFlags = 1 << 4, 261 MinimumSize = 1 << 5, 262 ScrollingPosition = 1 << 6, 263 ComputedStyle = 1 << 7, 264 Dataset = 1 << 8, 265 ClassList = 1 << 9, 266 ShadowRoot = 1 << 10, 267 CustomElementQueue = 1 << 11, 268 AttributeMap = 1 << 12, 269 InteractionObserver = 1 << 13, 270 PseudoElements = 1 << 14, 260 MinimumSize = 1 << 4, 261 ScrollingPosition = 1 << 5, 262 ComputedStyle = 1 << 6, 263 Dataset = 1 << 7, 264 ClassList = 1 << 8, 265 ShadowRoot = 1 << 9, 266 CustomElementQueue = 1 << 10, 267 AttributeMap = 1 << 11, 268 InteractionObserver = 1 << 12, 269 PseudoElements = 1 << 13, 271 270 }; 272 271 #endif 273 272 274 NodeRareData(RenderObject* renderer) 275 : NodeRareDataBase(renderer) 276 , m_connectedFrameCount(0) 273 NodeRareData() 277 274 { } 278 275 … … 321 318 322 319 private: 323 unsigned m_connectedFrameCount ; // Must fit Page::maxNumberOfFrames.320 unsigned m_connectedFrameCount { 0 }; // Must fit Page::maxNumberOfFrames. 324 321 325 322 std::unique_ptr<NodeListsNodeData> m_nodeLists; … … 337 334 } 338 335 339 inline NodeRareData* Node::rareData() const340 {341 ASSERT_WITH_SECURITY_IMPLICATION(hasRareData());342 return static_cast<NodeRareData*>(m_data.m_rareData);343 }344 345 336 inline NodeRareData& Node::ensureRareData() 346 337 { -
trunk/Source/WebCore/rendering/RenderObject.h
r246950 r248807 1104 1104 } 1105 1105 1106 inline void Node::setRenderer(RenderObject* renderer) { m_rendererWithStyleFlags.setPointer(renderer); } 1107 1106 1108 #if ENABLE(TREE_DEBUGGING) 1107 1109 void printRenderTreeForLiveDocuments();
Note:
See TracChangeset
for help on using the changeset viewer.