PRBool nsVoidArray::GrowArrayBy(PRInt32 aGrowBy) { // We have to grow the array. Grow by kMinGrowArrayBy slots if we're // smaller than kLinearThreshold bytes, or a power of two if we're // larger. This is much more efficient with most memory allocators, // especially if it's very large, or of the allocator is binned. if (aGrowBy < kMinGrowArrayBy) aGrowBy = kMinGrowArrayBy; PRUint32 newCapacity = GetArraySize() + aGrowBy; // Minimum increase PRUint32 newSize = SIZEOF_IMPL(newCapacity); if (newSize >= (PRUint32) kLinearThreshold) { // newCount includes enough space for at least kMinGrowArrayBy new // slots. Select the next power-of-two size in bytes above or // equal to that. // Also, limit the increase in size to about a VM page or two. if (GetArraySize() >= kMaxGrowArrayBy) { newCapacity = GetArraySize() + PR_MAX(kMaxGrowArrayBy,aGrowBy); newSize = SIZEOF_IMPL(newCapacity); } else { PR_CEILING_LOG2(newSize, newSize); newCapacity = CAPACITYOF_IMPL(PR_BIT(newSize)); } } // frees old mImpl IF this succeeds if (!SizeTo(newCapacity)) return PR_FALSE; return PR_TRUE; }
bool nsVoidArray::GrowArrayBy(int32_t aGrowBy) { // We have to grow the array. Grow by kMinGrowArrayBy slots if we're // smaller than kLinearThreshold bytes, or a power of two if we're // larger. This is much more efficient with most memory allocators, // especially if it's very large, or of the allocator is binned. if (aGrowBy < kMinGrowArrayBy) aGrowBy = kMinGrowArrayBy; uint32_t newCapacity = GetArraySize() + aGrowBy; // Minimum increase uint32_t newSize = SIZEOF_IMPL(newCapacity); if (newSize >= (uint32_t) kLinearThreshold) { // newCount includes enough space for at least kMinGrowArrayBy new // slots. Select the next power-of-two size in bytes above or // equal to that. // Also, limit the increase in size to about a VM page or two. if (GetArraySize() >= kMaxGrowArrayBy) { newCapacity = GetArraySize() + XPCOM_MAX(kMaxGrowArrayBy,aGrowBy); newSize = SIZEOF_IMPL(newCapacity); } else { newSize = mozilla::CeilingLog2(newSize); newCapacity = CAPACITYOF_IMPL(1u << newSize); } } // frees old mImpl IF this succeeds if (!SizeTo(newCapacity)) return false; return true; }
FormatResult HTMLBodyDisplay::FormatForViewport ( WebRect* viewportRect, WEBC_BOOL hscrollPresent, WEBC_BOOL vscrollPresent ) { if (Width() != viewportRect->Width()) { SizeTo(viewportRect->Width(), viewportRect->Height()); SetParentStyleModified(); } else if (Height() != viewportRect->Height()) { SizeTo(viewportRect->Width(), viewportRect->Height()); SetPosChildStyleModified(); } FormatIfNecessary(); CSSPropertyValue overflowValue; if (mpHtmlElement->GetStyleFromCSS(CSS_PROPERTY_OVERFLOW, &overflowValue) == CSS_VALUE_SPECIFIED) { if (CSS_OVERFLOW_HIDDEN == overflowValue.overflow) { return (DISPLAY_FORMAT_SUCCESS); } } #if (WEBC_SUPPORT_SCROLLBARS) WebRect bounds; GetBounds(&bounds); if (bounds.Height() > viewportRect->Height() && !vscrollPresent) { return (DISPLAY_FORMAT_NEEDS_VSCROLL); } if (bounds.Width() > viewportRect->Width() && !hscrollPresent) { return (DISPLAY_FORMAT_NEEDS_HSCROLL); } #endif return (DISPLAY_FORMAT_SUCCESS); }
nsVoidArray::nsVoidArray(PRInt32 aCount) : mImpl(nsnull) { MOZ_COUNT_CTOR(nsVoidArray); #if DEBUG_VOIDARRAY mMaxCount = 0; mMaxSize = 0; mIsAuto = PR_FALSE; MaxElements[0]++; #endif SizeTo(aCount); }
nsVoidArray::nsVoidArray(int32_t aCount) : mImpl(nullptr) { MOZ_COUNT_CTOR(nsVoidArray); #if DEBUG_VOIDARRAY mMaxCount = 0; mMaxSize = 0; mIsAuto = false; MaxElements[0]++; #endif SizeTo(aCount); }
void nsVoidArray::Clear() { if (mImpl) { mImpl->mCount = 0; // We don't have to free on Clear, but if we have a built-in buffer, // it's worth considering. if (HasAutoBuffer() && IsArrayOwner() && GetArraySize() > kAutoClearCompactSizeFactor * kAutoBufSize) { SizeTo(0); } } }
void nsVoidArray::Compact() { if (mImpl) { // XXX NOTE: this is quite inefficient in many cases if we're only // compacting by a little, but some callers care more about memory use. int32_t count = Count(); if (GetArraySize() > count) { SizeTo(Count()); } } }
void PQP_CollideResult::Add(int a, int b) { if (num_pairs >= num_pairs_alloced) { // allocate more SizeTo(num_pairs_alloced*2+8); } // now proceed as usual pairs[num_pairs].id1 = a; pairs[num_pairs].id2 = b; num_pairs++; }
nsVoidArray& nsVoidArray::operator=(const nsVoidArray& other) { PRInt32 otherCount = other.Count(); PRInt32 maxCount = GetArraySize(); if (otherCount) { if (otherCount > maxCount) { // frees old mImpl IF this succeeds if (!GrowArrayBy(otherCount-maxCount)) return *this; // XXX The allocation failed - don't do anything memcpy(mImpl->mArray, other.mImpl->mArray, otherCount * sizeof(mImpl->mArray[0])); mImpl->mCount = otherCount; } else { // the old array can hold the new array memcpy(mImpl->mArray, other.mImpl->mArray, otherCount * sizeof(mImpl->mArray[0])); mImpl->mCount = otherCount; // if it shrank a lot, compact it anyways if ((otherCount*2) < maxCount && maxCount > 100) { Compact(); // shrank by at least 50 entries } } #if DEBUG_VOIDARRAY if (mImpl->mCount > mMaxCount && mImpl->mCount < (PRInt32)(sizeof(MaxElements)/sizeof(MaxElements[0]))) { MaxElements[mImpl->mCount]++; MaxElements[mMaxCount]--; mMaxCount = mImpl->mCount; } #endif } else { // Why do we drop the buffer here when we don't in Clear()? SizeTo(0); } return *this; }
nsSmallVoidArray& nsSmallVoidArray::operator=(nsSmallVoidArray& other) { PRInt32 count = other.Count(); switch (count) { case 0: Clear(); break; case 1: Clear(); AppendElement(other.ElementAt(0)); break; default: if (GetArraySize() >= count || SizeTo(count)) { *AsArray() = *other.AsArray(); } } return *this; }
void nsVoidArray::Compact() { if (mImpl) { // XXX NOTE: this is quite inefficient in many cases if we're only // compacting by a little, but some callers care more about memory use. PRInt32 count = Count(); if (HasAutoBuffer() && count <= kAutoBufSize) { Impl* oldImpl = mImpl; static_cast<nsAutoVoidArray*>(this)->ResetToAutoBuffer(); memcpy(mImpl->mArray, oldImpl->mArray, count * sizeof(mImpl->mArray[0])); free(reinterpret_cast<char *>(oldImpl)); } else if (GetArraySize() > count) { SizeTo(Count()); } } }
ndata::ndata(nnode *t,int special):nnode(t){ // printf("New NData\n"); dat=NULL; siz=asiz=canfree=0; alist=new CList(0); type=0; // printf("Special %d\n",special); if (special){ nplace *np1=new nplace(10); // printf("dat=%x\n",dat); SizeTo(32); // printf("dat=%x\n",dat); dat[0]=10; dat[1]=10; siz=2; // printf("Attaching\n"); Attach(np1,0); // printf("attach1\n"); Attach(new nplace(10),1); } // printf("Complete\n"); }
int ndata::Insert(const char *dt,int sz,int pl){ if (pl<0) return 0; if (pl>=siz) return 0; for (int i=0;i<alist->Num();i++){ nplace *np=(nplace*)alist->Item(i); if (np->ofs>=pl) np->ofs+=sz; } SizeTo(sz+siz); for (int i=siz-1;i>=pl;i--){ dat[i+sz]=dat[i]; } memcpy(dat+pl,dt,sz); siz+=sz; for (int i=0;i<sz;i++){ char c=dat[pl+i]; if (c==10 || c==13){ Attach(new nplace(10),pl+i); } } // printf("Got %d (%d,%d)\n",dt[0],siz,sz); return sz; }