Changeset 182373 in webkit
- Timestamp:
- Apr 5, 2015, 7:59:57 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r182371 r182373 1 2015-04-05 Simon Fraser <simon.fraser@apple.com> 2 3 Free up some bits in RenderObject by moving rarely used bits into a side table 4 https://bugs.webkit.org/show_bug.cgi?id=143432 5 6 Reviewed by Darin Adler. 7 8 Add a side table (global hash) on RenderObject to store data that is rarely 9 used. Move the "isDragging" and "hasReflection" bits there. Re-use one of 10 those bits for "hasRareData", and leave the other unused (I have plans for it). 11 12 * rendering/RenderBlock.cpp: 13 (WebCore::getBlockRareData): Renamed for consistency. 14 (WebCore::ensureBlockRareData): Renamed to avoid conflict with RenderObject::ensureRareData(). 15 (WebCore::RenderBlock::cachedFlowThreadContainingBlock): 16 (WebCore::RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate): 17 (WebCore::RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate): 18 (WebCore::RenderBlock::updateCachedFlowThreadContainingBlock): 19 (WebCore::RenderBlock::locateFlowThreadContainingBlock): 20 (WebCore::RenderBlock::paginationStrut): 21 (WebCore::RenderBlock::pageLogicalOffset): 22 (WebCore::RenderBlock::setPaginationStrut): 23 (WebCore::RenderBlock::setPageLogicalOffset): 24 (WebCore::getRareData): Deleted. 25 (WebCore::ensureRareData): Deleted. 26 * rendering/RenderObject.cpp: 27 (WebCore::RenderObject::~RenderObject): Assert that rare data hasn't been resurrected 28 since willBeDestroyed(). 29 (WebCore::RenderObject::willBeDestroyed): Clear the rare data. 30 (WebCore::RenderObject::setIsDragging): If setting, ensure that we have rare data and 31 set the bit. Otherwise, only clear the bit of we have rare data. 32 (WebCore::RenderObject::setHasReflection): Ditto. 33 (WebCore::RenderObject::rareDataMap): 34 (WebCore::RenderObject::rareData): 35 (WebCore::RenderObject::ensureRareData): 36 (WebCore::RenderObject::clearRareData): 37 * rendering/RenderObject.h: 38 (WebCore::RenderObject::isDragging): Fast-fail on the hasRareData() bit, then do the 39 slower lookup in rare data. 40 (WebCore::RenderObject::hasReflection): Ditto. 41 (WebCore::RenderObject::setEverHadLayout): Moved up to group with other bit setters. 42 (WebCore::RenderObject::hasRareData): 43 (WebCore::RenderObject::setHasRareData): 44 (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields): 45 (WebCore::RenderObject::RenderObjectRareData::RenderObjectRareData): 46 (WebCore::RenderObject::setHasReflection): Deleted. Out of line now. 47 (WebCore::RenderObject::setIsDragging): Deleted. Ditto. 48 1 49 2015-04-05 Darin Adler <darin@apple.com> 2 50 -
trunk/Source/WebCore/rendering/RenderBlock.cpp
r182364 r182373 934 934 } 935 935 936 static RenderBlockRareData* get RareData(const RenderBlock* block)937 { 938 return gRareDataMap ? gRareDataMap->get(block) : 0;939 } 940 941 static RenderBlockRareData& ensure RareData(const RenderBlock* block)936 static RenderBlockRareData* getBlockRareData(const RenderBlock* block) 937 { 938 return gRareDataMap ? gRareDataMap->get(block) : nullptr; 939 } 940 941 static RenderBlockRareData& ensureBlockRareData(const RenderBlock* block) 942 942 { 943 943 if (!gRareDataMap) … … 3233 3233 RenderFlowThread* RenderBlock::cachedFlowThreadContainingBlock() const 3234 3234 { 3235 RenderBlockRareData* rareData = get RareData(this);3235 RenderBlockRareData* rareData = getBlockRareData(this); 3236 3236 3237 3237 if (!rareData || !rareData->m_flowThreadContainingBlock) … … 3243 3243 bool RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate() const 3244 3244 { 3245 RenderBlockRareData* rareData = get RareData(this);3245 RenderBlockRareData* rareData = getBlockRareData(this); 3246 3246 3247 3247 if (!rareData || !rareData->m_flowThreadContainingBlock) … … 3253 3253 void RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate() 3254 3254 { 3255 RenderBlockRareData& rareData = ensure RareData(this);3255 RenderBlockRareData& rareData = ensureBlockRareData(this); 3256 3256 rareData.m_flowThreadContainingBlock = Nullopt; 3257 3257 } … … 3259 3259 RenderFlowThread* RenderBlock::updateCachedFlowThreadContainingBlock(RenderFlowThread* flowThread) const 3260 3260 { 3261 RenderBlockRareData& rareData = ensure RareData(this);3261 RenderBlockRareData& rareData = ensureBlockRareData(this); 3262 3262 rareData.m_flowThreadContainingBlock = flowThread; 3263 3263 … … 3267 3267 RenderFlowThread* RenderBlock::locateFlowThreadContainingBlock() const 3268 3268 { 3269 RenderBlockRareData* rareData = get RareData(this);3269 RenderBlockRareData* rareData = getBlockRareData(this); 3270 3270 if (!rareData || !rareData->m_flowThreadContainingBlock) 3271 3271 return updateCachedFlowThreadContainingBlock(RenderBox::locateFlowThreadContainingBlock()); … … 3277 3277 LayoutUnit RenderBlock::paginationStrut() const 3278 3278 { 3279 RenderBlockRareData* rareData = get RareData(this);3279 RenderBlockRareData* rareData = getBlockRareData(this); 3280 3280 return rareData ? rareData->m_paginationStrut : LayoutUnit(); 3281 3281 } … … 3283 3283 LayoutUnit RenderBlock::pageLogicalOffset() const 3284 3284 { 3285 RenderBlockRareData* rareData = get RareData(this);3285 RenderBlockRareData* rareData = getBlockRareData(this); 3286 3286 return rareData ? rareData->m_pageLogicalOffset : LayoutUnit(); 3287 3287 } … … 3289 3289 void RenderBlock::setPaginationStrut(LayoutUnit strut) 3290 3290 { 3291 RenderBlockRareData* rareData = get RareData(this);3291 RenderBlockRareData* rareData = getBlockRareData(this); 3292 3292 if (!rareData) { 3293 3293 if (!strut) 3294 3294 return; 3295 rareData = &ensure RareData(this);3295 rareData = &ensureBlockRareData(this); 3296 3296 } 3297 3297 rareData->m_paginationStrut = strut; … … 3300 3300 void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset) 3301 3301 { 3302 RenderBlockRareData* rareData = get RareData(this);3302 RenderBlockRareData* rareData = getBlockRareData(this); 3303 3303 if (!rareData) { 3304 3304 if (!logicalOffset) 3305 3305 return; 3306 rareData = &ensure RareData(this);3306 rareData = &ensureBlockRareData(this); 3307 3307 } 3308 3308 rareData->m_pageLogicalOffset = logicalOffset; -
trunk/Source/WebCore/rendering/RenderObject.cpp
r182215 r182373 131 131 #endif 132 132 view().didDestroyRenderer(); 133 ASSERT(!hasRareData()); 133 134 } 134 135 … … 1904 1905 1905 1906 clearLayoutRootIfNeeded(); 1907 removeRareData(); 1906 1908 } 1907 1909 … … 2496 2498 } 2497 2499 2500 void RenderObject::setIsDragging(bool isDragging) 2501 { 2502 if (isDragging || hasRareData()) 2503 ensureRareData().setIsDragging(isDragging); 2504 } 2505 2506 void RenderObject::setHasReflection(bool hasReflection) 2507 { 2508 if (hasReflection || hasRareData()) 2509 ensureRareData().setHasReflection(hasReflection); 2510 } 2511 2512 RenderObject::RareDataHash& RenderObject::rareDataMap() 2513 { 2514 static NeverDestroyed<RareDataHash> map; 2515 return map; 2516 } 2517 2518 RenderObject::RenderObjectRareData RenderObject::rareData() const 2519 { 2520 if (!hasRareData()) 2521 return RenderObjectRareData(); 2522 2523 return rareDataMap().get(this); 2524 } 2525 2526 RenderObject::RenderObjectRareData& RenderObject::ensureRareData() 2527 { 2528 setHasRareData(true); 2529 return rareDataMap().add(this, RenderObjectRareData()).iterator->value; 2530 } 2531 2532 void RenderObject::removeRareData() 2533 { 2534 rareDataMap().remove(this); 2535 setHasRareData(false); 2536 } 2537 2498 2538 } // namespace WebCore 2499 2539 -
trunk/Source/WebCore/rendering/RenderObject.h
r182215 r182373 516 516 bool isRenderView() const { return m_bitfields.isBox() && m_bitfields.isTextOrRenderView(); } 517 517 bool isInline() const { return m_bitfields.isInline(); } // inline object 518 bool isDragging() const { return m_bitfields.isDragging(); }519 518 bool isReplaced() const { return m_bitfields.isReplaced(); } // a "replaced" element (see CSS) 520 519 bool isHorizontalWritingMode() const { return m_bitfields.horizontalWritingMode(); } … … 624 623 void setHasLayer(bool b = true) { m_bitfields.setHasLayer(b); } 625 624 void setHasTransformRelatedProperty(bool b = true) { m_bitfields.setHasTransformRelatedProperty(b); } 626 void setHasReflection(bool b = true) { m_bitfields.setHasReflection(b); } 625 626 bool isDragging() const { return m_bitfields.hasRareData() && rareData().isDragging(); } 627 bool hasReflection() const { return m_bitfields.hasRareData() && rareData().hasReflection(); } 628 629 void setIsDragging(bool); 630 void setHasReflection(bool = true); 627 631 628 632 // Hook so that RenderTextControl can return the line height of its inner renderer. … … 756 760 bool isFloatingOrOutOfFlowPositioned() const { return (isFloating() || isOutOfFlowPositioned()); } 757 761 758 bool hasReflection() const { return m_bitfields.hasReflection(); }759 760 762 // Applied as a "slop" to dirty rect checks during the outline painting phase's dirty-rect checks. 761 763 int maximalOutlineSize(PaintPhase) const; … … 884 886 virtual bool isWBR() const { ASSERT_NOT_REACHED(); return false; } 885 887 888 void setEverHadLayout(bool b) { m_bitfields.setEverHadLayout(b); } 889 890 bool hasRareData() const { return m_bitfields.hasRareData(); } 891 void setHasRareData(bool b) { m_bitfields.setHasRareData(b); } 892 886 893 #ifndef NDEBUG 887 894 void checkBlockPositionedObjectsNeedLayout(); … … 916 923 public: 917 924 RenderObjectBitfields(const Node& node) 918 : m_beingDestroyed(false) 925 : m_hasRareData(false) 926 , m_beingDestroyed(false) 919 927 , m_needsLayout(false) 920 928 , m_needsPositionedMovementLayout(false) … … 931 939 , m_isLineBreak(false) 932 940 , m_horizontalWritingMode(true) 933 , m_isDragging(false)934 941 , m_hasLayer(false) 935 942 , m_hasOverflowClip(false) 936 943 , m_hasTransformRelatedProperty(false) 937 , m_hasReflection(false)938 944 , m_everHadLayout(false) 939 945 , m_childrenInline(false) … … 944 950 { 945 951 } 952 953 ADD_BOOLEAN_BITFIELD(hasRareData, HasRareData); 946 954 947 955 ADD_BOOLEAN_BITFIELD(beingDestroyed, BeingDestroyed); … … 961 969 ADD_BOOLEAN_BITFIELD(isLineBreak, IsLineBreak); 962 970 ADD_BOOLEAN_BITFIELD(horizontalWritingMode, HorizontalWritingMode); 963 ADD_BOOLEAN_BITFIELD(isDragging, IsDragging);964 971 965 972 ADD_BOOLEAN_BITFIELD(hasLayer, HasLayer); 966 973 ADD_BOOLEAN_BITFIELD(hasOverflowClip, HasOverflowClip); // Set in the case of overflow:auto/scroll/hidden 967 974 ADD_BOOLEAN_BITFIELD(hasTransformRelatedProperty, HasTransformRelatedProperty); 968 ADD_BOOLEAN_BITFIELD( hasReflection, HasReflection);975 ADD_BOOLEAN_BITFIELD(unused, Unused); 969 976 970 977 ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout); … … 1002 1009 }; 1003 1010 1011 RenderObjectBitfields m_bitfields; 1012 1013 class RenderObjectRareData { 1014 public: 1015 RenderObjectRareData() 1016 : m_isDragging(false) 1017 , m_hasReflection(false) 1018 { 1019 } 1020 1021 ADD_BOOLEAN_BITFIELD(isDragging, IsDragging); 1022 ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection); 1023 }; 1024 1025 RenderObjectRareData rareData() const; 1026 RenderObjectRareData& ensureRareData(); 1027 void removeRareData(); 1028 1029 // Note: RenderObjectRareData is stored by value. 1030 typedef HashMap<const RenderObject*, RenderObjectRareData> RareDataHash; 1031 1032 static RareDataHash& rareDataMap(); 1033 1004 1034 #undef ADD_BOOLEAN_BITFIELD 1005 1006 RenderObjectBitfields m_bitfields;1007 1008 void setIsDragging(bool b) { m_bitfields.setIsDragging(b); }1009 void setEverHadLayout(bool b) { m_bitfields.setEverHadLayout(b); }1010 1035 }; 1011 1036
Note:
See TracChangeset
for help on using the changeset viewer.