Bug 1295197 - use non-null-checked operator new in xpcom/; r=erahm

The standard placement new function is declared to not throw, which
means that, per spec, a null check on its result is required.  There are
a number of places throughout xpcom/ where we know that we are passing
non-null pointers to placement new (and receiving them as a return
value), and we are therefore doing useless work performing these null
checks.

Therefore, we should be using an operator new overload that doesn't
require the null check.  MFBT has just such an overload, so use that.
This commit is contained in:
Nathan Froyd 2016-08-16 17:05:39 -04:00
parent 0ba196de55
commit da3e07b555
5 changed files with 12 additions and 8 deletions

View File

@ -719,7 +719,7 @@ public:
block->mNext = nullptr;
mNextBlock = &block->mNext;
}
return new (mNext++) PtrInfo(aPointer, aParticipant);
return new (mozilla::KnownNotNull, mNext++) PtrInfo(aPointer, aParticipant);
}
private:
NodeBlock** mNextBlock;

View File

@ -11,6 +11,7 @@
#include "PLDHashTable.h"
#include "mozilla/HashFunctions.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/OperatorNewExtensions.h"
#include "nsAlgorithm.h"
#include "mozilla/Likely.h"
#include "mozilla/MemoryReporting.h"
@ -317,7 +318,7 @@ PLDHashTable::ClearAndPrepareForLength(uint32_t aLength)
uint32_t entrySize = mEntrySize;
this->~PLDHashTable();
new (this) PLDHashTable(ops, entrySize, aLength);
new (KnownNotNull, this) PLDHashTable(ops, entrySize, aLength);
}
void

View File

@ -7,6 +7,7 @@
#include "nsCOMArray.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/OperatorNewExtensions.h"
#include "nsCOMPtr.h"
@ -20,13 +21,13 @@ public:
// Zero out the value
static inline void Construct(E* aE)
{
new (static_cast<void*>(aE)) E();
new (mozilla::KnownNotNull, static_cast<void*>(aE)) E();
}
// Invoke the copy-constructor in place.
template<class A>
static inline void Construct(E* aE, const A& aArg)
{
new (static_cast<void*>(aE)) E(aArg);
new (mozilla::KnownNotNull, static_cast<void*>(aE)) E(aArg);
}
// Invoke the destructor in place.
static inline void Destruct(E* aE)

View File

@ -18,6 +18,7 @@
#include "mozilla/MathAlgorithms.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Move.h"
#include "mozilla/OperatorNewExtensions.h"
#include "mozilla/ReverseIterator.h"
#include "mozilla/TypeTraits.h"
@ -504,7 +505,7 @@ public:
// ints. We don't want that because it can be a performance issue
// and people don't expect it; nsTArray should work like a regular
// C/C++ array in this respect.
new (static_cast<void*>(aE)) E;
new (mozilla::KnownNotNull, static_cast<void*>(aE)) E;
}
// Invoke the copy-constructor in place.
template<class A>
@ -515,7 +516,7 @@ public:
static_assert(!mozilla::IsSame<E_NoCV*, A_NoCV>::value,
"For safety, we disallow constructing nsTArray<E> elements "
"from E* pointers. See bug 960591.");
new (static_cast<void*>(aE)) E(mozilla::Forward<A>(aArg));
new (mozilla::KnownNotNull, static_cast<void*>(aE)) E(mozilla::Forward<A>(aArg));
}
// Invoke the destructor in place.
static inline void Destruct(E* aE) { aE->~E(); }

View File

@ -14,6 +14,7 @@
#include "mozilla/MemoryChecking.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Move.h"
#include "mozilla/OperatorNewExtensions.h"
#include "mozilla/PodOperations.h"
#include "mozilla/TypeTraits.h"
@ -391,7 +392,7 @@ nsTHashtable<EntryType>::s_CopyEntry(PLDHashTable* aTable,
EntryType* fromEntry =
const_cast<EntryType*>(static_cast<const EntryType*>(aFrom));
new (aTo) EntryType(mozilla::Move(*fromEntry));
new (mozilla::KnownNotNull, aTo) EntryType(mozilla::Move(*fromEntry));
fromEntry->~EntryType();
}
@ -409,7 +410,7 @@ void
nsTHashtable<EntryType>::s_InitEntry(PLDHashEntryHdr* aEntry,
const void* aKey)
{
new (aEntry) EntryType(static_cast<KeyTypePointer>(aKey));
new (mozilla::KnownNotNull, aEntry) EntryType(static_cast<KeyTypePointer>(aKey));
}
class nsCycleCollectionTraversalCallback;