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 7a2d7c6
Showing
5 changed files
with
176 additions
and
23 deletions.
There are no files selected for viewing
9 changes: 5 additions & 4 deletions
9
...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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,23 @@ | ||
// 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 | ||
es6id: 14.5.14 | ||
description: > | ||
Runtime Semantics: ClassDefinitionEvaluation | ||
If superclass is null, then | ||
Let protoParent be null. | ||
Let constructorParent be the intrinsic object %FunctionPrototype%. | ||
`extends null` requires return override in the constructor | ||
---*/ | ||
|
||
var obj = {}; | ||
class Foo extends null { | ||
constructor() { | ||
return {}; | ||
return obj; | ||
} | ||
} | ||
|
||
var f = new Foo(); | ||
|
||
assert.sameValue(Object.getPrototypeOf(f), Object.prototype); | ||
assert.sameValue(f, obj); |
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); |
62 changes: 62 additions & 0 deletions
62
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,62 @@ | ||
// 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, | ||
obviating the need for an explicit return value in 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:superArguments | ||
1. Let newTarget be GetNewTarget(). | ||
2. If newTarget is undefined, throw a ReferenceError exception. | ||
3. Let func be ? GetSuperConstructor(). | ||
12.3.5.2 Runtime Semantics: GetSuperConstructor | ||
4. Let superConstructor be ? activeFunction.[[GetPrototypeOf]](). | ||
5. If IsConstructor(superConstructor) is false, throw a TypeError exception. | ||
---*/ | ||
|
||
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); |