diff --git a/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp b/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp index 7c9948c5467eb99b07a5d7f8e974b9b380ad0f14..c858b16c6dfadddc42235bcbacfb17acb1df55f1 100644 --- a/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp +++ b/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp @@ -35,7 +35,7 @@ DOMCharacterDataImpl::DOMCharacterDataImpl(DOMDocument *doc, const XMLCh *dat) { fDoc = (DOMDocumentImpl*)doc; - fDataBuf = fDoc->popBuffer(); + fDataBuf = fDoc->popBuffer(XMLString::stringLen(dat)+1); if (!fDataBuf) fDataBuf = new (fDoc) DOMBuffer(fDoc, dat); else @@ -50,7 +50,7 @@ DOMCharacterDataImpl::DOMCharacterDataImpl(const DOMCharacterDataImpl &other) { fDoc = (DOMDocumentImpl*)other.fDoc; - fDataBuf = fDoc->popBuffer(); + fDataBuf = fDoc->popBuffer(other.getLength()+1); if (!fDataBuf) fDataBuf = new (fDoc) DOMBuffer(fDoc, other.fDataBuf->getRawBuffer()); else diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp index 48beb41fbd09ccb6c5c847a9a6922d3df4734d42..0fa2dd20c4452e18389acbe347d8dee1312ee9fb 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp @@ -1414,11 +1414,15 @@ void DOMDocumentImpl::releaseBuffer(DOMBuffer* buffer) fRecycleBufferPtr->push(buffer); } -DOMBuffer* DOMDocumentImpl::popBuffer() +DOMBuffer* DOMDocumentImpl::popBuffer(XMLSize_t nMinSize) { if (!fRecycleBufferPtr || fRecycleBufferPtr->empty()) return 0; + for(unsigned int index=fRecycleBufferPtr->size()-1;index>0;index--) + if(fRecycleBufferPtr->elementAt(index)->getCapacity()>=nMinSize) + return fRecycleBufferPtr->popAt(index); + // if we didn't find a buffer big enough, get the last one return fRecycleBufferPtr->pop(); } diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp index c5ef881bc8367671f6b62b0dcdba8fa9ca151acb..b4f0ca46dbaa089e521028ee567e2492bc572d84 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp @@ -255,7 +255,7 @@ public: void deleteHeap(); void releaseDocNotifyUserData(DOMNode* object); void releaseBuffer(DOMBuffer* buffer); - DOMBuffer* popBuffer(); + DOMBuffer* popBuffer(XMLSize_t nMinSize); MemoryManager* getMemoryManager() const; // Factory methods for getting/creating node lists. diff --git a/src/xercesc/dom/impl/DOMStringPool.hpp b/src/xercesc/dom/impl/DOMStringPool.hpp index bf92c9f7f380044804cd3e859425969438391aa0..1128ad91b6f5fc2d9eea73f228d947688732265d 100644 --- a/src/xercesc/dom/impl/DOMStringPool.hpp +++ b/src/xercesc/dom/impl/DOMStringPool.hpp @@ -130,6 +130,11 @@ public : return fIndex; } + unsigned int getCapacity() const + { + return fCapacity; + } + // ----------------------------------------------------------------------- // Private helpers // ----------------------------------------------------------------------- diff --git a/src/xercesc/util/RefStackOf.c b/src/xercesc/util/RefStackOf.c index ac635f23f31f119fcbaae30ad40c0137156c7669..e791d005621121ec7c8324c075134082b67bcb36 100644 --- a/src/xercesc/util/RefStackOf.c +++ b/src/xercesc/util/RefStackOf.c @@ -51,11 +51,20 @@ template <class TElem> RefStackOf<TElem>::~RefStackOf() template <class TElem> const TElem* RefStackOf<TElem>:: elementAt(const unsigned int index) const { - if (index > fVector.size()) + if (index >= fVector.size()) ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Stack_BadIndex, fVector.getMemoryManager()); return fVector.elementAt(index); } +template <class TElem> TElem* RefStackOf<TElem>::popAt(const unsigned int index) +{ + if (index >= fVector.size()) + ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Stack_BadIndex, fVector.getMemoryManager()); + + // Orphan off the element from the slot in the vector + return fVector.orphanElementAt(index); +} + template <class TElem> void RefStackOf<TElem>::push(TElem* const toPush) { fVector.addElement(toPush); diff --git a/src/xercesc/util/RefStackOf.hpp b/src/xercesc/util/RefStackOf.hpp index b24928ce3e3b3458bbb28a9ca8c3e265b19b6472..822d8ec5361bae431c6f7f83b51132ffd575c89e 100644 --- a/src/xercesc/util/RefStackOf.hpp +++ b/src/xercesc/util/RefStackOf.hpp @@ -49,6 +49,7 @@ public : // Element management methods // ----------------------------------------------------------------------- const TElem* elementAt(const unsigned int index) const; + TElem* popAt(const unsigned int index); void push(TElem* const toPush); const TElem* peek() const; TElem* pop();