0753cbeaae
When an empty class is nested inside a class with private instance methods, like this: class Outer { constructor() {} #method() {} factory() { class Inner { constructor() { } } return Inner; } run(obj) { obj.#method(); } } The bytecode generator previously generate private brand initialization for the constructor of Inner by mistake, because during scope chain serialization/deserialization, the outer scopes of Inner and factory() are not allocated or serialized (as they are empty). In the eyes of the bytecode generator, it then appeared as if Outer is the direct outer scope of Inner's constructor. In order to work around this information loss, in this patch we rely on SharedFunctionInfo instead of the Context/ScopeInfo chain to maintain the information about private brand initialization. This is done by shrinking expected_nof_properties to 8 bits and freeing 8 bits for a second bitfield on the SFI. Design doc: https://docs.google.com/document/d/14maU596YbHcWR7XR-_iXM_ANhAAmiuRlJZysM61lqaE/edit# Bug: v8:9839, v8:8330, v8:10098 Change-Id: I4370a0459bfc0da388052ad5a91aac59582d811d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2056889 Commit-Queue: Joyee Cheung <joyee@igalia.com> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Cr-Commit-Position: refs/heads/master@{#66575}
45 lines
1.1 KiB
JavaScript
45 lines
1.1 KiB
JavaScript
// Copyright 2020 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
|
|
|
|
let {session, contextGroup, Protocol} = InspectorTest.start(
|
|
'Test empty inner classes with private instance methods in the outer class');
|
|
|
|
contextGroup.addScript(`
|
|
function run() {
|
|
class Outer {
|
|
#method() {}
|
|
|
|
factory() {
|
|
return class Inner {
|
|
fn() {
|
|
debugger;
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
const a = new Outer();
|
|
const Inner = a.factory();
|
|
(new Inner).fn();
|
|
}`);
|
|
|
|
InspectorTest.runAsyncTestSuite([async function testScopesPaused() {
|
|
Protocol.Debugger.enable();
|
|
Protocol.Runtime.evaluate({expression: 'run()'});
|
|
|
|
let {params: {callFrames}} =
|
|
await Protocol.Debugger.oncePaused(); // inside fn()
|
|
let frame = callFrames[0];
|
|
|
|
let {result} =
|
|
await Protocol.Runtime.getProperties({objectId: frame.this.objectId});
|
|
|
|
InspectorTest.logObject(result.privateProperties);
|
|
|
|
Protocol.Debugger.resume();
|
|
Protocol.Debugger.disable();
|
|
}]);
|