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