OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 "use strict"; | 5 "use strict"; |
6 | 6 |
7 // If true, prints all messages sent and received by inspector. | 7 // If true, prints all messages sent and received by inspector. |
8 const printProtocolMessages = false; | 8 const printProtocolMessages = false; |
9 | 9 |
10 // The active wrapper instance. | 10 // The active wrapper instance. |
(...skipping 27 matching lines...) Expand all Loading... | |
38 AsyncTaskEvent: 7 | 38 AsyncTaskEvent: 7 |
39 }; | 39 }; |
40 | 40 |
41 // The different types of steps. | 41 // The different types of steps. |
42 this.StepAction = { StepOut: 0, | 42 this.StepAction = { StepOut: 0, |
43 StepNext: 1, | 43 StepNext: 1, |
44 StepIn: 2, | 44 StepIn: 2, |
45 StepFrame: 3, | 45 StepFrame: 3, |
46 }; | 46 }; |
47 | 47 |
48 // The different types of scripts matching enum ScriptType in objects.h. | |
49 this.ScriptType = { Native: 0, | |
50 Extension: 1, | |
51 Normal: 2, | |
52 Wasm: 3}; | |
53 | |
48 // A copy of the scope types from runtime-debug.cc. | 54 // A copy of the scope types from runtime-debug.cc. |
49 // NOTE: these constants should be backward-compatible, so | 55 // NOTE: these constants should be backward-compatible, so |
50 // add new ones to the end of this list. | 56 // add new ones to the end of this list. |
51 this.ScopeType = { Global: 0, | 57 this.ScopeType = { Global: 0, |
52 Local: 1, | 58 Local: 1, |
53 With: 2, | 59 With: 2, |
54 Closure: 3, | 60 Closure: 3, |
55 Catch: 4, | 61 Catch: 4, |
56 Block: 5, | 62 Block: 5, |
57 Script: 6, | 63 Script: 6, |
(...skipping 13 matching lines...) Expand all Loading... | |
71 }; | 77 }; |
72 | 78 |
73 // The different script break point types. | 79 // The different script break point types. |
74 this.ScriptBreakPointType = { ScriptId: 0, | 80 this.ScriptBreakPointType = { ScriptId: 0, |
75 ScriptName: 1, | 81 ScriptName: 1, |
76 ScriptRegExp: 2 }; | 82 ScriptRegExp: 2 }; |
77 | 83 |
78 // Store the current script id so we can skip corresponding break events. | 84 // Store the current script id so we can skip corresponding break events. |
79 this.thisScriptId = %FunctionGetScriptId(receive); | 85 this.thisScriptId = %FunctionGetScriptId(receive); |
80 | 86 |
87 // Stores all set breakpoints. | |
88 this.breakpoints = new Set(); | |
89 | |
81 // Register as the active wrapper. | 90 // Register as the active wrapper. |
82 assertTrue(activeWrapper === undefined); | 91 assertTrue(activeWrapper === undefined); |
83 activeWrapper = this; | 92 activeWrapper = this; |
84 } | 93 } |
85 | 94 |
86 enable() { this.sendMessageForMethodChecked("Debugger.enable"); } | 95 enable() { this.sendMessageForMethodChecked("Debugger.enable"); } |
87 disable() { this.sendMessageForMethodChecked("Debugger.disable"); } | 96 disable() { this.sendMessageForMethodChecked("Debugger.disable"); } |
88 | 97 |
89 setListener(listener) { this.listener = listener; } | 98 setListener(listener) { this.listener = listener; } |
90 | 99 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
129 setBreakPoint(func, opt_line, opt_column, opt_condition) { | 138 setBreakPoint(func, opt_line, opt_column, opt_condition) { |
130 assertTrue(%IsFunction(func)); | 139 assertTrue(%IsFunction(func)); |
131 assertFalse(%FunctionIsAPIFunction(func)); | 140 assertFalse(%FunctionIsAPIFunction(func)); |
132 | 141 |
133 const scriptid = %FunctionGetScriptId(func); | 142 const scriptid = %FunctionGetScriptId(func); |
134 assertTrue(scriptid != -1); | 143 assertTrue(scriptid != -1); |
135 | 144 |
136 const offset = %FunctionGetScriptSourcePosition(func); | 145 const offset = %FunctionGetScriptSourcePosition(func); |
137 const loc = | 146 const loc = |
138 %ScriptLocationFromLine2(scriptid, opt_line, opt_column, offset); | 147 %ScriptLocationFromLine2(scriptid, opt_line, opt_column, offset); |
139 | 148 return this.setBreakPointAtLocation(scriptid, loc, opt_condition); |
140 const params = { location : | |
141 { scriptId : scriptid.toString(), | |
142 lineNumber : loc.line, | |
143 columnNumber : loc.column, | |
144 }}; | |
145 if (!!opt_condition) { | |
146 params.condition = opt_condition; | |
147 } | |
148 | |
149 const {msgid, msg} = this.createMessage("Debugger.setBreakpoint", params); | |
150 this.sendMessage(msg); | |
151 | |
152 const reply = this.takeReplyChecked(msgid); | |
153 assertTrue(reply.result !== undefined); | |
154 const breakid = reply.result.breakpointId; | |
155 assertTrue(breakid !== undefined); | |
156 | |
157 return breakid; | |
158 } | 149 } |
159 | 150 |
160 setScriptBreakPoint(type, scriptid, opt_line, opt_column, opt_condition) { | 151 setScriptBreakPoint(type, scriptid, opt_line, opt_column, opt_condition) { |
161 // Only sets by script id are supported for now. | 152 // Only sets by script id are supported for now. |
162 assertEquals(this.ScriptBreakPointType.ScriptId, type); | 153 assertEquals(this.ScriptBreakPointType.ScriptId, type); |
163 return this.setScriptBreakPointById(scriptid, opt_line, opt_column, | 154 return this.setScriptBreakPointById(scriptid, opt_line, opt_column, |
164 opt_condition); | 155 opt_condition); |
165 } | 156 } |
166 | 157 |
167 setScriptBreakPointById(scriptid, opt_line, opt_column, opt_condition) { | 158 setScriptBreakPointById(scriptid, opt_line, opt_column, opt_condition) { |
168 const loc = %ScriptLocationFromLine2(scriptid, opt_line, opt_column, 0); | 159 const loc = %ScriptLocationFromLine2(scriptid, opt_line, opt_column, 0); |
169 | 160 return this.setBreakPointAtLocation(scriptid, loc, opt_condition); |
170 const params = { location : | |
171 { scriptId : scriptid.toString(), | |
172 lineNumber : loc.line, | |
173 columnNumber : loc.column, | |
174 }}; | |
175 if (!!opt_condition) { | |
176 params.condition = opt_condition; | |
177 } | |
178 | |
179 const {msgid, msg} = this.createMessage("Debugger.setBreakpoint", params); | |
180 this.sendMessage(msg); | |
181 | |
182 const reply = this.takeReplyChecked(msgid); | |
183 assertTrue(reply.result !== undefined); | |
184 const breakid = reply.result.breakpointId; | |
185 assertTrue(breakid !== undefined); | |
186 | |
187 return breakid; | |
188 } | 161 } |
189 | 162 |
190 clearBreakPoint(breakid) { | 163 clearBreakPoint(breakid) { |
164 assertTrue(this.breakpoints.has(breakid)); | |
191 const {msgid, msg} = this.createMessage( | 165 const {msgid, msg} = this.createMessage( |
192 "Debugger.removeBreakpoint", { breakpointId : breakid }); | 166 "Debugger.removeBreakpoint", { breakpointId : breakid }); |
193 this.sendMessage(msg); | 167 this.sendMessage(msg); |
194 this.takeReplyChecked(msgid); | 168 this.takeReplyChecked(msgid); |
169 this.breakpoints.delete(breakid); | |
170 } | |
171 | |
172 clearAllBreakPoints() { | |
173 for (let breakid of this.breakpoints) { | |
174 this.clearBreakPoint(breakid); | |
175 } | |
Yang
2016/11/16 14:31:59
do we want to clear the set afterwards?
jgruber
2016/11/16 15:18:21
Sounds like a good idea.
Good catch :)
| |
195 } | 176 } |
196 | 177 |
197 showBreakPoints(f, opt_position_alignment) { | 178 showBreakPoints(f, opt_position_alignment) { |
198 if (!%IsFunction(f)) throw new Error("Not passed a Function"); | 179 if (!%IsFunction(f)) throw new Error("Not passed a Function"); |
199 | 180 |
200 const source = %FunctionGetSourceCode(f); | 181 const source = %FunctionGetSourceCode(f); |
201 const offset = %FunctionGetScriptSourcePosition(f); | 182 const offset = %FunctionGetScriptSourcePosition(f); |
202 const position_alignment = opt_position_alignment === undefined | 183 const position_alignment = opt_position_alignment === undefined |
203 ? this.BreakPositionAlignment.Statement : opt_position_alignment; | 184 ? this.BreakPositionAlignment.Statement : opt_position_alignment; |
204 const locations = %GetBreakLocations(f, position_alignment); | 185 const locations = %GetBreakLocations(f, position_alignment); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
262 if (result_count == 1) { | 243 if (result_count == 1) { |
263 return last_result; | 244 return last_result; |
264 } else { | 245 } else { |
265 return undefined; | 246 return undefined; |
266 } | 247 } |
267 } else { | 248 } else { |
268 return %GetScript(func_or_script_name); | 249 return %GetScript(func_or_script_name); |
269 } | 250 } |
270 } | 251 } |
271 | 252 |
253 // Returns the script source. If the parameter is a function the return value | |
254 // is the script source for the script in which the function is defined. If th e | |
Yang
2016/11/16 14:31:59
80-char limit
jgruber
2016/11/16 15:18:21
Done.
| |
255 // parameter is a string the return value is the script for which the script | |
256 // name has that string value. | |
257 scriptSource(func_or_script_name) { | |
258 return this.findScript(func_or_script_name).source; | |
259 }; | |
260 | |
272 sourcePosition(f) { | 261 sourcePosition(f) { |
273 if (!%IsFunction(f)) throw new Error("Not passed a Function"); | 262 if (!%IsFunction(f)) throw new Error("Not passed a Function"); |
274 return %FunctionGetScriptSourcePosition(f); | 263 return %FunctionGetScriptSourcePosition(f); |
275 }; | 264 }; |
276 | 265 |
266 // Returns the character position in a script based on a line number and an | |
267 // optional position within that line. | |
268 findScriptSourcePosition(script, opt_line, opt_column) { | |
269 var location = %ScriptLocationFromLine(script, opt_line, opt_column, 0); | |
270 return location ? location.position : null; | |
271 }; | |
272 | |
273 findFunctionSourceLocation(func, opt_line, opt_column) { | |
274 var script = %FunctionGetScript(func); | |
275 var script_offset = %FunctionGetScriptSourcePosition(func); | |
276 return %ScriptLocationFromLine(script, opt_line, opt_column, script_offset); | |
277 } | |
278 | |
277 setBreakPointsActive(enabled) { | 279 setBreakPointsActive(enabled) { |
278 const {msgid, msg} = this.createMessage( | 280 const {msgid, msg} = this.createMessage( |
279 "Debugger.setBreakpointsActive", { active : enabled }); | 281 "Debugger.setBreakpointsActive", { active : enabled }); |
280 this.sendMessage(msg); | 282 this.sendMessage(msg); |
281 this.takeReplyChecked(msgid); | 283 this.takeReplyChecked(msgid); |
282 } | 284 } |
283 | 285 |
284 get LiveEdit() { | 286 get LiveEdit() { |
285 return %GetLiveEditAPIObject(); | 287 return %GetLiveEditAPIObject(); |
286 } | 288 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
323 this.takeReplyChecked(msgid); | 325 this.takeReplyChecked(msgid); |
324 } | 326 } |
325 | 327 |
326 takeReplyChecked(msgid) { | 328 takeReplyChecked(msgid) { |
327 const reply = this.receivedMessages.get(msgid); | 329 const reply = this.receivedMessages.get(msgid); |
328 assertTrue(reply !== undefined); | 330 assertTrue(reply !== undefined); |
329 this.receivedMessages.delete(msgid); | 331 this.receivedMessages.delete(msgid); |
330 return reply; | 332 return reply; |
331 } | 333 } |
332 | 334 |
335 setBreakPointAtLocation(scriptid, loc, opt_condition) { | |
336 const params = { location : | |
337 { scriptId : scriptid.toString(), | |
338 lineNumber : loc.line, | |
339 columnNumber : loc.column, | |
340 }, | |
341 condition : opt_condition, | |
342 }; | |
343 | |
344 const {msgid, msg} = this.createMessage("Debugger.setBreakpoint", params); | |
345 this.sendMessage(msg); | |
346 | |
347 const reply = this.takeReplyChecked(msgid); | |
348 assertTrue(reply.result !== undefined); | |
349 const breakid = reply.result.breakpointId; | |
350 assertTrue(breakid !== undefined); | |
351 | |
352 this.breakpoints.add(breakid); | |
353 | |
354 return breakid; | |
355 } | |
356 | |
333 execStatePrepareStep(action) { | 357 execStatePrepareStep(action) { |
334 switch(action) { | 358 switch(action) { |
335 case this.StepAction.StepOut: this.stepOut(); break; | 359 case this.StepAction.StepOut: this.stepOut(); break; |
336 case this.StepAction.StepNext: this.stepOver(); break; | 360 case this.StepAction.StepNext: this.stepOver(); break; |
337 case this.StepAction.StepIn: this.stepInto(); break; | 361 case this.StepAction.StepIn: this.stepInto(); break; |
338 default: %AbortJS("Unsupported StepAction"); break; | 362 default: %AbortJS("Unsupported StepAction"); break; |
339 } | 363 } |
340 } | 364 } |
341 | 365 |
342 execStateScopeType(type) { | 366 execStateScopeType(type) { |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
687 debug.instance = new DebugWrapper(); | 711 debug.instance = new DebugWrapper(); |
688 debug.instance.enable(); | 712 debug.instance.enable(); |
689 } | 713 } |
690 return debug.instance; | 714 return debug.instance; |
691 }}); | 715 }}); |
692 | 716 |
693 Object.defineProperty(debug, 'ScopeType', { get: function() { | 717 Object.defineProperty(debug, 'ScopeType', { get: function() { |
694 const instance = debug.Debug; | 718 const instance = debug.Debug; |
695 return instance.ScopeType; | 719 return instance.ScopeType; |
696 }}); | 720 }}); |
OLD | NEW |