You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2009/09/04 16:40:21 UTC
svn commit: r811428 - in /xerces/c/trunk:
src/xercesc/dom/impl/DOMElementImpl.cpp tests/src/DOM/DOMTest/DTest.cpp
Author: amassari
Date: Fri Sep 4 14:40:20 2009
New Revision: 811428
URL: http://svn.apache.org/viewvc?rev=811428&view=rev
Log:
When releasing an element, remove and release also its attributes (XERCESC-646)
Modified:
xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp
xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
Modified: xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp?rev=811428&r1=811427&r2=811428&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp (original)
+++ xerces/c/trunk/src/xercesc/dom/impl/DOMElementImpl.cpp Fri Sep 4 14:40:20 2009
@@ -477,7 +477,17 @@
DOMDocumentImpl* doc = (DOMDocumentImpl*) fParent.fOwnerDocument;
if (doc) {
fNode.callUserDataHandlers(DOMUserDataHandler::NODE_DELETED, 0, 0);
+ // release children
fParent.release();
+ // release attributes
+ fAttributes->hasDefaults(false);
+ XMLSize_t count;
+ while((count = fAttributes->getLength()) != 0)
+ {
+ DOMNode* attr = fAttributes->removeNamedItemAt(count-1);
+ attr->release();
+ }
+
doc->release(this, DOMMemoryManager::ELEMENT_OBJECT);
}
else {
Modified: xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp?rev=811428&r1=811427&r2=811428&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp (original)
+++ xerces/c/trunk/tests/src/DOM/DOMTest/DTest.cpp Fri Sep 4 14:40:20 2009
@@ -916,6 +916,33 @@
DOMTest::testDocumentFragmentNode = 0;
DOMTest::testNotationNode = 0;
+ // test release of attributes
+ DOMElement* elt = d->createElement(tempStr3);
+ elt->setAttribute(tempStr3, tempStr3);
+ elt->release();
+
+ elt = d->createElement(tempStr3);
+ DOMAttr *attr = d->createAttribute(tempStr3);
+ attr->setValue(tempStr3);
+ elt->setAttributeNode(attr);
+ elt->setIdAttributeNode(attr, true);
+
+ DOMElement *eleTest = d->getElementById(tempStr3);
+ if(eleTest==NULL)
+ {
+ fprintf(stderr, "getElementById test failed at line %i\n", __LINE__);
+ OK = false;
+ }
+
+ //all good until here
+ elt->release();
+ eleTest = d->getElementById(tempStr3);
+ if(eleTest!=NULL)
+ {
+ fprintf(stderr, "getElementById test failed at line %i\n", __LINE__);
+ OK = false;
+ }
+
// we couldn't really test the user data handler call as the userhandler is already
// deleted when the release() is done, but still set it to test the code internally
d->setUserData(tempStr, (void*) tempStr, &userhandler);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org