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