00c7e2a2c5
Added null check when printing the brand with --print-ast. Bug: chromium:961507, chromium:961508 Original change's description: > [class] implement private method declarations > > This patch implements the declarations of private methods, the access > of private methods would be left to a future patch. > When a private methods declaration is encountered, we now: > > - Create a brand symbol during class evaluation and store it in the > context. > - Create the closures for the private methods > - Load the brand from the context and store it in the instance in the > constructor. > > Design: https://docs.google.com/document/d/1T-Ql6HOIH2U_8YjWkwK2rTfywwb7b3Qe8d3jkz72KwA/edit# > > Bug: v8:8330 > Change-Id: I2d695cbdc8a7367ddc7620d627b318f779d36150 > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1568708 > Commit-Queue: Joyee Cheung <joyee@igalia.com> > Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> > Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org> > Cr-Commit-Position: refs/heads/master@{#61387} Change-Id: I3bf465f70c27914c9ec19f3f59ae018b28c9a866 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1605521 Commit-Queue: Joyee Cheung <joyee@igalia.com> Reviewed-by: Adam Klein <adamk@chromium.org> Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org> Cr-Commit-Position: refs/heads/master@{#61459}
96 lines
1.1 KiB
JavaScript
96 lines
1.1 KiB
JavaScript
// Copyright 2019 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --harmony-private-methods
|
|
|
|
"use strict";
|
|
|
|
{
|
|
class C {
|
|
#a() {}
|
|
}
|
|
new C;
|
|
}
|
|
|
|
{
|
|
class C {
|
|
#a() {
|
|
class B {
|
|
#a() { }
|
|
}
|
|
new B;
|
|
}
|
|
}
|
|
new C;
|
|
}
|
|
|
|
{
|
|
class A {
|
|
#a() {
|
|
class C extends A {
|
|
#c() { }
|
|
}
|
|
new C;
|
|
}
|
|
}
|
|
|
|
new A;
|
|
}
|
|
|
|
{
|
|
const C = class {
|
|
#a() { }
|
|
}
|
|
new C;
|
|
}
|
|
|
|
{
|
|
const C = class {
|
|
#a() {
|
|
const B = class {
|
|
#a() { }
|
|
}
|
|
new B;
|
|
}
|
|
}
|
|
new C;
|
|
}
|
|
|
|
{
|
|
class A {
|
|
constructor(arg) {
|
|
return arg;
|
|
}
|
|
}
|
|
|
|
class C extends A {
|
|
#x() { }
|
|
|
|
constructor(arg) {
|
|
super(arg);
|
|
}
|
|
}
|
|
|
|
// Add the brand twice on the same object.
|
|
let c1 = new C({});
|
|
assertThrows(() => new C(c1), TypeError);
|
|
}
|
|
|
|
{
|
|
// TODO(v8:9177): test extending a class expression that does not have
|
|
// a private method.
|
|
class D extends class {
|
|
#c() {}
|
|
} {
|
|
#d() {}
|
|
}
|
|
|
|
class E extends D {
|
|
#e() {}
|
|
}
|
|
|
|
new D;
|
|
new E;
|
|
}
|