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 {