On Sep 9, 2008, at 1:49 PM, Garrett Smith wrote:
On Tue, Sep 9, 2008 at 11:32 AM, Mark S. Miller
<[EMAIL PROTECTED]> wrote:
Should strict 'arguments' be an array? I know we've over this before
and that strong reasons were presented why we couldn't do this.
But on
the ES3.1 phone call this morning no one could remember or regenerate
those reasons. Anyone? Pointers to previous threads are a fine
answer.
There was a narrow-cast thread among ES3.1 principals, I replied
without enlarging it. Here's my last message in full, citing Allen's
agreement:
I only now noticed that this mail spun off from a narrowcast mail
from Pratap, but the topic (arguments' type) deserves a wider list.
[EMAIL PROTECTED] is fine. May be that we are done with
this thread, but if not (or if it comes back to life), it should
not be too narrowly distributed. There's always the TC39 reflector
for member-only stuff.
/be
On Aug 1, 2008, at 6:26 PM, Allen Wirfs-Brock wrote:
OK, I generally buy this, that arguments is an Object but its
[[prototype]] is Array.prototype. What about the semantics of its
length property and other array specific semantics defined in Array
instances’ custom [[Put]] method ([[ThrowablePut]] in the ES3.1
spec.). I would think--yes, which means we will need to define a
custom [[ThrowablePut]] for argument objects. That is probably
also the appropriate place for defining the mapping to/from actual
parameters semantics.
At least one thing in Array.prototype that doesn’t fit if arguments
is an Object and not an Array. That is the definition of
constructor in Array.prototype. We can fix that by explicitly
providing an over-riding constructor property on arguments
instances. Are there any other properties of Array.prototype that
need special consideration?
Finally, this brings to mind a subtlety to think about. The
Object meta functions can expose whether or not a property is an
own property or an inherited property. When the speciation says
(as it does in several places) that an instance of a specific
constructor has certain properties are we implying that those
properties must be observably own properties of the instance? From
an implementation flexibility perspective I’d prefer that this was
left unspecified but from an interoperability perspective I suppose
we should pin it down.
From: Brendan Eich [mailto:[EMAIL PROTECTED]
Sent: Tuesday, July 29, 2008 7:34 AM
To: Pratap Lakshman (VJ#SDK)
Cc: [EMAIL PROTECTED]; Mark S. Miller; Kris Zyp; Mike Cowlishaw;
Adam Peller; Sam Ruby; Lars Hansen; [EMAIL PROTECTED]; Allen Wirfs-
Brock; Waldemar Horwat
Subject: Re: ES3.1 WG phone conference 29 July 08:00 PT
On Jul 29, 2008, at 7:04 AM, Pratap Lakshman (VJ#SDK) wrote:
(3) arguments. I think we should make arguments a true ES array. We
should correct the specification error that allowed it to be
anything else.
This is not possible without extra magic, due to the aliasing of
arguments[0] and x in
function f(x){arguments[0] = 42; return x}
It goes both ways of course:
function f(x){x = 42; return arguments[0]}
You can't require analysis to find the mutation (of either alias),
due to eval. We shouldn't require any kind of analysis in ES3.1 to
handle this aliasing. It has to be done as it has always been done,
by a magic arguments object whose element getters know how to find
the actual parameters, and whose element setters update those
actuals that correspond to declared formal parameters.
Note that the last sentence requires the first call to f below to
return undefined, not 42:
js> function f(a,b){arguments[1]=42;return b}
js> f(1)
js> f(1,2)
42
For these reasons, arguments cannot be a true array. Such a change
is also not backward compatible in ways I recall Lars found out
about when he was at Opera.
The only harmonized solution is to make arguments' prototype be
Array.prototype. Let's please do that, or else leave arguments alone.
(4) Edits based on review feedback from Oslo; schedule for
circulating the next draft
Sorry if I cannot attend this meeting -- I will try if my schedule
permits. I'm still traveling and I haven't had a chance to dig into
chapter 15 of the spec. I hope the above is clear.
/be
Back to the present:
Thanks.
There are other threads covering arguments, not hard to find with
site:mail.mozilla.org or nabble.com (although both have odd gaps in
message indexing -- I'll talk to mail.mozilla.org admins).
The arguments object could have the same methods as array, like a
"subclass" of array, but not have the special [[Put]], and concat()
could still work the way it does with today's arguments object (I
don't actually prefer the current behavior)
The plan has been to make arguments objects delegate to Array.prototype.
/be
_______________________________________________
Es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss