summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/language/statements/class/elements/abrupt-completition-on-field-initializer.js
blob: e2ea7199ab874c0416826454384df1e5284a13ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: If an initializer returns an abrupt completion, other initializers should not execute
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).
    ...

  ClassTail : ClassHeritage { ClassBody }
    ...
    34. For each item fieldRecord in order from staticFields,
      a. Perform ? DefineField(F, field).
    ...

features: [class-fields-public, class-static-fields-public, class]
---*/

function abruptCompletion() {
  throw new Test262Error();
}

let neverExecuted = false;

function sideEffect() {
  neverExecuted = true;
}

class C {
  a = abruptCompletion();
  b = sideEffect();
}

assert.throws(Test262Error, function() {
  let c = new C();
}, 'field initializer should end with abrupt completion');
assert.sameValue(neverExecuted, false);

assert.throws(Test262Error, function() {
  class D {
    static a = abruptCompletion();
    static b = sideEffect();
  }
}, 'static field initializer should end with abrupt completion');
assert.sameValue(neverExecuted, false);

reportCompare(0, 0);