Closed
Bug 124900
Opened 23 years ago
Closed 23 years ago
arguments object storing duplicate parameter values
Categories
(Rhino Graveyard :: Core, defect)
Tracking
(Not tracked)
VERIFIED
FIXED
1.5R4
People
(Reporter: pschwartau, Assigned: norrisboyd)
Details
The testcase
js/tests/ecma_3/ExecutionContexts/10.1.3-1.js
has recently been added to the JS testsuite, to test functions having
duplicate formal parameter names. The following section of the test
is passing in SpiderMonkey, but failing in Rhino:
function f(x,x,x,x)
{
var ret = [];
for (var i=0; i<arguments.length; i++)
ret.push(arguments[i]);
return ret.toString();
}
actual = f(1,2,3,4);
expect = '1,2,3,4';
SPIDERMONKEY
test passes
RHINO
test FAILED!: Expected value '1,2,3,4', Actual value '4,4,4,4'
ECMA-262, 3rd Edition Final, contains this language:
10.1.3 Variable Instantiation
Every execution context has associated with it a variable object.
Variables and functions declared in the source text are added as properties
of the variable object. For function code, parameters are added as properties
of the variable object.
Which object is used as the variable object and what attributes are used
for the properties depends on the type of code, but the remainder of the
behaviour is generic. On entering an execution context, the
properties are bound to the variable object in the following order:
• For function code: for each formal parameter, as defined in the
FormalParameterList, create a property of the variable object whose name
is the Identifier and whose attributes are determined by the type of code.
The values of the parameters are supplied by the caller as arguments to
[[Call]]. If the caller supplies fewer parameter values than there are formal
parameters, the extra formal parameters have value undefined. If two or more
formal parameters share the same name, hence the same property, the
corresponding property is given the value that was supplied for the last
parameter with
this name. If the value of this last parameter was not supplied by the caller,
the value of the corresponding property is undefined.
10.1.8 Arguments Object
When control enters an execution context for function code, an arguments object
is created and initialised as follows:
• The value of the internal [[Prototype]] property of the arguments object
is the original Object prototype object, the one that is the initial value of
Object.prototype (see 15.2.3.1).
• A property is created with name callee and property attributes { DontEnum }.
The initial value of this property is the Function object being executed.
This allows anonymous functions to be recursive.
• A property is created with name length and property attributes { DontEnum }.
The initial value of this property is the number of actual parameter values
supplied by the caller.
• For each non-negative integer, arg, less than the value of the length
property, a property is created with name ToString(arg) and property
attributes { DontEnum }. The initial value of this property is the value
of the corresponding actual parameter supplied by the caller. The first
actual parameter value corresponds to arg = 0, the second to arg = 1, and so on.
In the case when arg is less than the number of formal parameters for the
Function object, this property shares its value with the corresponding property
of the activation object. This means that changing this property changes the
corresponding property of the activation object and vice versa.
Reporter | ||
Comment 1•23 years ago
|
||
My reading of ECMA is that disparate parameter values should be preserved
in the arguments object, even if the parameter names are the same in each case,
and even though it is only the last parameter value that will have effect.
cc'ing Waldemar to be sure -
Assignee | ||
Comment 2•23 years ago
|
||
So this behavior is correct, right?
js> function f(x,x) { x = 7; return arguments[0]; }
js> f(3,4)
7
js> function f(x,x) { x = 7; return arguments[1]; }
js> f(3,4)
7
Comment 3•23 years ago
|
||
Comment 2: I agree.
Comment 3: I'd expect, in a faithful ECMA implementation, the first function
definition to return 3 and the second one to return 7. If they both return 7,
you get a nonsensical situation of x being an alias of arguments[0], x being an
alias of arguments[1], but arguments[0] and arguments[1] initially holding
different values.
As an aside, I personally feel that the standard is unnecessarily detailed about
this case and should have left it unspecified. Having two parameters with the
same name is not something ECMAScript programs should do.
Reporter | ||
Comment 4•23 years ago
|
||
Here's what SpiderMonkey does on Norris' example:
js> function f(x,x) {x=7; return arguments[0]}
js> f(3,4);
3
js> function f(x,x) {x=7; return arguments[1]}
js> f(3,4);
7
Comment 5•23 years ago
|
||
I wish I knew why MS's lead was so intent on making this case work, and making
the spec for it so detailed. It seems to be gilding the lily, at best. I tried
pushing for SpiderMonkey's behavior (an error, now a strict warning), but lost
no good reason.
/be
Assignee | ||
Comment 6•23 years ago
|
||
Fixed:
Checking in Arguments.java;
/cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/Arguments.java,v <--
Arguments.java
new revision: 1.13; previous revision: 1.12
done
Status: NEW → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
Reporter | ||
Comment 7•23 years ago
|
||
Verified Fixed. Both new testcases on duplicate parameters are now
passing in the rhino and rhinoi shells on WinNT:
js/tests/ecma_3/ExecutionContexts/10.1.3-1.js
js/tests/ecma_3/ExecutionContexts/10.1.3-2.js
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•