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