v8/test/inspector/debugger/get-possible-breakpoints-class-fields-expected.txt
Benedikt Meurer 4739535d71 [debug] Remove breakable location right before suspending.
This aligns the breakpoint behavior of YieldExpression and
AwaitExpression with the behavior of AssignmentExpression
in V8. It basically boils down to not reporting expression
positions on SuspendGenerator bytecodes as breakable
locations.

In particular the initial implicit yield of any generator
function is no longer a breakable position. In light of
this changes we also refine https://crrev.com/c/2949099
to not be able to step to the initial implicit yield
either, which would otherwise be really odd.

Before: https://imgur.com/KYy9F1S.png
After: https://imgur.com/gCnWU8J.png
Doc: https://goo.gle/devtools-reliable-await-breakpoints
Bug: chromium:901814, chromium:1319019, chromium:1246869
Fixed: chromium:1319019, chromium:1357501
Change-Id: I0c5f83e279918eb392d8f77a8a04c4c0285f938e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3909688
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Kim-Anh Tran <kimanh@chromium.org>
Auto-Submit: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83392}
2022-09-23 08:28:05 +00:00

208 lines
2.8 KiB
Plaintext

Checks Debugger.getPossibleBreakpoints for class fields
// Copyright 2017 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 x = |R|class {}
|_|x = |R|class {
x = |_|1;
y = |_|2;
}|R|
|_|x = |R|class {
x = |C|foo();
y = |_|2;
z = |C|bar();
}|R|
|_|x = class {
x = |C|foo();
y = |_|2;
z = |C|bar();
constructor() {
this.|_|x;
|R|}
}|R|
|_|x = class {
x = |C|foo();
y = |_|2;
constructor() {
this.|_|x;
|R|}
z = |C|bar();
}|R|
|_|x = class {
x = |C|foo();
y = |_|2;
constructor() {
this.|_|x;
|R|}
z = |C|bar();
}|R|
|_|x = |R|class {
x = |_|1;
foo() {|R|}
y = |_|2;
}|R|
|_|x = |R|class {
x = (function() {
|C|foo();
|R|})|C|();
y = (() => {
|C|bar();
|R|})|C|();
}|R|
|_|x = |R|class {
x = |_|function() {
|C|foo();
|R|};
}|R|
|_|x = |R|class {
x = |_|async function() {
|_|await |C|foo();
|R|};
}|R|
|_|x = |R|class {
x = |_|() => {
|C|foo();
|R|};
y = |_|() => |C|bar()|R|;
}|R|
|_|x = |R|class {
x = |_|async () => {
|_|await |C|foo();
|R|};
y = |_|async () => |_|await |C|bar()|R|;
}|R|
|_|x = |R|class {
[|_|x] = |_|1;
[|C|foo()] = |_|2;
}|R|
|_|x = |R|class {
[|_|x] = |_|[...this];
}|R|
|_|x = |R|class {
x;
[|C|foo()];
}|R|
|_|x = |R|class {
x = |_|function*() {
|_|yield 1;
|R|};
}|R|
|_|x = |R|class {
static x = |_|1;
static y = |_|2|R|;
}
|_|x = |R|class {
static x = |C|foo();
static y = |_|2;
static z = |C|bar()|R|;
}
|_|x = class {
static x = |C|foo();
static y = |_|2;
static z = |C|bar()|R|;
constructor() {
this.|_|x;
|R|}
}
|_|x = class {
static x = |C|foo();
static y = |_|2;
constructor() {
this.|_|x;
|R|}
static z = |C|bar()|R|;
}
|_|x = |R|class {
static x = |_|1;
static foo() {|R|}
bar() {|R|}
static y = |_|2|R|;
}
|_|x = |R|class {
static x = (function() {
|C|foo();
|R|})|C|();
static y = (() => {
|C|bar();
|R|})|C|()|R|;
}
|_|x = |R|class {
static x = |_|function() {
|C|foo();
|R|}|R|;
}
|_|x = |R|class {
static x = |_|async function() {
|_|await |C|foo();
|R|}|R|;
}
|_|x = |R|class {
static x = |_|() => {
|C|foo();
|R|};
static y = |_|() => |C|bar()|R|;
}
|_|x = |R|class {
static x = |_|async () => {
|_|await |C|foo();
|R|};
static y = |_|async () => |_|await |C|bar()|R|;
}
|_|x = |R|class {
static [|_|x] = |_|1;
static [|C|foo()] = |_|2|R|;
}
|_|x = |R|class {
static [|_|x] = |_|[...this]|R|;
}
|_|x = |R|class {
static x;
static [|C|foo()]|R|;
}
|_|x = |R|class {
static x = |_|function*() {
|_|yield 1;
|R|}|R|;
}
|_|x = |R|class {
static x = |_|1;
y = |_|2;
static [|_|z] = |_|3;
[|_|p] = |_|4;
static [|C|foo()] = |_|5|R|;
[|C|bar()] = |_|6;
}|R|
|R|