[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