forked from tc39/test262
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update tests concerning null-extending classes
The latest revision of ECMA262 makes special provisions for classes which extend the `null` value [1]. Update the relevant tests accordingly. [1] tc39/ecma262#543
- Loading branch information
1 parent
f912927
commit 029909f
Showing
5 changed files
with
177 additions
and
21 deletions.
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) 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, | ||
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); | ||
assert.sameValue(instance, thisVal); |
42 changes: 32 additions & 10 deletions
42
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. | ||
// 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 | ||
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); |