a8176a530c
Nop bytecodes are required only for break locations in debugger. Since nop bytecode doesn't change program state we can remove all of them. There are at least two changes which this CL produce: - we don't provide break position when we load local variable (still provide when load variable from global), - we don't provide break position for statements without actual break positions (e.g. "a;") - these expressions should be super rare and user always can set breakpoint before or after this statement. More details in one pager: https://docs.google.com/a/google.com/document/d/1JXlQpfMa9vRojbE272b6GMBbrfh6m_00135iAUOJEz8/edit?usp=sharing Bug: v8:6425 Change-Id: I4aee73d497a84f7b5d89caa6dda6d3060567dfda Reviewed-on: https://chromium-review.googlesource.com/543161 Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org> Cr-Commit-Position: refs/heads/master@{#46742}
362 lines
7.6 KiB
Plaintext
362 lines
7.6 KiB
Plaintext
Tests breakable locations in await expression.
|
|
|
|
Running test: testBreakLocations
|
|
|
|
function testFunction() {
|
|
async function f1() {
|
|
for (let x = |_|0; x |_|< 1; ++|_|x) |_|await x;
|
|
|_|return await Promise.|C|resolve(2);
|
|
|R|}
|
|
|
|
async function f2() {
|
|
let r = |_|await |C|f1() + await |C|f1();
|
|
|_|await |C|f1();
|
|
|_|await |C|f1().|C|then(x => x |_|* 2|R|);
|
|
|_|await [1].|C|map(x => Promise.|C|resolve(x)|R|)[0];
|
|
|_|await Promise.|C|resolve().|C|then(x => x |_|* 2|R|);
|
|
let p = |_|Promise.|C|resolve(42);
|
|
|_|await p;
|
|
|_|return r;
|
|
|R|}
|
|
|
|
return |C|f2();|R|
|
|
}
|
|
|
|
|
|
Running test: testStepInto
|
|
(anonymous) (expr.js:0:0)
|
|
|
|
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
|
|
return #f2();
|
|
}
|
|
|
|
f2 (test.js:8:12)
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
async function f2() {
|
|
let r = #await f1() + await f1();
|
|
await f1();
|
|
|
|
f1 (test.js:3:17)
|
|
f2 (test.js:8:18)
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
async function f1() {
|
|
for (let x = #0; x < 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
f2 (test.js:8:18)
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:32)
|
|
f2 (test.js:8:18)
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++x) #await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:29)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++#x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:4:4)
|
|
for (let x = 0; x < 1; ++x) await x;
|
|
#return await Promise.resolve(2);
|
|
}
|
|
|
|
f1 (test.js:5:2)
|
|
return await Promise.resolve(2);
|
|
#}
|
|
|
|
|
|
f2 (test.js:8:31)
|
|
async function f2() {
|
|
let r = await f1() + await #f1();
|
|
await f1();
|
|
|
|
f1 (test.js:3:17)
|
|
f2 (test.js:8:31)
|
|
async function f1() {
|
|
for (let x = #0; x < 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
f2 (test.js:8:31)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:32)
|
|
f2 (test.js:8:31)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++x) #await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:29)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++#x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:4:4)
|
|
for (let x = 0; x < 1; ++x) await x;
|
|
#return await Promise.resolve(2);
|
|
}
|
|
|
|
f1 (test.js:5:2)
|
|
return await Promise.resolve(2);
|
|
#}
|
|
|
|
|
|
f2 (test.js:9:4)
|
|
let r = await f1() + await f1();
|
|
#await f1();
|
|
await f1().then(x => x * 2);
|
|
|
|
f1 (test.js:3:17)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = #0; x < 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:32)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++x) #await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:29)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++#x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:4:4)
|
|
for (let x = 0; x < 1; ++x) await x;
|
|
#return await Promise.resolve(2);
|
|
}
|
|
|
|
f1 (test.js:5:2)
|
|
return await Promise.resolve(2);
|
|
#}
|
|
|
|
|
|
f2 (test.js:10:4)
|
|
await f1();
|
|
#await f1().then(x => x * 2);
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
|
|
f1 (test.js:3:17)
|
|
f2 (test.js:10:10)
|
|
async function f1() {
|
|
for (let x = #0; x < 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
f2 (test.js:10:10)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:32)
|
|
f2 (test.js:10:10)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++x) #await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:29)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++#x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:4:4)
|
|
for (let x = 0; x < 1; ++x) await x;
|
|
#return await Promise.resolve(2);
|
|
}
|
|
|
|
f1 (test.js:5:2)
|
|
return await Promise.resolve(2);
|
|
#}
|
|
|
|
|
|
f1.then.x (test.js:10:27)
|
|
await f1();
|
|
await f1().then(x => x #* 2);
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
|
|
f1.then.x (test.js:10:30)
|
|
await f1();
|
|
await f1().then(x => x * 2#);
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
|
|
f2 (test.js:11:4)
|
|
await f1().then(x => x * 2);
|
|
#await [1].map(x => Promise.resolve(x))[0];
|
|
await Promise.resolve().then(x => x * 2);
|
|
|
|
map.x (test.js:11:31)
|
|
f2 (test.js:11:14)
|
|
await f1().then(x => x * 2);
|
|
await [1].map(x => Promise.#resolve(x))[0];
|
|
await Promise.resolve().then(x => x * 2);
|
|
|
|
map.x (test.js:11:41)
|
|
f2 (test.js:11:14)
|
|
await f1().then(x => x * 2);
|
|
await [1].map(x => Promise.resolve(x)#)[0];
|
|
await Promise.resolve().then(x => x * 2);
|
|
|
|
f2 (test.js:12:4)
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
#await Promise.resolve().then(x => x * 2);
|
|
let p = Promise.resolve(42);
|
|
|
|
f2 (test.js:13:12)
|
|
await Promise.resolve().then(x => x * 2);
|
|
let p = #Promise.resolve(42);
|
|
await p;
|
|
|
|
f2 (test.js:14:4)
|
|
let p = Promise.resolve(42);
|
|
#await p;
|
|
return r;
|
|
|
|
f2 (test.js:15:4)
|
|
await p;
|
|
#return r;
|
|
}
|
|
|
|
f2 (test.js:16:2)
|
|
return r;
|
|
#}
|
|
|
|
|
|
|
|
Running test: testStepOver
|
|
f2 (test.js:8:12)
|
|
testFunction (test.js:18:9)
|
|
(anonymous) (expr.js:0:0)
|
|
async function f2() {
|
|
let r = #await f1() + await f1();
|
|
await f1();
|
|
|
|
f2 (test.js:8:31)
|
|
async function f2() {
|
|
let r = await f1() + await #f1();
|
|
await f1();
|
|
|
|
f2 (test.js:9:4)
|
|
let r = await f1() + await f1();
|
|
#await f1();
|
|
await f1().then(x => x * 2);
|
|
|
|
f2 (test.js:10:4)
|
|
await f1();
|
|
#await f1().then(x => x * 2);
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
|
|
f2 (test.js:11:4)
|
|
await f1().then(x => x * 2);
|
|
#await [1].map(x => Promise.resolve(x))[0];
|
|
await Promise.resolve().then(x => x * 2);
|
|
|
|
f2 (test.js:12:4)
|
|
await [1].map(x => Promise.resolve(x))[0];
|
|
#await Promise.resolve().then(x => x * 2);
|
|
let p = Promise.resolve(42);
|
|
|
|
f2 (test.js:13:12)
|
|
await Promise.resolve().then(x => x * 2);
|
|
let p = #Promise.resolve(42);
|
|
await p;
|
|
|
|
f2 (test.js:14:4)
|
|
let p = Promise.resolve(42);
|
|
#await p;
|
|
return r;
|
|
|
|
f2 (test.js:15:4)
|
|
await p;
|
|
#return r;
|
|
}
|
|
|
|
f2 (test.js:16:2)
|
|
return r;
|
|
#}
|
|
|
|
|
|
|
|
Running test: testStepIntoAfterBreakpoint
|
|
f2 (test.js:9:4)
|
|
let r = await f1() + await f1();
|
|
#await f1();
|
|
await f1().then(x => x * 2);
|
|
|
|
f1 (test.js:3:17)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = #0; x < 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:32)
|
|
f2 (test.js:9:10)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++x) #await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:29)
|
|
async function f1() {
|
|
for (let x = 0; x < 1; ++#x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:3:22)
|
|
async function f1() {
|
|
for (let x = 0; x #< 1; ++x) await x;
|
|
return await Promise.resolve(2);
|
|
|
|
f1 (test.js:4:4)
|
|
for (let x = 0; x < 1; ++x) await x;
|
|
#return await Promise.resolve(2);
|
|
}
|
|
|