diff --git a/src/class-elements/static-private-method-access-on-inner-arrow-function.case b/src/class-elements/static-private-method-access-on-inner-arrow-function.case new file mode 100644 index 0000000000..0d4207a7e4 --- /dev/null +++ b/src/class-elements/static-private-method-access-on-inner-arrow-function.case @@ -0,0 +1,38 @@ +// Copyright (C) 2019 Kubilay Kahveci (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: Static private method access inside of an arrow function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static #f() { return 42; } +static g() { + const arrowFunction = () => { + return this.#f(); + }; + + return arrowFunction(); +} + +//- assertions +assert.sameValue(C.g(), 42); +assert.throws(TypeError, function() { + C.g.call({}); +}, 'Accessed static private method from an object which did not contain it'); diff --git a/src/class-elements/static-private-method-access-on-inner-function.case b/src/class-elements/static-private-method-access-on-inner-function.case new file mode 100644 index 0000000000..e0ecac1392 --- /dev/null +++ b/src/class-elements/static-private-method-access-on-inner-function.case @@ -0,0 +1,40 @@ +// Copyright (C) 2019 Kubilay Kahveci (Bloomberg LP). All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +desc: Static private method access inside of a nested function +info: | + PrivateFieldGet (P, O) + 1. Assert: P is a Private Name. + 2. If O is not an object, throw a TypeError exception. + 3. If P.[[Kind]] is "field", + ... + 4. Perform ? PrivateBrandCheck(O, P). + 5. If P.[[Kind]] is "method", + a. Return P.[[Value]]. + ... + + PrivateBrandCheck(O, P) + 1. If O.[[PrivateBrands]] does not contain an entry e such that SameValue(e, P.[[Brand]]) is true, + a. Throw a TypeError exception. +template: default +features: [class-static-methods-private] +---*/ + +//- elements +static #f() { return 42; } +static g() { + const self = this; + + function innerFunction() { + return self.#f(); + } + + return innerFunction(); +} + +//- assertions +assert.sameValue(C.g(), 42); +assert.throws(TypeError, function() { + C.g.call({}); +}, 'Accessed static private method from an object which did not contain it');