[Libreoffice-commits] core.git: sax/source

Noel Grandin noel.grandin at collabora.co.uk
Wed Jul 11 10:38:20 UTC 2018


 sax/source/fastparser/fastparser.cxx |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

New commits:
commit 7d5c8923284b1ea8f82e30b7e8b2435e929e6c45
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Tue Jul 10 13:34:41 2018 +0200

    tdf#79878 perf loading docx file, more sax
    
    (*) in GetTokenWithPrefix, use rtl_str_reverseCompare_WithLength
        faster than strncmp
    (*) No need for NamespaceDefine to be stored via std::shared_tr
    
    Change-Id: Ibd262a3f4f5a0f518ec6abe1fb19e7803f78fe8b
    Reviewed-on: https://gerrit.libreoffice.org/57261
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
    Tested-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/sax/source/fastparser/fastparser.cxx b/sax/source/fastparser/fastparser.cxx
index 9477559c12e8..72e42c1d0247 100644
--- a/sax/source/fastparser/fastparser.cxx
+++ b/sax/source/fastparser/fastparser.cxx
@@ -137,6 +137,7 @@ struct NamespaceDefine
     OUString    maNamespaceURL;
 
     NamespaceDefine( const OString& rPrefix, sal_Int32 nToken, const OUString& rNamespaceURL ) : maPrefix( rPrefix ), mnToken( nToken ), maNamespaceURL( rNamespaceURL ) {}
+    NamespaceDefine() : mnToken(-1) {}
 };
 
 // Entity binds all information needed for a single file | single call of parseStream
@@ -185,8 +186,7 @@ struct Entity : public ParserData
     std::stack< SaxContext, std::vector<SaxContext> >  maContextStack;
     // Determines which elements of maNamespaceDefines are valid in current context
     std::stack< sal_uInt32, std::vector<sal_uInt32> >  maNamespaceCount;
-    std::vector< std::shared_ptr< NamespaceDefine > >
-                                          maNamespaceDefines;
+    std::vector< NamespaceDefine >                     maNamespaceDefines;
 
     explicit Entity( const ParserData& rData );
     Entity( const Entity& rEntity ) = delete;
@@ -653,7 +653,7 @@ void FastSaxParserImpl::DefineNamespace( const OString& rPrefix, const OUString&
     if( rEntity.maNamespaceDefines.size() <= nOffset )
         rEntity.maNamespaceDefines.resize( rEntity.maNamespaceDefines.size() + 64 );
 
-    rEntity.maNamespaceDefines[nOffset].reset( new NamespaceDefine( rPrefix, GetNamespaceToken( namespaceURL ), namespaceURL ) );
+    rEntity.maNamespaceDefines[nOffset] = NamespaceDefine( rPrefix, GetNamespaceToken( namespaceURL ), namespaceURL );
 }
 
 sal_Int32 FastSaxParserImpl::GetToken( const xmlChar* pName, sal_Int32 nameLen /* = 0 */ )
@@ -675,11 +675,11 @@ sal_Int32 FastSaxParserImpl::GetTokenWithPrefix( const xmlChar* pPrefix, int nPr
     while( nNamespace-- )
     {
         const auto & rNamespaceDefine = rEntity.maNamespaceDefines[nNamespace];
-        const OString& rPrefix( rNamespaceDefine->maPrefix );
+        const OString& rPrefix( rNamespaceDefine.maPrefix );
         if( (rPrefix.getLength() == nPrefixLen) &&
-            (strncmp( rPrefix.getStr(), XML_CAST( pPrefix ), nPrefixLen ) == 0 ) )
+            rtl_str_reverseCompare_WithLength(rPrefix.pData->buffer, rPrefix.pData->length, XML_CAST( pPrefix ), nPrefixLen ) == 0 )
         {
-            nNamespaceToken = rNamespaceDefine->mnToken;
+            nNamespaceToken = rNamespaceDefine.mnToken;
             break;
         }
 
@@ -714,8 +714,8 @@ OUString const & FastSaxParserImpl::GetNamespaceURL( const OString& rPrefix )
     {
         sal_uInt32 nNamespace = rEntity.maNamespaceCount.top();
         while( nNamespace-- )
-            if( rEntity.maNamespaceDefines[nNamespace]->maPrefix == rPrefix )
-                return rEntity.maNamespaceDefines[nNamespace]->maNamespaceURL;
+            if( rEntity.maNamespaceDefines[nNamespace].maPrefix == rPrefix )
+                return rEntity.maNamespaceDefines[nNamespace].maNamespaceURL;
     }
 
     throw SAXException("No namespace defined for " + OUString::fromUtf8(rPrefix),


More information about the Libreoffice-commits mailing list