Bug 1463752 - Part 2: Avoid allocating AutoTArray when there are no items that can be merged together
MozReview-Commit-ID: 2t0ehABBPy4
--- a/layout/painting/FrameLayerBuilder.cpp
+++ b/layout/painting/FrameLayerBuilder.cpp
@@ -4348,42 +4348,42 @@ ContainerState::ProcessDisplayItems(nsDi
if (hitTestInfo->Area().IsEmpty()) {
continue;
}
}
// Only allow either LayerEventRegions or CompositorHitTestInfo items.
MOZ_ASSERT(!(hadLayerEventRegions && hadCompositorHitTestInfo));
- // Peek ahead to the next item and see if it can be merged with the current
- // item. We create a list of consecutive items that can be merged together.
- AutoTArray<nsDisplayItem*, 1> mergedItems;
-
if (marker == DisplayItemEntryType::ITEM) {
- mergedItems.AppendElement(item);
-
- while (nsDisplayItem* peek = iter.PeekNext()) {
- if (!item->CanMerge(peek)) {
- break;
+ // Peek ahead to the next item and see if it can be merged with the
+ // current item.
+ nsDisplayItem* peek = iter.PeekNext();
+ if (peek && item->CanMerge(peek)) {
+ // Create a list of consecutive items that can be merged together.
+ AutoTArray<nsDisplayItem*, 2> mergedItems { item };
+ while ((peek = iter.PeekNext())) {
+ if (!item->CanMerge(peek)) {
+ break;
+ }
+
+ mergedItems.AppendElement(peek);
+
+ // Move the iterator forward since we will merge this item.
+ i = iter.GetNext();
}
- mergedItems.AppendElement(peek);
-
- // Move the iterator forward since we will merge this item.
- i = iter.GetNext();
+ // We have items that can be merged together.
+ // Merge them into a temporary item and process that item immediately.
+ MOZ_ASSERT(mergedItems.Length() > 1);
+ item = mBuilder->MergeItems(mergedItems);
+ MOZ_ASSERT(item && itemType == item->GetType());
}
}
- if (mergedItems.Length() > 1) {
- // We have items that can be merged together. Merge them into a temporary
- // item and process that item immediately.
- item = mBuilder->MergeItems(mergedItems);
- MOZ_ASSERT(item && itemType == item->GetType());
- }
-
MOZ_ASSERT(item->GetType() != DisplayItemType::TYPE_WRAP_LIST);
NS_ASSERTION(mAppUnitsPerDevPixel == AppUnitsPerDevPixel(item),
"items in a container layer should all have the same app units per dev pixel");
if (mBuilder->NeedToForceTransparentSurfaceForItem(item)) {
aList->SetNeedsTransparentSurface();
}