<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Aug 29, 2011, at 7:43 AM, Tom Van Cutsem wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">(changed subject to fork off discussion on function proxies)<br><br><div class="gmail_quote">2011/8/29 Allen Wirfs-Brock <span dir="ltr"><<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>On Aug 27, 2011, at 6:12 AM, Andreas Rossberg wrote:<br> > True, and actually, there are more issues with length & function<br>
> proxies. I don't have my notes with me right now, but for example, it<br>
> is not clear at all what length Function.prototype.bind should set<br>
> when called on a function proxy. 0? 1? Should it try to get the length<br>
> property from the proxy and subtract N? What if length is not defined<br>
> on the proxy, or not a (natural) number?<br>
<br>
</div>The ES5.1 spec.  defines how how bind determines the length for the function it creates based upon the length property of the target function.  I would expect the same rules would apply when the target is a function proxy.</blockquote>

<div><br></div><div>I see two options here:</div><div>a) either query the function proxy for its "length" property via its "get" trap, and convert the result using ToInteger, introducing a new error case if the conversion fails.</div>

<div>b) or determine "length" based on the function proxy's call trap (which is presumably a non-proxy function. If it is a function proxy itself, recurse)</div><div><br></div><div>The spec currently uses the wording: "Let L be the length property of Target ..." (ES5.1 section 15.3.4.5)</div>
<div>If that is not equivalent to "Let L be the result of calling the [[Get]] internal method of Target with argument "length"", then option b) seems better.</div></div></blockquote><div><br></div><div>It should be considered to be a [[Get]] (and should be restarted as such).</div><div><br></div><div>A deeper question is whether or not function proxy objects are ES5 [[Class]]=='Function' objects (regardless of how this is actually expressed in the ES6 spec.)  For ES5, the distinction between objects that are callable and more specific objects where [[Class]]=='Function' was that [[Class]]=='Function' implies all of the invariants from sections 13.2 and 15.3 and their subsections while isCallable only means that the object supports [[Call]]. For example, such object always have a immutable 'length' property whose value is a number but host objects that are callable might not have such a property.  Hence the test in 15.3.4.5 step 15.</div><div><br></div><div>Because of their nature, it would seem unreasonable to assume that function proxy objects conform to all of the 13.2 and 15.3 invariants. </div><div><br></div><div>That means that according to 15.3.4.5 a bound function that targets a function proxy would have a length of 0.  That doesn't seem quite right either.  I think 15.3.4.5 should be generalize so that the computation of the length property isn't predicted by [[Class]]=='Function' but instead should just use the the numeric value of the target's length property, if it exists.  If the target does not have a length property or if its value is not a number then the bound function would get a length value of 0.</div><div><br></div><div><br></div><div>Allen</div><div><br></div></div></body></html>