From 2fe5658f5d3ad6ffbb1885c2cfe93f2607cd2459 Mon Sep 17 00:00:00 2001 From: Kevin Gibbons Date: Mon, 9 Apr 2018 12:02:22 -0700 Subject: [PATCH] Add test for double super for proposal-class-fields#92 --- .../class/fields-run-once-on-double-super.js | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/language/expressions/class/fields-run-once-on-double-super.js diff --git a/test/language/expressions/class/fields-run-once-on-double-super.js b/test/language/expressions/class/fields-run-once-on-double-super.js new file mode 100644 index 00000000000..e01de58ca80 --- /dev/null +++ b/test/language/expressions/class/fields-run-once-on-double-super.js @@ -0,0 +1,41 @@ +// Copyright (C) 2018 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-super-keyword-runtime-semantics-evaluation +description: > + when calling `super()` for a second time in a derived class, the super constructor is run twice but the field initializers are only run once +info: | + [...] + 6. Let result be ? Construct(func, argList, newTarget). + [...] + 10. Perform ? thisER.BindThisValue(result). + 11. Perform ? InitializeInstanceFields(result, F). + [...] +features: [class-fields-public] +---*/ + + +var baseCtorCalled = 0; +var fieldInitCalled = 0; +class Base { + constructor() { + ++baseCtorCalled; + } +} + +var C = class extends Base { + field = ++fieldInitCalled; + constructor() { + assert.sameValue(baseCtorCalled, 0); + assert.sameValue(fieldInitCalled, 0); + super(); + assert.sameValue(baseCtorCalled, 1); + assert.sameValue(fieldInitCalled, 1); + assert.throws(ReferenceError, () => super()); + } +}; + +new C(); + +assert.sameValue(baseCtorCalled, 2); +assert.sameValue(fieldInitCalled, 1);