<!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>[248001] branches/safari-608-branch/Source/WebKit</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/248001">248001</a></dd>
<dt>Author</dt> <dd>alancoon@apple.com</dd>
<dt>Date</dt> <dd>2019-07-29 20:56:54 -0700 (Mon, 29 Jul 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Cherry-pick <a href="http://trac.webkit.org/projects/webkit/changeset/247672">r247672</a>. rdar://problem/53449739

    Micro-optimize HashMap & String IPC decoding
    https://bugs.webkit.org/show_bug.cgi?id=199967

    Reviewed by Geoffrey Garen.

    The legacy HashMap decoder (returning a boolean) was failing to WTFMove()
    the key & value when calling HashMap::add(). The modern decoder (returning
    an Optional) was properly using WTFMove(). Rewrite the legacy HashMap decoder
    to call the modern one to reduce code duplication and to get this optimization.

    Also, encode HashMap::size() as a uint32_t instead of a uint64_t since
    HashMap::size() returns an 'unsigned int' type. Finally, update the modern
    decoder to WTFMove(hashMap) when returning. Because the function returns an
    Optional<HashMap> and not a HashMap, I do not believe we get return value
    optimization (RVO).

    Do similar changes to String IPC coders.

    * Platform/IPC/ArgumentCoders.cpp:
    (IPC::decodeStringText):
    (IPC::ArgumentCoder<String>::decode):
    * Platform/IPC/ArgumentCoders.h:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247672 268f45cc-cd09-0410-ab3c-d52691b4dbfc</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari608branchSourceWebKitChangeLog">branches/safari-608-branch/Source/WebKit/ChangeLog</a></li>
<li><a href="#branchessafari608branchSourceWebKitPlatformIPCArgumentCoderscpp">branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.cpp</a></li>
<li><a href="#branchessafari608branchSourceWebKitPlatformIPCArgumentCodersh">branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari608branchSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Source/WebKit/ChangeLog (248000 => 248001)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Source/WebKit/ChangeLog       2019-07-30 03:56:52 UTC (rev 248000)
+++ branches/safari-608-branch/Source/WebKit/ChangeLog  2019-07-30 03:56:54 UTC (rev 248001)
</span><span class="lines">@@ -1,5 +1,60 @@
</span><span class="cx"> 2019-07-29  Alan Coon  <alancoon@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r247672. rdar://problem/53449739
+
+    Micro-optimize HashMap & String IPC decoding
+    https://bugs.webkit.org/show_bug.cgi?id=199967
+    
+    Reviewed by Geoffrey Garen.
+    
+    The legacy HashMap decoder (returning a boolean) was failing to WTFMove()
+    the key & value when calling HashMap::add(). The modern decoder (returning
+    an Optional) was properly using WTFMove(). Rewrite the legacy HashMap decoder
+    to call the modern one to reduce code duplication and to get this optimization.
+    
+    Also, encode HashMap::size() as a uint32_t instead of a uint64_t since
+    HashMap::size() returns an 'unsigned int' type. Finally, update the modern
+    decoder to WTFMove(hashMap) when returning. Because the function returns an
+    Optional<HashMap> and not a HashMap, I do not believe we get return value
+    optimization (RVO).
+    
+    Do similar changes to String IPC coders.
+    
+    * Platform/IPC/ArgumentCoders.cpp:
+    (IPC::decodeStringText):
+    (IPC::ArgumentCoder<String>::decode):
+    * Platform/IPC/ArgumentCoders.h:
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247672 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-07-20  Chris Dumez  <cdumez@apple.com>
+
+            Micro-optimize HashMap & String IPC decoding
+            https://bugs.webkit.org/show_bug.cgi?id=199967
+
+            Reviewed by Geoffrey Garen.
+
+            The legacy HashMap decoder (returning a boolean) was failing to WTFMove()
+            the key & value when calling HashMap::add(). The modern decoder (returning
+            an Optional) was properly using WTFMove(). Rewrite the legacy HashMap decoder
+            to call the modern one to reduce code duplication and to get this optimization.
+
+            Also, encode HashMap::size() as a uint32_t instead of a uint64_t since
+            HashMap::size() returns an 'unsigned int' type. Finally, update the modern
+            decoder to WTFMove(hashMap) when returning. Because the function returns an
+            Optional<HashMap> and not a HashMap, I do not believe we get return value
+            optimization (RVO).
+
+            Do similar changes to String IPC coders.
+
+            * Platform/IPC/ArgumentCoders.cpp:
+            (IPC::decodeStringText):
+            (IPC::ArgumentCoder<String>::decode):
+            * Platform/IPC/ArgumentCoders.h:
+
+2019-07-29  Alan Coon  <alancoon@apple.com>
+
</ins><span class="cx">         Cherry-pick r247890. rdar://problem/53647283
</span><span class="cx"> 
</span><span class="cx">     Allow more syscalls in the WebContent process' sandbox profile
</span></span></pre></div>
<a id="branchessafari608branchSourceWebKitPlatformIPCArgumentCoderscpp"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.cpp (248000 => 248001)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.cpp 2019-07-30 03:56:52 UTC (rev 248000)
+++ branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.cpp    2019-07-30 03:56:54 UTC (rev 248001)
</span><span class="lines">@@ -132,44 +132,22 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template <typename CharacterType>
</span><del>-static inline bool decodeStringText(Decoder& decoder, uint32_t length, String& result)
</del><ins>+static inline Optional<String> decodeStringText(Decoder& decoder, uint32_t length)
</ins><span class="cx"> {
</span><span class="cx">     // Before allocating the string, make sure that the decoder buffer is big enough.
</span><span class="cx">     if (!decoder.bufferIsLargeEnoughToContain<CharacterType>(length)) {
</span><span class="cx">         decoder.markInvalid();
</span><del>-        return false;
</del><ins>+        return WTF::nullopt;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     CharacterType* buffer;
</span><span class="cx">     String string = String::createUninitialized(length, buffer);
</span><span class="cx">     if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(CharacterType), alignof(CharacterType)))
</span><del>-        return false;
</del><ins>+        return WTF::nullopt;
</ins><span class="cx">     
</span><del>-    result = string;
-    return true;    
</del><ins>+    return WTFMove(string);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool ArgumentCoder<String>::decode(Decoder& decoder, String& result)
-{
-    uint32_t length;
-    if (!decoder.decode(length))
-        return false;
-
-    if (length == std::numeric_limits<uint32_t>::max()) {
-        // This is the null string.
-        result = String();
-        return true;
-    }
-
-    bool is8Bit;
-    if (!decoder.decode(is8Bit))
-        return false;
-
-    if (is8Bit)
-        return decodeStringText<LChar>(decoder, length, result);
-    return decodeStringText<UChar>(decoder, length, result);
-}
-
</del><span class="cx"> Optional<String> ArgumentCoder<String>::decode(Decoder& decoder)
</span><span class="cx"> {
</span><span class="cx">     uint32_t length;
</span><span class="lines">@@ -185,17 +163,21 @@
</span><span class="cx">     if (!decoder.decode(is8Bit))
</span><span class="cx">         return WTF::nullopt;
</span><span class="cx">     
</span><del>-    String result;
-    if (is8Bit) {
-        if (!decodeStringText<LChar>(decoder, length, result))
-            return WTF::nullopt;
-        return result;
-    }
-    if (!decodeStringText<UChar>(decoder, length, result))
-        return WTF::nullopt;
-    return result;
</del><ins>+    if (is8Bit)
+        return decodeStringText<LChar>(decoder, length);
+    return decodeStringText<UChar>(decoder, length);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool ArgumentCoder<String>::decode(Decoder& decoder, String& result)
+{
+    Optional<String> string;
+    decoder >> string;
+    if (!string)
+        return false;
+    result = WTFMove(*string);
+    return true;
+}
+
</ins><span class="cx"> void ArgumentCoder<SHA1::Digest>::encode(Encoder& encoder, const SHA1::Digest& digest)
</span><span class="cx"> {
</span><span class="cx">     encoder.encodeFixedLengthData(digest.data(), sizeof(digest), 1);
</span></span></pre></div>
<a id="branchessafari608branchSourceWebKitPlatformIPCArgumentCodersh"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.h (248000 => 248001)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.h   2019-07-30 03:56:52 UTC (rev 248000)
+++ branches/safari-608-branch/Source/WebKit/Platform/IPC/ArgumentCoders.h      2019-07-30 03:56:54 UTC (rev 248001)
</span><span class="lines">@@ -366,56 +366,30 @@
</span><span class="cx"> 
</span><span class="cx">     static void encode(Encoder& encoder, const HashMapType& hashMap)
</span><span class="cx">     {
</span><del>-        encoder << static_cast<uint64_t>(hashMap.size());
</del><ins>+        encoder << static_cast<uint32_t>(hashMap.size());
</ins><span class="cx">         for (typename HashMapType::const_iterator it = hashMap.begin(), end = hashMap.end(); it != end; ++it)
</span><span class="cx">             encoder << *it;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static bool decode(Decoder& decoder, HashMapType& hashMap)
-    {
-        uint64_t hashMapSize;
-        if (!decoder.decode(hashMapSize))
-            return false;
-
-        HashMapType tempHashMap;
-        for (uint64_t i = 0; i < hashMapSize; ++i) {
-            KeyArg key;
-            MappedArg value;
-            if (!decoder.decode(key))
-                return false;
-            if (!decoder.decode(value))
-                return false;
-
-            if (!tempHashMap.add(key, value).isNewEntry) {
-                // The hash map already has the specified key, bail.
-                decoder.markInvalid();
-                return false;
-            }
-        }
-
-        hashMap.swap(tempHashMap);
-        return true;
-    }
-
</del><span class="cx">     static Optional<HashMapType> decode(Decoder& decoder)
</span><span class="cx">     {
</span><del>-        uint64_t hashMapSize;
</del><ins>+        uint32_t hashMapSize;
</ins><span class="cx">         if (!decoder.decode(hashMapSize))
</span><span class="cx">             return WTF::nullopt;
</span><span class="cx"> 
</span><span class="cx">         HashMapType hashMap;
</span><del>-        for (uint64_t i = 0; i < hashMapSize; ++i) {
</del><ins>+        for (uint32_t i = 0; i < hashMapSize; ++i) {
</ins><span class="cx">             Optional<KeyArg> key;
</span><span class="cx">             decoder >> key;
</span><del>-            if (!key)
</del><ins>+            if (UNLIKELY(!key))
</ins><span class="cx">                 return WTF::nullopt;
</span><span class="cx"> 
</span><span class="cx">             Optional<MappedArg> value;
</span><span class="cx">             decoder >> value;
</span><del>-            if (!value)
</del><ins>+            if (UNLIKELY(!value))
</ins><span class="cx">                 return WTF::nullopt;
</span><span class="cx"> 
</span><del>-            if (!hashMap.add(WTFMove(key.value()), WTFMove(value.value())).isNewEntry) {
</del><ins>+            if (UNLIKELY(!hashMap.add(WTFMove(*key), WTFMove(*value)).isNewEntry)) {
</ins><span class="cx">                 // The hash map already has the specified key, bail.
</span><span class="cx">                 decoder.markInvalid();
</span><span class="cx">                 return WTF::nullopt;
</span><span class="lines">@@ -422,8 +396,18 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return hashMap;
</del><ins>+        return WTFMove(hashMap);
</ins><span class="cx">     }
</span><ins>+
+    static bool decode(Decoder& decoder, HashMapType& hashMap)
+    {
+        Optional<HashMapType> tempHashMap;
+        decoder >> tempHashMap;
+        if (!tempHashMap)
+            return false;
+        hashMap.swap(*tempHashMap);
+        return true;
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template<typename KeyArg, typename HashArg, typename KeyTraitsArg> struct ArgumentCoder<HashSet<KeyArg, HashArg, KeyTraitsArg>> {
</span></span></pre>
</div>
</div>

</body>
</html>