blob: edf7bcab12406b5bbda5bb463b916a48e17042e8 [file] [log] [blame]
Ben Murdoch61f157c2016-09-16 13:49:30 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --harmony-async-await --expose-debug-as debug
6
7var Debug = debug.Debug;
8var breakPointCount = 0;
9
10function listener(event, exec_state, event_data, data) {
11 if (event != Debug.DebugEvent.Break) return;
12 ++breakPointCount;
13 try {
14 if (breakPointCount === 1) {
15 assertEquals(
16 "inner", exec_state.frame(0).evaluate("inner").value());
17 assertThrows(() => exec_state.frame(0).evaluate("letInner").value(),
18 ReferenceError);
19 assertThrows(() => exec_state.frame(0).evaluate("constInner").value(),
20 ReferenceError);
21
22 assertEquals("outer", exec_state.frame(0).evaluate("outer").value());
23 assertEquals(
24 "const outer", exec_state.frame(0).evaluate("constOuter").value());
25 assertEquals(
26 "let outer", exec_state.frame(0).evaluate("letOuter").value());
27
28 assertEquals("outer", exec_state.frame(1).evaluate("outer").value());
29 assertEquals(
30 "const outer", exec_state.frame(1).evaluate("constOuter").value());
31 assertEquals(
32 "let outer", exec_state.frame(1).evaluate("letOuter").value());
33
34 assertThrows(() => exec_state.frame(0).evaluate("withVar").value(),
35 ReferenceError);
36
37 } else if (breakPointCount === 2) {
38 assertEquals(
39 "inner", exec_state.frame(0).evaluate("inner").value());
40 assertThrows(() => exec_state.frame(0).evaluate("letInner").value(),
41 ReferenceError);
42 assertThrows(() => exec_state.frame(0).evaluate("constInner").value(),
43 ReferenceError);
44
45 assertEquals(57, exec_state.frame(0).evaluate("x").value());
46 assertEquals(100, exec_state.frame(0).evaluate("y").value());
47
48 // From breakPointCount === 1 and later, it's not possible to access
49 // earlier framestates.
50 assertEquals("outer", exec_state.frame(0).evaluate("outer").value());
51 assertEquals(
52 "const outer", exec_state.frame(0).evaluate("constOuter").value());
53 assertEquals(
54 "let outer", exec_state.frame(0).evaluate("letOuter").value());
55
56 exec_state.frame(0).evaluate("x = `x later(${x})`");
57 exec_state.frame(0).evaluate("y = `y later(${y})`");
58 exec_state.frame(0).evaluate("z = `ZEE`");
59
60 } else if (breakPointCount === 3) {
61 assertEquals(
62 "inner", exec_state.frame(0).evaluate("inner").value());
63 assertEquals(
64 "let inner", exec_state.frame(0).evaluate("letInner").value());
65 assertEquals(
66 "const inner", exec_state.frame(0).evaluate("constInner").value());
67
68 } else if (breakPointCount === 4) {
69 assertEquals(
70 "oop", exec_state.frame(0).evaluate("error.message").value());
71 assertEquals(
72 "Error",
73 exec_state.frame(0).evaluate("error.constructor.name").value());
74 assertEquals("floof", exec_state.frame(0).evaluate("bun").value());
75 assertThrows(() => exec_state.frame(0).evaluate("cow").value(),
76 ReferenceError);
77
78 assertEquals("outer", exec_state.frame(0).evaluate("outer").value());
79 assertEquals(
80 "const outer", exec_state.frame(0).evaluate("constOuter").value());
81 assertEquals(
82 "let outer", exec_state.frame(0).evaluate("letOuter").value());
83 }
84 } catch (e) {
85 print(e.stack);
86 quit(1);
87 }
88}
89
90Debug.setListener(listener);
91
92var outer = "outer";
93const constOuter = "const outer";
94let letOuter = "let outer"
95
96async function thrower() {
97 return Promise.reject(new Error("oop"));
98}
99
100async function testLater() {
101 return { x: 57, y: 100 };
102}
103
104async function test() {
105 var inner = "inner";
106 debugger;
107
108 let withVar = await testLater();
109 with (withVar) {
110 debugger;
111 }
112
113 assertEquals("x later(57)", withVar.x);
114 assertEquals("y later(100)", withVar.y);
115 assertEquals(undefined, withVar.z);
116 assertEquals("ZEE", z);
117
118 let letInner = "let inner";
119 const constInner = "const inner";
120 debugger;
121
122 try {
123 await thrower();
124 } catch (error) {
125 const bun = "floof";
126 debugger;
127 let cow = "moo";
128 }
129}
130
131test().
132then(x => {
133 Debug.setListener(null);
134}).
135catch(error => {
136 print(error.stack);
137 quit(1);
138 Debug.setListener(null);
139});