v8/test/inspector/debugger/class-private-methods-nested-super.js
Joyee Cheung 1e6294d3c3 [class] initialize brand after super() in nested arrow function
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}
2022-02-10 14:05:48 +00:00

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();
}
]);