[xpcom] Don't use realloc for shrinking nsTArrays when allowRealloc is false.
This commit is contained in:
parent
a0f6231e6d
commit
8391e57b27
|
@ -248,12 +248,28 @@ nsTArray_base<Alloc, Copy>::ShrinkCapacity(size_type aElemSize,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_type size = sizeof(Header) + length * aElemSize;
|
size_type newSize = sizeof(Header) + length * aElemSize;
|
||||||
void* ptr = nsTArrayFallibleAllocator::Realloc(mHdr, size);
|
|
||||||
if (!ptr) {
|
Header* newHeader;
|
||||||
return;
|
if (!Copy::allowRealloc) {
|
||||||
|
// Malloc() and copy
|
||||||
|
newHeader = static_cast<Header*>(nsTArrayFallibleAllocator::Malloc(newSize));
|
||||||
|
if (!newHeader) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Copy::MoveNonOverlappingRegionWithHeader(newHeader, mHdr, Length(), aElemSize);
|
||||||
|
|
||||||
|
nsTArrayFallibleAllocator::Free(mHdr);
|
||||||
|
} else {
|
||||||
|
// Realloc() existing data
|
||||||
|
newHeader = static_cast<Header*>(nsTArrayFallibleAllocator::Realloc(mHdr, newSize));
|
||||||
|
if (!newHeader) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mHdr = static_cast<Header*>(ptr);
|
|
||||||
|
mHdr = newHeader;
|
||||||
mHdr->mCapacity = length;
|
mHdr->mCapacity = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue