Bug 843925 - Make nsLineLayout::NewPerSpanData() allocation infallible. r=roc

This commit is contained in:
Mats Palmgren 2013-02-23 11:38:15 +01:00
Родитель 4c8611a61b
Коммит d85ac931c6
2 изменённых файлов: 34 добавлений и 42 удалений

Просмотреть файл

@ -179,8 +179,7 @@ nsLineLayout::BeginLineReflow(nscoord aX, nscoord aY,
mLineBox->ClearHasBullet();
}
PerSpanData* psd;
NewPerSpanData(&psd);
PerSpanData* psd = NewPerSpanData();
mCurrentSpan = mRootSpan = psd;
psd->mReflowState = mBlockReflowState;
psd->mLeftEdge = aX;
@ -350,15 +349,15 @@ nsLineLayout::UpdateBand(const nsRect& aNewAvailSpace,
mLastFloatWasLetterFrame = nsGkAtoms::letterFrame == aFloatFrame->GetType();
}
nsresult
nsLineLayout::NewPerSpanData(PerSpanData** aResult)
nsLineLayout::PerSpanData*
nsLineLayout::NewPerSpanData()
{
PerSpanData* psd = mSpanFreeList;
if (nullptr == psd) {
if (!psd) {
void *mem;
PL_ARENA_ALLOCATE(mem, &mArena, sizeof(PerSpanData));
if (nullptr == mem) {
return NS_ERROR_OUT_OF_MEMORY;
if (!mem) {
NS_RUNTIMEABORT("OOM");
}
psd = reinterpret_cast<PerSpanData*>(mem);
}
@ -376,15 +375,13 @@ nsLineLayout::NewPerSpanData(PerSpanData** aResult)
#ifdef DEBUG
mSpansAllocated++;
#endif
*aResult = psd;
return NS_OK;
return psd;
}
nsresult
void
nsLineLayout::BeginSpan(nsIFrame* aFrame,
const nsHTMLReflowState* aSpanReflowState,
nscoord aLeftEdge,
nscoord aRightEdge,
nscoord aLeftEdge, nscoord aRightEdge,
nscoord* aBaseline)
{
NS_ASSERTION(aRightEdge != NS_UNCONSTRAINEDSIZE,
@ -395,33 +392,28 @@ nsLineLayout::BeginSpan(nsIFrame* aFrame,
printf(": BeginSpan leftEdge=%d rightEdge=%d\n", aLeftEdge, aRightEdge);
#endif
PerSpanData* psd;
nsresult rv = NewPerSpanData(&psd);
if (NS_SUCCEEDED(rv)) {
// Link up span frame's pfd to point to its child span data
PerFrameData* pfd = mCurrentSpan->mLastFrame;
NS_ASSERTION(pfd->mFrame == aFrame, "huh?");
pfd->mSpan = psd;
PerSpanData* psd = NewPerSpanData();
// Link up span frame's pfd to point to its child span data
PerFrameData* pfd = mCurrentSpan->mLastFrame;
NS_ASSERTION(pfd->mFrame == aFrame, "huh?");
pfd->mSpan = psd;
// Init new span
psd->mFrame = pfd;
psd->mParent = mCurrentSpan;
psd->mReflowState = aSpanReflowState;
psd->mLeftEdge = aLeftEdge;
psd->mX = aLeftEdge;
psd->mRightEdge = aRightEdge;
psd->mBaseline = aBaseline;
// Init new span
psd->mFrame = pfd;
psd->mParent = mCurrentSpan;
psd->mReflowState = aSpanReflowState;
psd->mLeftEdge = aLeftEdge;
psd->mX = aLeftEdge;
psd->mRightEdge = aRightEdge;
psd->mBaseline = aBaseline;
psd->mNoWrap =
!aSpanReflowState->frame->StyleText()->WhiteSpaceCanWrap();
psd->mDirection = aSpanReflowState->mStyleVisibility->mDirection;
psd->mChangedFrameDirection = false;
psd->mNoWrap = !aSpanReflowState->frame->StyleText()->WhiteSpaceCanWrap();
psd->mDirection = aSpanReflowState->mStyleVisibility->mDirection;
psd->mChangedFrameDirection = false;
// Switch to new span
mCurrentSpan = psd;
mSpanDepth++;
}
return rv;
// Switch to new span
mCurrentSpan = psd;
mSpanDepth++;
}
nscoord

Просмотреть файл

@ -68,11 +68,8 @@ public:
void UpdateBand(const nsRect& aNewAvailableSpace,
nsIFrame* aFloatFrame);
nsresult BeginSpan(nsIFrame* aFrame,
const nsHTMLReflowState* aSpanReflowState,
nscoord aLeftEdge,
nscoord aRightEdge,
nscoord* aBaseline);
void BeginSpan(nsIFrame* aFrame, const nsHTMLReflowState* aSpanReflowState,
nscoord aLeftEdge, nscoord aRightEdge, nscoord* aBaseline);
// Returns the width of the span
nscoord EndSpan(nsIFrame* aFrame);
@ -509,7 +506,10 @@ protected:
nsresult NewPerFrameData(PerFrameData** aResult);
nsresult NewPerSpanData(PerSpanData** aResult);
/**
* Allocate a PerSpanData from the mArena pool. The allocation is infallible.
*/
PerSpanData* NewPerSpanData();
void FreeSpan(PerSpanData* psd);