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 2006/12/11 16:16:56 UTC

svn commit: r485700 - /xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp

Author: amassari
Date: Mon Dec 11 07:16:55 2006
New Revision: 485700

URL: http://svn.apache.org/viewvc?view=rev&rev=485700
Log:
Performance improvement: allocate memory only when the data inside the XMLElementDecl cannot be reused

Modified:
    xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp

Modified: xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp?view=diff&rev=485700&r1=485699&r2=485700
==============================================================================
--- xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp (original)
+++ xerces/c/branches/xerces-2.7/src/xercesc/parsers/SAX2XMLReaderImpl.cpp Mon Dec 11 07:16:55 2006
@@ -694,8 +694,21 @@
 
     if (fDocHandler)
     {
-        QName element(elemPrefix?elemPrefix:XMLUni::fgZeroLenString, elemDecl.getBaseName(), elemURLId, fMemoryManager);
-        const XMLCh* const elemQName = element.getRawName();
+        ArrayJanitor<XMLCh> janElemName(NULL);
+        XMLCh* elemQName = NULL;
+        if(elemPrefix==0 || *elemPrefix==0)
+            elemQName=(XMLCh*)elemDecl.getBaseName();
+        else if(XMLString::equals(elemPrefix, elemDecl.getElementName()->getPrefix()))
+            elemQName=(XMLCh*)elemDecl.getElementName()->getRawName();
+        else
+        {
+            unsigned int prefixLen=XMLString::stringLen(elemPrefix);
+            elemQName=(XMLCh*)fMemoryManager->allocate((prefixLen+1+XMLString::stringLen(elemDecl.getBaseName())+1)*sizeof(XMLCh));
+            XMLString::moveChars(elemQName, elemPrefix, prefixLen);
+            elemQName[prefixLen] = chColon;
+            XMLString::copyString(&elemQName[prefixLen+1], elemDecl.getBaseName());
+            janElemName.reset(elemQName, fMemoryManager);
+        }
 
         if (getDoNamespaces())
         {
@@ -814,14 +827,25 @@
                             , const bool            isRoot
                             , const XMLCh* const    elemPrefix)
 {
-    QName element(elemPrefix?elemPrefix:XMLUni::fgZeroLenString, elemDecl.getBaseName(), uriId, fMemoryManager);
-    const XMLCh* const elemQName = element.getRawName();
-
     // Just map to the SAX document handler
     if (fDocHandler)
     {
+        ArrayJanitor<XMLCh> janElemName(NULL);
+        XMLCh* elemQName = NULL;
+        if(elemPrefix==0 || *elemPrefix==0)
+            elemQName=(XMLCh*)elemDecl.getBaseName();
+        else if(XMLString::equals(elemPrefix, elemDecl.getElementName()->getPrefix()))
+            elemQName=(XMLCh*)elemDecl.getElementName()->getRawName();
+        else
+        {
+            unsigned int prefixLen=XMLString::stringLen(elemPrefix);
+            elemQName=(XMLCh*)fMemoryManager->allocate((prefixLen+1+XMLString::stringLen(elemDecl.getBaseName())+1)*sizeof(XMLCh));
+            XMLString::moveChars(elemQName, elemPrefix, prefixLen);
+            elemQName[prefixLen] = chColon;
+            XMLString::copyString(&elemQName[prefixLen+1], elemDecl.getBaseName());
+            janElemName.reset(elemQName, fMemoryManager);
+        }
 
-        // get the prefixes back so that we can call endPrefixMapping()
         if (getDoNamespaces())
         {
             fDocHandler->endElement
@@ -831,6 +855,7 @@
                 , elemQName
             );
 
+            // get the prefixes back so that we can call endPrefixMapping()
             unsigned int numPrefix = fPrefixCounts->pop();
             for (unsigned int i = 0; i < numPrefix; i++)
             {



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