<!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>[211360] 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/211360">211360</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-30 02:14:36 -0800 (Mon, 30 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Several web timing tests crash in GTK+ and AppleWin bots
https://bugs.webkit.org/show_bug.cgi?id=167577

Reviewed by Ryosuke Niwa.

The problem is that entry is used in both the key, to get name, and in the value with WTFMove. So, the name is
invalidated by the move. It could be fixed by simply copying the name, instead of using entry-&gt;name, but I think
that code could be simplified using HashMap::ensure and then we don't need any string copy, nor even the static
insertPerformanceEntry().

Fix crashes in several imported/w3c/web-platform-tests/user-timing/ tests.

* page/PerformanceUserTiming.cpp:
(WebCore::UserTiming::mark):
(WebCore::UserTiming::measure):
(WebCore::insertPerformanceEntry): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepagePerformanceUserTimingcpp">trunk/Source/WebCore/page/PerformanceUserTiming.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211359 => 211360)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-30 10:10:40 UTC (rev 211359)
+++ trunk/Source/WebCore/ChangeLog        2017-01-30 10:14:36 UTC (rev 211360)
</span><span class="lines">@@ -1,5 +1,24 @@
</span><span class="cx"> 2017-01-30  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        Several web timing tests crash in GTK+ and AppleWin bots
+        https://bugs.webkit.org/show_bug.cgi?id=167577
+
+        Reviewed by Ryosuke Niwa.
+
+        The problem is that entry is used in both the key, to get name, and in the value with WTFMove. So, the name is
+        invalidated by the move. It could be fixed by simply copying the name, instead of using entry-&gt;name, but I think
+        that code could be simplified using HashMap::ensure and then we don't need any string copy, nor even the static
+        insertPerformanceEntry().
+
+        Fix crashes in several imported/w3c/web-platform-tests/user-timing/ tests.
+
+        * page/PerformanceUserTiming.cpp:
+        (WebCore::UserTiming::mark):
+        (WebCore::UserTiming::measure):
+        (WebCore::insertPerformanceEntry): Deleted.
+
+2017-01-30  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         [Threaded Compositor] Crash in GraphicsContext3D::deleteTexture when destroying TextureMapperPlatformLayerProxy
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=167575
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePerformanceUserTimingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PerformanceUserTiming.cpp (211359 => 211360)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PerformanceUserTiming.cpp        2017-01-30 10:10:40 UTC (rev 211359)
+++ trunk/Source/WebCore/page/PerformanceUserTiming.cpp        2017-01-30 10:14:36 UTC (rev 211360)
</span><span class="lines">@@ -88,16 +88,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void insertPerformanceEntry(PerformanceEntryMap&amp; performanceEntryMap, Ref&lt;PerformanceEntry&gt;&amp;&amp; performanceEntry)
-{
-    RefPtr&lt;PerformanceEntry&gt; entry = WTFMove(performanceEntry);
-    auto it = performanceEntryMap.find(entry-&gt;name());
-    if (it != performanceEntryMap.end())
-        it-&gt;value.append(WTFMove(entry));
-    else
-        performanceEntryMap.set(entry-&gt;name(), Vector&lt;RefPtr&lt;PerformanceEntry&gt;&gt; { WTFMove(entry) });
-}
-
</del><span class="cx"> static void clearPerformanceEntries(PerformanceEntryMap&amp; performanceEntryMap, const String&amp; name)
</span><span class="cx"> {
</span><span class="cx">     if (name.isNull()) {
</span><span class="lines">@@ -113,7 +103,9 @@
</span><span class="cx">     if (restrictedMarkFunction(markName))
</span><span class="cx">         return Exception { SYNTAX_ERR };
</span><span class="cx"> 
</span><del>-    insertPerformanceEntry(m_marksMap, PerformanceMark::create(markName, m_performance.now()));
</del><ins>+    auto&amp; performanceEntryList = m_marksMap.ensure(markName, [] { return Vector&lt;RefPtr&lt;PerformanceEntry&gt;&gt;(); }).iterator-&gt;value;
+    performanceEntryList.append(PerformanceMark::create(markName, m_performance.now()));
+
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -161,7 +153,9 @@
</span><span class="cx">         endTime = endMarkResult.releaseReturnValue();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    insertPerformanceEntry(m_measuresMap, PerformanceMeasure::create(measureName, startTime, endTime));
</del><ins>+    auto&amp; performanceEntryList = m_measuresMap.ensure(measureName, [] { return Vector&lt;RefPtr&lt;PerformanceEntry&gt;&gt;(); }).iterator-&gt;value;
+    performanceEntryList.append(PerformanceMeasure::create(measureName, startTime, endTime));
+
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>