1e6294d3c3
Handle the case of nested super() by checking if the class scope contains a private brand. In this case the ContextScope chain is different from the actual context chain so this added back the AddPrivateBrand() runtime function but with the additional step of walking the context chain to get the correct class context that will be stored as the value of the brand property for the debugger. Bug: v8:12354 Change-Id: Ieeb9b9d6372bfbb1a39c4c2dc9e9848e9109f02a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3275137 Reviewed-by: Shu-yu Guo <syg@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Marja Hölttä <marja@chromium.org> Commit-Queue: Joyee Cheung <joyee@igalia.com> Cr-Commit-Position: refs/heads/main@{#79032}
80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
// Copyright 2021 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.
|
|
|
|
let { session, contextGroup, Protocol } = InspectorTest.start(
|
|
"Test getting private class methods from an instance that calls nested super()"
|
|
);
|
|
|
|
contextGroup.addScript(`
|
|
function run() {
|
|
class A {}
|
|
class B extends A {
|
|
#b() {}
|
|
constructor() {
|
|
(() => super())();
|
|
}
|
|
test() { debugger; }
|
|
};
|
|
(new B()).test();
|
|
|
|
class C extends B {
|
|
get #c() {}
|
|
constructor() {
|
|
const callSuper = () => super();
|
|
callSuper();
|
|
}
|
|
test() { debugger; }
|
|
};
|
|
(new C()).test();
|
|
|
|
class D extends C {
|
|
set #d(val) {}
|
|
constructor(str) {
|
|
eval(str);
|
|
}
|
|
test() { debugger; }
|
|
};
|
|
(new D('super();')).test();
|
|
}`);
|
|
|
|
InspectorTest.runAsyncTestSuite([
|
|
async function testScopesPaused() {
|
|
Protocol.Debugger.enable();
|
|
Protocol.Runtime.evaluate({ expression: "run()" });
|
|
|
|
let {
|
|
params: { callFrames }
|
|
} = await Protocol.Debugger.oncePaused(); // inside B constructor
|
|
let frame = callFrames[0];
|
|
let { result } = await Protocol.Runtime.getProperties({
|
|
objectId: frame.this.objectId
|
|
});
|
|
|
|
InspectorTest.log('properties after super() is called in IIFE');
|
|
InspectorTest.logMessage(result.privateProperties);
|
|
Protocol.Debugger.resume();
|
|
|
|
({ params: { callFrames } }
|
|
= await Protocol.Debugger.oncePaused()); // inside C constructor
|
|
frame = callFrames[0];
|
|
({ result } = await Protocol.Runtime.getProperties({
|
|
objectId: frame.this.objectId
|
|
}));
|
|
InspectorTest.log('privateProperties after super() is called in arrow function');
|
|
InspectorTest.logMessage(result.privateProperties);
|
|
Protocol.Debugger.resume();
|
|
({ params: { callFrames } }
|
|
= await Protocol.Debugger.oncePaused()); // inside D constructor
|
|
frame = callFrames[0];
|
|
({ result } = await Protocol.Runtime.getProperties({
|
|
objectId: frame.this.objectId
|
|
}));
|
|
InspectorTest.log('privateProperties after super() is called in eval()');
|
|
InspectorTest.logMessage(result.privateProperties);
|
|
Protocol.Debugger.resume();
|
|
|
|
Protocol.Debugger.disable();
|
|
}
|
|
]);
|