<!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>[204488] trunk/Source/JavaScriptCore</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/204488">204488</a></dd>
<dt>Author</dt> <dd>sbarati@apple.com</dd>
<dt>Date</dt> <dd>2016-08-15 16:31:39 -0700 (Mon, 15 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Array.prototype.map builtin should go on the fast path when constructor===@Array
https://bugs.webkit.org/show_bug.cgi?id=160836

Reviewed by Keith Miller.

In the FTL, we were not compiling the result array in Array.prototype.map
efficiently when the result array should use the Array constructor
(which is the common case). We used to compile it as:
x: JSConstant(Array)
y: Construct(@x, ...)
instead of
y: NewArrayWithSize(...)

This patch changes the builtin to go down the fast path when certain
conditions are met. Often, the check to go down the fast path will
be constant folded because we always create a normal array from the
Array constructor.

This is around a 5% speedup on ES6 Sample Bench.

I also made similar changes for Array.prototype.filter
and Array.prototype.concat on its slow path.

* builtins/ArrayPrototype.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebuiltinsArrayPrototypejs">trunk/Source/JavaScriptCore/builtins/ArrayPrototype.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (204487 => 204488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-15 22:43:11 UTC (rev 204487)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-15 23:31:39 UTC (rev 204488)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-08-15  Saam Barati  &lt;sbarati@apple.com&gt;
+
+        Array.prototype.map builtin should go on the fast path when constructor===@Array
+        https://bugs.webkit.org/show_bug.cgi?id=160836
+
+        Reviewed by Keith Miller.
+
+        In the FTL, we were not compiling the result array in Array.prototype.map
+        efficiently when the result array should use the Array constructor
+        (which is the common case). We used to compile it as:
+        x: JSConstant(Array)
+        y: Construct(@x, ...)
+        instead of
+        y: NewArrayWithSize(...)
+
+        This patch changes the builtin to go down the fast path when certain
+        conditions are met. Often, the check to go down the fast path will
+        be constant folded because we always create a normal array from the
+        Array constructor.
+
+        This is around a 5% speedup on ES6 Sample Bench.
+
+        I also made similar changes for Array.prototype.filter
+        and Array.prototype.concat on its slow path.
+
+        * builtins/ArrayPrototype.js:
+
</ins><span class="cx"> 2016-08-15  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make JSValue::strictEqual() handle failures to resolve JSRopeStrings.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebuiltinsArrayPrototypejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/builtins/ArrayPrototype.js (204487 => 204488)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/builtins/ArrayPrototype.js        2016-08-15 22:43:11 UTC (rev 204487)
+++ trunk/Source/JavaScriptCore/builtins/ArrayPrototype.js        2016-08-15 23:31:39 UTC (rev 204488)
</span><span class="lines">@@ -212,9 +212,9 @@
</span><span class="cx">                 constructor = @undefined;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (constructor === @undefined) {
</del><ins>+    if (constructor === @Array || constructor === @undefined)
</ins><span class="cx">         result = [];
</span><del>-    } else
</del><ins>+    else
</ins><span class="cx">         result = new constructor(0);
</span><span class="cx"> 
</span><span class="cx">     var nextIndex = 0;
</span><span class="lines">@@ -261,9 +261,9 @@
</span><span class="cx">                 constructor = @undefined;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (constructor === @undefined) {
</del><ins>+    if (constructor === @Array || constructor === @undefined)
</ins><span class="cx">         result = @Array(length);
</span><del>-    } else
</del><ins>+    else
</ins><span class="cx">         result = new constructor(length);
</span><span class="cx"> 
</span><span class="cx">     var nextIndex = 0;
</span><span class="lines">@@ -676,11 +676,13 @@
</span><span class="cx">                 constructor = @Array;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (constructor === @undefined)
-        constructor = @Array;
</del><span class="cx"> 
</span><span class="cx">     var argCount = arguments.length;
</span><del>-    var result = new constructor(0);
</del><ins>+    var result;
+    if (constructor === @Array || constructor === @undefined)
+        result = [];
+    else
+        result = new constructor(0);
</ins><span class="cx">     var resultIsArray = @isJSArray(result);
</span><span class="cx"> 
</span><span class="cx">     var resultIndex = 0;
</span></span></pre>
</div>
</div>

</body>
</html>