<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[173754] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/173754">173754</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2014-09-19 08:48:36 -0700 (Fri, 19 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Optimize MarkupAccumulator::appendText()
https://bugs.webkit.org/show_bug.cgi?id=136935

Reviewed by Benjamin Poulain.

MarkupAccumulator::appendText() was calling the generic appendNodeValue()
method to append the text. appendNodeValue() supports any kind of Node and
thus calls the Node::nodeValue() virtual function.

Since appendText() is the only caller to appendNodeValue(), this patch
inlines the code in appendText() and makes it specific to Text Node, and
thus more efficient. The code now calls CharacterData::data() instead of
the Node::nodeValue() virtual function. This patch also updates
CharacterData::data() to return a const reference to avoid copying the
return value.

No new tests, no behavior change.

* dom/CharacterData.h:
(WebCore::CharacterData::data):
* editing/MarkupAccumulator.cpp:
(WebCore::MarkupAccumulator::appendText):
(WebCore::MarkupAccumulator::appendNodeValue): Deleted.
* editing/MarkupAccumulator.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomCharacterDatah">trunk/Source/WebCore/dom/CharacterData.h</a></li>
<li><a href="#trunkSourceWebCoreeditingMarkupAccumulatorcpp">trunk/Source/WebCore/editing/MarkupAccumulator.cpp</a></li>
<li><a href="#trunkSourceWebCoreeditingMarkupAccumulatorh">trunk/Source/WebCore/editing/MarkupAccumulator.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173753 => 173754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-19 15:40:04 UTC (rev 173753)
+++ trunk/Source/WebCore/ChangeLog        2014-09-19 15:48:36 UTC (rev 173754)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2014-09-19  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Optimize MarkupAccumulator::appendText()
+        https://bugs.webkit.org/show_bug.cgi?id=136935
+
+        Reviewed by Benjamin Poulain.
+
+        MarkupAccumulator::appendText() was calling the generic appendNodeValue()
+        method to append the text. appendNodeValue() supports any kind of Node and
+        thus calls the Node::nodeValue() virtual function.
+
+        Since appendText() is the only caller to appendNodeValue(), this patch
+        inlines the code in appendText() and makes it specific to Text Node, and
+        thus more efficient. The code now calls CharacterData::data() instead of
+        the Node::nodeValue() virtual function. This patch also updates
+        CharacterData::data() to return a const reference to avoid copying the
+        return value.
+
+        No new tests, no behavior change.
+
+        * dom/CharacterData.h:
+        (WebCore::CharacterData::data):
+        * editing/MarkupAccumulator.cpp:
+        (WebCore::MarkupAccumulator::appendText):
+        (WebCore::MarkupAccumulator::appendNodeValue): Deleted.
+        * editing/MarkupAccumulator.h:
+
</ins><span class="cx"> 2014-09-18  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Dot not allow to create delete-on-destroy GMainLoopSources
</span></span></pre></div>
<a id="trunkSourceWebCoredomCharacterDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/CharacterData.h (173753 => 173754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/CharacterData.h        2014-09-19 15:40:04 UTC (rev 173753)
+++ trunk/Source/WebCore/dom/CharacterData.h        2014-09-19 15:48:36 UTC (rev 173754)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> class CharacterData : public Node {
</span><span class="cx"> public:
</span><del>-    String data() const { return m_data; }
</del><ins>+    const String&amp; data() const { return m_data; }
</ins><span class="cx">     static ptrdiff_t dataMemoryOffset() { return OBJECT_OFFSETOF(CharacterData, m_data); }
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void setData(const String&amp;, ExceptionCode&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingMarkupAccumulatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/MarkupAccumulator.cpp (173753 => 173754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/MarkupAccumulator.cpp        2014-09-19 15:40:04 UTC (rev 173753)
+++ trunk/Source/WebCore/editing/MarkupAccumulator.cpp        2014-09-19 15:48:36 UTC (rev 173754)
</span><span class="lines">@@ -255,24 +255,6 @@
</span><span class="cx">     result.append(quoteChar);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkupAccumulator::appendNodeValue(StringBuilder&amp; result, const Node&amp; node, const Range* range, EntityMask entityMask)
-{
-    const String str = node.nodeValue();
-    unsigned length = str.length();
-    unsigned start = 0;
-
-    if (range) {
-        if (&amp;node == range-&gt;endContainer())
-            length = range-&gt;endOffset();
-        if (&amp;node == range-&gt;startContainer()) {
-            start = range-&gt;startOffset();
-            length -= start;
-        }
-    }
-
-    appendCharactersReplacingEntities(result, str, start, length, entityMask);
-}
-
</del><span class="cx"> bool MarkupAccumulator::shouldAddNamespaceElement(const Element&amp; element)
</span><span class="cx"> {
</span><span class="cx">     // Don't add namespace attribute if it is already defined for this elem.
</span><span class="lines">@@ -359,7 +341,20 @@
</span><span class="cx"> 
</span><span class="cx"> void MarkupAccumulator::appendText(StringBuilder&amp; result, const Text&amp; text)
</span><span class="cx"> {
</span><del>-    appendNodeValue(result, text, m_range, entityMaskForText(text));
</del><ins>+    const String&amp; textData = text.data();
+    unsigned start = 0;
+    unsigned length = textData.length();
+
+    if (m_range) {
+        if (&amp;text == m_range-&gt;endContainer())
+            length = m_range-&gt;endOffset();
+        if (&amp;text == m_range-&gt;startContainer()) {
+            start = m_range-&gt;startOffset();
+            length -= start;
+        }
+    }
+
+    appendCharactersReplacingEntities(result, textData, start, length, entityMaskForText(text));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void appendComment(StringBuilder&amp; result, const String&amp; comment)
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingMarkupAccumulatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/MarkupAccumulator.h (173753 => 173754)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/MarkupAccumulator.h        2014-09-19 15:40:04 UTC (rev 173753)
+++ trunk/Source/WebCore/editing/MarkupAccumulator.h        2014-09-19 15:48:36 UTC (rev 173754)
</span><span class="lines">@@ -87,7 +87,6 @@
</span><span class="cx">     void appendEndMarkup(StringBuilder&amp;, const Node&amp;);
</span><span class="cx"> 
</span><span class="cx">     void appendAttributeValue(StringBuilder&amp;, const String&amp;, bool);
</span><del>-    void appendNodeValue(StringBuilder&amp;, const Node&amp;, const Range*, EntityMask);
</del><span class="cx">     void appendNamespace(StringBuilder&amp;, const AtomicString&amp; prefix, const AtomicString&amp; namespaceURI, Namespaces&amp;, bool allowEmptyDefaultNS = false);
</span><span class="cx">     void appendXMLDeclaration(StringBuilder&amp;, const Document&amp;);
</span><span class="cx">     void appendDocumentType(StringBuilder&amp;, const DocumentType&amp;);
</span></span></pre>
</div>
</div>

</body>
</html>