From ad12c4f5ad887e6fd67e6dfc35b7834d53beb060 Mon Sep 17 00:00:00 2001 From: Valerie R Young <valerie@bocoup.com> Date: Wed, 1 Nov 2017 10:27:52 -0400 Subject: [PATCH] classfields: field definition abrupt completion tests --- .../classelementname-abrupt-completion.js | 42 ++++++++++++++ ...efinition-initializer-abrupt-completion.js | 46 +++++++++++++++ ...atic-classelementname-abrupt-completion.js | 42 ++++++++++++++ ...efinition-initializer-abrupt-completion.js | 42 ++++++++++++++ ...efinition-initializer-abrupt-completion.js | 56 +++++++++++++++++++ 5 files changed, 228 insertions(+) create mode 100644 test/language/statements/class/classelementname-abrupt-completion.js create mode 100644 test/language/statements/class/fielddefinition-initializer-abrupt-completion.js create mode 100644 test/language/statements/class/static-classelementname-abrupt-completion.js create mode 100644 test/language/statements/class/static-fielddefinition-initializer-abrupt-completion.js create mode 100644 test/language/statements/class/super-fielddefinition-initializer-abrupt-completion.js diff --git a/test/language/statements/class/classelementname-abrupt-completion.js b/test/language/statements/class/classelementname-abrupt-completion.js new file mode 100644 index 0000000000..146df5e559 --- /dev/null +++ b/test/language/statements/class/classelementname-abrupt-completion.js @@ -0,0 +1,42 @@ +// Copyright (C) 2017 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Class definition should error if evaluation of ClassElementName errors +esid: runtime-semantics-class-definition-evaluation +info: | + Runtime Semantics: ClassDefinitionEvaluation + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of e is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + + Runtime Semantics: ClassElementEvaluation + ... + ClassElement : FieldDefinition ; + 1. Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter false and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + FieldDefinition : ClassElementNameInitializer + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + +features: [class-fields] +---*/ + +function f() { + throw new Test262Error(); +} + +assert.throws(Test262Error, function() { + class C { + [f()] + } +}); diff --git a/test/language/statements/class/fielddefinition-initializer-abrupt-completion.js b/test/language/statements/class/fielddefinition-initializer-abrupt-completion.js new file mode 100644 index 0000000000..090c8c9bc5 --- /dev/null +++ b/test/language/statements/class/fielddefinition-initializer-abrupt-completion.js @@ -0,0 +1,46 @@ +// Copyright (C) 2017 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Class construction should error if evaluation of field initializer errors +esid: sec-ecmascript-function-objects-construct-argumentslist-newtarget +info: | + [[Construct]] ( argumentsList, newTarget) + ... + 8. If kind is "base", then + a. Perform OrdinaryCallBindThis(F, calleeContext, thisArgument). + b. Let result be InitializeInstanceFields(thisArgument, F). + c. If result is an abrupt completion, then + i. Remove calleeContext from execution context stack and restore callerContext as the running execution context. + ii. Return Completion(result). + + InitializeInstanceFields ( O, constructor ) + 1. Assert: Type ( O ) is Object. + 2. Assert: Assert constructor is an ECMAScript function object. + 3. Let fieldRecords be the value of constructor's [[Fields]] internal slot. + 4. For each item fieldRecord in order from fieldRecords, + a. If fieldRecord.[[static]] is false, then + i. Perform ? DefineField(O, fieldRecord). + + DefineField(receiver, fieldRecord) + 1. Assert: Type(receiver) is Object. + 2. Assert: fieldRecord is a Record as created by ClassFieldDefinitionEvaluation. + 3. Let fieldName be fieldRecord.[[Name]]. + 4. Let initializer be fieldRecord.[[Initializer]]. + 5. If initializer is not empty, then + a.Let initValue be ? Call(initializer, receiver). + +features: [class-fields] +---*/ + +function f() { + throw new Test262Error(); +} + +class C { + x = f(); +} + +assert.throws(Test262Error, function() { + new C(); +}) diff --git a/test/language/statements/class/static-classelementname-abrupt-completion.js b/test/language/statements/class/static-classelementname-abrupt-completion.js new file mode 100644 index 0000000000..d86d1f30d8 --- /dev/null +++ b/test/language/statements/class/static-classelementname-abrupt-completion.js @@ -0,0 +1,42 @@ +// Copyright (C) 2017 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Class definition should error if evaluation of static ClassElementName errors +esid: runtime-semantics-class-definition-evaluation +info: | + Runtime Semantics: ClassDefinitionEvaluation + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of e is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + + Runtime Semantics: ClassElementEvaluation + ... + ClassElement : static FieldDefinition ; + 1. Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter true and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + FieldDefinition : ClassElementNameInitializer + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + +features: [class-fields] +---*/ + +function f() { + throw new Test262Error(); +} + +assert.throws(Test262Error, function() { + class C { + static [f()] + } +}); diff --git a/test/language/statements/class/static-fielddefinition-initializer-abrupt-completion.js b/test/language/statements/class/static-fielddefinition-initializer-abrupt-completion.js new file mode 100644 index 0000000000..226586d8b7 --- /dev/null +++ b/test/language/statements/class/static-fielddefinition-initializer-abrupt-completion.js @@ -0,0 +1,42 @@ +// Copyright (C) 2017 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Class construction should error if evaluation of static field initializer errors +esid: runtime-semantics-class-definition-evaluation +info: | + Runtime Semantics: ClassDefinitionEvaluation + ... + 33. Let result be InitializeStaticFields(F). + 34. If result is an abrupt completion, then + a. Set the running execution context's LexicalEnvironment to lex. + b. Return Completion(result). + + InitializeStaticFields(F) + 1. Assert: Type(F) is Object. + 2. Assert: F is an ECMAScript function object. + 3. Let fieldRecords be the value of F's [[Fields]] internal slot. + 4. For each item fieldRecord in order from fieldRecords, + a. If fieldRecord.[[static]] is true, then + i. Perform ? DefineField(F, fieldRecord). + + DefineField(receiver, fieldRecord) + 1. Assert: Type(receiver) is Object. + 2. Assert: fieldRecord is a Record as created by ClassFieldDefinitionEvaluation. + 3. Let fieldName be fieldRecord.[[Name]]. + 4. Let initializer be fieldRecord.[[Initializer]]. + 5. If initializer is not empty, then + a. Let initValue be ? Call(initializer, receiver). + +features: [class-fields] +---*/ + +function f() { + throw new Test262Error(); +} + +assert.throws(Test262Error, function() { + class C { + static x = f(); + } +}) diff --git a/test/language/statements/class/super-fielddefinition-initializer-abrupt-completion.js b/test/language/statements/class/super-fielddefinition-initializer-abrupt-completion.js new file mode 100644 index 0000000000..da97ab0215 --- /dev/null +++ b/test/language/statements/class/super-fielddefinition-initializer-abrupt-completion.js @@ -0,0 +1,56 @@ +// Copyright (C) 2017 Valerie Young. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Class construction should error if evaluation of field initializer in super errors +esid: sec-super-keyword-runtime-semantics-evaluation +info: | + Runtime Semantics: Evaluation + SuperCall : superArguments + 1. Let newTarget be GetNewTarget(). + 2. If newTarget is undefined, throw a ReferenceError exception. + 3. Let func be ? GetSuperConstructor(). + 4. Let argList be ArgumentListEvaluation of Arguments. + 5. ReturnIfAbrupt(argList). + 6. Let result be ? Construct(func, argList, newTarget). + 7. Let thisER be GetThisEnvironment( ). + 8. Let F be thisER.[[FunctionObject]]. + 9. Assert: F is an ECMAScript function object. + 10. Perform ? InitializeInstanceFields(result, F). + + InitializeInstanceFields ( O, constructor ) + 1. Assert: Type ( O ) is Object. + 2. Assert: Assert constructor is an ECMAScript function object. + 3. Let fieldRecords be the value of constructor's [[Fields]] internal slot. + 4. For each item fieldRecord in order from fieldRecords, + a. If fieldRecord.[[static]] is false, then + i. Perform ? DefineField(O, fieldRecord). + + DefineField(receiver, fieldRecord) + 1. Assert: Type(receiver) is Object. + 2. Assert: fieldRecord is a Record as created by ClassFieldDefinitionEvaluation. + 3. Let fieldName be fieldRecord.[[Name]]. + 4. Let initializer be fieldRecord.[[Initializer]]. + 5. If initializer is not empty, then + a.Let initValue be ? Call(initializer, receiver). + +features: [class-fields] +---*/ + +function f() { + throw new Test262Error(); +} + +class A { + x = f(); +} + +class C extends A { + constructor() { + super(); + } +} + +assert.throws(Test262Error, function() { + new C(); +}) -- GitLab