<!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>[189341] 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/189341">189341</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-09-03 23:58:40 -0700 (Thu, 03 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[ES6] Implement ES6 arrow function syntax. Prototype of arrow function should be undefined
https://bugs.webkit.org/show_bug.cgi?id=147742

Source/JavaScriptCore:

Patch by Aleksandr Skachkov &lt;gskachkov@gmail.com&gt; on 2015-09-03
Reviewed by Saam Barati.

Added correct support of prototype property for arrow function. Arrow function
doesn’t have own prototype property, so (() =&gt; {}).hasOwnProperty('prototype') === false.
Changes prevent from creation of 'prototype' property automatically during initialization
of arrow function and allow to assign &amp; delete it later in js code.

* runtime/JSFunction.cpp:
(JSC::JSFunction::getOwnPropertySlot):
(JSC::JSFunction::deleteProperty):
* tests/stress/arrowfunction-prototype.js: Added.

LayoutTests:

Patch by Aleksandr Skachkov &lt;gskachkov@gmail.com&gt; on 2015-09-04
Reviewed by Saam Barati.

Added tests of prototype property for arrow function. Checks that arrow function does not have
prototype property after creating of it and check if it is possible to add/remove it later.

* js/arrowfunction-prototype-expected.txt: Added.
* js/arrowfunction-prototype.html: Added.
* js/script-tests/arrowfunction-prototype.js: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSFunctioncpp">trunk/Source/JavaScriptCore/runtime/JSFunction.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsjsarrowfunctionprototypeexpectedtxt">trunk/LayoutTests/js/arrowfunction-prototype-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsarrowfunctionprototypehtml">trunk/LayoutTests/js/arrowfunction-prototype.html</a></li>
<li><a href="#trunkLayoutTestsjsscripttestsarrowfunctionprototypejs">trunk/LayoutTests/js/script-tests/arrowfunction-prototype.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressarrowfunctionprototypejs">trunk/Source/JavaScriptCore/tests/stress/arrowfunction-prototype.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (189340 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-09-04 04:54:09 UTC (rev 189340)
+++ trunk/LayoutTests/ChangeLog        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-09-04  Aleksandr Skachkov  &lt;gskachkov@gmail.com&gt;
+
+        [ES6] Implement ES6 arrow function syntax. Prototype of arrow function should be undefined
+        https://bugs.webkit.org/show_bug.cgi?id=147742
+
+        Reviewed by Saam Barati.
+
+        Added tests of prototype property for arrow function. Checks that arrow function does not have 
+        prototype property after creating of it and check if it is possible to add/remove it later.
+
+        * js/arrowfunction-prototype-expected.txt: Added.
+        * js/arrowfunction-prototype.html: Added.
+        * js/script-tests/arrowfunction-prototype.js: Added.
+
</ins><span class="cx"> 2015-09-03  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rebaseline http/tests/w3c/html/dom/dynamic-markup-insertion/opening-the-input-stream/007.html
</span></span></pre></div>
<a id="trunkLayoutTestsjsarrowfunctionprototypeexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/arrowfunction-prototype-expected.txt (0 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/arrowfunction-prototype-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/arrowfunction-prototype-expected.txt        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+Tests for ES6 arrow function prototype property
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+() =&gt;  {}
+PASS typeof af1.prototype is 'undefined'
+PASS af1.hasOwnProperty('prototype') is false
+(a) =&gt; {a + 1}
+PASS typeof af2.prototype is 'undefined'
+PASS af2.hasOwnProperty('prototype') is false
+(x) =&gt;  x + 1
+PASS typeof af3.prototype is 'undefined'
+PASS af3.hasOwnProperty('prototype') is false
+af1.prototype = function (x) { return x + 1;}
+PASS typeof af1.prototype is 'function'
+PASS af1.prototype.toString() is 'function (x) { return x + 1;}'
+PASS af1.hasOwnProperty('prototype') is true
+delete af1.prototype
+PASS typeof af1.prototype is 'undefined'
+PASS af1.hasOwnProperty('prototype') is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsarrowfunctionprototypehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/arrowfunction-prototype.html (0 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/arrowfunction-prototype.html                                (rev 0)
+++ trunk/LayoutTests/js/arrowfunction-prototype.html        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;script-tests/arrowfunction-prototype.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsscripttestsarrowfunctionprototypejs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/script-tests/arrowfunction-prototype.js (0 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/script-tests/arrowfunction-prototype.js                                (rev 0)
+++ trunk/LayoutTests/js/script-tests/arrowfunction-prototype.js        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+// Inspired by mozilla tests
+description('Tests for ES6 arrow function prototype property');
+
+var af1 = () =&gt;  {};
+
+debug('() =&gt;  {}');
+shouldBe(&quot;typeof af1.prototype&quot;, &quot;'undefined'&quot;);
+shouldBe(&quot;af1.hasOwnProperty('prototype')&quot;, &quot;false&quot;);
+
+var af2 = (a) =&gt; {a + 1};
+
+debug('(a) =&gt; {a + 1}');
+shouldBe(&quot;typeof af2.prototype&quot;, &quot;'undefined'&quot;);
+shouldBe(&quot;af2.hasOwnProperty('prototype')&quot;, &quot;false&quot;);
+
+var af3 = (x) =&gt;  x + 1;
+
+debug('(x) =&gt;  x + 1');
+shouldBe(&quot;typeof af3.prototype&quot;, &quot;'undefined'&quot;);
+shouldBe(&quot;af3.hasOwnProperty('prototype')&quot;, &quot;false&quot;);
+
+
+af1.prototype = function (x) { return x + 1;};
+
+debug('af1.prototype = function (x) { return x + 1;}');
+shouldBe(&quot;typeof af1.prototype&quot;, &quot;'function'&quot;);
+shouldBe(&quot;af1.prototype.toString()&quot;, &quot;'function (x) { return x + 1;}'&quot;);
+shouldBe(&quot;af1.hasOwnProperty('prototype')&quot;, &quot;true&quot;);
+
+delete af1.prototype;
+
+debug('delete af1.prototype');
+shouldBe(&quot;typeof af1.prototype&quot;, &quot;'undefined'&quot;);
+shouldBe(&quot;af1.hasOwnProperty('prototype')&quot;, &quot;false&quot;);
+
+var successfullyParsed = true;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (189340 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-09-04 04:54:09 UTC (rev 189340)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-09-03 Aleksandr Skachkov   &lt;gskachkov@gmail.com&gt;
+
+        [ES6] Implement ES6 arrow function syntax. Prototype of arrow function should be undefined
+        https://bugs.webkit.org/show_bug.cgi?id=147742
+
+        Reviewed by Saam Barati.
+
+        Added correct support of prototype property for arrow function. Arrow function 
+        doesn’t have own prototype property, so (() =&gt; {}).hasOwnProperty('prototype') === false.
+        Changes prevent from creation of 'prototype' property automatically during initialization 
+        of arrow function and allow to assign &amp; delete it later in js code. 
+
+
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::getOwnPropertySlot):
+        (JSC::JSFunction::deleteProperty):
+        * tests/stress/arrowfunction-prototype.js: Added.
+
</ins><span class="cx"> 2015-09-03  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r189338.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSFunctioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSFunction.cpp (189340 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSFunction.cpp        2015-09-04 04:54:09 UTC (rev 189340)
+++ trunk/Source/JavaScriptCore/runtime/JSFunction.cpp        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -343,7 +343,7 @@
</span><span class="cx">     if (thisObject-&gt;isHostOrBuiltinFunction())
</span><span class="cx">         return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().prototype) {
</del><ins>+    if (propertyName == exec-&gt;propertyNames().prototype &amp;&amp; !thisObject-&gt;jsExecutable()-&gt;isArrowFunction()) {
</ins><span class="cx">         VM&amp; vm = exec-&gt;vm();
</span><span class="cx">         unsigned attributes;
</span><span class="cx">         PropertyOffset offset = thisObject-&gt;getDirectOffset(vm, propertyName, attributes);
</span><span class="lines">@@ -454,13 +454,16 @@
</span><span class="cx"> {
</span><span class="cx">     JSFunction* thisObject = jsCast&lt;JSFunction*&gt;(cell);
</span><span class="cx">     // For non-host functions, don't let these properties by deleted - except by DefineOwnProperty.
</span><del>-    if (!thisObject-&gt;isHostOrBuiltinFunction() &amp;&amp; !exec-&gt;vm().isInDefineOwnProperty()
-        &amp;&amp; (propertyName == exec-&gt;propertyNames().arguments
</del><ins>+    if (!thisObject-&gt;isHostOrBuiltinFunction() &amp;&amp; !exec-&gt;vm().isInDefineOwnProperty()) {
+        FunctionExecutable* executable = thisObject-&gt;jsExecutable();
+        if (propertyName == exec-&gt;propertyNames().arguments
</ins><span class="cx">             || propertyName == exec-&gt;propertyNames().length
</span><span class="cx">             || propertyName == exec-&gt;propertyNames().name
</span><del>-            || propertyName == exec-&gt;propertyNames().prototype
-            || propertyName == exec-&gt;propertyNames().caller))
</del><ins>+            || (propertyName == exec-&gt;propertyNames().prototype &amp;&amp; !executable-&gt;isArrowFunction())
+            || propertyName == exec-&gt;propertyNames().caller)
</ins><span class="cx">         return false;
</span><ins>+    }
+    
</ins><span class="cx">     return Base::deleteProperty(thisObject, exec, propertyName);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressarrowfunctionprototypejs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/arrowfunction-prototype.js (0 => 189341)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/arrowfunction-prototype.js                                (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/arrowfunction-prototype.js        2015-09-04 06:58:40 UTC (rev 189341)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+var testCase = function (actual, expected, message) {
+  if (actual !== expected) {
+    throw message + &quot;. Expected '&quot; + expected + &quot;', but was '&quot; + actual + &quot;'&quot;;
+  }
+};
+
+var af1 = () =&gt;  {};
+var af2 = (a) =&gt; {a + 1};
+var af3 = (x) =&gt;  x + 1;
+
+noInline(af1);
+noInline(af2);
+noInline(af3);
+
+for (var i = 0; i &lt; 10000; ++i) {
+  testCase(typeof af1.prototype, 'undefined', &quot;Error: Not correct result for prototype of arrow function #1&quot;);
+  testCase(typeof af2.prototype, 'undefined', &quot;Error: Not correct result for prototype of arrow function #2&quot;);
+  testCase(typeof af3.prototype, 'undefined', &quot;Error: Not correct result for prototype of arrow function #5&quot;);
+  testCase(af1.hasOwnProperty(&quot;prototype&quot;), false, &quot;Error: Not correct result for prototype of arrow function #3&quot;);
+  testCase(af2.hasOwnProperty(&quot;prototype&quot;), false, &quot;Error: Not correct result for prototype of arrow function #4&quot;);
+  testCase(af3.hasOwnProperty(&quot;prototype&quot;), false, &quot;Error: Not correct result for prototype of arrow function #6&quot;);
+}
</ins></span></pre>
</div>
</div>

</body>
</html>