[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:11:56 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit a588225f2080a5651f501354904664ab1b2b601c
Author: abarth at webkit.org <abarth at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Jul 14 23:44:03 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
This patch is just some cleanup to make fixing this bug easier.
* html/HTMLTreeBuilder.cpp:
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::ExternalCharacterTokenBuffer):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::~ExternalCharacterTokenBuffer):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::isEmpty):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::skipLeadingWhitespace):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeLeadingWhitespace):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeRemaining):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::giveRemainingTo):
(WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeRemainingWhitespace):
(WebCore::HTMLTreeBuilder::processDoctypeToken):
(WebCore::HTMLTreeBuilder::processStartTag):
(WebCore::HTMLTreeBuilder::processEndTag):
(WebCore::HTMLTreeBuilder::processComment):
(WebCore::HTMLTreeBuilder::processCharacter):
(WebCore::HTMLTreeBuilder::processCharacterBuffer):
(WebCore::HTMLTreeBuilder::processEndOfFile):
(WebCore::HTMLTreeBuilder::defaultForInitial):
(WebCore::HTMLTreeBuilder::defaultForBeforeHTML):
(WebCore::HTMLTreeBuilder::defaultForBeforeHead):
(WebCore::HTMLTreeBuilder::defaultForInHead):
(WebCore::HTMLTreeBuilder::defaultForInHeadNoscript):
(WebCore::HTMLTreeBuilder::defaultForAfterHead):
(WebCore::HTMLTreeBuilder::defaultForInTableText):
* html/HTMLTreeBuilder.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63372 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index b9a999b..b4e56bc 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,37 @@
+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
+
+ This patch is just some cleanup to make fixing this bug easier.
+
+ * html/HTMLTreeBuilder.cpp:
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::ExternalCharacterTokenBuffer):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::~ExternalCharacterTokenBuffer):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::isEmpty):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::skipLeadingWhitespace):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeLeadingWhitespace):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeRemaining):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::giveRemainingTo):
+ (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::takeRemainingWhitespace):
+ (WebCore::HTMLTreeBuilder::processDoctypeToken):
+ (WebCore::HTMLTreeBuilder::processStartTag):
+ (WebCore::HTMLTreeBuilder::processEndTag):
+ (WebCore::HTMLTreeBuilder::processComment):
+ (WebCore::HTMLTreeBuilder::processCharacter):
+ (WebCore::HTMLTreeBuilder::processCharacterBuffer):
+ (WebCore::HTMLTreeBuilder::processEndOfFile):
+ (WebCore::HTMLTreeBuilder::defaultForInitial):
+ (WebCore::HTMLTreeBuilder::defaultForBeforeHTML):
+ (WebCore::HTMLTreeBuilder::defaultForBeforeHead):
+ (WebCore::HTMLTreeBuilder::defaultForInHead):
+ (WebCore::HTMLTreeBuilder::defaultForInHeadNoscript):
+ (WebCore::HTMLTreeBuilder::defaultForAfterHead):
+ (WebCore::HTMLTreeBuilder::defaultForInTableText):
+ * html/HTMLTreeBuilder.h:
+
2010-07-14 Andreas Kling <andreas.kling at nokia.com>
Reviewed by Darin Adler.
diff --git a/WebCore/html/HTMLTreeBuilder.cpp b/WebCore/html/HTMLTreeBuilder.cpp
index c524ae8..02e5e1b 100644
--- a/WebCore/html/HTMLTreeBuilder.cpp
+++ b/WebCore/html/HTMLTreeBuilder.cpp
@@ -65,77 +65,6 @@ inline bool isTreeBuilderWhitepace(UChar cc)
return cc == '\t' || cc == '\x0A' || cc == '\x0C' || cc == '\x0D' || cc == ' ';
}
-class ExternalCharacterTokenBuffer : public Noncopyable {
-public:
- explicit ExternalCharacterTokenBuffer(AtomicHTMLToken& token)
- : m_current(token.characters().characters())
- , m_end(m_current + token.characters().length())
- {
- ASSERT(!isEmpty());
- }
-
- ~ExternalCharacterTokenBuffer()
- {
- ASSERT(isEmpty());
- }
-
- bool isEmpty() const { return m_current == m_end; }
-
- void skipLeadingWhitespace()
- {
- ASSERT(!isEmpty());
- while (isTreeBuilderWhitepace(*m_current)) {
- if (++m_current == m_end)
- return;
- }
- }
-
- String takeLeadingWhitespace()
- {
- ASSERT(!isEmpty());
- const UChar* start = m_current;
- skipLeadingWhitespace();
- if (start == m_current)
- return String();
- return String(start, m_current - start);
- }
-
- String takeRemaining()
- {
- ASSERT(!isEmpty());
- const UChar* start = m_current;
- m_current = m_end;
- return String(start, m_current - start);
- }
-
- void giveRemainingTo(Vector<UChar>& recipient)
- {
- recipient.append(m_current, m_end - m_current);
- m_current = m_end;
- }
-
- String takeRemainingWhitespace()
- {
- ASSERT(!isEmpty());
- Vector<UChar> whitespace;
- do {
- UChar cc = *m_current++;
- if (isTreeBuilderWhitepace(cc))
- whitespace.append(cc);
- } while (m_current < m_end);
- // Returning the null string when there aren't any whitespace
- // characters is slightly cleaner semantically because we don't want
- // to insert a text node (as opposed to inserting an empty text node).
- if (whitespace.isEmpty())
- return String();
- return String::adopt(whitespace);
- }
-
-private:
- const UChar* m_current;
- const UChar* m_end;
-};
-
inline bool hasNonWhitespace(const String& string)
{
const UChar* characters = string.characters();
@@ -316,6 +245,78 @@ bool isNotFormattingAndNotPhrasing(const Element* element)
} // namespace
+class HTMLTreeBuilder::ExternalCharacterTokenBuffer : public Noncopyable {
+public:
+ explicit ExternalCharacterTokenBuffer(AtomicHTMLToken& token)
+ : m_current(token.characters().characters())
+ , m_end(m_current + token.characters().length())
+ {
+ ASSERT(!isEmpty());
+ }
+
+ ~ExternalCharacterTokenBuffer()
+ {
+ ASSERT(isEmpty());
+ }
+
+ bool isEmpty() const { return m_current == m_end; }
+
+ void skipLeadingWhitespace()
+ {
+ ASSERT(!isEmpty());
+ while (isTreeBuilderWhitepace(*m_current)) {
+ if (++m_current == m_end)
+ return;
+ }
+ }
+
+ String takeLeadingWhitespace()
+ {
+ ASSERT(!isEmpty());
+ const UChar* start = m_current;
+ skipLeadingWhitespace();
+ if (start == m_current)
+ return String();
+ return String(start, m_current - start);
+ }
+
+ String takeRemaining()
+ {
+ ASSERT(!isEmpty());
+ const UChar* start = m_current;
+ m_current = m_end;
+ return String(start, m_current - start);
+ }
+
+ void giveRemainingTo(Vector<UChar>& recipient)
+ {
+ recipient.append(m_current, m_end - m_current);
+ m_current = m_end;
+ }
+
+ String takeRemainingWhitespace()
+ {
+ ASSERT(!isEmpty());
+ Vector<UChar> whitespace;
+ do {
+ UChar cc = *m_current++;
+ if (isTreeBuilderWhitepace(cc))
+ whitespace.append(cc);
+ } while (m_current < m_end);
+ // Returning the null string when there aren't any whitespace
+ // characters is slightly cleaner semantically because we don't want
+ // to insert a text node (as opposed to inserting an empty text node).
+ if (whitespace.isEmpty())
+ return String();
+ return String::adopt(whitespace);
+ }
+
+private:
+ const UChar* m_current;
+ const UChar* m_end;
+};
+
+
HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, HTMLDocument* document, bool reportErrors)
: m_framesetOk(true)
, m_document(document)
@@ -542,7 +543,7 @@ void HTMLTreeBuilder::processDoctypeToken(AtomicHTMLToken& token)
return;
}
if (m_insertionMode == InTableTextMode) {
- processDefaultForInTableTextMode(token);
+ defaultForInTableText();
processDoctypeToken(token);
return;
}
@@ -1178,7 +1179,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
switch (insertionMode()) {
case InitialMode:
ASSERT(insertionMode() == InitialMode);
- processDefaultForInitialMode(token);
+ defaultForInitial();
// Fall through.
case BeforeHTMLMode:
ASSERT(insertionMode() == BeforeHTMLMode);
@@ -1187,7 +1188,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
setInsertionMode(BeforeHeadMode);
return;
}
- processDefaultForBeforeHTMLMode(token);
+ defaultForBeforeHTML();
// Fall through.
case BeforeHeadMode:
ASSERT(insertionMode() == BeforeHeadMode);
@@ -1200,13 +1201,13 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
setInsertionMode(InHeadMode);
return;
}
- processDefaultForBeforeHeadMode(token);
+ defaultForBeforeHead();
// Fall through.
case InHeadMode:
ASSERT(insertionMode() == InHeadMode);
if (processStartTagForInHead(token))
return;
- processDefaultForInHeadMode(token);
+ defaultForInHead();
// Fall through.
case AfterHeadMode:
ASSERT(insertionMode() == AfterHeadMode);
@@ -1243,7 +1244,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForAfterHeadMode(token);
+ defaultForAfterHead();
// Fall through
case InBodyMode:
ASSERT(insertionMode() == InBodyMode);
@@ -1383,7 +1384,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForInHeadNoscriptMode(token);
+ defaultForInHeadNoscript();
processToken(token);
break;
case InFramesetMode:
@@ -1482,7 +1483,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
}
break;
case InTableTextMode:
- processDefaultForInTableTextMode(token);
+ defaultForInTableText();
processStartTag(token);
break;
case InForeignContentMode: {
@@ -2104,7 +2105,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
switch (insertionMode()) {
case InitialMode:
ASSERT(insertionMode() == InitialMode);
- processDefaultForInitialMode(token);
+ defaultForInitial();
// Fall through.
case BeforeHTMLMode:
ASSERT(insertionMode() == BeforeHTMLMode);
@@ -2112,7 +2113,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForBeforeHTMLMode(token);
+ defaultForBeforeHTML();
// Fall through.
case BeforeHeadMode:
ASSERT(insertionMode() == BeforeHeadMode);
@@ -2120,7 +2121,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForBeforeHeadMode(token);
+ defaultForBeforeHead();
// Fall through.
case InHeadMode:
ASSERT(insertionMode() == InHeadMode);
@@ -2133,7 +2134,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForInHeadMode(token);
+ defaultForInHead();
// Fall through.
case AfterHeadMode:
ASSERT(insertionMode() == AfterHeadMode);
@@ -2141,7 +2142,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForAfterHeadMode(token);
+ defaultForAfterHead();
// Fall through
case InBodyMode:
ASSERT(insertionMode() == InBodyMode);
@@ -2236,7 +2237,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
parseError(token);
return;
}
- processDefaultForInHeadNoscriptMode(token);
+ defaultForInHeadNoscript();
processToken(token);
break;
case TextMode:
@@ -2321,7 +2322,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
}
break;
case InTableTextMode:
- processDefaultForInTableTextMode(token);
+ defaultForInTableText();
processEndTag(token);
break;
case InForeignContentMode:
@@ -2410,7 +2411,7 @@ void HTMLTreeBuilder::processComment(AtomicHTMLToken& token)
return;
}
if (m_insertionMode == InTableTextMode) {
- processDefaultForInTableTextMode(token);
+ defaultForInTableText();
processComment(token);
return;
}
@@ -2420,13 +2421,16 @@ void HTMLTreeBuilder::processComment(AtomicHTMLToken& token)
void HTMLTreeBuilder::processCharacter(AtomicHTMLToken& token)
{
ASSERT(token.type() == HTMLToken::Character);
-
// FIXME: Currently this design has an extra memcpy because we copy the
// characters out of the HTMLTokenizer's buffer into the AtomicHTMLToken
// and then into the text node. What we'd really like is to copy directly
// from the HTMLTokenizer's buffer into the text node.
ExternalCharacterTokenBuffer buffer(token);
+ processCharacterBuffer(buffer);
+}
+void HTMLTreeBuilder::processCharacterBuffer(ExternalCharacterTokenBuffer& buffer)
+{
ReprocessBuffer:
switch (insertionMode()) {
case InitialMode: {
@@ -2434,7 +2438,7 @@ ReprocessBuffer:
buffer.skipLeadingWhitespace();
if (buffer.isEmpty())
return;
- processDefaultForInitialMode(token);
+ defaultForInitial();
// Fall through.
}
case BeforeHTMLMode: {
@@ -2442,7 +2446,7 @@ ReprocessBuffer:
buffer.skipLeadingWhitespace();
if (buffer.isEmpty())
return;
- processDefaultForBeforeHTMLMode(token);
+ defaultForBeforeHTML();
// Fall through.
}
case BeforeHeadMode: {
@@ -2450,7 +2454,7 @@ ReprocessBuffer:
buffer.skipLeadingWhitespace();
if (buffer.isEmpty())
return;
- processDefaultForBeforeHeadMode(token);
+ defaultForBeforeHead();
// Fall through.
}
case InHeadMode: {
@@ -2460,7 +2464,7 @@ ReprocessBuffer:
m_tree.insertTextNode(leadingWhitespace);
if (buffer.isEmpty())
return;
- processDefaultForInHeadMode(token);
+ defaultForInHead();
// Fall through.
}
case AfterHeadMode: {
@@ -2470,7 +2474,7 @@ ReprocessBuffer:
m_tree.insertTextNode(leadingWhitespace);
if (buffer.isEmpty())
return;
- processDefaultForAfterHeadMode(token);
+ defaultForAfterHead();
// Fall through.
}
case InBodyMode:
@@ -2513,7 +2517,7 @@ ReprocessBuffer:
case AfterBodyMode:
case AfterAfterBodyMode: {
ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode);
- parseError(token);
+ // FIXME: parse error
setInsertionMode(InBodyMode);
goto ReprocessBuffer;
break;
@@ -2530,7 +2534,7 @@ ReprocessBuffer:
m_tree.insertTextNode(leadingWhitespace);
if (buffer.isEmpty())
return;
- processDefaultForInHeadNoscriptMode(token);
+ defaultForInHeadNoscript();
goto ReprocessBuffer;
break;
}
@@ -2577,23 +2581,23 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token)
switch (insertionMode()) {
case InitialMode:
ASSERT(insertionMode() == InitialMode);
- processDefaultForInitialMode(token);
+ defaultForInitial();
// Fall through.
case BeforeHTMLMode:
ASSERT(insertionMode() == BeforeHTMLMode);
- processDefaultForBeforeHTMLMode(token);
+ defaultForBeforeHTML();
// Fall through.
case BeforeHeadMode:
ASSERT(insertionMode() == BeforeHeadMode);
- processDefaultForBeforeHeadMode(token);
+ defaultForBeforeHead();
// Fall through.
case InHeadMode:
ASSERT(insertionMode() == InHeadMode);
- processDefaultForInHeadMode(token);
+ defaultForInHead();
// Fall through.
case AfterHeadMode:
ASSERT(insertionMode() == AfterHeadMode);
- processDefaultForAfterHeadMode(token);
+ defaultForAfterHead();
// Fall through
case InBodyMode:
case InCellMode:
@@ -2607,7 +2611,7 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token)
break;
case InHeadNoscriptMode:
ASSERT(insertionMode() == InHeadNoscriptMode);
- processDefaultForInHeadNoscriptMode(token);
+ defaultForInHeadNoscript();
processToken(token);
break;
case AfterFramesetMode:
@@ -2643,7 +2647,7 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token)
processEndOfFile(token);
break;
case InTableTextMode:
- processDefaultForInTableTextMode(token);
+ defaultForInTableText();
processEndOfFile(token);
break;
case TextMode:
@@ -2654,50 +2658,50 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token)
}
}
-void HTMLTreeBuilder::processDefaultForInitialMode(AtomicHTMLToken& token)
+void HTMLTreeBuilder::defaultForInitial()
{
notImplemented();
- parseError(token);
+ // FIXME: parse error
setInsertionMode(BeforeHTMLMode);
}
-void HTMLTreeBuilder::processDefaultForBeforeHTMLMode(AtomicHTMLToken&)
+void HTMLTreeBuilder::defaultForBeforeHTML()
{
AtomicHTMLToken startHTML(HTMLToken::StartTag, htmlTag.localName());
m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML);
setInsertionMode(BeforeHeadMode);
}
-void HTMLTreeBuilder::processDefaultForBeforeHeadMode(AtomicHTMLToken&)
+void HTMLTreeBuilder::defaultForBeforeHead()
{
AtomicHTMLToken startHead(HTMLToken::StartTag, headTag.localName());
processStartTag(startHead);
}
-void HTMLTreeBuilder::processDefaultForInHeadMode(AtomicHTMLToken&)
+void HTMLTreeBuilder::defaultForInHead()
{
AtomicHTMLToken endHead(HTMLToken::EndTag, headTag.localName());
processEndTag(endHead);
}
-void HTMLTreeBuilder::processDefaultForInHeadNoscriptMode(AtomicHTMLToken&)
+void HTMLTreeBuilder::defaultForInHeadNoscript()
{
AtomicHTMLToken endNoscript(HTMLToken::EndTag, noscriptTag.localName());
processEndTag(endNoscript);
}
-void HTMLTreeBuilder::processDefaultForAfterHeadMode(AtomicHTMLToken&)
+void HTMLTreeBuilder::defaultForAfterHead()
{
AtomicHTMLToken startBody(HTMLToken::StartTag, bodyTag.localName());
processStartTag(startBody);
m_framesetOk = true;
}
-void HTMLTreeBuilder::processDefaultForInTableTextMode(AtomicHTMLToken& token)
+void HTMLTreeBuilder::defaultForInTableText()
{
String characters = String::adopt(m_pendingTableCharacters);
if (hasNonWhitespace(characters)) {
- parseError(token);
+ // FIXME: parse error
HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree, requiresRedirectToFosterParent(m_tree.currentElement()));
m_tree.reconstructTheActiveFormattingElements();
m_tree.insertTextNode(characters);
diff --git a/WebCore/html/HTMLTreeBuilder.h b/WebCore/html/HTMLTreeBuilder.h
index 74e3398..0f87cb0 100644
--- a/WebCore/html/HTMLTreeBuilder.h
+++ b/WebCore/html/HTMLTreeBuilder.h
@@ -76,6 +76,7 @@ public:
private:
class FakeInsertionMode;
+ class ExternalCharacterTokenBuffer;
// Represents HTML5 "insertion mode"
// http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#insertion-mode
enum InsertionMode {
@@ -134,6 +135,8 @@ private:
// needs to assert which tokens it can be called with.
void processAnyOtherEndTagForInBody(AtomicHTMLToken&);
+ void processCharacterBuffer(ExternalCharacterTokenBuffer&);
+
void processFakeStartTag(const QualifiedName&, PassRefPtr<NamedNodeMap> attributes = 0);
void processFakeEndTag(const QualifiedName&);
void processFakeCharacters(const String&);
@@ -144,14 +147,13 @@ private:
void processScriptStartTag(AtomicHTMLToken&);
// Default processing for the different insertion modes.
- // FIXME: These functions need to be renamed to remove "process" from their names.
- void processDefaultForInitialMode(AtomicHTMLToken&);
- void processDefaultForBeforeHTMLMode(AtomicHTMLToken&);
- void processDefaultForBeforeHeadMode(AtomicHTMLToken&);
- void processDefaultForInHeadMode(AtomicHTMLToken&);
- void processDefaultForInHeadNoscriptMode(AtomicHTMLToken&);
- void processDefaultForAfterHeadMode(AtomicHTMLToken&);
- void processDefaultForInTableTextMode(AtomicHTMLToken&);
+ void defaultForInitial();
+ void defaultForBeforeHTML();
+ void defaultForBeforeHead();
+ void defaultForInHead();
+ void defaultForInHeadNoscript();
+ void defaultForAfterHead();
+ void defaultForInTableText();
void processUsingSecondaryInsertionModeAndAdjustInsertionMode(AtomicHTMLToken&);
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list