<!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>[205023] 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/205023">205023</a></dd>
<dt>Author</dt> <dd>keith_miller@apple.com</dd>
<dt>Date</dt> <dd>2016-08-26 10:05:21 -0700 (Fri, 26 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>toString called on proxies returns incorrect tag
https://bugs.webkit.org/show_bug.cgi?id=161111

Reviewed by Benjamin Poulain.

This patch adds a new Method table function toStringName. This function
is used by Object.prototype.toString to create the string tag that it
inserts. Right now it only changes the stringification of proxy objects.
In future patches I plan to make it work for other classes of objects as
well.

* runtime/ClassInfo.h:
* runtime/JSCell.cpp:
(JSC::JSCell::toStringName):
* runtime/JSCell.h:
* runtime/JSObject.cpp:
(JSC::JSObject::toStringName):
* runtime/JSObject.h:
* runtime/ObjectPrototype.cpp:
(JSC::objectProtoFuncToString):
* runtime/ProxyObject.cpp:
(JSC::ProxyObject::toStringName):
* runtime/ProxyObject.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTeststest262yaml">trunk/JSTests/test262.yaml</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeClassInfoh">trunk/Source/JavaScriptCore/runtime/ClassInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellcpp">trunk/Source/JavaScriptCore/runtime/JSCell.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellh">trunk/Source/JavaScriptCore/runtime/JSCell.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjectcpp">trunk/Source/JavaScriptCore/runtime/JSObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjecth">trunk/Source/JavaScriptCore/runtime/JSObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeObjectPrototypecpp">trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeProxyObjectcpp">trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeProxyObjecth">trunk/Source/JavaScriptCore/runtime/ProxyObject.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTeststest262yaml"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/test262.yaml (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/test262.yaml        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/JSTests/test262.yaml        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -19480,9 +19480,9 @@
</span><span class="cx"> - path: test262/test/built-ins/JSON/stringify/value-proxy-revoked.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/built-ins/JSON/stringify/value-proxy.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/built-ins/JSON/stringify/value-proxy.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/built-ins/Map/Symbol.species/length.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;, &quot;../../../../harness/propertyHelper.js&quot;], []
</span><span class="cx"> - path: test262/test/built-ins/Map/Symbol.species/length.js
</span><span class="lines">@@ -22974,9 +22974,9 @@
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-139.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-14.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-14.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-140.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-140.js
</span><span class="lines">@@ -23746,9 +23746,9 @@
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-36.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-37.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-37.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-38.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../harness/assert.js&quot;, &quot;../../../../harness/sta.js&quot;], []
</span><span class="cx"> - path: test262/test/built-ins/Object/create/15.2.3.5-4-38.js
</span><span class="lines">@@ -34330,9 +34330,9 @@
</span><span class="cx"> - path: test262/test/built-ins/Object/prototype/toString/proxy-revoked.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/built-ins/Object/prototype/toString/proxy.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/built-ins/Object/prototype/toString/proxy.js
</span><del>-  cmd: runTest262 :fail, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;NoException&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</span><span class="cx"> - path: test262/test/built-ins/Object/prototype/toString/symbol-tag-non-str.js
</span><span class="lines">@@ -73106,13 +73106,13 @@
</span><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-arguments-in-formal-parameters.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</span><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-await-in-formals-default.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-await-in-formals-default.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-await-in-formals.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</ins><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-await-in-formals.js
</span><del>-  cmd: runTest262 :fail, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</del><ins>+  cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], [:strict]
</ins><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-body-contains-super-call.js
</span><span class="cx">   cmd: runTest262 :normal, &quot;SyntaxError&quot;, [&quot;../../../../../harness/assert.js&quot;, &quot;../../../../../harness/sta.js&quot;], []
</span><span class="cx"> - path: test262/test/language/statements/class/definition/early-errors-class-method-body-contains-super-call.js
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2016-08-25  Keith Miller  &lt;keith_miller@apple.com&gt;
+
+        toString called on proxies returns incorrect tag
+        https://bugs.webkit.org/show_bug.cgi?id=161111
+
+        Reviewed by Benjamin Poulain.
+
+        This patch adds a new Method table function toStringName. This function
+        is used by Object.prototype.toString to create the string tag that it
+        inserts. Right now it only changes the stringification of proxy objects.
+        In future patches I plan to make it work for other classes of objects as
+        well.
+
+        * runtime/ClassInfo.h:
+        * runtime/JSCell.cpp:
+        (JSC::JSCell::toStringName):
+        * runtime/JSCell.h:
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::toStringName):
+        * runtime/JSObject.h:
+        * runtime/ObjectPrototype.cpp:
+        (JSC::objectProtoFuncToString):
+        * runtime/ProxyObject.cpp:
+        (JSC::ProxyObject::toStringName):
+        * runtime/ProxyObject.h:
+
</ins><span class="cx"> 2016-08-26  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the ENABLE(WEBASSEMBLY) build on Linux
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeClassInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ClassInfo.h (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -91,6 +91,7 @@
</span><span class="cx"> 
</span><span class="cx">     typedef String (*ClassNameFunctionPtr)(const JSObject*);
</span><span class="cx">     ClassNameFunctionPtr className;
</span><ins>+    ClassNameFunctionPtr toStringName;
</ins><span class="cx"> 
</span><span class="cx">     typedef bool (*CustomHasInstanceFunctionPtr)(JSObject*, ExecState*, JSValue);
</span><span class="cx">     CustomHasInstanceFunctionPtr customHasInstance;
</span><span class="lines">@@ -166,6 +167,7 @@
</span><span class="cx">         &amp;ClassName::getStructurePropertyNames, \
</span><span class="cx">         &amp;ClassName::getGenericPropertyNames, \
</span><span class="cx">         &amp;ClassName::className, \
</span><ins>+        &amp;ClassName::toStringName, \
</ins><span class="cx">         &amp;ClassName::customHasInstance, \
</span><span class="cx">         &amp;ClassName::defineOwnProperty, \
</span><span class="cx">         &amp;ClassName::slowDownAndWasteMemory, \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.cpp (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.cpp        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.cpp        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -222,6 +222,12 @@
</span><span class="cx">     return String();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String JSCell::toStringName(const JSObject*)
+{
+    RELEASE_ASSERT_NOT_REACHED();
+    return String();
+}
+
</ins><span class="cx"> const char* JSCell::className() const
</span><span class="cx"> {
</span><span class="cx">     return classInfo()-&gt;className;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -212,6 +212,7 @@
</span><span class="cx">     static NO_RETURN_DUE_TO_CRASH JSValue getPrototype(JSObject*, ExecState*);
</span><span class="cx"> 
</span><span class="cx">     static String className(const JSObject*);
</span><ins>+    static String toStringName(const JSObject*);
</ins><span class="cx">     JS_EXPORT_PRIVATE static bool customHasInstance(JSObject*, ExecState*, JSValue);
</span><span class="cx">     static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&amp;, bool shouldThrow);
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.cpp (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -308,6 +308,13 @@
</span><span class="cx">     return info-&gt;className;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String JSObject::toStringName(const JSObject* object)
+{
+    const ClassInfo* info = object-&gt;classInfo();
+    ASSERT(info);
+    return info-&gt;methodTable.className(object);
+}
+
</ins><span class="cx"> String JSObject::calculatedClassName(JSObject* object)
</span><span class="cx"> {
</span><span class="cx">     String prototypeFunctionName;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.h (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.h        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.h        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -109,6 +109,12 @@
</span><span class="cx">     JS_EXPORT_PRIVATE static String className(const JSObject*);
</span><span class="cx">     JS_EXPORT_PRIVATE static String calculatedClassName(JSObject*);
</span><span class="cx"> 
</span><ins>+    // This function is what Object.prototype.toString() will use to get the name of
+    // an object when using Symbol.toStringTag fails. For the most part there is no
+    // difference between this and className(). The main use case is for new JS language
+    // objects to set the default tag to &quot;Object&quot;.
+    JS_EXPORT_PRIVATE static String toStringName(const JSObject*);
+
</ins><span class="cx">     // This is the fully virtual [[GetPrototypeOf]] internal function defined
</span><span class="cx">     // in the ECMAScript 6 specification. Use this when doing a [[GetPrototypeOf]] 
</span><span class="cx">     // operation as dictated in the specification.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeObjectPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/ObjectPrototype.cpp        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -298,7 +298,7 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        String newString = WTF::tryMakeString(&quot;[object &quot;, thisObject-&gt;methodTable(exec-&gt;vm())-&gt;className(thisObject), &quot;]&quot;);
</del><ins>+        String newString = WTF::tryMakeString(&quot;[object &quot;, thisObject-&gt;methodTable(exec-&gt;vm())-&gt;toStringName(thisObject), &quot;]&quot;);
</ins><span class="cx">         if (!newString)
</span><span class="cx">             return throwOutOfMemoryError(exec);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeProxyObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -49,6 +49,14 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String ProxyObject::toStringName(const JSObject* object)
+{
+    const JSObject* target = jsCast&lt;const ProxyObject*&gt;(object)-&gt;target();
+    if (isJSArray(target))
+        return target-&gt;classInfo()-&gt;methodTable.className(target);
+    return ASCIILiteral(&quot;Object&quot;);
+}
+
</ins><span class="cx"> Structure* ProxyObject::structureForTarget(JSGlobalObject* globalObject, JSValue target)
</span><span class="cx"> {
</span><span class="cx">     if (!target.isObject())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeProxyObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ProxyObject.h (205022 => 205023)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ProxyObject.h        2016-08-26 17:02:37 UTC (rev 205022)
+++ trunk/Source/JavaScriptCore/runtime/ProxyObject.h        2016-08-26 17:05:21 UTC (rev 205023)
</span><span class="lines">@@ -75,6 +75,7 @@
</span><span class="cx">     void finishCreation(VM&amp;, ExecState*, JSValue target, JSValue handler);
</span><span class="cx">     static Structure* structureForTarget(JSGlobalObject*, JSValue target);
</span><span class="cx"> 
</span><ins>+    static String toStringName(const JSObject*);
</ins><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx">     static bool getOwnPropertySlotByIndex(JSObject*, ExecState*, unsigned propertyName, PropertySlot&amp;);
</span><span class="cx">     static CallType getCallData(JSCell*, CallData&amp;);
</span></span></pre>
</div>
</div>

</body>
</html>