Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java @ 22003:5bc7f7b867ab
Making debugger always on for each TruffleVM execution. Introducing EventConsumer to process such debugger events. Requesting each RootNode to be associated with a TruffleLanguage, so debugger can find out proper context for each Node where executions gets suspended.
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Sat, 18 Jul 2015 18:03:36 +0200 |
parents | 9c8c0937da41 |
children | dc83cc1f94f2 |
comparison
equal
deleted
inserted
replaced
22002:324997830dc9 | 22003:5bc7f7b867ab |
---|---|
22 * or visit www.oracle.com if you need additional information or have any | 22 * or visit www.oracle.com if you need additional information or have any |
23 * questions. | 23 * questions. |
24 */ | 24 */ |
25 package com.oracle.truffle.tools.debug.shell.server; | 25 package com.oracle.truffle.tools.debug.shell.server; |
26 | 26 |
27 import com.oracle.truffle.api.debug.Breakpoint; | |
28 import java.io.*; | |
27 import java.util.*; | 29 import java.util.*; |
28 | 30 |
29 import com.oracle.truffle.api.frame.*; | 31 import com.oracle.truffle.api.frame.*; |
30 import com.oracle.truffle.api.instrument.*; | 32 import com.oracle.truffle.api.instrument.*; |
31 import com.oracle.truffle.api.nodes.*; | 33 import com.oracle.truffle.api.nodes.*; |
32 import com.oracle.truffle.api.source.*; | 34 import com.oracle.truffle.api.source.*; |
33 import com.oracle.truffle.api.vm.TruffleVM.Language; | |
34 import com.oracle.truffle.tools.debug.engine.*; | |
35 import com.oracle.truffle.tools.debug.shell.*; | 35 import com.oracle.truffle.tools.debug.shell.*; |
36 | 36 |
37 /** | 37 /** |
38 * Server-side REPL implementation of an {@linkplain REPLMessage "op"}. | 38 * Server-side REPL implementation of an {@linkplain REPLMessage "op"}. |
39 * <p> | 39 * <p> |
42 public abstract class REPLHandler { | 42 public abstract class REPLHandler { |
43 | 43 |
44 // TODO (mlvdv) add support for setting/using ignore count | 44 // TODO (mlvdv) add support for setting/using ignore count |
45 private static final int DEFAULT_IGNORE_COUNT = 0; | 45 private static final int DEFAULT_IGNORE_COUNT = 0; |
46 | 46 |
47 // TODO (mlvdv) add support for setting/using groupId | |
48 private static final int DEFAULT_GROUP_ID = 0; | |
49 | |
50 private final String op; | 47 private final String op; |
51 | 48 |
52 protected REPLHandler(String op) { | 49 protected REPLHandler(String op) { |
53 this.op = op; | 50 this.op = op; |
54 } | 51 } |
97 reply.put(REPLMessage.DISPLAY_MSG, explanation); | 94 reply.put(REPLMessage.DISPLAY_MSG, explanation); |
98 final REPLMessage[] replies = new REPLMessage[]{reply}; | 95 final REPLMessage[] replies = new REPLMessage[]{reply}; |
99 return replies; | 96 return replies; |
100 } | 97 } |
101 | 98 |
102 protected static REPLMessage createBreakpointInfoMessage(Breakpoint breakpoint) { | 99 static final REPLMessage createBreakpointInfoMessage(Breakpoint breakpoint, REPLServerContext serverContext) { |
103 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.BREAKPOINT_INFO); | 100 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.BREAKPOINT_INFO); |
104 infoMessage.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpoint.getId())); | 101 infoMessage.put(REPLMessage.BREAKPOINT_ID, Integer.toString(serverContext.getBreakpointID(breakpoint))); |
105 infoMessage.put(REPLMessage.BREAKPOINT_GROUP_ID, Integer.toString(breakpoint.getGroupId())); | |
106 infoMessage.put(REPLMessage.BREAKPOINT_STATE, breakpoint.getState().toString()); | |
107 infoMessage.put(REPLMessage.BREAKPOINT_HIT_COUNT, Integer.toString(breakpoint.getHitCount())); | 102 infoMessage.put(REPLMessage.BREAKPOINT_HIT_COUNT, Integer.toString(breakpoint.getHitCount())); |
108 infoMessage.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, Integer.toString(breakpoint.getIgnoreCount())); | 103 infoMessage.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, Integer.toString(breakpoint.getIgnoreCount())); |
109 infoMessage.put(REPLMessage.INFO_VALUE, breakpoint.getLocationDescription().toString()); | 104 infoMessage.put(REPLMessage.INFO_VALUE, breakpoint.getLocationDescription().toString()); |
110 if (breakpoint.getCondition() != null) { | 105 if (breakpoint.getCondition() != null) { |
111 infoMessage.put(REPLMessage.BREAKPOINT_CONDITION, breakpoint.getCondition()); | 106 infoMessage.put(REPLMessage.BREAKPOINT_CONDITION, breakpoint.getCondition()); |
113 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); | 108 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); |
114 return infoMessage; | 109 return infoMessage; |
115 } | 110 } |
116 | 111 |
117 protected static REPLMessage createFrameInfoMessage(final REPLServerContext serverContext, FrameDebugDescription frame) { | 112 protected static REPLMessage createFrameInfoMessage(final REPLServerContext serverContext, FrameDebugDescription frame) { |
118 final Visualizer visualizer = serverContext.getLanguage().getDebugSupport().getVisualizer(); | 113 final Visualizer visualizer = serverContext.getVisualizer(); |
119 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.FRAME_INFO); | 114 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.FRAME_INFO); |
120 infoMessage.put(REPLMessage.FRAME_NUMBER, Integer.toString(frame.index())); | 115 infoMessage.put(REPLMessage.FRAME_NUMBER, Integer.toString(frame.index())); |
121 final Node node = frame.node(); | 116 final Node node = frame.node(); |
122 | 117 |
123 infoMessage.put(REPLMessage.SOURCE_LOCATION, visualizer.displaySourceLocation(node)); | 118 infoMessage.put(REPLMessage.SOURCE_LOCATION, visualizer.displaySourceLocation(node)); |
125 | 120 |
126 if (node != null) { | 121 if (node != null) { |
127 SourceSection section = node.getSourceSection(); | 122 SourceSection section = node.getSourceSection(); |
128 if (section == null) { | 123 if (section == null) { |
129 section = node.getEncapsulatingSourceSection(); | 124 section = node.getEncapsulatingSourceSection(); |
130 if (section != null) { | 125 } |
131 infoMessage.put(REPLMessage.FILE_PATH, section.getSource().getPath()); | 126 if (section != null) { |
132 infoMessage.put(REPLMessage.LINE_NUMBER, Integer.toString(section.getStartLine())); | 127 infoMessage.put(REPLMessage.FILE_PATH, section.getSource().getPath()); |
133 infoMessage.put(REPLMessage.SOURCE_LINE_TEXT, section.getSource().getCode(section.getStartLine())); | 128 infoMessage.put(REPLMessage.LINE_NUMBER, Integer.toString(section.getStartLine())); |
134 } | 129 infoMessage.put(REPLMessage.SOURCE_LINE_TEXT, section.getSource().getCode(section.getStartLine())); |
135 } | 130 } |
136 } | 131 } |
137 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); | 132 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); |
138 return infoMessage; | 133 return infoMessage; |
139 } | 134 } |
142 | 137 |
143 @Override | 138 @Override |
144 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 139 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
145 final REPLMessage reply = createReply(); | 140 final REPLMessage reply = createReply(); |
146 final ArrayList<REPLMessage> frameMessages = new ArrayList<>(); | 141 final ArrayList<REPLMessage> frameMessages = new ArrayList<>(); |
147 for (FrameDebugDescription frame : serverContext.getDebugEngine().getStack()) { | 142 for (FrameDebugDescription frame : serverContext.getStack()) { |
148 frameMessages.add(createFrameInfoMessage(serverContext, frame)); | 143 frameMessages.add(createFrameInfoMessage(serverContext, frame)); |
149 } | 144 } |
150 if (frameMessages.size() > 0) { | 145 if (frameMessages.size() > 0) { |
151 return frameMessages.toArray(new REPLMessage[0]); | 146 return frameMessages.toArray(new REPLMessage[0]); |
152 } | 147 } |
177 } | 172 } |
178 Integer ignoreCount = request.getIntValue(REPLMessage.BREAKPOINT_IGNORE_COUNT); | 173 Integer ignoreCount = request.getIntValue(REPLMessage.BREAKPOINT_IGNORE_COUNT); |
179 if (ignoreCount == null) { | 174 if (ignoreCount == null) { |
180 ignoreCount = 0; | 175 ignoreCount = 0; |
181 } | 176 } |
182 LineBreakpoint breakpoint; | 177 Breakpoint breakpoint; |
183 try { | 178 try { |
184 breakpoint = serverContext.getDebugEngine().setLineBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), false); | 179 breakpoint = serverContext.db().setLineBreakpoint(DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), false); |
180 serverContext.registerBreakpoint(breakpoint); | |
185 } catch (Exception ex) { | 181 } catch (Exception ex) { |
186 return finishReplyFailed(reply, ex.getMessage()); | 182 return finishReplyFailed(reply, ex.getMessage()); |
187 } | 183 } |
188 reply.put(REPLMessage.SOURCE_NAME, fileName); | 184 reply.put(REPLMessage.SOURCE_NAME, fileName); |
189 reply.put(REPLMessage.FILE_PATH, source.getPath()); | 185 reply.put(REPLMessage.FILE_PATH, source.getPath()); |
190 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpoint.getId())); | 186 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(serverContext.getBreakpointID(breakpoint))); |
191 reply.put(REPLMessage.LINE_NUMBER, Integer.toString(lineNumber)); | 187 reply.put(REPLMessage.LINE_NUMBER, Integer.toString(lineNumber)); |
192 reply.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, ignoreCount.toString()); | 188 reply.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, ignoreCount.toString()); |
193 return finishReplySucceeded(reply, "Breakpoint set"); | 189 return finishReplySucceeded(reply, "Breakpoint set"); |
194 } | 190 } |
195 }; | 191 }; |
214 Integer lineNumber = request.getIntValue(REPLMessage.LINE_NUMBER); | 210 Integer lineNumber = request.getIntValue(REPLMessage.LINE_NUMBER); |
215 if (lineNumber == null) { | 211 if (lineNumber == null) { |
216 return finishReplyFailed(reply, "missing line number"); | 212 return finishReplyFailed(reply, "missing line number"); |
217 } | 213 } |
218 try { | 214 try { |
219 serverContext.getDebugEngine().setLineBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), true); | 215 Breakpoint b = serverContext.db().setLineBreakpoint(DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), true); |
216 serverContext.registerBreakpoint(b); | |
220 } catch (Exception ex) { | 217 } catch (Exception ex) { |
221 return finishReplyFailed(reply, ex.getMessage()); | 218 return finishReplyFailed(reply, ex.getMessage()); |
222 } | 219 } |
223 reply.put(REPLMessage.SOURCE_NAME, fileName); | 220 reply.put(REPLMessage.SOURCE_NAME, fileName); |
224 reply.put(REPLMessage.FILE_PATH, source.getPath()); | 221 reply.put(REPLMessage.FILE_PATH, source.getPath()); |
231 | 228 |
232 @Override | 229 @Override |
233 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 230 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
234 final REPLMessage reply = createReply(); | 231 final REPLMessage reply = createReply(); |
235 try { | 232 try { |
236 serverContext.getDebugEngine().setTagBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, false); | 233 Breakpoint b = serverContext.db().setTagBreakpoint(DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, false); |
234 serverContext.registerBreakpoint(b); | |
237 return finishReplySucceeded(reply, "Breakpoint at any throw set"); | 235 return finishReplySucceeded(reply, "Breakpoint at any throw set"); |
238 } catch (Exception ex) { | 236 } catch (Exception ex) { |
239 return finishReplyFailed(reply, ex.getMessage()); | 237 return finishReplyFailed(reply, ex.getMessage()); |
240 } | 238 } |
241 } | 239 } |
245 | 243 |
246 @Override | 244 @Override |
247 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 245 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
248 final REPLMessage reply = createReply(); | 246 final REPLMessage reply = createReply(); |
249 try { | 247 try { |
250 serverContext.getDebugEngine().setTagBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, true); | 248 serverContext.db().setTagBreakpoint(DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, true); |
251 return finishReplySucceeded(reply, "One-shot breakpoint at any throw set"); | 249 return finishReplySucceeded(reply, "One-shot breakpoint at any throw set"); |
252 } catch (Exception ex) { | 250 } catch (Exception ex) { |
253 return finishReplyFailed(reply, ex.getMessage()); | 251 return finishReplyFailed(reply, ex.getMessage()); |
254 } | 252 } |
255 } | 253 } |
259 | 257 |
260 @Override | 258 @Override |
261 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 259 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
262 final REPLMessage reply = createReply(); | 260 final REPLMessage reply = createReply(); |
263 final ArrayList<REPLMessage> infoMessages = new ArrayList<>(); | 261 final ArrayList<REPLMessage> infoMessages = new ArrayList<>(); |
264 for (Breakpoint breakpoint : serverContext.getDebugEngine().getBreakpoints()) { | 262 for (Breakpoint breakpoint : serverContext.db().getBreakpoints()) { |
265 infoMessages.add(createBreakpointInfoMessage(breakpoint)); | 263 infoMessages.add(createBreakpointInfoMessage(breakpoint, serverContext)); |
266 } | 264 } |
267 if (infoMessages.size() > 0) { | 265 if (infoMessages.size() > 0) { |
268 return infoMessages.toArray(new REPLMessage[0]); | 266 return infoMessages.toArray(new REPLMessage[0]); |
269 } | 267 } |
270 return finishReplyFailed(reply, "No breakpoints"); | 268 return finishReplyFailed(reply, "No breakpoints"); |
278 final REPLMessage reply = createReply(); | 276 final REPLMessage reply = createReply(); |
279 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); | 277 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); |
280 if (breakpointNumber == null) { | 278 if (breakpointNumber == null) { |
281 return finishReplyFailed(reply, "missing breakpoint number"); | 279 return finishReplyFailed(reply, "missing breakpoint number"); |
282 } | 280 } |
283 final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); | 281 final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); |
284 if (breakpoint == null) { | 282 if (breakpoint == null) { |
285 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); | 283 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); |
286 } | 284 } |
287 breakpoint.dispose(); | 285 breakpoint.dispose(); |
288 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); | 286 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); |
293 public static final REPLHandler CONTINUE_HANDLER = new REPLHandler(REPLMessage.CONTINUE) { | 291 public static final REPLHandler CONTINUE_HANDLER = new REPLHandler(REPLMessage.CONTINUE) { |
294 | 292 |
295 @Override | 293 @Override |
296 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 294 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
297 final REPLMessage reply = createReply(); | 295 final REPLMessage reply = createReply(); |
298 serverContext.getDebugEngine().prepareContinue(); | 296 serverContext.prepareContinue(); |
299 return finishReplySucceeded(reply, "Continue mode entered"); | 297 return finishReplySucceeded(reply, "Continue mode entered"); |
300 } | 298 } |
301 }; | 299 }; |
302 | 300 |
303 public static final REPLHandler DELETE_HANDLER = new REPLHandler(REPLMessage.DELETE_BREAK) { | 301 public static final REPLHandler DELETE_HANDLER = new REPLHandler(REPLMessage.DELETE_BREAK) { |
304 | 302 |
305 @Override | 303 @Override |
306 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 304 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
307 final REPLMessage reply = createReply(); | 305 final REPLMessage reply = createReply(); |
308 int deleteCount = 0; | 306 int deleteCount = 0; |
309 for (Breakpoint breakpoint : serverContext.getDebugEngine().getBreakpoints()) { | 307 for (Breakpoint breakpoint : serverContext.db().getBreakpoints()) { |
310 breakpoint.dispose(); | 308 breakpoint.dispose(); |
311 deleteCount++; | 309 deleteCount++; |
312 } | 310 } |
313 if (deleteCount == 0) { | 311 if (deleteCount == 0) { |
314 return finishReplyFailed(reply, "no breakpoints to delete"); | 312 return finishReplyFailed(reply, "no breakpoints to delete"); |
324 final REPLMessage reply = createReply(); | 322 final REPLMessage reply = createReply(); |
325 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); | 323 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); |
326 if (breakpointNumber == null) { | 324 if (breakpointNumber == null) { |
327 return finishReplyFailed(reply, "missing breakpoint number"); | 325 return finishReplyFailed(reply, "missing breakpoint number"); |
328 } | 326 } |
329 final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); | 327 final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); |
330 if (breakpoint == null) { | 328 if (breakpoint == null) { |
331 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); | 329 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); |
332 } | 330 } |
333 breakpoint.setEnabled(false); | 331 breakpoint.setEnabled(false); |
334 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); | 332 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); |
343 final REPLMessage reply = createReply(); | 341 final REPLMessage reply = createReply(); |
344 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); | 342 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); |
345 if (breakpointNumber == null) { | 343 if (breakpointNumber == null) { |
346 return finishReplyFailed(reply, "missing breakpoint number"); | 344 return finishReplyFailed(reply, "missing breakpoint number"); |
347 } | 345 } |
348 final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); | 346 final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); |
349 if (breakpoint == null) { | 347 if (breakpoint == null) { |
350 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); | 348 return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); |
351 } | 349 } |
352 breakpoint.setEnabled(true); | 350 breakpoint.setEnabled(true); |
353 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); | 351 reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); |
393 final REPLMessage reply = createReply(); | 391 final REPLMessage reply = createReply(); |
394 final Integer frameNumber = request.getIntValue(REPLMessage.FRAME_NUMBER); | 392 final Integer frameNumber = request.getIntValue(REPLMessage.FRAME_NUMBER); |
395 if (frameNumber == null) { | 393 if (frameNumber == null) { |
396 return finishReplyFailed(reply, "no frame number specified"); | 394 return finishReplyFailed(reply, "no frame number specified"); |
397 } | 395 } |
398 final List<FrameDebugDescription> stack = serverContext.getDebugEngine().getStack(); | 396 final List<FrameDebugDescription> stack = serverContext.getStack(); |
399 if (frameNumber < 0 || frameNumber >= stack.size()) { | 397 if (frameNumber < 0 || frameNumber >= stack.size()) { |
400 return finishReplyFailed(reply, "frame number " + frameNumber + " out of range"); | 398 return finishReplyFailed(reply, "frame number " + frameNumber + " out of range"); |
401 } | 399 } |
402 final FrameDebugDescription frameDescription = stack.get(frameNumber); | 400 final FrameDebugDescription frameDescription = stack.get(frameNumber); |
403 final REPLMessage frameMessage = createFrameInfoMessage(serverContext, frameDescription); | 401 final REPLMessage frameMessage = createFrameInfoMessage(serverContext, frameDescription); |
404 final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true); | 402 final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true); |
405 final Language language = serverContext.getLanguage(); | 403 final Visualizer visualizer = serverContext.getVisualizer(); |
406 final Visualizer visualizer = language.getDebugSupport().getVisualizer(); | |
407 final FrameDescriptor frameDescriptor = frame.getFrameDescriptor(); | 404 final FrameDescriptor frameDescriptor = frame.getFrameDescriptor(); |
408 try { | 405 try { |
409 final StringBuilder sb = new StringBuilder(); | 406 final StringBuilder sb = new StringBuilder(); |
410 for (FrameSlot slot : frameDescriptor.getSlots()) { | 407 for (FrameSlot slot : frameDescriptor.getSlots()) { |
411 sb.append(Integer.toString(slot.getIndex()) + ": " + visualizer.displayIdentifier(slot) + " = "); | 408 sb.append(Integer.toString(slot.getIndex()) + ": " + visualizer.displayIdentifier(slot) + " = "); |
450 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); | 447 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); |
451 if (breakpointNumber == null) { | 448 if (breakpointNumber == null) { |
452 return finishReplyFailed(message, "missing breakpoint number"); | 449 return finishReplyFailed(message, "missing breakpoint number"); |
453 } | 450 } |
454 message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); | 451 message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); |
455 final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); | 452 final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); |
456 if (breakpoint == null) { | 453 if (breakpoint == null) { |
457 return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); | 454 return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); |
458 } | 455 } |
459 final String expr = request.get(REPLMessage.BREAKPOINT_CONDITION); | 456 final String expr = request.get(REPLMessage.BREAKPOINT_CONDITION); |
460 if (expr == null || expr.isEmpty()) { | 457 if (expr == null || expr.isEmpty()) { |
461 return finishReplyFailed(message, "missing condition for " + breakpointNumber); | 458 return finishReplyFailed(message, "missing condition for " + breakpointNumber); |
462 } | 459 } |
463 try { | 460 try { |
464 breakpoint.setCondition(expr); | 461 breakpoint.setCondition(expr); |
465 } catch (DebugException ex) { | 462 } catch (IOException ex) { |
466 return finishReplyFailed(message, "invalid condition for " + breakpointNumber); | 463 return finishReplyFailed(message, "invalid condition for " + breakpointNumber); |
467 } catch (UnsupportedOperationException ex) { | 464 } catch (UnsupportedOperationException ex) { |
468 return finishReplyFailed(message, "conditions not unsupported by breakpoint " + breakpointNumber); | 465 return finishReplyFailed(message, "conditions not unsupported by breakpoint " + breakpointNumber); |
469 } | 466 } |
470 message.put(REPLMessage.BREAKPOINT_CONDITION, expr); | 467 message.put(REPLMessage.BREAKPOINT_CONDITION, expr); |
479 final REPLMessage reply = createReply(); | 476 final REPLMessage reply = createReply(); |
480 Integer repeat = request.getIntValue(REPLMessage.REPEAT); | 477 Integer repeat = request.getIntValue(REPLMessage.REPEAT); |
481 if (repeat == null) { | 478 if (repeat == null) { |
482 repeat = 1; | 479 repeat = 1; |
483 } | 480 } |
484 serverContext.getDebugEngine().prepareStepInto(repeat); | 481 serverContext.prepareStepInto(repeat); |
485 return finishReplySucceeded(reply, "StepInto <" + repeat + "> enabled"); | 482 return finishReplySucceeded(reply, "StepInto <" + repeat + "> enabled"); |
486 } | 483 } |
487 }; | 484 }; |
488 | 485 |
489 public static final REPLHandler STEP_OUT_HANDLER = new REPLHandler(REPLMessage.STEP_OUT) { | 486 public static final REPLHandler STEP_OUT_HANDLER = new REPLHandler(REPLMessage.STEP_OUT) { |
490 | 487 |
491 @Override | 488 @Override |
492 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 489 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
493 serverContext.getDebugEngine().prepareStepOut(); | 490 serverContext.prepareStepOut(); |
494 return finishReplySucceeded(createReply(), "StepOut enabled"); | 491 return finishReplySucceeded(createReply(), "StepOut enabled"); |
495 } | 492 } |
496 }; | 493 }; |
497 | 494 |
498 public static final REPLHandler STEP_OVER_HANDLER = new REPLHandler(REPLMessage.STEP_OVER) { | 495 public static final REPLHandler STEP_OVER_HANDLER = new REPLHandler(REPLMessage.STEP_OVER) { |
502 final REPLMessage reply = createReply(); | 499 final REPLMessage reply = createReply(); |
503 Integer repeat = request.getIntValue(REPLMessage.REPEAT); | 500 Integer repeat = request.getIntValue(REPLMessage.REPEAT); |
504 if (repeat == null) { | 501 if (repeat == null) { |
505 repeat = 1; | 502 repeat = 1; |
506 } | 503 } |
507 debugServerContextFrame.getDebugEngine().prepareStepOver(repeat); | 504 debugServerContextFrame.prepareStepOver(repeat); |
508 return finishReplySucceeded(reply, "StepOver <" + repeat + "> enabled"); | 505 return finishReplySucceeded(reply, "StepOver <" + repeat + "> enabled"); |
509 } | 506 } |
510 }; | 507 }; |
511 | 508 |
512 public static final REPLHandler TRUFFLE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE) { | 509 public static final REPLHandler TRUFFLE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE) { |
513 | 510 |
514 @Override | 511 @Override |
515 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 512 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
516 final REPLMessage reply = createReply(); | 513 final REPLMessage reply = createReply(); |
517 final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter(); | 514 final ASTPrinter astPrinter = serverContext.getVisualizer().getASTPrinter(); |
518 final String topic = request.get(REPLMessage.TOPIC); | 515 final String topic = request.get(REPLMessage.TOPIC); |
519 reply.put(REPLMessage.TOPIC, topic); | 516 reply.put(REPLMessage.TOPIC, topic); |
520 Node node = serverContext.getNode(); | 517 Node node = serverContext.getNodeAtHalt(); |
521 if (node == null) { | 518 if (node == null) { |
522 return finishReplyFailed(reply, "no current AST node"); | 519 return finishReplyFailed(reply, "no current AST node"); |
523 } | 520 } |
524 final Integer depth = request.getIntValue(REPLMessage.AST_DEPTH); | 521 final Integer depth = request.getIntValue(REPLMessage.AST_DEPTH); |
525 if (depth == null) { | 522 if (depth == null) { |
529 switch (topic) { | 526 switch (topic) { |
530 case REPLMessage.AST: | 527 case REPLMessage.AST: |
531 while (node.getParent() != null) { | 528 while (node.getParent() != null) { |
532 node = node.getParent(); | 529 node = node.getParent(); |
533 } | 530 } |
534 final String astText = astPrinter.printTreeToString(node, depth, serverContext.getNode()); | 531 final String astText = astPrinter.printTreeToString(node, depth, serverContext.getNodeAtHalt()); |
535 return finishReplySucceeded(reply, astText); | 532 return finishReplySucceeded(reply, astText); |
536 case REPLMessage.SUBTREE: | 533 case REPLMessage.SUBTREE: |
537 case REPLMessage.SUB: | 534 case REPLMessage.SUB: |
538 final String subTreeText = astPrinter.printTreeToString(node, depth); | 535 final String subTreeText = astPrinter.printTreeToString(node, depth); |
539 return finishReplySucceeded(reply, subTreeText); | 536 return finishReplySucceeded(reply, subTreeText); |
555 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); | 552 Integer breakpointNumber = request.getIntValue(REPLMessage.BREAKPOINT_ID); |
556 if (breakpointNumber == null) { | 553 if (breakpointNumber == null) { |
557 return finishReplyFailed(message, "missing breakpoint number"); | 554 return finishReplyFailed(message, "missing breakpoint number"); |
558 } | 555 } |
559 message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); | 556 message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); |
560 final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); | 557 final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); |
561 if (breakpoint == null) { | 558 if (breakpoint == null) { |
562 return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); | 559 return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); |
563 } | 560 } |
564 try { | 561 try { |
565 breakpoint.setCondition(null); | 562 breakpoint.setCondition(null); |
566 } catch (DebugException e) { | 563 } catch (IOException e) { |
567 return finishReplyFailed(message, e.getMessage()); | 564 return finishReplyFailed(message, e.getMessage()); |
568 } | 565 } |
569 return finishReplyFailed(message, "Breakpoint " + breakpointNumber + " condition cleared"); | 566 return finishReplyFailed(message, "Breakpoint " + breakpointNumber + " condition cleared"); |
570 } | 567 } |
571 }; | 568 }; |
573 public static final REPLHandler TRUFFLE_NODE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE_NODE) { | 570 public static final REPLHandler TRUFFLE_NODE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE_NODE) { |
574 | 571 |
575 @Override | 572 @Override |
576 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { | 573 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { |
577 final REPLMessage reply = createReply(); | 574 final REPLMessage reply = createReply(); |
578 final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter(); | 575 final ASTPrinter astPrinter = serverContext.getVisualizer().getASTPrinter(); |
579 final Node node = serverContext.getNode(); | 576 final Node node = serverContext.getNodeAtHalt(); |
580 if (node == null) { | 577 if (node == null) { |
581 return finishReplyFailed(reply, "no current AST node"); | 578 return finishReplyFailed(reply, "no current AST node"); |
582 } | 579 } |
583 | 580 |
584 try { | 581 try { |