Closed Bug 57048 Opened 25 years ago Closed 25 years ago

propertyIsEnumerable(): Ecmascript compliance bug

Categories

(Core :: JavaScript Engine, defect, P3)

defect

Tracking

()

RESOLVED FIXED

People

(Reporter: david, Assigned: rogerl)

Details

(Keywords: js1.5)

Attachments

(1 file)

Section 15.2.4.7 of the ECMA3 spec says that propertyIsEnumerable "does not consider objects in the prototype chain". Personally, I think this is a mistake in the specification, because the function isn't as useful if it ignores that prototype chain. However, spidermonkey does not conform to the spec as it is written. Note that Rhino does conform. Here is an illustration: js> String.prototype.foo = "bar"; bar js> s = "test" test js> s.propertyIsEnumerable("foo") true js> function Foo() { this.x = 1; } js> Foo.prototype.y = 2; 2 js> var f = new Foo(); js> f.propertyIsEnumerable("x"); true js> f.propertyIsEnumerable("y"); true
From the ECMA3 spec: 15.2.4.7 Object.prototype.propertyIsEnumerable (V) When the propertyIsEnumerable method is called with argument V, the following steps are taken: 1. Let O be this object. 2. Call ToString(V). 3. If O doesn’t have a property with the name given by Result(2), return false . 4. If the property has the DontEnum attribute, return false . 5. Return true. NOTE This method does not consider objects in the prototype chain.
We believe the spec suffered a draft error that no one caught, and that the intention was for propertyIsEnumerable to match the for..in loop, and check the prototype chain as well as the object at hand. I think we should WONTFIX this bug and fix the spec, but I'll confirm and reassign to waldemar for ultimate disposition. /be
Assignee: rogerl → waldemar
Status: UNCONFIRMED → NEW
Ever confirmed: true
Keywords: js1.5
A quick check of a newly downloaded copy of IE 5.5 makes it look like MS implements the spec as written, rather than as intended. javascript:String.prototype.foo = 'bar';s='foo';s.propertyIsEnumerable('foo') evaluates to false in IE5.5
I discussed this at the last ECMA meeting and the decision was to implement the spec as written, even if it's flawed in this case. Spidermonkey is correct; Rhino should be updated.
Assignee: waldemar → rogerl
Summary: propertyIsEnumerable(): ecmascript compliance bug → [rhino] propertyIsEnumerable()
Reassigning to Rhino per Waldemar's comment above -
Assignee: rogerl → nboyd
Component: Javascript Engine → Core
Product: Browser → Rhino
Reassigning back-- Rhino's matches the spec as written, SpiderMonkey does not. Here's Rhino's output: js> String.prototype.foo = "bar"; bar js> s = "test" test js> s.propertyIsEnumerable("foo") false js> function Foo() { this.x = 1; } js> Foo.prototype.y = 2; 2 js> var f = new Foo(); js> f.propertyIsEnumerable("x"); true js> f.propertyIsEnumerable("y"); false js>
Assignee: nboyd → rogerl
Component: Core → Javascript Engine
Product: Rhino → Browser
[MID-AIR COLLISION] Norris is correct. As David reported, it's SpiderMonkey that goes up the prototype chain for propertyIsEnumerable(), against spec. Confirmed with Waldemar -
Summary: [rhino] propertyIsEnumerable() → propertyIsEnumerable(): Ecmascript compliance bug
r=rogerl
Fix checked in.
Status: NEW → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
Who sr='d this change? I still think ECMA is wrong, and should be fixed -- it's not as if anyone uses this feature yet. /be
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: