Skip to content

Commit

Permalink
Update tests concerning null-extending classes
Browse files Browse the repository at this point in the history
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
jugglinmike committed May 27, 2016
1 parent f912927 commit 7a2d7c6
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 23 deletions.
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);
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);
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);
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);
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);

0 comments on commit 7a2d7c6

Please sign in to comment.