Loading xpcom/ds/nsAtom.h +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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 Loading xpcom/ds/nsAtomTable.cpp +31 −23 Original line number Diff line number Diff line Loading @@ -92,38 +92,47 @@ private: mozilla::ThreadSafeAutoRefCnt mRefCnt; }; // 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) static char16_t* FromStringBuffer(const nsAString& aString) { MOZ_ASSERT(aKind == AtomKind::DynamicAtom || aKind == AtomKind::HTML5Atom); char16_t* str; size_t length = aString.Length(); RefPtr<nsStringBuffer> buf = nsStringBuffer::FromString(aString); if (buf) { mString = static_cast<char16_t*>(buf->Data()); str = static_cast<char16_t*>(buf->Data()); } else { const size_t size = (mLength + 1) * sizeof(char16_t); const size_t size = (length + 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); NS_ABORT_OOM(size); // OOM because atom allocations should be small. } mString = static_cast<char16_t*>(buf->Data()); CopyUnicodeTo(aString, 0, mString, mLength); mString[mLength] = char16_t(0); 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); 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. Loading @@ -143,7 +152,7 @@ nsAtom::~nsAtom() { if (!IsStaticAtom()) { MOZ_ASSERT(IsDynamicAtom() || IsHTML5Atom()); nsStringBuffer::FromData(mString)->Release(); GetStringBuffer()->Release(); } } Loading @@ -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); } } Loading @@ -182,8 +191,7 @@ nsAtom::AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, AtomsSizes& aSizes) } else { aSizes.mDynamicAtomObjects += thisSize; aSizes.mDynamicUnsharedBuffers += nsStringBuffer::FromData(mString)->SizeOfIncludingThisIfUnshared( aMallocSizeOf); GetStringBuffer()->SizeOfIncludingThisIfUnshared(aMallocSizeOf); } } Loading Loading
xpcom/ds/nsAtom.h +4 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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 Loading
xpcom/ds/nsAtomTable.cpp +31 −23 Original line number Diff line number Diff line Loading @@ -92,38 +92,47 @@ private: mozilla::ThreadSafeAutoRefCnt mRefCnt; }; // 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) static char16_t* FromStringBuffer(const nsAString& aString) { MOZ_ASSERT(aKind == AtomKind::DynamicAtom || aKind == AtomKind::HTML5Atom); char16_t* str; size_t length = aString.Length(); RefPtr<nsStringBuffer> buf = nsStringBuffer::FromString(aString); if (buf) { mString = static_cast<char16_t*>(buf->Data()); str = static_cast<char16_t*>(buf->Data()); } else { const size_t size = (mLength + 1) * sizeof(char16_t); const size_t size = (length + 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); NS_ABORT_OOM(size); // OOM because atom allocations should be small. } mString = static_cast<char16_t*>(buf->Data()); CopyUnicodeTo(aString, 0, mString, mLength); mString[mLength] = char16_t(0); 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); 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. Loading @@ -143,7 +152,7 @@ nsAtom::~nsAtom() { if (!IsStaticAtom()) { MOZ_ASSERT(IsDynamicAtom() || IsHTML5Atom()); nsStringBuffer::FromData(mString)->Release(); GetStringBuffer()->Release(); } } Loading @@ -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); } } Loading @@ -182,8 +191,7 @@ nsAtom::AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, AtomsSizes& aSizes) } else { aSizes.mDynamicAtomObjects += thisSize; aSizes.mDynamicUnsharedBuffers += nsStringBuffer::FromData(mString)->SizeOfIncludingThisIfUnshared( aMallocSizeOf); GetStringBuffer()->SizeOfIncludingThisIfUnshared(aMallocSizeOf); } } Loading