Bug 1943811, avoid calling SegmentedVector::Length() in hot code paths, r=mccr8
Differential Revision: https://phabricator.services.mozilla.com/D240910
This commit is contained in:
@@ -3041,13 +3041,8 @@ struct DeferredFinalizerImpl {
|
||||
static bool DeferredFinalize(uint32_t aSlice, void* aData) {
|
||||
MOZ_ASSERT(aSlice > 0, "nonsensical/useless call with aSlice == 0");
|
||||
SmartPtrArray* pointers = static_cast<SmartPtrArray*>(aData);
|
||||
uint32_t oldLen = pointers->Length();
|
||||
if (oldLen < aSlice) {
|
||||
aSlice = oldLen;
|
||||
}
|
||||
uint32_t newLen = oldLen - aSlice;
|
||||
pointers->PopLastN(aSlice);
|
||||
if (newLen == 0) {
|
||||
if (pointers->IsEmpty()) {
|
||||
delete pointers;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -224,10 +224,8 @@ class SegmentedVector : private AllocPolicy {
|
||||
}
|
||||
|
||||
// Equivalent to calling |PopLast| |aNumElements| times, but potentially
|
||||
// more efficient.
|
||||
// more efficient. It is safe to call this even when aNumElements > Length().
|
||||
void PopLastN(uint32_t aNumElements) {
|
||||
MOZ_ASSERT(aNumElements <= Length());
|
||||
|
||||
Segment* last;
|
||||
|
||||
// Pop full segments for as long as we can. Note that this loop
|
||||
|
||||
@@ -110,6 +110,23 @@ void TestBasics() {
|
||||
|
||||
// Verify the contents are what we expect.
|
||||
CheckContents(v, 700);
|
||||
|
||||
// Verify PopLastN can take larger than .Length() value as an argument.
|
||||
v.PopLastN(1000);
|
||||
MOZ_RELEASE_ASSERT(v.Length() == 0);
|
||||
MOZ_RELEASE_ASSERT(v.IsEmpty());
|
||||
|
||||
// Fill the vector again.
|
||||
for (i = 0; i < 1000; ++i) {
|
||||
v.InfallibleAppend(std::move(i));
|
||||
}
|
||||
MOZ_RELEASE_ASSERT(!v.IsEmpty());
|
||||
MOZ_RELEASE_ASSERT(v.Length() == 1000);
|
||||
|
||||
// Verify that calling PopLastN with Length() empties the vector.
|
||||
v.PopLastN(v.Length());
|
||||
MOZ_RELEASE_ASSERT(v.Length() == 0);
|
||||
MOZ_RELEASE_ASSERT(v.IsEmpty());
|
||||
}
|
||||
|
||||
void TestMoveAndSwap() {
|
||||
|
||||
Reference in New Issue
Block a user