<!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>[195173] 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/195173">195173</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2016-01-16 12:37:25 -0800 (Sat, 16 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Give RuleSet a BumpArena and start using it for RuleDataVectors.
&lt;https://webkit.org/b/153169&gt;

Reviewed by Antti Koivisto.

Since RuleSet only supports appending rules and doesn't need to worry about removing them,
it's a great candidate for BumpArena optimizations.

Give each RuleSet its own BumpArena and teach them how to allocate RuleDataVector objects
out of them.

There are more things that can be done here, ideally all the sub-allocations inside RuleSet
that happen via e.g Vector and HashMap would also come out of the BumpArena.

* css/RuleSet.cpp:
(WebCore::RuleSet::RuleSet):
(WebCore::RuleSet::addToRuleSet):
(WebCore::RuleSet::copyShadowPseudoElementRulesFrom):
* css/RuleSet.h:
(WebCore::RuleSet::RuleDataVector::create):
(WebCore::RuleSet::RuleSet): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssRuleSetcpp">trunk/Source/WebCore/css/RuleSet.cpp</a></li>
<li><a href="#trunkSourceWebCorecssRuleSeth">trunk/Source/WebCore/css/RuleSet.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (195172 => 195173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-01-16 19:07:34 UTC (rev 195172)
+++ trunk/Source/WebCore/ChangeLog        2016-01-16 20:37:25 UTC (rev 195173)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2016-01-16  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Give RuleSet a BumpArena and start using it for RuleDataVectors.
+        &lt;https://webkit.org/b/153169&gt;
+
+        Reviewed by Antti Koivisto.
+
+        Since RuleSet only supports appending rules and doesn't need to worry about removing them,
+        it's a great candidate for BumpArena optimizations.
+
+        Give each RuleSet its own BumpArena and teach them how to allocate RuleDataVector objects
+        out of them.
+
+        There are more things that can be done here, ideally all the sub-allocations inside RuleSet
+        that happen via e.g Vector and HashMap would also come out of the BumpArena.
+
+        * css/RuleSet.cpp:
+        (WebCore::RuleSet::RuleSet):
+        (WebCore::RuleSet::addToRuleSet):
+        (WebCore::RuleSet::copyShadowPseudoElementRulesFrom):
+        * css/RuleSet.h:
+        (WebCore::RuleSet::RuleDataVector::create):
+        (WebCore::RuleSet::RuleSet): Deleted.
+
</ins><span class="cx"> 2016-01-16  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix flakiness of displaylists/layer-dispay-list.html
</span></span></pre></div>
<a id="trunkSourceWebCorecssRuleSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/RuleSet.cpp (195172 => 195173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/RuleSet.cpp        2016-01-16 19:07:34 UTC (rev 195172)
+++ trunk/Source/WebCore/css/RuleSet.cpp        2016-01-16 20:37:25 UTC (rev 195173)
</span><span class="lines">@@ -183,13 +183,18 @@
</span><span class="cx">         features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RuleSet::RuleSet()
+    : m_arena(WTF::BumpArena::create())
+{
+}
+
</ins><span class="cx"> void RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap&amp; map, const RuleData&amp; ruleData)
</span><span class="cx"> {
</span><span class="cx">     if (!key)
</span><span class="cx">         return;
</span><span class="cx">     auto&amp; rules = map.add(key, nullptr).iterator-&gt;value;
</span><span class="cx">     if (!rules)
</span><del>-        rules = std::make_unique&lt;RuleDataVector&gt;();
</del><ins>+        rules = RuleDataVector::create(m_arena.get());
</ins><span class="cx">     rules-&gt;append(ruleData);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -399,7 +404,7 @@
</span><span class="cx"> void RuleSet::copyShadowPseudoElementRulesFrom(const RuleSet&amp; other)
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; keyValuePair : other.m_shadowPseudoElementRules)
</span><del>-        m_shadowPseudoElementRules.add(keyValuePair.key, std::make_unique&lt;RuleDataVector&gt;(*keyValuePair.value));
</del><ins>+        m_shadowPseudoElementRules.add(keyValuePair.key, RuleDataVector::create(m_arena.get(), *keyValuePair.value));
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx">     // FIXME: We probably shouldn't treat WebVTT as author stylable user agent shadow tree.
</span></span></pre></div>
<a id="trunkSourceWebCorecssRuleSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/RuleSet.h (195172 => 195173)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/RuleSet.h        2016-01-16 19:07:34 UTC (rev 195172)
+++ trunk/Source/WebCore/css/RuleSet.h        2016-01-16 20:37:25 UTC (rev 195173)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include &quot;RuleFeature.h&quot;
</span><span class="cx"> #include &quot;SelectorCompiler.h&quot;
</span><span class="cx"> #include &quot;StyleRule.h&quot;
</span><ins>+#include &lt;wtf/BumpArena.h&gt;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="lines">@@ -158,7 +159,19 @@
</span><span class="cx"> 
</span><span class="cx">     RuleSet();
</span><span class="cx"> 
</span><del>-    typedef Vector&lt;RuleData, 1&gt; RuleDataVector;
</del><ins>+    class RuleDataVector : public Vector&lt;RuleData, 1&gt; {
+        WTF_MAKE_BUMPARENA_ALLOCATED;
+    public:
+        static std::unique_ptr&lt;RuleDataVector&gt; create(BumpArena&amp; arena)
+        {
+            return std::unique_ptr&lt;RuleDataVector&gt;(new (&amp;arena) RuleDataVector);
+        }
+        static std::unique_ptr&lt;RuleDataVector&gt; create(BumpArena&amp; arena, const RuleDataVector&amp; other)
+        {
+            return std::unique_ptr&lt;RuleDataVector&gt;(new (&amp;arena) RuleDataVector(other));
+        }
+    };
+
</ins><span class="cx">     typedef HashMap&lt;AtomicStringImpl*, std::unique_ptr&lt;RuleDataVector&gt;&gt; AtomRuleMap;
</span><span class="cx"> 
</span><span class="cx">     void addRulesFromSheet(StyleSheetContents&amp;, const MediaQueryEvaluator&amp;, StyleResolver* = 0);
</span><span class="lines">@@ -213,18 +226,13 @@
</span><span class="cx">     RuleDataVector m_focusPseudoClassRules;
</span><span class="cx">     RuleDataVector m_universalRules;
</span><span class="cx">     Vector&lt;StyleRulePage*&gt; m_pageRules;
</span><del>-    unsigned m_ruleCount;
-    bool m_autoShrinkToFitEnabled;
</del><ins>+    unsigned m_ruleCount { 0 };
+    bool m_autoShrinkToFitEnabled { true };
</ins><span class="cx">     RuleFeatureSet m_features;
</span><span class="cx">     Vector&lt;RuleSetSelectorPair&gt; m_regionSelectorsAndRuleSets;
</span><ins>+    Ref&lt;BumpArena&gt; m_arena;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-inline RuleSet::RuleSet()
-    : m_ruleCount(0)
-    , m_autoShrinkToFitEnabled(true)
-{
-}
-
</del><span class="cx"> inline const RuleSet::RuleDataVector* RuleSet::tagRules(AtomicStringImpl* key, bool isHTMLName) const
</span><span class="cx"> {
</span><span class="cx">     const AtomRuleMap* tagRules;
</span></span></pre>
</div>
</div>

</body>
</html>