Closed
Bug 1166950
Opened 8 years ago
Closed 8 years ago
Generator methods incorrectly restricted from use as constructors
Categories
(Core :: JavaScript Engine, defect)
Core
JavaScript Engine
Tracking
()
RESOLVED
FIXED
mozilla41
Tracking | Status | |
---|---|---|
firefox41 | --- | fixed |
People
(Reporter: jugglinmike, Assigned: evilpie)
References
(Blocks 1 open bug)
Details
Attachments
(3 files)
5.68 KB,
patch
|
efaust
:
review+
|
Details | Diff | Splinter Review |
6.12 KB,
patch
|
efaust
:
review+
|
Details | Diff | Splinter Review |
4.40 KB,
patch
|
efaust
:
review+
|
Details | Diff | Splinter Review |
Input: var g = { *g() {} }.g; new g(); Expected: an object is created whose [[Prototype]] internal slot is the generator function defined in the object initializer. Actual: TypeError Demo: $ js -e "var g = { *g() {} }.g; new g();" -e:1:27 TypeError: g is not a constructor "Normal" functions declared within object initializers using the MethodDefinition syntax do not defined a [[Construct]] internal method and cannot be used as constructors. The same is not true for generator functions: > 14.4.13 Runtime Semantics: PropertyDefinitionEvaluation > > GeneratorMethod : * PropertyName ( StrictFormalParameters ) { GeneratorBody } > > [...] > 5. Let closure be GeneratorFunctionCreate(Method, StrictFormalParameters, > GeneratorBody, scope, strict). > 6. Perform MakeMethod(closure, object). > 7. Let prototype be ObjectCreate(%GeneratorPrototype%). > 8. Perform MakeConstructor(closure, true, prototype). > [...] > 9.2.6 GeneratorFunctionCreate (kind, ParameterList, Body, Scope, Strict) > > 1. Let functionPrototype be the intrinsic object %Generator%. > 2. Let F be FunctionAllocate(functionPrototype, Strict, "generator"). > 3. Return FunctionInitialize(F, kind, ParameterList, Body, Scope). > 9.2.3 FunctionAllocate (functionPrototype, strict [,functionKind] ) > > [...] > 3. If functionKind is not present, let functionKind be "normal". > 4. If functionKind is "non-constructor", then > a. Let functionKind be "normal". > b. Let needsConstruct be false. > 5. Else let needsConstruct be true. > [...] > 9. If needsConstruct is true, then > a. Set F’s [[Construct]] internal method to the definition specified in > 9.2.2. > b. If functionKind is "generator", set the [[ConstructorKind]] internal > slot of F to "derived". > c. Else, set the [[ConstructorKind]] internal slot of F to "base". > d. NOTE Generator functions are tagged as "derived" constructors to > prevent [[Construct]] from preallocating a generator instance. > Generator instance objects are allocated when EvaluateBody is applied > to the GeneratorBody of a generator function. Sources: - https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generator-function-definitions-runtime-semantics-propertydefinitionevaluation - https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorfunctioncreate - https://people.mozilla.org/~jorendorff/es6-draft.html#sec-functionallocate
And Method Definitions except for GeneratorMethod should not have a prototype property: js> ({m(){}}).m.hasOwnProperty("prototype") true // should be false js> ({*g(){}}).g.hasOwnProperty("prototype") true // √ js> (class {constructor(){} static m(){}}).m.hasOwnProperty("prototype") true // should be false js> (class {constructor(){} static *g(){}}).g.hasOwnProperty("prototype") true // √ js> (new (class {constructor(){} m(){}})).m.hasOwnProperty("prototype") true // should be false js> (new (class {constructor(){} *g(){}})).g.hasOwnProperty("prototype") true // √ js> Object.getOwnPropertyDescriptor({set m(_){}}, "m").set.hasOwnProperty("prototype") true // should be false js> Object.getOwnPropertyDescriptor({get m(){}}, "m").get.hasOwnProperty("prototype") true // should be false
See Also: → 1069402
Assignee | ||
Updated•8 years ago
|
Assignee: nobody → evilpies
Assignee | ||
Comment 2•8 years ago
|
||
Attachment #8609834 -
Flags: review?(efaustbmo)
Assignee | ||
Comment 3•8 years ago
|
||
Attachment #8609835 -
Flags: review?(efaustbmo)
Assignee | ||
Comment 4•8 years ago
|
||
Attachment #8609836 -
Flags: review?(efaustbmo)
Comment 5•8 years ago
|
||
Comment on attachment 8609834 [details] [diff] [review] Introduce a new FunctionKind for class-constructors Review of attachment 8609834 [details] [diff] [review]: ----------------------------------------------------------------- Looks fine. ::: js/src/jsfun.h @@ +165,5 @@ > > // Arrow functions store their lexical |this| in the first extended slot. > bool isArrow() const { return kind() == Arrow; } > // Every class-constructor is also a method. > + bool isMethod() const { return kind() == Method || kind() == ClassConstructor; } nit: || isClassConstructor()
Attachment #8609834 -
Flags: review?(efaustbmo) → review+
Comment 6•8 years ago
|
||
Comment on attachment 8609835 [details] [diff] [review] Make generator methods constructors Review of attachment 8609835 [details] [diff] [review]: ----------------------------------------------------------------- Yup
Attachment #8609835 -
Flags: review?(efaustbmo) → review+
Comment 7•8 years ago
|
||
Comment on attachment 8609836 [details] [diff] [review] Only give constructor functions a prototype Review of attachment 8609836 [details] [diff] [review]: ----------------------------------------------------------------- Thanks for taking this, too.
Attachment #8609836 -
Flags: review?(efaustbmo) → review+
https://hg.mozilla.org/integration/mozilla-inbound/rev/80585eecc103 https://hg.mozilla.org/integration/mozilla-inbound/rev/0adc0764b127 https://hg.mozilla.org/integration/mozilla-inbound/rev/f3bf2b462632
Comment 9•8 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/80585eecc103 https://hg.mozilla.org/mozilla-central/rev/0adc0764b127 https://hg.mozilla.org/mozilla-central/rev/f3bf2b462632
Status: NEW → RESOLVED
Closed: 8 years ago
status-firefox41:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla41
You need to log in
before you can comment on or make changes to this bug.
Description
•