Bug 803669 - convert nsScannerBufferList to use mozilla::LinkedList; r=mrbkap

This commit is contained in:
Nathan Froyd 2013-07-31 11:35:25 -04:00
parent a0ff9d546b
commit 3146349ea1
2 changed files with 32 additions and 46 deletions

View File

@ -9,7 +9,7 @@
#include "nsString.h"
#include "nsUnicharUtils.h" // for nsCaseInsensitiveStringComparator
#include "prclist.h"
#include "mozilla/LinkedList.h"
#include <algorithm>
@ -61,7 +61,7 @@ class nsScannerBufferList
* of the data segment is determined by increment the |this| pointer
* by 1 unit.
*/
class Buffer : public PRCList
class Buffer : public mozilla::LinkedListElement<Buffer>
{
public:
@ -76,11 +76,11 @@ class nsScannerBufferList
const PRUnichar* DataEnd() const { return mDataEnd; }
PRUnichar* DataEnd() { return mDataEnd; }
const Buffer* Next() const { return static_cast<const Buffer*>(next); }
Buffer* Next() { return static_cast<Buffer*>(next); }
const Buffer* Next() const { return getNext(); }
Buffer* Next() { return getNext(); }
const Buffer* Prev() const { return static_cast<const Buffer*>(prev); }
Buffer* Prev() { return static_cast<Buffer*>(prev); }
const Buffer* Prev() const { return getPrevious(); }
Buffer* Prev() { return getPrevious(); }
uint32_t DataLength() const { return mDataEnd - DataStart(); }
void SetDataLength(uint32_t len) { mDataEnd = DataStart() + len; }
@ -127,23 +127,22 @@ class nsScannerBufferList
nsScannerBufferList( Buffer* buf )
: mRefCnt(0)
{
PR_INIT_CLIST(&mBuffers);
PR_APPEND_LINK(buf, &mBuffers);
mBuffers.insertBack(buf);
}
void AddRef() { ++mRefCnt; }
void Release() { if (--mRefCnt == 0) delete this; }
void Append( Buffer* buf ) { PR_APPEND_LINK(buf, &mBuffers); }
void InsertAfter( Buffer* buf, Buffer* prev ) { PR_INSERT_AFTER(buf, prev); }
void Append( Buffer* buf ) { mBuffers.insertBack(buf); }
void InsertAfter( Buffer* buf, Buffer* prev ) { prev->setNext(buf); }
void SplitBuffer( const Position& );
void DiscardUnreferencedPrefix( Buffer* );
Buffer* Head() { return static_cast<Buffer*>(PR_LIST_HEAD(&mBuffers)); }
const Buffer* Head() const { return static_cast<const Buffer*>(PR_LIST_HEAD(&mBuffers)); }
Buffer* Head() { return mBuffers.getFirst(); }
const Buffer* Head() const { return mBuffers.getFirst(); }
Buffer* Tail() { return static_cast<Buffer*>(PR_LIST_TAIL(&mBuffers)); }
const Buffer* Tail() const { return static_cast<const Buffer*>(PR_LIST_TAIL(&mBuffers)); }
Buffer* Tail() { return mBuffers.getLast(); }
const Buffer* Tail() const { return mBuffers.getLast(); }
private:
@ -153,7 +152,7 @@ class nsScannerBufferList
void ReleaseAll();
int32_t mRefCnt;
PRCList mBuffers;
mozilla::LinkedList<Buffer> mBuffers;
};

View File

@ -19,25 +19,13 @@ nsScannerBufferList::Buffer*
nsScannerBufferList::AllocBufferFromString( const nsAString& aString )
{
uint32_t len = aString.Length();
Buffer* buf = AllocBuffer(len);
if (len > MAX_CAPACITY)
return nullptr;
Buffer* buf = (Buffer*) malloc(sizeof(Buffer) + (len + 1) * sizeof(PRUnichar));
if (buf)
{
// leave PRCList members of Buffer uninitialized
buf->mUsageCount = 0;
buf->mDataEnd = buf->DataStart() + len;
nsAString::const_iterator source;
aString.BeginReading(source);
nsCharTraits<PRUnichar>::copy(buf->DataStart(), source.get(), len);
// XXX null terminate. this shouldn't be required, but we do it because
// nsScanner erroneously thinks it can dereference DataEnd :-(
*buf->mDataEnd = PRUnichar(0);
}
return buf;
}
@ -48,30 +36,29 @@ nsScannerBufferList::AllocBuffer( uint32_t capacity )
if (capacity > MAX_CAPACITY)
return nullptr;
Buffer* buf = (Buffer*) malloc(sizeof(Buffer) + (capacity + 1) * sizeof(PRUnichar));
if (buf)
{
// leave PRCList members of Buffer uninitialized
void* ptr = malloc(sizeof(Buffer) + (capacity + 1) * sizeof(PRUnichar));
if (!ptr)
return nullptr;
buf->mUsageCount = 0;
buf->mDataEnd = buf->DataStart() + capacity;
Buffer* buf = new (ptr) Buffer();
// XXX null terminate. this shouldn't be required, but we do it because
// nsScanner erroneously thinks it can dereference DataEnd :-(
*buf->mDataEnd = PRUnichar(0);
}
buf->mUsageCount = 0;
buf->mDataEnd = buf->DataStart() + capacity;
// XXX null terminate. this shouldn't be required, but we do it because
// nsScanner erroneously thinks it can dereference DataEnd :-(
*buf->mDataEnd = PRUnichar(0);
return buf;
}
void
nsScannerBufferList::ReleaseAll()
{
while (!PR_CLIST_IS_EMPTY(&mBuffers))
while (!mBuffers.isEmpty())
{
PRCList* node = PR_LIST_HEAD(&mBuffers);
PR_REMOVE_LINK(node);
Buffer* node = mBuffers.popFirst();
//printf(">>> freeing buffer @%p\n", node);
free(static_cast<Buffer*>(node));
free(node);
}
}
@ -106,10 +93,10 @@ nsScannerBufferList::DiscardUnreferencedPrefix( Buffer* aBuf )
{
if (aBuf == Head())
{
while (!PR_CLIST_IS_EMPTY(&mBuffers) && !Head()->IsInUse())
while (!mBuffers.isEmpty() && !Head()->IsInUse())
{
Buffer* buffer = Head();
PR_REMOVE_LINK(buffer);
buffer->remove();
free(buffer);
}
}
@ -276,7 +263,7 @@ nsScannerSubstring::GetNextFragment( nsScannerFragment& frag ) const
if (frag.mBuffer == mEnd.mBuffer)
return false;
frag.mBuffer = static_cast<const Buffer*>(PR_NEXT_LINK(frag.mBuffer));
frag.mBuffer = frag.mBuffer->getNext();
if (frag.mBuffer == mStart.mBuffer)
frag.mFragmentStart = mStart.mPosition;
@ -298,7 +285,7 @@ nsScannerSubstring::GetPrevFragment( nsScannerFragment& frag ) const
if (frag.mBuffer == mStart.mBuffer)
return false;
frag.mBuffer = static_cast<const Buffer*>(PR_PREV_LINK(frag.mBuffer));
frag.mBuffer = frag.mBuffer->getPrevious();
if (frag.mBuffer == mStart.mBuffer)
frag.mFragmentStart = mStart.mPosition;