New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update tests concerning null-extending classes #658
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
3 changes: 1 addition & 2 deletions
3
...anguage/statements/class/subclass/class-definition-null-proto-contains-return-override.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 31 additions & 9 deletions
40
...language/statements/class/subclass/class-definition-null-proto-missing-return-override.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,43 @@ | ||
// Copyright (C) 2014 the V8 project authors. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
/*--- | ||
es6id: 14.5.14 | ||
esid: sec-runtime-semantics-classdefinitionevaluation | ||
description: > | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
The `this` value of a null-extending class is automatically initialized, | ||
obviating the need for an explicit return value in the constructor. | ||
info: | | ||
The behavior under test was introduced in the "ES2017" revision of the | ||
specification and conflicts with prior editions. | ||
|
||
If superclass is null, then | ||
Let protoParent be null. | ||
Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
|
||
`extends null` requires return override in the constructor | ||
[...] | ||
5. If ClassHeritageopt is not present, then | ||
[...] | ||
6. Else, | ||
[...] | ||
e. If superclass is null, then | ||
i. Let protoParent be null. | ||
ii. Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
[...] | ||
15. If ClassHeritageopt is present and protoParent is not null, then set F's | ||
[[ConstructorKind]] internal slot to "derived". | ||
[...] | ||
|
||
9.2.2 [[Construct]] | ||
|
||
[...] | ||
5. If kind is "base", then | ||
a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, | ||
"%ObjectPrototype%"). | ||
[...] | ||
15. Return ? envRec.GetThisBinding(). | ||
---*/ | ||
|
||
class Foo extends null { | ||
constructor() {} | ||
} | ||
|
||
assert.throws(ReferenceError, function() { | ||
new Foo(); | ||
}); | ||
var foo = new Foo(); | ||
|
||
assert.sameValue(Object.getPrototypeOf(foo), Foo); |
67 changes: 67 additions & 0 deletions
67
test/language/statements/class/subclass/class-definition-null-proto-super.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright (C) 2016 the V8 project authors. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
/*--- | ||
esid: sec-runtime-semantics-classdefinitionevaluation | ||
description: > | ||
The `this` value of a null-extending class is automatically initialized, | ||
preventing the use of `super` from within the constructor. | ||
info: | | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
|
||
[...] | ||
5. If ClassHeritageopt is not present, then | ||
[...] | ||
6. Else, | ||
[...] | ||
e. If superclass is null, then | ||
i. Let protoParent be null. | ||
ii. Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
[...] | ||
15. If ClassHeritageopt is present and protoParent is not null, then set F's | ||
[[ConstructorKind]] internal slot to "derived". | ||
[...] | ||
|
||
9.2.2 [[Construct]] | ||
|
||
[...] | ||
5. If kind is "base", then | ||
a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, | ||
"%ObjectPrototype%"). | ||
[...] | ||
|
||
12.3.5.1 Runtime Semantics: Evaluation | ||
|
||
SuperCall : super Arguments | ||
|
||
[...] | ||
6. Let result be ? Construct(func, argList, newTarget). | ||
7. Let thisER be GetThisEnvironment( ). | ||
8. Return ? thisER.BindThisValue(result). | ||
|
||
8.1.1.3.1 BindThisValue | ||
|
||
[...] | ||
3. If envRec.[[ThisBindingStatus]] is "initialized", throw a ReferenceError | ||
exception. | ||
4. Set envRec.[[ThisValue]] to V. | ||
5. Set envRec.[[ThisBindingStatus]] to "initialized". | ||
[...] | ||
---*/ | ||
|
||
var unreachable = 0; | ||
var reachable = 0; | ||
|
||
class C extends null { | ||
constructor() { | ||
reachable += 1; | ||
super(); | ||
unreachable += 1; | ||
} | ||
} | ||
|
||
assert.throws(TypeError, function() { | ||
new C(); | ||
}); | ||
|
||
assert.sameValue(reachable, 1); | ||
assert.sameValue(unreachable, 0); |
46 changes: 46 additions & 0 deletions
46
test/language/statements/class/subclass/class-definition-null-proto-this.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// Copyright (C) 2014 the V8 project authors. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
/*--- | ||
esid: sec-runtime-semantics-classdefinitionevaluation | ||
description: > | ||
The `this` value of a null-extending class is automatically initialized | ||
info: | | ||
The behavior under test was introduced in the "ES2017" revision of the | ||
specification and conflicts with prior editions. | ||
|
||
Runtime Semantics: ClassDefinitionEvaluation | ||
|
||
[...] | ||
5. If ClassHeritageopt is not present, then | ||
[...] | ||
6. Else, | ||
[...] | ||
e. If superclass is null, then | ||
i. Let protoParent be null. | ||
ii. Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
[...] | ||
15. If ClassHeritageopt is present and protoParent is not null, then set F's | ||
[[ConstructorKind]] internal slot to "derived". | ||
[...] | ||
|
||
9.2.2 [[Construct]] | ||
|
||
[...] | ||
5. If kind is "base", then | ||
a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget, | ||
"%ObjectPrototype%"). | ||
[...] | ||
---*/ | ||
|
||
var thisVal, instance; | ||
|
||
class C extends null { | ||
constructor() { | ||
thisVal = this; | ||
} | ||
} | ||
|
||
instance = new C(); | ||
|
||
assert.sameValue(instance instanceof C, true); | ||
assert.sameValue(instance, thisVal); |
44 changes: 33 additions & 11 deletions
44
test/language/statements/class/subclass/class-definition-null-proto.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,41 @@ | ||
// Copyright (C) 2014 the V8 project authors. All rights reserved. | ||
// Copyright (C) 2016 the V8 project authors. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
/*--- | ||
es6id: 14.5.14_S6.e | ||
esid: sec-runtime-semantics-classdefinitionevaluation | ||
es6id: 14.5.14 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is a whole new test, I wonder if the copyright year should be 2016 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure |
||
description: > | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
When a null-extending class does not specify a `constructor` method | ||
definition, a method with zero parameters and an empty body is used | ||
info: | | ||
The behavior under test was introduced in the "ES2017" revision of the | ||
specification and conflicts with prior editions. | ||
|
||
If superclass is null, then | ||
Let protoParent be null. | ||
Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
|
||
5. If ClassHeritageopt is not present, then | ||
[...] | ||
6. Else, | ||
[...] | ||
e. If superclass is null, then | ||
i. Let protoParent be null. | ||
ii. Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
[...] | ||
7. Let proto be ObjectCreate(protoParent). | ||
8. If ClassBodyopt is not present, let constructor be empty. | ||
9. Else, let constructor be ConstructorMethod of ClassBody. | ||
10. If constructor is empty, then | ||
a. If ClassHeritageopt is present and protoParent is not null, then | ||
[...] | ||
b. Else, | ||
i. Let constructor be the result of parsing the source text | ||
|
||
constructor( ){ } | ||
|
||
using the syntactic grammar with the goal symbol MethodDefinition. | ||
[...] | ||
---*/ | ||
class Foo extends null { | ||
constructor() { | ||
return {}; | ||
} | ||
} | ||
|
||
class Foo extends null {} | ||
|
||
assert.sameValue(Object.getPrototypeOf(Foo.prototype), null); | ||
assert.sameValue(Object.getPrototypeOf(Foo.prototype.constructor), Function.prototype); |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's great to have this test and class-definition-null-proto-super.js