c45a214cb5
This change removes the confusing statement positions that were previously emitted for every binding identifier within both array and object destructurings. These statement positions were reported as breakable positions to the debugger front-end, and during stepping, the debugger would also stop on them. This is confusing and very different from how other expressions work (we don't emit statement positions within expressions normally). Instead we emit expression positions for the binding identifiers, which are used to construct the source positions for stack traces. As a drive by we also add the missing position (and test cases) for sub-patterns. In particular this aligns the stepping and breakpoint behavior around destructuring expressions with that of Firefox DevTools. We also remove the original test cases, introduced with https://codereview.chromium.org/1542813003 and https://codereview.chromium.org/1533313002, which were written as debugger tests, with new inspector tests that also ensure that the call positions are correct. Fixed: chromium:1368444 Bug: v8:811 Doc: http://go/chrome-devtools:destructuring-breakpoints-design Change-Id: I4d53ad059b5eede73abd01d9bc9fdf8263c55c9d Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3916453 Reviewed-by: Kim-Anh Tran <kimanh@chromium.org> Commit-Queue: 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@{#83455}
201 lines
5.3 KiB
Plaintext
201 lines
5.3 KiB
Plaintext
Tests breakable locations in variable initializations.
|
|
|
|
Running test: testBreakLocations
|
|
|
|
Running test: testStepInto
|
|
|
|
function testFunction() {
|
|
var obj1 = |_|{a : 1};
|
|
var arr1 = |_|[1];
|
|
var promise = |_|Promise.|C|resolve(1).|C|then(x => x |_|* 2|R|).|C|then(x => x |_|/ 2|R|);
|
|
|_|Promise.|C|resolve(1).|C|then(x => x |_|* 2|R|).|C|then(x => x |_|/ 2|R|);
|
|
|_|promise = Promise.|C|resolve(1).|C|then(x => x |_|* 2|R|).|C|then(x => x |_|/ 2|R|);
|
|
var a = |_|1;
|
|
const x = |_|(a = 20);
|
|
var y = |_|(a = 100);
|
|
var z = |_|x + (a = 1) + (a = 2) + (a = 3) + |C|f();
|
|
function f() {
|
|
for (let { x, y } = |_|{ x: 0, y: 1 }; y |_|> 0; --|_|y) { let z = |_|x + y; }
|
|
|R|}
|
|
var b = obj1.|_|a;
|
|
|_|(async function asyncF() {
|
|
let r = |_|await Promise.|C|resolve(42);
|
|
|_|return r;|R|
|
|
})|C|();
|
|
|_|return promise;|R|
|
|
}
|
|
|
|
(anonymous) (expr.js:0:0)
|
|
|
|
|
|
testFunction (test.js:2:13)
|
|
(anonymous) (expr.js:0:0)
|
|
function testFunction() {
|
|
var obj1 = #{a : 1};
|
|
var arr1 = [1];
|
|
|
|
testFunction (test.js:3:13)
|
|
(anonymous) (expr.js:0:0)
|
|
var obj1 = {a : 1};
|
|
var arr1 = #[1];
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
testFunction (test.js:4:16)
|
|
(anonymous) (expr.js:0:0)
|
|
var arr1 = [1];
|
|
var promise = #Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
testFunction (test.js:5:2)
|
|
(anonymous) (expr.js:0:0)
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
#Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
testFunction (test.js:6:2)
|
|
(anonymous) (expr.js:0:0)
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
#promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
var a = 1;
|
|
|
|
testFunction (test.js:7:10)
|
|
(anonymous) (expr.js:0:0)
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
var a = #1;
|
|
const x = (a = 20);
|
|
|
|
testFunction (test.js:8:12)
|
|
(anonymous) (expr.js:0:0)
|
|
var a = 1;
|
|
const x = #(a = 20);
|
|
var y = (a = 100);
|
|
|
|
testFunction (test.js:9:10)
|
|
(anonymous) (expr.js:0:0)
|
|
const x = (a = 20);
|
|
var y = #(a = 100);
|
|
var z = x + (a = 1) + (a = 2) + (a = 3) + f();
|
|
|
|
testFunction (test.js:10:10)
|
|
(anonymous) (expr.js:0:0)
|
|
var y = (a = 100);
|
|
var z = #x + (a = 1) + (a = 2) + (a = 3) + f();
|
|
function f() {
|
|
|
|
f (test.js:12:24)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = #{ x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
|
|
}
|
|
|
|
f (test.js:12:42)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = { x: 0, y: 1 }; y #> 0; --y) { let z = x + y; }
|
|
}
|
|
|
|
f (test.js:12:62)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = { x: 0, y: 1 }; y > 0; --y) { let z = #x + y; }
|
|
}
|
|
|
|
f (test.js:12:49)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = { x: 0, y: 1 }; y > 0; --#y) { let z = x + y; }
|
|
}
|
|
|
|
f (test.js:12:42)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = { x: 0, y: 1 }; y #> 0; --y) { let z = x + y; }
|
|
}
|
|
|
|
f (test.js:13:2)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
for (let { x, y } = { x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
|
|
#}
|
|
var b = obj1.a;
|
|
|
|
testFunction (test.js:14:15)
|
|
(anonymous) (expr.js:0:0)
|
|
}
|
|
var b = obj1.#a;
|
|
(async function asyncF() {
|
|
|
|
testFunction (test.js:15:2)
|
|
(anonymous) (expr.js:0:0)
|
|
var b = obj1.a;
|
|
#(async function asyncF() {
|
|
let r = await Promise.resolve(42);
|
|
|
|
asyncF (test.js:16:12)
|
|
testFunction (test.js:18:4)
|
|
(anonymous) (expr.js:0:0)
|
|
(async function asyncF() {
|
|
let r = #await Promise.resolve(42);
|
|
return r;
|
|
|
|
asyncF (test.js:17:4)
|
|
let r = await Promise.resolve(42);
|
|
#return r;
|
|
})();
|
|
|
|
asyncF (test.js:17:13)
|
|
let r = await Promise.resolve(42);
|
|
return r;#
|
|
})();
|
|
|
|
(anonymous) (test.js:4:64)
|
|
var arr1 = [1];
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x #/ 2);
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
(anonymous) (test.js:4:67)
|
|
var arr1 = [1];
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2#);
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
(anonymous) (test.js:5:50)
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
Promise.resolve(1).then(x => x * 2).then(x => x #/ 2);
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
(anonymous) (test.js:5:53)
|
|
var promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2#);
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
|
|
(anonymous) (test.js:6:60)
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x #/ 2);
|
|
var a = 1;
|
|
|
|
(anonymous) (test.js:6:63)
|
|
Promise.resolve(1).then(x => x * 2).then(x => x / 2);
|
|
promise = Promise.resolve(1).then(x => x * 2).then(x => x / 2#);
|
|
var a = 1;
|
|
|
|
|
|
Running test: testStepIntoAfterBreakpoint
|
|
testFunction (test.js:10:10)
|
|
(anonymous) (expr.js:0:0)
|
|
var y = (a = 100);
|
|
var z = #x + (a = 1) + (a = 2) + (a = 3) + f();
|
|
function f() {
|
|
|
|
f (test.js:12:24)
|
|
testFunction (test.js:10:44)
|
|
(anonymous) (expr.js:0:0)
|
|
function f() {
|
|
for (let { x, y } = #{ x: 0, y: 1 }; y > 0; --y) { let z = x + y; }
|
|
}
|
|
|