[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

abarth at webkit.org abarth at webkit.org
Wed Dec 22 11:12:24 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 829878ad6bf3cbf98fbeabc4d5edd64b526e33e5
Author: abarth at webkit.org <abarth at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Jul 15 01:13:47 2010 +0000

    2010-07-14  Adam Barth  <abarth at webkit.org>
    
            Reviewed by Eric Seidel.
    
            Avoid extra memcpy of character tokens
            https://bugs.webkit.org/show_bug.cgi?id=42002
    
            Eric tells me this patch makes the new tree builder 1% faster than the
            old tree builder on our parser benchmark.
    
            * html/HTMLToken.h:
            (WebCore::AtomicHTMLToken::AtomicHTMLToken):
            (WebCore::AtomicHTMLToken::characters):
            * html/HTMLTreeBuilder.cpp:
            (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::ExternalCharacterTokenBuffer):
            (WebCore::convertToOldStyle):
            (WebCore::HTMLTreeBuilder::processFakeCharacters):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63387 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 5cc8e19..02cf7a2 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,21 @@
+2010-07-14  Adam Barth  <abarth at webkit.org>
+
+        Reviewed by Eric Seidel.
+
+        Avoid extra memcpy of character tokens
+        https://bugs.webkit.org/show_bug.cgi?id=42002
+
+        Eric tells me this patch makes the new tree builder 1% faster than the
+        old tree builder on our parser benchmark.
+
+        * html/HTMLToken.h:
+        (WebCore::AtomicHTMLToken::AtomicHTMLToken):
+        (WebCore::AtomicHTMLToken::characters):
+        * html/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::ExternalCharacterTokenBuffer):
+        (WebCore::convertToOldStyle):
+        (WebCore::HTMLTreeBuilder::processFakeCharacters):
+
 2010-07-14  Eric Seidel  <eric at webkit.org>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/html/HTMLToken.h b/WebCore/html/HTMLToken.h
index c2db87d..d2987f4 100644
--- a/WebCore/html/HTMLToken.h
+++ b/WebCore/html/HTMLToken.h
@@ -339,7 +339,7 @@ public:
             m_data = String(token.comment().data(), token.comment().size());
             break;
         case HTMLToken::Character:
-            m_data = String(token.characters().data(), token.characters().size());
+            m_externalCharacters = &token.characters();
             break;
         }
     }
@@ -352,12 +352,6 @@ public:
         ASSERT(usesName());
     }
 
-    explicit AtomicHTMLToken(const String& characters)
-        : m_type(HTMLToken::Character)
-        , m_data(characters)
-    {
-    }
-
     HTMLToken::Type type() const { return m_type; }
 
     const AtomicString& name() const
@@ -398,10 +392,10 @@ public:
         return m_attributes.release();
     }
 
-    const String& characters() const
+    const HTMLToken::DataVector& characters() const
     {
         ASSERT(m_type == HTMLToken::Character);
-        return m_data;
+        return *m_externalCharacters;
     }
 
     const String& comment() const
@@ -446,10 +440,19 @@ private:
     // "name" for DOCTYPE, StartTag, and EndTag
     AtomicString m_name;
 
-    // "characters" for Character
     // "data" for Comment
     String m_data;
 
+    // "characters" for Character
+    //
+    // We don't want to copy the the characters out of the HTMLToken, so we
+    // keep a pointer to its buffer instead.  This buffer is owned by the
+    // HTMLToken and causes a lifetime dependence between these objects.
+    //
+    // FIXME: Add a mechanism for "internalizing" the characters when the
+    //        HTMLToken is destructed.
+    const HTMLToken::DataVector* m_externalCharacters;
+
     // For DOCTYPE
     OwnPtr<HTMLToken::DoctypeData> m_doctypeData;
 
diff --git a/WebCore/html/HTMLTreeBuilder.cpp b/WebCore/html/HTMLTreeBuilder.cpp
index 1c0ad27..a288391 100644
--- a/WebCore/html/HTMLTreeBuilder.cpp
+++ b/WebCore/html/HTMLTreeBuilder.cpp
@@ -248,8 +248,15 @@ bool isNotFormattingAndNotPhrasing(const Element* element)
 class HTMLTreeBuilder::ExternalCharacterTokenBuffer : public Noncopyable {
 public:
     explicit ExternalCharacterTokenBuffer(AtomicHTMLToken& token)
-        : m_current(token.characters().characters())
-        , m_end(m_current + token.characters().length())
+        : m_current(token.characters().data())
+        , m_end(m_current + token.characters().size())
+    {
+        ASSERT(!isEmpty());
+    }
+
+    explicit ExternalCharacterTokenBuffer(const String& string)
+        : m_current(string.characters())
+        , m_end(m_current + string.length())
     {
         ASSERT(!isEmpty());
     }
@@ -387,7 +394,7 @@ static void convertToOldStyle(AtomicHTMLToken& token, Token& oldStyleToken)
         break;
     case HTMLToken::Character:
         oldStyleToken.tagName = textAtom;
-        oldStyleToken.text = token.characters().impl();
+        oldStyleToken.text = StringImpl::create(token.characters().data(), token.characters().size());
         break;
     }
 }
@@ -566,8 +573,9 @@ void HTMLTreeBuilder::processFakeEndTag(const QualifiedName& tagName)
 
 void HTMLTreeBuilder::processFakeCharacters(const String& characters)
 {
-    AtomicHTMLToken fakeToken(characters);
-    processCharacter(fakeToken);
+    ASSERT(!characters.isEmpty());
+    ExternalCharacterTokenBuffer buffer(characters);
+    processCharacterBuffer(buffer);
 }
 
 void HTMLTreeBuilder::processFakePEndTagIfPInScope()

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list