On Tue, Oct 4, 2011 at 4:09 PM, Sean Eagan <[email protected]> wrote:
> On Mon, Oct 3, 2011 at 5:11 PM, Allen Wirfs-Brock <[email protected]> 
> wrote:
>> as it currently stands, a function is allowed to use both:
>>
>> function f(a,b,c,...rest) {
>>    g(...arguments);
>>    h(...rest);
>> }
>
> Rest parameters are capable of anything arguments objects are and
> more, so what use case would there ever be for using both?  Your
> example can be rewritten using only rest parameters as either:
>
> function f(a,b,c,...rest) {
>  g(...[a,b,c,...rest]);
>   h(...rest);
> }
>
> or
>
> function f(...arguments) {
>  [,,,...rest] = arguments;
>  g(...arguments);
>   h(...rest);
> }
>
> Rest parameters are intended to deprecate `arguments`, if both are
> allowed simultaneously then this deprecation will be much harder to
> accomplish.  I would even go so far as to disallow the use of
> `arguments` altogether in "extended code", to encourage the use of
> rest parameters and accelerate the deprecation of `arguments`.
>
>> In a high perf implementation, the arguments to a function call will 
>> typically be passed as a dense sequence of values on the processor stack.  
>> Not as an actual array object. Such a sequence normally does not include any 
>> way to encode the existence of "holes" so a new mechanism would have to be 
>> added by implementors.  Probably a distinguished value.  Such mechanisms 
>> typically carry a cost.  For example, such a distinguished internal marker 
>> value must never be exposed to JS code as the value of formal parameter.  
>> So, the callee might have to scrub each argument position and replace each 
>> hole with undefined.  It already has to do something like that for default 
>> value parameters (based on the size of the argument list) but now it would 
>> have to do it for every parameter.
>
> Hopefully I'm not getting in way over my head here, but I did some
> digging in spider monkey code, and here's what I found:
> * There is already a distinguished value for array holes [1].
> * The Function.prototype.apply code [1] loops over the passed argument
> array [2], copying each element over to the argv structure of the
> callee, explicity converting holes to undefined [3].  These
> conversions could instead be done by the callee only for indexes
> corresponding to non-rest formal parameters and indexes which may be
> accessed from an arguments object, which as I argue above, should
> never coexist with a rest parameter.  Indexes corresponding to a rest
> parameter would not be coverted to holes, and thus hole preservation
> would be acheived.
> [1] 
> http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsfun.cpp.html#l1866[2]
> http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsfun.cpp.html#l1913[3]
> http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsarray.cpp.html#l441[4]
> http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsval.h.html#l259

The sources got mangled, should be:

[1] http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsfun.cpp.html#l1866
[2] http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsfun.cpp.html#l1913
[3] http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsarray.cpp.html#l441
[4] http://dxr.mozilla.org/mozilla/mozilla-central/js/src/jsval.h.html#l259

Thanks,
Sean Eagan
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to