<!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>[210518] trunk</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/210518">210518</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-09 13:09:04 -0800 (Mon, 09 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/210476">r210476</a>.
https://bugs.webkit.org/show_bug.cgi?id=166859

&quot;4% JSBench regression&quot; (Requested by keith_mi_ on #webkit).

Reverted changeset:

&quot;Add a slice intrinsic to the DFG/FTL&quot;
https://bugs.webkit.org/show_bug.cgi?id=166707
http://trac.webkit.org/changeset/210476</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGAbstractInterpreterInlinesh">trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp">trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGClobberizeh">trunk/Source/JavaScriptCore/dfg/DFGClobberize.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDoesGCcpp">trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGFixupPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeTypeh">trunk/Source/JavaScriptCore/dfg/DFGNodeType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSafeToExecuteh">trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITh">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLCapabilitiescpp">trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLLowerDFGToB3cpp">trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitAssemblyHelperscpp">trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArrayPrototypecpp">trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArrayPrototypeh">trunk/Source/JavaScriptCore/runtime/ArrayPrototype.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeIntrinsich">trunk/Source/JavaScriptCore/runtime/Intrinsic.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjecth">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkJSTestsstressarraysliceintrinsicjs">trunk/JSTests/stress/array-slice-intrinsic.js</a></li>
<li><a href="#trunkJSTestsstressarrayslicejettisononconstructorchangejs">trunk/JSTests/stress/array-slice-jettison-on-constructor-change.js</a></li>
<li><a href="#trunkJSTestsstressarraysliceosrexit2js">trunk/JSTests/stress/array-slice-osr-exit-2.js</a></li>
<li><a href="#trunkJSTestsstressarraysliceosrexitjs">trunk/JSTests/stress/array-slice-osr-exit.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChangeLog (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/JSTests/ChangeLog        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-01-09  Commit Queue  &lt;commit-queue@webkit.org&gt;
+
+        Unreviewed, rolling out r210476.
+        https://bugs.webkit.org/show_bug.cgi?id=166859
+
+        &quot;4% JSBench regression&quot; (Requested by keith_mi_ on #webkit).
+
+        Reverted changeset:
+
+        &quot;Add a slice intrinsic to the DFG/FTL&quot;
+        https://bugs.webkit.org/show_bug.cgi?id=166707
+        http://trac.webkit.org/changeset/210476
+
</ins><span class="cx"> 2017-01-06  Saam Barati  &lt;sbarati@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a slice intrinsic to the DFG/FTL
</span></span></pre></div>
<a id="trunkJSTestsstressarraysliceintrinsicjs"></a>
<div class="delfile"><h4>Deleted: trunk/JSTests/stress/array-slice-intrinsic.js (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/array-slice-intrinsic.js        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/JSTests/stress/array-slice-intrinsic.js        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,49 +0,0 @@
</span><del>-function assert(b) {
-    if (!b)
-        throw new Error(&quot;Bad&quot;)
-}
-noInline(assert);
-
-function shallowEq(a, b) {
-    assert(a.length === b.length);
-    for (let i = 0; i &lt; a.length; i++)
-        assert(a[i] === b[i]);
-}
-noInline(shallowEq);
-
-let tests = [
-    [[1,2,3,4,5], [1,2,3,4,5], 0, 5],
-    [[1,2,3,4,5], [1,2,3,4,5], 0],
-    [[1,2,3,4,5], [4], -2, -1],
-    [[1,2,3,4,5], [5], -1],
-    [[1,2,3,4,5], [5], -1, 5],
-    [[1,2,3,4,5], [], -10, -20],
-    [[1,2,3,4,5], [], -20, -10],
-    [[1,2,3,4,5], [], 6, 4],
-    [[1,2,3,4,5], [], 3, 2],
-    [[1,2,3,4,5], [4,5], 3, 10],
-    [[1,2,3,4,5], [3,4,5], 2, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -10, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -5, 10],
-    [[1,2,3,4,5], [2,3,4,5], -4, 10],
-];
-
-function runTest1(a, b) {
-    return a.slice(b);
-}
-noInline(runTest1);
-
-function runTest2(a, b, c) {
-    return a.slice(b, c);
-}
-noInline(runTest2);
-
-for (let i = 0; i &lt; 10000; i++) {
-    for (let [input, output, ...args] of tests) {
-        assert(args.length === 1 || args.length === 2);
-        if (args.length === 1)
-            shallowEq(runTest1(input, args[0]), output);
-        else
-            shallowEq(runTest2(input, args[0], args[1]), output);
-    }
-}
</del></span></pre></div>
<a id="trunkJSTestsstressarrayslicejettisononconstructorchangejs"></a>
<div class="delfile"><h4>Deleted: trunk/JSTests/stress/array-slice-jettison-on-constructor-change.js (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/array-slice-jettison-on-constructor-change.js        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/JSTests/stress/array-slice-jettison-on-constructor-change.js        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,72 +0,0 @@
</span><del>-function assert(b) {
-    if (!b)
-        throw new Error(&quot;Bad&quot;)
-}
-noInline(assert);
-
-let shouldBeNewConstructor = false;
-const newConstructor = {};
-
-function shallowEq(a, b) {
-    assert(a.length === b.length);
-    if (shouldBeNewConstructor)
-        assert(b.constructor === newConstructor);
-    for (let i = 0; i &lt; a.length; i++)
-        assert(a[i] === b[i]);
-}
-noInline(shallowEq);
-
-let tests = [
-    [[1,2,3,4,5], [1,2,3,4,5], 0, 5],
-    [[1,2,3,4,5], [1,2,3,4,5], 0],
-    [[1,2,3,4,5], [4], -2, -1],
-    [[1,2,3,4,5], [5], -1],
-    [[1,2,3,4,5], [5], -1, 5],
-    [[1,2,3,4,5], [], -10, -20],
-    [[1,2,3,4,5], [], -20, -10],
-    [[1,2,3,4,5], [], 6, 4],
-    [[1,2,3,4,5], [], 3, 2],
-    [[1,2,3,4,5], [4,5], 3, 10],
-    [[1,2,3,4,5], [3,4,5], 2, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -10, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -5, 10],
-    [[1,2,3,4,5], [2,3,4,5], -4, 10],
-];
-
-function runTest1(a, b) {
-    let result = a.slice(b);
-    return result;
-}
-noInline(runTest1);
-
-function runTest2(a, b, c) {
-    let result = a.slice(b, c);
-    return result;
-}
-noInline(runTest2);
-
-function addRandomProperties(input) {
-    for (let i = 0; i &lt; 4; i++) {
-        input[&quot;prop&quot; + i + ((Math.random() * 100000) | 0)] = i;
-    }
-}
-noInline(addRandomProperties);
-
-function runTests() {
-    for (let i = 0; i &lt; 10000; i++) {
-        for (let [input, output, ...args] of tests) {
-            addRandomProperties(input);
-            assert(args.length === 1 || args.length === 2);
-            if (args.length === 1)
-                shallowEq(runTest1(input, args[0]), output);
-            else
-                shallowEq(runTest2(input, args[0], args[1]), output);
-        }
-    }
-}
-
-runTests();
-
-Array.prototype.constructor = newConstructor;
-shouldBeNewConstructor = true;
-runTests();
</del></span></pre></div>
<a id="trunkJSTestsstressarraysliceosrexit2js"></a>
<div class="delfile"><h4>Deleted: trunk/JSTests/stress/array-slice-osr-exit-2.js (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/array-slice-osr-exit-2.js        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/JSTests/stress/array-slice-osr-exit-2.js        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,76 +0,0 @@
</span><del>-function assert(b) {
-    if (!b)
-        throw new Error(&quot;Bad&quot;)
-}
-noInline(assert);
-
-class Foo extends Array {
-    constructor(...args) {
-        super(...args);
-    }
-};
-function shallowEq(a, b) {
-    assert(a.length === b.length);
-    for (let i = 0; i &lt; a.length; i++)
-        assert(a[i] === b[i]);
-}
-noInline(shallowEq);
-
-let tests = [
-    [[1,2,3,4,5], [1,2,3,4,5], 0, 5],
-    [[1,2,3,4,5], [1,2,3,4,5], 0],
-    [[1,2,3,4,5], [4], -2, -1],
-    [[1,2,3,4,5], [5], -1],
-    [[1,2,3,4,5], [5], -1, 5],
-    [[1,2,3,4,5], [], -10, -20],
-    [[1,2,3,4,5], [], -20, -10],
-    [[1,2,3,4,5], [], 6, 4],
-    [[1,2,3,4,5], [], 3, 2],
-    [[1,2,3,4,5], [4,5], 3, 10],
-    [[1,2,3,4,5], [3,4,5], 2, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -10, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -5, 10],
-    [[1,2,3,4,5], [2,3,4,5], -4, 10],
-];
-
-function runTest1(a, b) {
-    let result = a.slice(b);
-    assert(a instanceof Foo === result instanceof Foo);
-    return result;
-}
-noInline(runTest1);
-
-function runTest2(a, b, c) {
-    let result = a.slice(b, c);
-    assert(a instanceof Foo === result instanceof Foo);
-    return result;
-}
-noInline(runTest2);
-
-function addRandomProperties(input) {
-    for (let i = 0; i &lt; 4; i++) {
-        input[&quot;prop&quot; + i + ((Math.random() * 100000) | 0)] = i;
-    }
-}
-noInline(addRandomProperties);
-
-function runTests() {
-    for (let i = 0; i &lt; 10000; i++) {
-        for (let [input, output, ...args] of tests) {
-            addRandomProperties(input);
-            assert(args.length === 1 || args.length === 2);
-            if (args.length === 1)
-                shallowEq(runTest1(input, args[0]), output);
-            else
-                shallowEq(runTest2(input, args[0], args[1]), output);
-        }
-    }
-}
-
-runTests();
-
-tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -10, 10]);
-tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -5, 10]);
-tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4, 10]);
-tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4]);
-runTests();
</del></span></pre></div>
<a id="trunkJSTestsstressarraysliceosrexitjs"></a>
<div class="delfile"><h4>Deleted: trunk/JSTests/stress/array-slice-osr-exit.js (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/stress/array-slice-osr-exit.js        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/JSTests/stress/array-slice-osr-exit.js        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,74 +0,0 @@
</span><del>-function assert(b) {
-    if (!b)
-        throw new Error(&quot;Bad&quot;)
-}
-noInline(assert);
-
-class Foo extends Array {
-    constructor(...args) {
-        super(...args);
-    }
-};
-function shallowEq(a, b) {
-    assert(a.length === b.length);
-    for (let i = 0; i &lt; a.length; i++)
-        assert(a[i] === b[i]);
-}
-noInline(shallowEq);
-
-let tests = [
-    [[1,2,3,4,5], [1,2,3,4,5], 0, 5],
-    [[1,2,3,4,5], [1,2,3,4,5], 0],
-    [[1,2,3,4,5], [4], -2, -1],
-    [[1,2,3,4,5], [5], -1],
-    [[1,2,3,4,5], [5], -1, 5],
-    [[1,2,3,4,5], [], -10, -20],
-    [[1,2,3,4,5], [], -20, -10],
-    [[1,2,3,4,5], [], 6, 4],
-    [[1,2,3,4,5], [], 3, 2],
-    [[1,2,3,4,5], [4,5], 3, 10],
-    [[1,2,3,4,5], [3,4,5], 2, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -10, 10],
-    [[1,2,3,4,5], [1,2,3,4,5], -5, 10],
-    [[1,2,3,4,5], [2,3,4,5], -4, 10],
-];
-tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -10, 10]);
-tests.push([new Foo(1,2,3,4,5), [1,2,3,4,5], -5, 10]);
-tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4, 10]);
-tests.push([new Foo(1,2,3,4,5), [2,3,4,5], -4]);
-
-function runTest1(a, b) {
-    let result = a.slice(b);
-    assert(a instanceof Foo === result instanceof Foo);
-    return result;
-}
-noInline(runTest1);
-
-function runTest2(a, b, c) {
-    let result = a.slice(b, c);
-    assert(a instanceof Foo === result instanceof Foo);
-    return result;
-}
-noInline(runTest2);
-
-function addRandomProperties(input) {
-    for (let i = 0; i &lt; 4; i++) {
-        input[&quot;prop&quot; + i + ((Math.random() * 100000) | 0)] = i;
-    }
-}
-noInline(addRandomProperties);
-
-function runTests() {
-    for (let i = 0; i &lt; 10000; i++) {
-        for (let [input, output, ...args] of tests) {
-            addRandomProperties(input);
-            assert(args.length === 1 || args.length === 2);
-            if (args.length === 1)
-                shallowEq(runTest1(input, args[0]), output);
-            else
-                shallowEq(runTest2(input, args[0], args[1]), output);
-        }
-    }
-}
-
-runTests();
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-01-09  Commit Queue  &lt;commit-queue@webkit.org&gt;
+
+        Unreviewed, rolling out r210476.
+        https://bugs.webkit.org/show_bug.cgi?id=166859
+
+        &quot;4% JSBench regression&quot; (Requested by keith_mi_ on #webkit).
+
+        Reverted changeset:
+
+        &quot;Add a slice intrinsic to the DFG/FTL&quot;
+        https://bugs.webkit.org/show_bug.cgi?id=166707
+        http://trac.webkit.org/changeset/210476
+
</ins><span class="cx"> 2017-01-08  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Inject MarkedSpace size classes for a few more high-volume objects.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGAbstractInterpreterInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1650,25 +1650,6 @@
</span><span class="cx">         clobberWorld(node-&gt;origin.semantic, clobberLimit);
</span><span class="cx">         forNode(node).setType(SpecBytecodeNumber);
</span><span class="cx">         break;
</span><del>-
-    case ArraySlice:
-        IndexingType indexingType;
-        switch (node-&gt;arrayMode().type()) {
-        case Array::Double:
-            indexingType = ArrayWithDouble;
-            break;
-        case Array::Int32:
-            indexingType = ArrayWithInt32;
-            break;
-        case Array::Contiguous:
-            indexingType = ArrayWithContiguous;
-            break;
-        default:
-            DFG_CRASH(m_graph, node, &quot;Bad array mode.&quot;);
-        }
-
-        forNode(node).set(m_graph, m_graph.globalObjectFor(node-&gt;origin.semantic)-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType));
-        break;
</del><span class="cx">             
</span><span class="cx">     case ArrayPop:
</span><span class="cx">         clobberWorld(node-&gt;origin.semantic, clobberLimit);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -2246,92 +2246,6 @@
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    case ArraySliceIntrinsic: {
-#if USE(JSVALUE32_64)
-        if (isX86()) {
-            // There aren't enough registers for this to be done easily.
-            return false;
-        }
-#endif
-        if (argumentCountIncludingThis &lt; 2)
-            return false;
-
-        if (m_inlineStackTop-&gt;m_exitProfile.hasExitSite(m_currentIndex, BadIndexingType)
-            || m_inlineStackTop-&gt;m_exitProfile.hasExitSite(m_currentIndex, BadConstantCache)
-            || m_inlineStackTop-&gt;m_exitProfile.hasExitSite(m_currentIndex, BadCache))
-            return false;
-
-        ArrayMode arrayMode = getArrayMode(m_currentInstruction[OPCODE_LENGTH(op_call) - 2].u.arrayProfile);
-        if (!arrayMode.isJSArray())
-            return false;
-
-        if (arrayMode.arrayClass() != Array::OriginalArray)
-            return false;
-
-        switch (arrayMode.type()) {
-        case Array::Double:
-        case Array::Int32:
-        case Array::Contiguous: {
-            JSGlobalObject* globalObject = m_graph.globalObjectFor(currentNodeOrigin().semantic);
-
-            InlineWatchpointSet&amp; objectPrototypeTransition = globalObject-&gt;objectPrototype()-&gt;structure()-&gt;transitionWatchpointSet();
-            InlineWatchpointSet&amp; arrayPrototypeTransition = globalObject-&gt;arrayPrototype()-&gt;structure()-&gt;transitionWatchpointSet();
-
-            // FIXME: We could easily relax the Array/Object.prototype transition as long as we OSR exitted if we saw a hole.
-            if (globalObject-&gt;arraySpeciesWatchpoint().isStillValid()
-                &amp;&amp; globalObject-&gt;havingABadTimeWatchpoint()-&gt;isStillValid()
-                &amp;&amp; arrayPrototypeTransition.isStillValid()
-                &amp;&amp; objectPrototypeTransition.isStillValid()
-                &amp;&amp; globalObject-&gt;arrayPrototypeChainIsSane()) {
-
-                m_graph.watchpoints().addLazily(globalObject-&gt;arraySpeciesWatchpoint());
-                m_graph.watchpoints().addLazily(globalObject-&gt;havingABadTimeWatchpoint());
-                m_graph.watchpoints().addLazily(arrayPrototypeTransition);
-                m_graph.watchpoints().addLazily(objectPrototypeTransition);
-
-                insertChecks();
-
-                Node* array = get(virtualRegisterForArgument(0, registerOffset));
-                // We do a few things here to prove that we aren't skipping doing side-effects in an observable way:
-                // 1. We ensure that the &quot;constructor&quot; property hasn't been changed (because the observable
-                // effects of slice require that we perform a Get(array, &quot;constructor&quot;) and we can skip
-                // that if we're an original array structure.
-                //
-                // 2. We check that the array we're calling slice on has the same global object as the lexical
-                // global object that this code is running in. This requirement is necessary because we setup the
-                // watchpoints above on the lexical global object. This means that code that calls slice on
-                // arrays produced by other global objects won't get this optimization. We could relax this
-                // requirement in the future by checking that the watchpoint hasn't fired at runtime in the code
-                // we generate instead of registering it as a watchpoint that would invalidate the compilation.
-                //
-                // 3. By proving we're an original array structure, we guarantee that the incoming array
-                // isn't a subclass of Array.
-
-                Structure* structure = arrayMode.originalArrayStructure(m_graph, currentNodeOrigin().semantic);
-                RELEASE_ASSERT(structure);
-                addToGraph(CheckStructure, OpInfo(m_graph.addStructureSet(structure)), array);
-
-                addVarArgChild(array);
-                addVarArgChild(get(virtualRegisterForArgument(1, registerOffset))); // Start index.
-                if (argumentCountIncludingThis &gt;= 3)
-                    addVarArgChild(get(virtualRegisterForArgument(2, registerOffset))); // End index.
-                addVarArgChild(addToGraph(GetButterfly, array));
-
-                Node* arraySlice = addToGraph(Node::VarArg, ArraySlice, OpInfo(arrayMode.asWord()), OpInfo(prediction));
-                set(VirtualRegister(resultOperand), arraySlice);
-                return true;
-            }
-
-            return false;
-        }
-        default:
-            return false;
-        }
-
-        RELEASE_ASSERT_NOT_REACHED();
-        return false;
-    }
</del><span class="cx">         
</span><span class="cx">     case ArrayPopIntrinsic: {
</span><span class="cx">         if (argumentCountIncludingThis != 1)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGClobberizeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGClobberize.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGClobberize.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGClobberize.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -503,29 +503,6 @@
</span><span class="cx">         read(MiscFields);
</span><span class="cx">         def(HeapLocation(IsFunctionLoc, MiscFields, node-&gt;child1()), LazyNode(node));
</span><span class="cx">         return;
</span><del>-
-    case ArraySlice:
-        read(MiscFields);
-        read(JSCell_indexingType);
-        read(JSCell_structureID);
-        read(JSObject_butterfly);
-        read(Butterfly_publicLength);
-        switch (node-&gt;arrayMode().type()) {
-        case Array::Double:
-            read(IndexedDoubleProperties);
-            break;
-        case Array::Int32:
-            read(IndexedInt32Properties);
-            break;
-        case Array::Contiguous:
-            read(IndexedContiguousProperties);
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-        }
-        read(HeapObjectCount);
-        write(HeapObjectCount);
-        return;
</del><span class="cx">         
</span><span class="cx">     case GetById:
</span><span class="cx">     case GetByIdFlush:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDoesGCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -309,7 +309,6 @@
</span><span class="cx">     case ToLowerCase:
</span><span class="cx">     case CallDOMGetter:
</span><span class="cx">     case CallDOM:
</span><del>-    case ArraySlice:
</del><span class="cx">         return true;
</span><span class="cx">         
</span><span class="cx">     case MultiPutByOffset:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGFixupPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -931,14 +931,6 @@
</span><span class="cx">             fixEdge&lt;KnownCellUse&gt;(node-&gt;child1());
</span><span class="cx">             break;
</span><span class="cx">         }
</span><del>-
-        case ArraySlice: {
-            fixEdge&lt;KnownCellUse&gt;(m_graph.varArgChild(node, 0));
-            fixEdge&lt;Int32Use&gt;(m_graph.varArgChild(node, 1));
-            if (node-&gt;numChildren() == 4)
-                fixEdge&lt;Int32Use&gt;(m_graph.varArgChild(node, 2));
-            break;
-        }
</del><span class="cx">             
</span><span class="cx">         case RegExpExec:
</span><span class="cx">         case RegExpTest: {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -1472,7 +1472,6 @@
</span><span class="cx">         case GetArgument:
</span><span class="cx">         case ArrayPop:
</span><span class="cx">         case ArrayPush:
</span><del>-        case ArraySlice:
</del><span class="cx">         case RegExpExec:
</span><span class="cx">         case RegExpTest:
</span><span class="cx">         case GetGlobalVar:
</span><span class="lines">@@ -1797,7 +1796,6 @@
</span><span class="cx">         case Arrayify:
</span><span class="cx">         case ArrayifyToStructure:
</span><span class="cx">         case ArrayPush:
</span><del>-        case ArraySlice:
</del><span class="cx">         case ArrayPop:
</span><span class="cx">         case HasIndexedProperty:
</span><span class="cx">             return true;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNodeType.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNodeType.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGNodeType.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -248,7 +248,6 @@
</span><span class="cx">     /* Optimizations for array mutation. */\
</span><span class="cx">     macro(ArrayPush, NodeResultJS | NodeMustGenerate) \
</span><span class="cx">     macro(ArrayPop, NodeResultJS | NodeMustGenerate) \
</span><del>-    macro(ArraySlice, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
</del><span class="cx">     \
</span><span class="cx">     /* Optimizations for regular expression matching. */\
</span><span class="cx">     macro(RegExpExec, NodeResultJS | NodeMustGenerate) \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -678,7 +678,6 @@
</span><span class="cx"> 
</span><span class="cx">         case ArrayPop:
</span><span class="cx">         case ArrayPush:
</span><del>-        case ArraySlice:
</del><span class="cx">         case RegExpExec:
</span><span class="cx">         case RegExpTest:
</span><span class="cx">         case StringReplace:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSafeToExecuteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -402,7 +402,6 @@
</span><span class="cx">     case GetArrayLength:
</span><span class="cx">     case ArrayPush:
</span><span class="cx">     case ArrayPop:
</span><del>-    case ArraySlice:
</del><span class="cx">     case StringCharAt:
</span><span class="cx">     case StringCharCodeAt:
</span><span class="cx">         return node-&gt;arrayMode().alreadyChecked(graph, node, state.forNode(node-&gt;child1()));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -7171,127 +7171,6 @@
</span><span class="cx">     int32Result(resultGPR, node);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SpeculativeJIT::compileArraySlice(Node* node)
-{
-    ASSERT(node-&gt;op() == ArraySlice);
-
-    JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node-&gt;origin.semantic);
-
-    GPRTemporary temp(this);
-    StorageOperand storage(this, node-&gt;numChildren() == 3 ? m_jit.graph().varArgChild(node, 2) : m_jit.graph().varArgChild(node, 3));
-    GPRTemporary result(this);
-    
-    GPRReg storageGPR = storage.gpr();
-    GPRReg resultGPR = result.gpr();
-    GPRReg tempGPR = temp.gpr();
-
-    IndexingType indexingType;
-    switch (node-&gt;arrayMode().type()) {
-    case Array::Int32:
-        indexingType = ArrayWithInt32;
-        break;
-    case Array::Contiguous:
-        indexingType = ArrayWithContiguous;
-        break;
-    case Array::Double:
-        indexingType = ArrayWithDouble;
-        break;
-    default:
-        RELEASE_ASSERT_NOT_REACHED();
-    }
-
-    auto populateIndex = [&amp;] (unsigned childIndex, GPRReg length, GPRReg result) {
-        SpeculateInt32Operand index(this, m_jit.graph().varArgChild(node, childIndex));
-        GPRReg indexGPR = index.gpr();
-        MacroAssembler::JumpList done;
-        auto isPositive = m_jit.branch32(MacroAssembler::GreaterThanOrEqual, indexGPR, TrustedImm32(0));
-        m_jit.move(length, result);
-        done.append(m_jit.branchAdd32(MacroAssembler::PositiveOrZero, indexGPR, result));
-        m_jit.move(TrustedImm32(0), result);
-        done.append(m_jit.jump());
-
-        isPositive.link(&amp;m_jit);
-        m_jit.move(indexGPR, result);
-        done.append(m_jit.branch32(MacroAssembler::BelowOrEqual, result, length));
-        m_jit.move(length, result);
-
-        done.link(&amp;m_jit);
-    };
-
-    {
-        GPRTemporary tempLength(this);
-        GPRReg lengthGPR = tempLength.gpr();
-        m_jit.load32(MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), lengthGPR);
-
-        if (node-&gt;numChildren() == 4)
-            populateIndex(2, lengthGPR, tempGPR);
-        else
-            m_jit.move(lengthGPR, tempGPR);
-
-        GPRTemporary tempStartIndex(this);
-        GPRReg startGPR = tempStartIndex.gpr();
-        populateIndex(1, lengthGPR, startGPR);
-
-        auto tooBig = m_jit.branch32(MacroAssembler::Above, startGPR, tempGPR);
-        m_jit.sub32(startGPR, tempGPR); // the size of the array we'll make.
-        auto done = m_jit.jump();
-
-        tooBig.link(&amp;m_jit);
-        m_jit.move(TrustedImm32(0), tempGPR);
-        done.link(&amp;m_jit);
-    }
-
-    const bool shouldConvertLargeSizeToArrayStorage = false;
-    compileAllocateNewArrayWithSize(globalObject, resultGPR, tempGPR, indexingType, shouldConvertLargeSizeToArrayStorage);
-
-    GPRTemporary temp3(this);
-    GPRTemporary temp4(this);
-    GPRReg tempValue = temp3.gpr();
-    GPRReg loadIndex = temp4.gpr();
-
-    m_jit.load32(MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), tempValue);
-    if (node-&gt;numChildren() == 4)
-        populateIndex(2, tempValue, tempGPR);
-    else
-        m_jit.move(tempValue, tempGPR);
-    populateIndex(1, tempValue, loadIndex);
-
-    GPRTemporary temp5(this);
-    GPRReg storeIndex = temp5.gpr();
-    m_jit.move(TrustedImmPtr(0), storeIndex);
-
-    GPRTemporary temp2(this);
-    GPRReg resultButterfly = temp2.gpr();
-
-    m_jit.loadPtr(MacroAssembler::Address(resultGPR, JSObject::butterflyOffset()), resultButterfly);
-    m_jit.zeroExtend32ToPtr(tempGPR, tempGPR);
-    m_jit.zeroExtend32ToPtr(loadIndex, loadIndex);
-    auto done = m_jit.branchPtr(MacroAssembler::AboveOrEqual, loadIndex, tempGPR);
-
-    auto loop = m_jit.label();
-#if USE(JSVALUE64)
-    m_jit.load64(
-        MacroAssembler::BaseIndex(storageGPR, loadIndex, MacroAssembler::TimesEight), tempValue);
-    m_jit.store64(
-        tempValue, MacroAssembler::BaseIndex(resultButterfly, storeIndex, MacroAssembler::TimesEight));
-#else
-    m_jit.load32(
-        MacroAssembler::BaseIndex(storageGPR, loadIndex, MacroAssembler::TimesEight, PayloadOffset), tempValue);
-    m_jit.store32(
-        tempValue, MacroAssembler::BaseIndex(resultButterfly, storeIndex, MacroAssembler::TimesEight, PayloadOffset));
-    m_jit.load32(
-        MacroAssembler::BaseIndex(storageGPR, loadIndex, MacroAssembler::TimesEight, TagOffset), tempValue);
-    m_jit.store32(
-        tempValue, MacroAssembler::BaseIndex(resultButterfly, storeIndex, MacroAssembler::TimesEight, TagOffset));
-#endif // USE(JSVALUE64)
-    m_jit.addPtr(TrustedImm32(1), loadIndex);
-    m_jit.addPtr(TrustedImm32(1), storeIndex);
-    m_jit.branchPtr(MacroAssembler::Below, loadIndex, tempGPR).linkTo(loop, &amp;m_jit);
-
-    done.link(&amp;m_jit);
-    cellResult(resultGPR, node);
-}
-
</del><span class="cx"> void SpeculativeJIT::compileNotifyWrite(Node* node)
</span><span class="cx"> {
</span><span class="cx">     WatchpointSet* set = node-&gt;watchpointSet();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -2680,7 +2680,6 @@
</span><span class="cx">     void compileSpread(Node*);
</span><span class="cx">     void compileNewArrayWithSpread(Node*);
</span><span class="cx">     void compileGetRestLength(Node*);
</span><del>-    void compileArraySlice(Node*);
</del><span class="cx">     void compileNotifyWrite(Node*);
</span><span class="cx">     bool compileRegExpExec(Node*);
</span><span class="cx">     void compileIsObjectOrNull(Node*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -3550,11 +3550,6 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    case ArraySlice: {
-        compileArraySlice(node);
-        break;
-    }
-
</del><span class="cx">     case DFG::Jump: {
</span><span class="cx">         jump(node-&gt;targetBlock());
</span><span class="cx">         noResult(node);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -3462,11 +3462,6 @@
</span><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><del>-
-    case ArraySlice: {
-        compileArraySlice(node);
-        break;
-    }
</del><span class="cx">         
</span><span class="cx">     case ArrayPop: {
</span><span class="cx">         ASSERT(node-&gt;arrayMode().isJSArray());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLCapabilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -282,7 +282,6 @@
</span><span class="cx">     case CheckDOM:
</span><span class="cx">     case CallDOM:
</span><span class="cx">     case CallDOMGetter:
</span><del>-    case ArraySlice:
</del><span class="cx">         // These are OK.
</span><span class="cx">         break;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLLowerDFGToB3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -706,9 +706,6 @@
</span><span class="cx">         case ArrayPop:
</span><span class="cx">             compileArrayPop();
</span><span class="cx">             break;
</span><del>-        case ArraySlice:
-            compileArraySlice();
-            break;
</del><span class="cx">         case CreateActivation:
</span><span class="cx">             compileCreateActivation();
</span><span class="cx">             break;
</span><span class="lines">@@ -3863,83 +3860,6 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-
-    void compileArraySlice()
-    {
-        JSGlobalObject* globalObject = m_graph.globalObjectFor(m_node-&gt;origin.semantic);
-
-        LValue sourceStorage = lowStorage(m_node-&gt;numChildren() == 3 ? m_graph.varArgChild(m_node, 2) : m_graph.varArgChild(m_node, 3));
-        LValue inputLength = m_out.load32(sourceStorage, m_heaps.Butterfly_publicLength);
-
-        LValue endBoundary;
-        if (m_node-&gt;numChildren() == 3)
-            endBoundary = m_out.load32(sourceStorage, m_heaps.Butterfly_publicLength);
-        else {
-            endBoundary = lowInt32(m_graph.varArgChild(m_node, 2));
-            endBoundary = m_out.select(m_out.greaterThanOrEqual(endBoundary, m_out.constInt32(0)),
-                m_out.select(m_out.above(endBoundary, inputLength), inputLength, endBoundary),
-                m_out.select(m_out.lessThan(m_out.add(inputLength, endBoundary), m_out.constInt32(0)), m_out.constInt32(0), m_out.add(inputLength, endBoundary)));
-        }
-
-        LValue startIndex = lowInt32(m_graph.varArgChild(m_node, 1));
-        startIndex = m_out.select(m_out.greaterThanOrEqual(startIndex, m_out.constInt32(0)),
-            m_out.select(m_out.above(startIndex, inputLength), inputLength, startIndex),
-            m_out.select(m_out.lessThan(m_out.add(inputLength, startIndex), m_out.constInt32(0)), m_out.constInt32(0), m_out.add(inputLength, startIndex)));
-
-        LValue resultLength = m_out.select(m_out.below(startIndex, endBoundary),
-            m_out.sub(endBoundary, startIndex),
-            m_out.constInt32(0));
-
-        IndexingType indexingType;
-        switch (m_node-&gt;arrayMode().type()) {
-        case Array::Int32:
-            indexingType = ArrayWithInt32;
-            break;
-        case Array::Contiguous:
-            indexingType = ArrayWithContiguous;
-            break;
-        case Array::Double:
-            indexingType = ArrayWithDouble;
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-        }
-
-        Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
-        auto arrayResult = allocateJSArray(resultLength, structure, false, false);
-
-        LBasicBlock loop = m_out.newBlock();
-        LBasicBlock continuation = m_out.newBlock();
-
-        resultLength = m_out.zeroExtPtr(resultLength);
-        ValueFromBlock startLoadIndex = m_out.anchor(m_out.zeroExtPtr(startIndex));
-        ValueFromBlock startStoreIndex = m_out.anchor(m_out.constIntPtr(0));
-
-        m_out.branch(
-            m_out.below(m_out.constIntPtr(0), resultLength), unsure(loop), unsure(continuation));
-
-        LBasicBlock lastNext = m_out.appendTo(loop, continuation);
-        LValue storeIndex = m_out.phi(pointerType(), startStoreIndex);
-        LValue loadIndex = m_out.phi(pointerType(), startLoadIndex);
-        IndexedAbstractHeap&amp; heap = m_heaps.forArrayType(m_node-&gt;arrayMode().type());
-        if (indexingType == ArrayWithDouble) {
-            LValue value = m_out.loadDouble(m_out.baseIndex(heap, sourceStorage, loadIndex));
-            m_out.storeDouble(value, m_out.baseIndex(heap, arrayResult.butterfly, storeIndex));
-        } else {
-            LValue value = m_out.load64(m_out.baseIndex(heap, sourceStorage, loadIndex));
-            m_out.store64(value, m_out.baseIndex(heap, arrayResult.butterfly, storeIndex));
-        }
-        LValue nextStoreIndex = m_out.add(storeIndex, m_out.constIntPtr(1));
-        m_out.addIncomingToPhi(storeIndex, m_out.anchor(nextStoreIndex));
-        m_out.addIncomingToPhi(loadIndex, m_out.anchor(m_out.add(loadIndex, m_out.constIntPtr(1))));
-        m_out.branch(
-            m_out.below(nextStoreIndex, resultLength), unsure(loop), unsure(continuation));
-
-        m_out.appendTo(continuation, lastNext);
-
-        mutatorFence();
-        setJSValue(arrayResult.array);
-    }
</del><span class="cx">     
</span><span class="cx">     void compileArrayPop()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAssemblyHelperscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -447,7 +447,6 @@
</span><span class="cx"> void AssemblyHelpers::emitLoadStructure(RegisterID source, RegisterID dest, RegisterID scratch)
</span><span class="cx"> {
</span><span class="cx"> #if USE(JSVALUE64)
</span><del>-    ASSERT(dest != scratch);
</del><span class="cx">     load32(MacroAssembler::Address(source, JSCell::structureIDOffset()), dest);
</span><span class="cx">     loadPtr(vm()-&gt;heap.structureIDTable().base(), scratch);
</span><span class="cx">     loadPtr(MacroAssembler::BaseIndex(scratch, dest, MacroAssembler::TimesEight), dest);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArrayPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;reverse&quot;, arrayProtoFuncReverse, DontEnum, 0);
</span><span class="cx">     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames-&gt;builtinNames().shiftPublicName(), arrayProtoFuncShift, DontEnum, 0);
</span><span class="cx">     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames-&gt;builtinNames().shiftPrivateName(), arrayProtoFuncShift, DontEnum | DontDelete | ReadOnly, 0);
</span><del>-    JSC_NATIVE_INTRINSIC_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames-&gt;slice, arrayProtoFuncSlice, DontEnum, 2, ArraySliceIntrinsic);
</del><ins>+    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames-&gt;slice, arrayProtoFuncSlice, DontEnum, 2);
</ins><span class="cx">     JSC_BUILTIN_FUNCTION_WITHOUT_TRANSITION(&quot;sort&quot;, arrayPrototypeSortCodeGenerator, DontEnum);
</span><span class="cx">     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;splice&quot;, arrayProtoFuncSplice, DontEnum, 2);
</span><span class="cx">     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(&quot;unshift&quot;, arrayProtoFuncUnShift, DontEnum, 1);
</span><span class="lines">@@ -191,12 +191,21 @@
</span><span class="cx">         throwTypeError(exec, scope, ASCIILiteral(ReadonlyPropertyWriteError));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool speciesWatchpointIsValid(JSObject* thisObject)
</del><ins>+inline bool speciesWatchpointsValid(ExecState* exec, JSObject* thisObject)
</ins><span class="cx"> {
</span><ins>+    VM&amp; vm = exec-&gt;vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
</ins><span class="cx">     ArrayPrototype* arrayPrototype = thisObject-&gt;globalObject()-&gt;arrayPrototype();
</span><ins>+    ArrayPrototype::SpeciesWatchpointStatus status = arrayPrototype-&gt;speciesWatchpointStatus();
+    if (UNLIKELY(status == ArrayPrototype::SpeciesWatchpointStatus::Uninitialized)) {
+        status = arrayPrototype-&gt;attemptToInitializeSpeciesWatchpoint(exec);
+        RETURN_IF_EXCEPTION(scope, false);
+    }
+    ASSERT(status != ArrayPrototype::SpeciesWatchpointStatus::Uninitialized);
</ins><span class="cx">     return !thisObject-&gt;hasCustomProperties()
</span><span class="cx">         &amp;&amp; arrayPrototype == thisObject-&gt;getPrototypeDirect()
</span><del>-        &amp;&amp; arrayPrototype-&gt;globalObject()-&gt;arraySpeciesWatchpoint().isStillValid();
</del><ins>+        &amp;&amp; status == ArrayPrototype::SpeciesWatchpointStatus::Initialized;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> enum class SpeciesConstructResult {
</span><span class="lines">@@ -221,7 +230,8 @@
</span><span class="cx">     if (LIKELY(thisIsArray)) {
</span><span class="cx">         // Fast path in the normal case where the user has not set an own constructor and the Array.prototype.constructor is normal.
</span><span class="cx">         // We need prototype check for subclasses of Array, which are Array objects but have a different prototype by default.
</span><del>-        bool isValid = speciesWatchpointIsValid(thisObject);
</del><ins>+        bool isValid = speciesWatchpointsValid(exec, thisObject);
+        RETURN_IF_EXCEPTION(scope, exceptionResult());
</ins><span class="cx">         if (LIKELY(isValid))
</span><span class="cx">             return std::make_pair(SpeciesConstructResult::FastPath, nullptr);
</span><span class="cx"> 
</span><span class="lines">@@ -910,29 +920,29 @@
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL arrayProtoFuncSlice(ExecState* exec)
</span><span class="cx"> {
</span><del>-    // https://tc39.github.io/ecma262/#sec-array.prototype.slice
</del><ins>+    // http://developer.netscape.com/docs/manuals/js/client/jsref/array.htm#1193713 or 15.4.4.10
</ins><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx">     JSObject* thisObj = exec-&gt;thisValue().toThis(exec, StrictMode).toObject(exec);
</span><span class="cx">     ASSERT(!!scope.exception() == !thisObj);
</span><span class="cx">     if (UNLIKELY(!thisObj))
</span><del>-        return { };
</del><ins>+        return encodedJSValue();
</ins><span class="cx">     unsigned length = getLength(exec, thisObj);
</span><del>-    RETURN_IF_EXCEPTION(scope, { });
</del><ins>+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx"> 
</span><span class="cx">     unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
</span><del>-    RETURN_IF_EXCEPTION(scope, { });
</del><ins>+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx">     unsigned end = argumentClampedIndexFromStartOrEnd(exec, 1, length, length);
</span><del>-    RETURN_IF_EXCEPTION(scope, { });
</del><ins>+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx"> 
</span><span class="cx">     std::pair&lt;SpeciesConstructResult, JSObject*&gt; speciesResult = speciesConstructArray(exec, thisObj, end - begin);
</span><span class="cx">     // We can only get an exception if we call some user function.
</span><span class="cx">     ASSERT(!!scope.exception() == (speciesResult.first == SpeciesConstructResult::Exception));
</span><span class="cx">     if (UNLIKELY(speciesResult.first == SpeciesConstructResult::Exception))
</span><del>-        return { };
</del><ins>+        return encodedJSValue();
</ins><span class="cx"> 
</span><span class="cx">     bool okToDoFastPath = speciesResult.first == SpeciesConstructResult::FastPath &amp;&amp; isJSArray(thisObj) &amp;&amp; length == getLength(exec, thisObj);
</span><del>-    RETURN_IF_EXCEPTION(scope, { });
</del><ins>+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx">     if (LIKELY(okToDoFastPath)) {
</span><span class="cx">         if (JSArray* result = asArray(thisObj)-&gt;fastSlice(*exec, begin, end - begin))
</span><span class="cx">             return JSValue::encode(result);
</span><span class="lines">@@ -943,16 +953,16 @@
</span><span class="cx">         result = speciesResult.second;
</span><span class="cx">     else {
</span><span class="cx">         result = constructEmptyArray(exec, nullptr, end - begin);
</span><del>-        RETURN_IF_EXCEPTION(scope, { });
</del><ins>+        RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     unsigned n = 0;
</span><span class="cx">     for (unsigned k = begin; k &lt; end; k++, n++) {
</span><span class="cx">         JSValue v = getProperty(exec, thisObj, k);
</span><del>-        RETURN_IF_EXCEPTION(scope, { });
</del><ins>+        RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx">         if (v) {
</span><span class="cx">             result-&gt;putDirectIndex(exec, n, v, 0, PutDirectIndexShouldThrow);
</span><del>-            RETURN_IF_EXCEPTION(scope, { });
</del><ins>+            RETURN_IF_EXCEPTION(scope, encodedJSValue());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     scope.release();
</span><span class="lines">@@ -1239,7 +1249,8 @@
</span><span class="cx">         return JSValue::encode(jsNull());
</span><span class="cx"> 
</span><span class="cx">     // We need to check the species constructor here since checking it in the JS wrapper is too expensive for the non-optimizing tiers.
</span><del>-    bool isValid = speciesWatchpointIsValid(firstArray);
</del><ins>+    bool isValid = speciesWatchpointsValid(exec, firstArray);
+    ASSERT(!scope.exception() || !isValid);
</ins><span class="cx">     if (UNLIKELY(!isValid))
</span><span class="cx">         return JSValue::encode(jsNull());
</span><span class="cx"> 
</span><span class="lines">@@ -1331,18 +1342,15 @@
</span><span class="cx">     ArrayPrototype* m_arrayPrototype;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-void ArrayPrototype::initializeSpeciesWatchpoint(ExecState* exec)
</del><ins>+ArrayPrototype::SpeciesWatchpointStatus ArrayPrototype::attemptToInitializeSpeciesWatchpoint(ExecState* exec)
</ins><span class="cx"> {
</span><ins>+    ASSERT(m_speciesWatchpointStatus == SpeciesWatchpointStatus::Uninitialized);
+
</ins><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><del>-
-    RELEASE_ASSERT(!m_constructorWatchpoint);
-    RELEASE_ASSERT(!m_constructorSpeciesWatchpoint);
-
</del><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><del>-    UNUSED_PARAM(scope);
</del><span class="cx"> 
</span><span class="cx">     if (verbose)
</span><del>-        dataLog(&quot;Initializing Array species watchpoints for Array.prototype: &quot;, pointerDump(this), &quot; with structure: &quot;, pointerDump(this-&gt;structure()), &quot;\nand Array: &quot;, pointerDump(this-&gt;globalObject()-&gt;arrayConstructor()), &quot; with structure: &quot;, pointerDump(this-&gt;globalObject()-&gt;arrayConstructor()-&gt;structure()), &quot;\n&quot;);
</del><ins>+        dataLog(&quot;Attempting to initialize Array species watchpoints for Array.prototype: &quot;, pointerDump(this), &quot; with structure: &quot;, pointerDump(this-&gt;structure()), &quot;\nand Array: &quot;, pointerDump(this-&gt;globalObject()-&gt;arrayConstructor()), &quot; with structure: &quot;, pointerDump(this-&gt;globalObject()-&gt;arrayConstructor()-&gt;structure()), &quot;\n&quot;);
</ins><span class="cx">     // First we need to make sure that the Array.prototype.constructor property points to Array
</span><span class="cx">     // and that Array[Symbol.species] is the primordial GetterSetter.
</span><span class="cx"> 
</span><span class="lines">@@ -1356,11 +1364,12 @@
</span><span class="cx">     ArrayConstructor* arrayConstructor = globalObject-&gt;arrayConstructor();
</span><span class="cx"> 
</span><span class="cx">     PropertySlot constructorSlot(this, PropertySlot::InternalMethodType::VMInquiry);
</span><del>-    this-&gt;getOwnPropertySlot(this, exec, vm.propertyNames-&gt;constructor, constructorSlot);
-    ASSERT(!scope.exception());
-    ASSERT(constructorSlot.slotBase() == this);
-    ASSERT(constructorSlot.isCacheableValue());
-    RELEASE_ASSERT(constructorSlot.getValue(exec, vm.propertyNames-&gt;constructor) == arrayConstructor);
</del><ins>+    JSValue(this).get(exec, vm.propertyNames-&gt;constructor, constructorSlot);
+    if (UNLIKELY(scope.exception())
+        || constructorSlot.slotBase() != this
+        || !constructorSlot.isCacheableValue()
+        || constructorSlot.getValue(exec, vm.propertyNames-&gt;constructor) != arrayConstructor)
+        return m_speciesWatchpointStatus = SpeciesWatchpointStatus::Fired;
</ins><span class="cx"> 
</span><span class="cx">     Structure* constructorStructure = arrayConstructor-&gt;structure(vm);
</span><span class="cx">     if (constructorStructure-&gt;isDictionary())
</span><span class="lines">@@ -1367,11 +1376,12 @@
</span><span class="cx">         constructorStructure = constructorStructure-&gt;flattenDictionaryStructure(vm, arrayConstructor);
</span><span class="cx"> 
</span><span class="cx">     PropertySlot speciesSlot(arrayConstructor, PropertySlot::InternalMethodType::VMInquiry);
</span><del>-    arrayConstructor-&gt;getOwnPropertySlot(arrayConstructor, exec, vm.propertyNames-&gt;speciesSymbol, speciesSlot);
-    ASSERT(!scope.exception());
-    ASSERT(speciesSlot.slotBase() == arrayConstructor);
-    ASSERT(speciesSlot.isCacheableGetter());
-    RELEASE_ASSERT(speciesSlot.getterSetter() == globalObject-&gt;speciesGetterSetter());
</del><ins>+    JSValue(arrayConstructor).get(exec, vm.propertyNames-&gt;speciesSymbol, speciesSlot);
+    if (UNLIKELY(scope.exception())
+        || speciesSlot.slotBase() != arrayConstructor
+        || !speciesSlot.isCacheableGetter()
+        || speciesSlot.getterSetter() != globalObject-&gt;speciesGetterSetter())
+        return m_speciesWatchpointStatus = SpeciesWatchpointStatus::Fired;
</ins><span class="cx"> 
</span><span class="cx">     // Now we need to setup the watchpoints to make sure these conditions remain valid.
</span><span class="cx">     prototypeStructure-&gt;startWatchingPropertyForReplacements(vm, constructorSlot.cachedOffset());
</span><span class="lines">@@ -1380,8 +1390,8 @@
</span><span class="cx">     ObjectPropertyCondition constructorCondition = ObjectPropertyCondition::equivalence(vm, this, this, vm.propertyNames-&gt;constructor.impl(), arrayConstructor);
</span><span class="cx">     ObjectPropertyCondition speciesCondition = ObjectPropertyCondition::equivalence(vm, this, arrayConstructor, vm.propertyNames-&gt;speciesSymbol.impl(), globalObject-&gt;speciesGetterSetter());
</span><span class="cx"> 
</span><del>-    RELEASE_ASSERT(constructorCondition.isWatchable());
-    RELEASE_ASSERT(speciesCondition.isWatchable());
</del><ins>+    if (!constructorCondition.isWatchable() || !speciesCondition.isWatchable())
+        return m_speciesWatchpointStatus = SpeciesWatchpointStatus::Fired;
</ins><span class="cx"> 
</span><span class="cx">     m_constructorWatchpoint = std::make_unique&lt;ArrayPrototypeAdaptiveInferredPropertyWatchpoint&gt;(constructorCondition, this);
</span><span class="cx">     m_constructorWatchpoint-&gt;install();
</span><span class="lines">@@ -1388,6 +1398,8 @@
</span><span class="cx"> 
</span><span class="cx">     m_constructorSpeciesWatchpoint = std::make_unique&lt;ArrayPrototypeAdaptiveInferredPropertyWatchpoint&gt;(speciesCondition, this);
</span><span class="cx">     m_constructorSpeciesWatchpoint-&gt;install();
</span><ins>+
+    return m_speciesWatchpointStatus = SpeciesWatchpointStatus::Initialized;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ArrayPrototypeAdaptiveInferredPropertyWatchpoint::ArrayPrototypeAdaptiveInferredPropertyWatchpoint(const ObjectPropertyCondition&amp; key, ArrayPrototype* prototype)
</span><span class="lines">@@ -1406,8 +1418,7 @@
</span><span class="cx">     if (verbose)
</span><span class="cx">         WTF::dataLog(stringDetail, &quot;\n&quot;);
</span><span class="cx"> 
</span><del>-    JSGlobalObject* globalObject = m_arrayPrototype-&gt;globalObject();
-    globalObject-&gt;arraySpeciesWatchpoint().fireAll(globalObject-&gt;vm(), stringDetail);
</del><ins>+    m_arrayPrototype-&gt;m_speciesWatchpointStatus = ArrayPrototype::SpeciesWatchpointStatus::Fired;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArrayPrototypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ArrayPrototype.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ArrayPrototype.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/runtime/ArrayPrototype.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -49,7 +49,8 @@
</span><span class="cx">         return Structure::create(vm, globalObject, prototype, TypeInfo(DerivedArrayType, StructureFlags), info(), ArrayClass);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void initializeSpeciesWatchpoint(ExecState*);
</del><ins>+    SpeciesWatchpointStatus speciesWatchpointStatus() const { return m_speciesWatchpointStatus; }
+    SpeciesWatchpointStatus attemptToInitializeSpeciesWatchpoint(ExecState*);
</ins><span class="cx"> 
</span><span class="cx">     static const bool needsDestruction = false;
</span><span class="cx">     // We don't need destruction since we use a finalizer.
</span><span class="lines">@@ -63,6 +64,7 @@
</span><span class="cx">     friend ArrayPrototypeAdaptiveInferredPropertyWatchpoint;
</span><span class="cx">     std::unique_ptr&lt;ArrayPrototypeAdaptiveInferredPropertyWatchpoint&gt; m_constructorWatchpoint;
</span><span class="cx">     std::unique_ptr&lt;ArrayPrototypeAdaptiveInferredPropertyWatchpoint&gt; m_constructorSpeciesWatchpoint;
</span><ins>+    SpeciesWatchpointStatus m_speciesWatchpointStatus { SpeciesWatchpointStatus::Uninitialized };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL arrayProtoFuncToString(ExecState*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeIntrinsich"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Intrinsic.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Intrinsic.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/runtime/Intrinsic.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -40,7 +40,6 @@
</span><span class="cx">     TanIntrinsic,
</span><span class="cx">     ArrayPushIntrinsic,
</span><span class="cx">     ArrayPopIntrinsic,
</span><del>-    ArraySliceIntrinsic,
</del><span class="cx">     CharCodeAtIntrinsic,
</span><span class="cx">     CharAtIntrinsic,
</span><span class="cx">     FromCharCodeIntrinsic,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -332,7 +332,6 @@
</span><span class="cx">     , m_varInjectionWatchpoint(adoptRef(new WatchpointSet(IsWatched)))
</span><span class="cx">     , m_weakRandom(Options::forceWeakRandomSeed() ? Options::forcedWeakRandomSeed() : static_cast&lt;unsigned&gt;(randomNumber() * (std::numeric_limits&lt;unsigned&gt;::max() + 1.0)))
</span><span class="cx">     , m_arrayIteratorProtocolWatchpoint(IsWatched)
</span><del>-    , m_arraySpeciesWatchpoint(IsWatched)
</del><span class="cx">     , m_templateRegistry(vm)
</span><span class="cx">     , m_evalEnabled(true)
</span><span class="cx">     , m_runtimeFlags()
</span><span class="lines">@@ -945,8 +944,6 @@
</span><span class="cx">             m_arrayPrototypeSymbolIteratorWatchpoint = std::make_unique&lt;ArrayIteratorAdaptiveWatchpoint&gt;(condition, this);
</span><span class="cx">             m_arrayPrototypeSymbolIteratorWatchpoint-&gt;install();
</span><span class="cx">         }
</span><del>-
-        this-&gt;arrayPrototype()-&gt;initializeSpeciesWatchpoint(exec);
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     resetPrototype(vm, getPrototypeDirect());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h (210517 => 210518)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2017-01-09 19:34:48 UTC (rev 210517)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2017-01-09 21:09:04 UTC (rev 210518)
</span><span class="lines">@@ -399,11 +399,9 @@
</span><span class="cx">     WeakRandom m_weakRandom;
</span><span class="cx"> 
</span><span class="cx">     InlineWatchpointSet&amp; arrayIteratorProtocolWatchpoint() { return m_arrayIteratorProtocolWatchpoint; }
</span><del>-    InlineWatchpointSet&amp; arraySpeciesWatchpoint() { return m_arraySpeciesWatchpoint; }
</del><span class="cx">     // If this hasn't been invalidated, it means the array iterator protocol
</span><span class="cx">     // is not observable to user code yet.
</span><span class="cx">     InlineWatchpointSet m_arrayIteratorProtocolWatchpoint;
</span><del>-    InlineWatchpointSet m_arraySpeciesWatchpoint;
</del><span class="cx">     std::unique_ptr&lt;ArrayIteratorAdaptiveWatchpoint&gt; m_arrayPrototypeSymbolIteratorWatchpoint;
</span><span class="cx">     std::unique_ptr&lt;ArrayIteratorAdaptiveWatchpoint&gt; m_arrayIteratorPrototypeNext;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>