You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ga...@apache.org on 2007/08/21 10:08:18 UTC

svn commit: r568004 - in /xerces/c/branches/xerces-2.7/src/xercesc: dom/impl/DOMParentNode.cpp dom/impl/DOMParentNode.hpp parsers/AbstractDOMParser.cpp

Author: gareth
Date: Tue Aug 21 01:08:17 2007
New Revision: 568004

URL: http://svn.apache.org/viewvc?rev=568004&view=rev
Log:
add appendChildFast and call it in parser. Performance patch. Thanks to Boris Kolpackov

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.cpp
    xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.hpp
    xerces/c/branches/xerces-2.7/src/xercesc/parsers/AbstractDOMParser.cpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.cpp?rev=568004&r1=568003&r2=568004&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.cpp Tue Aug 21 01:08:17 2007
@@ -350,6 +350,49 @@
 }
 
 
+DOMNode * DOMParentNode::appendChildFast(DOMNode *newChild)
+{
+    // This function makes the following assumptions:
+    //
+    // - newChild != 0
+    // - newChild is not read-only
+    // - newChild is not a document fragment
+    // - owner documents of this node and newChild are the same
+    // - appending newChild to this node cannot result in a cycle
+    // - DOMDocumentImpl::isKidOK (this, newChild) return true (that is,
+    //   appending newChild to this node results in a valid structure)
+    // - newChild->getParentNode() is 0
+    // - there are no ranges set for this document
+    //
+
+    // Attach up
+    castToNodeImpl(newChild)->fOwnerNode = castToNode(this);
+    castToNodeImpl(newChild)->isOwned(true);
+
+    // Attach before and after
+    // Note: fFirstChild.previousSibling == lastChild!!
+    if (fFirstChild != 0)
+    {
+        DOMNode *lastChild = castToChildImpl(fFirstChild)->previousSibling;
+        castToChildImpl(lastChild)->nextSibling = newChild;
+        castToChildImpl(newChild)->previousSibling = lastChild;
+        castToChildImpl(fFirstChild)->previousSibling = newChild;
+    }
+    else
+    {
+        // this our first and only child
+        fFirstChild = newChild;
+        castToNodeImpl(newChild)->isFirstChild(true);
+        // castToChildImpl(newChild)->previousSibling = newChild;
+        DOMChildNode *newChild_ci = castToChildImpl(newChild);
+        newChild_ci->previousSibling = newChild;
+    }
+
+    changed();
+
+    return newChild;
+}
+
 
 //Introduced in DOM Level 2
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.hpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.hpp?rev=568004&r1=568003&r2=568004&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.hpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/dom/impl/DOMParentNode.hpp Tue Aug 21 01:08:17 2007
@@ -82,6 +82,10 @@
     DOMNode*     removeChild(DOMNode *oldChild);
     DOMNode*     replaceChild(DOMNode *newChild, DOMNode *oldChild);
 
+    // Append certain types of nodes fast. Used to speed up XML to DOM
+    // parsing. See the function implementation for detail.
+    DOMNode*     appendChildFast(DOMNode *newChild);
+
     //Introduced in DOM Level 2
     void	normalize();
 

Modified: xerces/c/branches/xerces-2.7/src/xercesc/parsers/AbstractDOMParser.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/parsers/AbstractDOMParser.cpp?rev=568004&r1=568003&r2=568004&view=diff
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/parsers/AbstractDOMParser.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/parsers/AbstractDOMParser.cpp Tue Aug 21 01:08:17 2007
@@ -58,6 +58,7 @@
 #include <xercesc/dom/DOMProcessingInstruction.hpp>
 #include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp>
 #include <xercesc/dom/impl/DOMNodeIDMap.hpp>
+#include <xercesc/dom/impl/DOMCasts.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
 #include <xercesc/validators/common/GrammarResolver.hpp>
 #include <xercesc/validators/schema/SchemaSymbols.hpp>
@@ -752,7 +753,7 @@
     if (cdataSection == true)
     {
         DOMCDATASection *node = fDocument->createCDATASection(chars);
-        fCurrentParent->appendChild(node);
+        castToParentImpl (fCurrentParent)->appendChildFast (node);
         fCurrentNode = node;
     }
     else
@@ -765,7 +766,7 @@
         else
         {
             DOMText *node = fDocument->createTextNode(chars);
-            fCurrentParent->appendChild(node);
+            castToParentImpl (fCurrentParent)->appendChildFast (node);
             fCurrentNode = node;
         }
     }
@@ -778,7 +779,7 @@
 {
     if (fCreateCommentNodes) {
         DOMComment *dcom = fDocument->createComment(comment);
-        fCurrentParent->appendChild(dcom);
+        castToParentImpl (fCurrentParent)->appendChildFast (dcom);
         fCurrentNode = dcom;
     }
 }
@@ -792,7 +793,7 @@
         target
         , data
         );
-    fCurrentParent->appendChild(pi);
+    castToParentImpl (fCurrentParent)->appendChildFast (pi);
     fCurrentNode = pi;
 }
 
@@ -856,7 +857,7 @@
     {
         DOMTextImpl *node = (DOMTextImpl *)fDocument->createTextNode(chars);
         node->setIgnorableWhitespace(true);
-        fCurrentParent->appendChild(node);
+        castToParentImpl (fCurrentParent)->appendChildFast (node);
 
         fCurrentNode = node;
     }
@@ -1093,8 +1094,10 @@
         }
     }
 
-
-    fCurrentParent->appendChild(elem);
+    if (fCurrentParent != fDocument)
+      castToParentImpl (fCurrentParent)->appendChildFast (elem);
+    else
+      fCurrentParent->appendChild (elem);
 
     fNodeStack->push(fCurrentParent);
     fCurrentParent = elem;
@@ -1127,7 +1130,7 @@
         DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er;
         erImpl->setReadOnly(false, true);
 
-        fCurrentParent->appendChild(er);
+        castToParentImpl (fCurrentParent)->appendChildFast (er);
 
         fNodeStack->push(fCurrentParent);
         fCurrentParent = er;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org