The language I used was a bit confusing with regards to the baseline and what does what. In more direct, less spec-like language:<div><br></div><div>* <a href="http://Function.prototype.name">Function.prototype.name</a> is frozen and set to the empty string.</div>
<div>* named functions of any kind are also frozen and set to the name (how it currently works in browsers that support name)</div><div>* class constructors maintain how they would work when desugared to a function, so represent the class for naming</div>
<div>* In unnamed functions (arrow + anonymous), if there is a statically defined name that is appropriate to use then it is set as the name, but remains writable since the code author never explicitly set the name.</div>
<div><br></div><div>Another place where a name could be used is in assignment to member expressions where the property name is an identifier.</div><div><br></div><div>The following is all the places that should be covered and result in writable named functions:</div>
<div><br></div><div>var declFunc = function(){}</div><div>var declArrow = () => {}</div><div>var declClass = class {}</div><div><br></div><div>var obj = {</div><div>  propFunc: function(){},</div><div>  popArrow: () => {},</div>
<div>  propClass: class {}</div><div>}</div><div><br></div><div>object.memberFunc = function(){}</div><div>object.memberArrow = () => {}</div><div>object.memberClass = class {}</div><div><br></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Nov 16, 2012 at 10:31 AM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.org" target="_blank">brendan@mozilla.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">Brandon Benvie wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This is based on <a href="http://wiki.ecmascript.org/doku.php?id=strawman:name_property_of_functions" target="_blank">http://wiki.ecmascript.org/<u></u>doku.php?id=strawman:name_<u></u>property_of_functions</a><br>
<br>
Justification: the usefulness of the name of function is not just for debugging. It is useful in the same ways that property names as strings are such as dispatching by name or assigning by name.<br>
<br>
The goals expand a bit beyond the ones in the strawman, and are also updated based on the current state of affairs. The first goal is that every function has an own "name" property, and this property is always a string (unless the user specifically decides to violate this norm), and that this name property is initialized with the value that makes sense from static semantics.The third goal is to allow predefined names to be altered in cases where it makes sense.<br>

</blockquote>
<br></div>
The third goal needs more discussion. The displayName property consulted by certain devtools (WebKit JS profiler, IIRC; others by now) was added to avoid non-writable .name. With downrev browsers in the field, how can we make name writable and let it be used cross-browser that way?<div class="im">
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Semantics:<br>
<br>
The baseline for every function is the 'name' property defined as<br>
{ value: "",<br>
  writable: true,<br>
  enumerable: false,<br>
  configurable: false }.<br>
</blockquote>
<br></div>
SpiderMonkey's .name property of functions is like this except for writable: false.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
For FunctionDeclarations, named FunctionExpressions, MethodDefinitions, or accessor Properties then the function's "name" property is set to the given identifier.<br>
</blockquote>
<br></div>
Nit: don't define a baseline and then mutate it. Better to have the write immutable pd from the get-go, for each case.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
In the case of the constructor method of classes, the class name is used instead. In the case of accessors, 'get ' or 'set ' is included.<br>
</blockquote>
<br></div>
at the front, to be super-clear ;-).<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The "name" property is set to non-writable. Function.prototype's name is also non-writable.<br>
</blockquote>
<br></div>
Oh, I see now: you made .name writable only as a spec-internal thing. But wait, what about your goal 3?<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Anonymous FunctionExpressions and ArrowFunctionExpressions assigned in a VariableDeclaration or ObjectExpression<br>
</blockquote>
<br></div>
"defined in an ObjectLiteral", rather.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
are given the name of the variable or property they are assigned to and the name remains writable. Anonymous ClassExpressions follow the same semantics, with the name being used for the constructor method.<br>
</blockquote>
<br></div>
Really great stuff here, this makes me want to back your proposal. Just need to hash out the nits and points of confusion (possibly mine).<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Whenever a function's name is defined by a Symbol instead of a regular identifier then the name is the result of ToString(symbol).<br>
</blockquote>
<br></div>
Symbols don't have useful ToString conversions, do they? Are you thinking of the optional string passed to the constructor, for diagnostics and debugging?<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The name property should (probably) not have any reflection on the output of Function.prototype.toString.<br>
</blockquote>
<br></div>
You mean if <a href="http://f.name" target="_blank">f.name</a> is writable then f.toString() should not reflect updates to <a href="http://f.name" target="_blank">f.name</a>? Agreed, but why is <a href="http://f.name" target="_blank">f.name</a> writable?<span class="HOEnZb"><font color="#888888"><br>

<br>
/be<br>
</font></span></blockquote></div><br></div>