Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright (C) 2015 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: >
Function `length` attribute not inferred in presence of static `length` method
info: |
ClassTail : ClassHeritage_opt { ClassBody_opt }

14. If constructor is empty, then [...]
b. Let F be ! CreateBuiltinFunction(steps, 0, className, « [[ConstructorKind]], [[SourceText]] », empty, constructorParent).
15. Else,
a. Let constructorInfo be ! DefineMethod of constructor with arguments proto and constructorParent.
[ This sets the length property on constructorInfo.[[Closure]]. ]
b. Let F be constructorInfo.[[Closure]].
[...]
25. For each ClassElement e of elements, do
a. If IsStatic of e is false, then [...]
b. Else,
i. Let field be ClassElementEvaluation of e with arguments F and false.
[ This overwrites the length property on F. ]
includes: [compareArray.js]
features: [generators]
---*/

class A {
static method() {
throw new Test262Error('Static method should not be executed during definition');
}
static length() {
throw new Test262Error('Static method should not be executed during definition');
}
}

assert.sameValue(typeof A.length, 'function');
assert(compareArray(Object.getOwnPropertyNames(A), ['length', 'name', 'prototype', 'method']))

var attr = 'length';
class B {
static [attr]() {
throw new Test262Error(
'Static method defined via computed property should not be executed ' +
'during definition'
);
}
}

assert.sameValue(typeof B.length, 'function');
assert(compareArray(Object.getOwnPropertyNames(B), ['length', 'name', 'prototype']))

var isDefined = false;
class C {
static get length() {
if (isDefined) {
return 'pass';
}
throw new Test262Error('Static `get` accessor should not be executed during definition');
}
}

isDefined = true;
assert.sameValue(C.length, 'pass');
assert(compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype']))

class D {
static set length(_) {
throw new Test262Error('Static `set` accessor should not be executed during definition');
}
}

assert.sameValue(D.length, undefined);
assert(compareArray(Object.getOwnPropertyNames(D), ['length', 'name', 'prototype']))

class E {
static *length() {
throw new Test262Error('Static GeneratorMethod should not be executed during definition');
}
}

assert.sameValue(typeof E.length, 'function');
assert(compareArray(Object.getOwnPropertyNames(E), ['length', 'name', 'prototype']))
Original file line number Diff line number Diff line change
Expand Up @@ -2,65 +2,78 @@
// This code is governed by the BSD license found in the LICENSE file.

/*---
es6id: 14.5.15
esid: sec-runtime-semantics-classdefinitionevaluation
description: >
Function `name` attribute not inferred in presence of static `name` method
info: |
ClassDeclaration : class BindingIdentifier ClassTail
ClassTail : ClassHeritage_opt { ClassBody_opt }

[...]
4. Let hasNameProperty be HasOwnProperty(value, "name").
5. ReturnIfAbrupt(hasNameProperty).
6. If hasNameProperty is false, then perform SetFunctionName(value,
className).
14. If constructor is empty, then [...]
b. Let F be ! CreateBuiltinFunction(steps, 0, className, « [[ConstructorKind]], [[SourceText]] », empty, constructorParent).
15. Else, [...]
d. Perform ! SetFunctionName(F, className).
25. For each ClassElement e of elements, do
a. If IsStatic of e is false, then [...]
b. Else,
i. Let field be ClassElementEvaluation of e with arguments F and false.
[ This overwrites the name property on F. ]
includes: [compareArray.js]
features: [generators]
---*/

class A {
static method() {
throw new Test262Error('Static method should not be executed during definition');
}
static name() {
$ERROR('Static method should not be executed during definition');
throw new Test262Error('Static method should not be executed during definition');
}
}

assert.sameValue(typeof A.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(A), ['length', 'name', 'prototype', 'method']))

var attr = 'name';
class B {
static [attr]() {
$ERROR(
throw new Test262Error(
'Static method defined via computed property should not be executed ' +
'during definition'
);
}
}

assert.sameValue(typeof B.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(B), ['length', 'name', 'prototype']))

var isDefined = false;
class C {
static get name() {
if (isDefined) {
return 'pass';
}
$ERROR('Static `get` accessor should not be executed during definition');
throw new Test262Error('Static `get` accessor should not be executed during definition');
}
}

isDefined = true;
assert.sameValue(C.name, 'pass');
assert(compareArray(Object.getOwnPropertyNames(C), ['length', 'name', 'prototype']))

class D {
static set name(_) {
$ERROR('Static `set` accessor should not be executed during definition');
throw new Test262Error('Static `set` accessor should not be executed during definition');
}
}

assert.sameValue(D.name, undefined);
assert(compareArray(Object.getOwnPropertyNames(D), ['length', 'name', 'prototype']))

class E {
static *name() {
$ERROR('Static GeneratorMethod should not be executed during definition');
throw new Test262Error('Static GeneratorMethod should not be executed during definition');
}
}

assert.sameValue(typeof E.name, 'function');
assert(compareArray(Object.getOwnPropertyNames(E), ['length', 'name', 'prototype']))