зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1442433 - Make nsAtom::mString more const. r=froydnj
The patch also uses GetStringBuffer() in a couple of appropriate places. MozReview-Commit-ID: JufCUgmO8JL --HG-- extra : rebase_source : ecd3f17b5560b19622c86759d605fa122d70e48a
This commit is contained in:
Родитель
f39f6d1228
Коммит
9bc7f17b9e
|
@ -51,11 +51,12 @@ public:
|
|||
void ToString(nsAString& aString) const;
|
||||
void ToUTF8String(nsACString& aString) const;
|
||||
|
||||
// This is only valid for dynamic atoms.
|
||||
// This is not valid for static atoms. The caller must *not* mutate the
|
||||
// string buffer, otherwise all hell will break loose.
|
||||
nsStringBuffer* GetStringBuffer() const
|
||||
{
|
||||
// See the comment on |mString|'s declaration.
|
||||
MOZ_ASSERT(IsDynamicAtom());
|
||||
MOZ_ASSERT(IsDynamicAtom() || IsHTML5Atom());
|
||||
return nsStringBuffer::FromData(mString);
|
||||
}
|
||||
|
||||
|
@ -98,7 +99,7 @@ protected:
|
|||
// non-static atoms it points to the chars in an nsStringBuffer. This means
|
||||
// that nsStringBuffer::FromData(mString) calls are only valid for non-static
|
||||
// atoms.
|
||||
char16_t* mString;
|
||||
char16_t* const mString;
|
||||
};
|
||||
|
||||
// A trivial subclass of nsAtom that can be used for known static atoms. The
|
||||
|
|
|
@ -92,38 +92,47 @@ private:
|
|||
mozilla::ThreadSafeAutoRefCnt mRefCnt;
|
||||
};
|
||||
|
||||
static char16_t*
|
||||
FromStringBuffer(const nsAString& aString)
|
||||
{
|
||||
char16_t* str;
|
||||
size_t length = aString.Length();
|
||||
RefPtr<nsStringBuffer> buf = nsStringBuffer::FromString(aString);
|
||||
if (buf) {
|
||||
str = static_cast<char16_t*>(buf->Data());
|
||||
} else {
|
||||
const size_t size = (length + 1) * sizeof(char16_t);
|
||||
buf = nsStringBuffer::Alloc(size);
|
||||
if (MOZ_UNLIKELY(!buf)) {
|
||||
NS_ABORT_OOM(size); // OOM because atom allocations should be small.
|
||||
}
|
||||
str = static_cast<char16_t*>(buf->Data());
|
||||
CopyUnicodeTo(aString, 0, str, length);
|
||||
str[length] = char16_t(0);
|
||||
}
|
||||
|
||||
MOZ_ASSERT(buf && buf->StorageSize() >= (length + 1) * sizeof(char16_t),
|
||||
"enough storage");
|
||||
|
||||
// Take ownership of the string buffer.
|
||||
mozilla::Unused << buf.forget();
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
// This constructor is for dynamic atoms and HTML5 atoms.
|
||||
nsAtom::nsAtom(AtomKind aKind, const nsAString& aString, uint32_t aHash)
|
||||
: mLength(aString.Length())
|
||||
, mKind(static_cast<uint32_t>(aKind))
|
||||
, mHash(aHash)
|
||||
, mString(FromStringBuffer(aString))
|
||||
{
|
||||
MOZ_ASSERT(aKind == AtomKind::DynamicAtom || aKind == AtomKind::HTML5Atom);
|
||||
RefPtr<nsStringBuffer> buf = nsStringBuffer::FromString(aString);
|
||||
if (buf) {
|
||||
mString = static_cast<char16_t*>(buf->Data());
|
||||
} else {
|
||||
const size_t size = (mLength + 1) * sizeof(char16_t);
|
||||
buf = nsStringBuffer::Alloc(size);
|
||||
if (MOZ_UNLIKELY(!buf)) {
|
||||
// We OOM because atom allocations should be small and it's hard to
|
||||
// handle them more gracefully in a constructor.
|
||||
NS_ABORT_OOM(size);
|
||||
}
|
||||
mString = static_cast<char16_t*>(buf->Data());
|
||||
CopyUnicodeTo(aString, 0, mString, mLength);
|
||||
mString[mLength] = char16_t(0);
|
||||
}
|
||||
|
||||
MOZ_ASSERT_IF(!IsHTML5Atom(), mHash == HashString(mString, mLength));
|
||||
|
||||
MOZ_ASSERT(mString[mLength] == char16_t(0), "null terminated");
|
||||
MOZ_ASSERT(buf && buf->StorageSize() >= (mLength + 1) * sizeof(char16_t),
|
||||
"enough storage");
|
||||
MOZ_ASSERT(Equals(aString), "correct data");
|
||||
|
||||
// Take ownership of buffer
|
||||
mozilla::Unused << buf.forget();
|
||||
}
|
||||
|
||||
// This constructor is for static atoms.
|
||||
|
@ -143,7 +152,7 @@ nsAtom::~nsAtom()
|
|||
{
|
||||
if (!IsStaticAtom()) {
|
||||
MOZ_ASSERT(IsDynamicAtom() || IsHTML5Atom());
|
||||
nsStringBuffer::FromData(mString)->Release();
|
||||
GetStringBuffer()->Release();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +166,7 @@ nsAtom::ToString(nsAString& aString) const
|
|||
// which is what's important.
|
||||
aString.AssignLiteral(mString, mLength);
|
||||
} else {
|
||||
nsStringBuffer::FromData(mString)->ToString(mLength, aString);
|
||||
GetStringBuffer()->ToString(mLength, aString);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -182,8 +191,7 @@ nsAtom::AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, AtomsSizes& aSizes)
|
|||
} else {
|
||||
aSizes.mDynamicAtomObjects += thisSize;
|
||||
aSizes.mDynamicUnsharedBuffers +=
|
||||
nsStringBuffer::FromData(mString)->SizeOfIncludingThisIfUnshared(
|
||||
aMallocSizeOf);
|
||||
GetStringBuffer()->SizeOfIncludingThisIfUnshared(aMallocSizeOf);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче