Mercurial > hg > truffle
diff 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 |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java Thu Jul 16 19:11:31 2015 +0200 +++ b/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java Sat Jul 18 18:03:36 2015 +0200 @@ -24,14 +24,14 @@ */ package com.oracle.truffle.tools.debug.shell.server; +import com.oracle.truffle.api.debug.Breakpoint; +import java.io.*; import java.util.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.instrument.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.api.source.*; -import com.oracle.truffle.api.vm.TruffleVM.Language; -import com.oracle.truffle.tools.debug.engine.*; import com.oracle.truffle.tools.debug.shell.*; /** @@ -44,9 +44,6 @@ // TODO (mlvdv) add support for setting/using ignore count private static final int DEFAULT_IGNORE_COUNT = 0; - // TODO (mlvdv) add support for setting/using groupId - private static final int DEFAULT_GROUP_ID = 0; - private final String op; protected REPLHandler(String op) { @@ -99,11 +96,9 @@ return replies; } - protected static REPLMessage createBreakpointInfoMessage(Breakpoint breakpoint) { + static final REPLMessage createBreakpointInfoMessage(Breakpoint breakpoint, REPLServerContext serverContext) { final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.BREAKPOINT_INFO); - infoMessage.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpoint.getId())); - infoMessage.put(REPLMessage.BREAKPOINT_GROUP_ID, Integer.toString(breakpoint.getGroupId())); - infoMessage.put(REPLMessage.BREAKPOINT_STATE, breakpoint.getState().toString()); + infoMessage.put(REPLMessage.BREAKPOINT_ID, Integer.toString(serverContext.getBreakpointID(breakpoint))); infoMessage.put(REPLMessage.BREAKPOINT_HIT_COUNT, Integer.toString(breakpoint.getHitCount())); infoMessage.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, Integer.toString(breakpoint.getIgnoreCount())); infoMessage.put(REPLMessage.INFO_VALUE, breakpoint.getLocationDescription().toString()); @@ -115,7 +110,7 @@ } protected static REPLMessage createFrameInfoMessage(final REPLServerContext serverContext, FrameDebugDescription frame) { - final Visualizer visualizer = serverContext.getLanguage().getDebugSupport().getVisualizer(); + final Visualizer visualizer = serverContext.getVisualizer(); final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.FRAME_INFO); infoMessage.put(REPLMessage.FRAME_NUMBER, Integer.toString(frame.index())); final Node node = frame.node(); @@ -127,11 +122,11 @@ SourceSection section = node.getSourceSection(); if (section == null) { section = node.getEncapsulatingSourceSection(); - if (section != null) { - infoMessage.put(REPLMessage.FILE_PATH, section.getSource().getPath()); - infoMessage.put(REPLMessage.LINE_NUMBER, Integer.toString(section.getStartLine())); - infoMessage.put(REPLMessage.SOURCE_LINE_TEXT, section.getSource().getCode(section.getStartLine())); - } + } + if (section != null) { + infoMessage.put(REPLMessage.FILE_PATH, section.getSource().getPath()); + infoMessage.put(REPLMessage.LINE_NUMBER, Integer.toString(section.getStartLine())); + infoMessage.put(REPLMessage.SOURCE_LINE_TEXT, section.getSource().getCode(section.getStartLine())); } } infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); @@ -144,7 +139,7 @@ public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); final ArrayList<REPLMessage> frameMessages = new ArrayList<>(); - for (FrameDebugDescription frame : serverContext.getDebugEngine().getStack()) { + for (FrameDebugDescription frame : serverContext.getStack()) { frameMessages.add(createFrameInfoMessage(serverContext, frame)); } if (frameMessages.size() > 0) { @@ -179,15 +174,16 @@ if (ignoreCount == null) { ignoreCount = 0; } - LineBreakpoint breakpoint; + Breakpoint breakpoint; try { - breakpoint = serverContext.getDebugEngine().setLineBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), false); + breakpoint = serverContext.db().setLineBreakpoint(DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), false); + serverContext.registerBreakpoint(breakpoint); } catch (Exception ex) { return finishReplyFailed(reply, ex.getMessage()); } reply.put(REPLMessage.SOURCE_NAME, fileName); reply.put(REPLMessage.FILE_PATH, source.getPath()); - reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpoint.getId())); + reply.put(REPLMessage.BREAKPOINT_ID, Integer.toString(serverContext.getBreakpointID(breakpoint))); reply.put(REPLMessage.LINE_NUMBER, Integer.toString(lineNumber)); reply.put(REPLMessage.BREAKPOINT_IGNORE_COUNT, ignoreCount.toString()); return finishReplySucceeded(reply, "Breakpoint set"); @@ -216,7 +212,8 @@ return finishReplyFailed(reply, "missing line number"); } try { - serverContext.getDebugEngine().setLineBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), true); + Breakpoint b = serverContext.db().setLineBreakpoint(DEFAULT_IGNORE_COUNT, source.createLineLocation(lineNumber), true); + serverContext.registerBreakpoint(b); } catch (Exception ex) { return finishReplyFailed(reply, ex.getMessage()); } @@ -233,7 +230,8 @@ public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); try { - serverContext.getDebugEngine().setTagBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, false); + Breakpoint b = serverContext.db().setTagBreakpoint(DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, false); + serverContext.registerBreakpoint(b); return finishReplySucceeded(reply, "Breakpoint at any throw set"); } catch (Exception ex) { return finishReplyFailed(reply, ex.getMessage()); @@ -247,7 +245,7 @@ public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); try { - serverContext.getDebugEngine().setTagBreakpoint(DEFAULT_GROUP_ID, DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, true); + serverContext.db().setTagBreakpoint(DEFAULT_IGNORE_COUNT, StandardSyntaxTag.THROW, true); return finishReplySucceeded(reply, "One-shot breakpoint at any throw set"); } catch (Exception ex) { return finishReplyFailed(reply, ex.getMessage()); @@ -261,8 +259,8 @@ public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); final ArrayList<REPLMessage> infoMessages = new ArrayList<>(); - for (Breakpoint breakpoint : serverContext.getDebugEngine().getBreakpoints()) { - infoMessages.add(createBreakpointInfoMessage(breakpoint)); + for (Breakpoint breakpoint : serverContext.db().getBreakpoints()) { + infoMessages.add(createBreakpointInfoMessage(breakpoint, serverContext)); } if (infoMessages.size() > 0) { return infoMessages.toArray(new REPLMessage[0]); @@ -280,7 +278,7 @@ if (breakpointNumber == null) { return finishReplyFailed(reply, "missing breakpoint number"); } - final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); + final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); if (breakpoint == null) { return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); } @@ -295,7 +293,7 @@ @Override public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); - serverContext.getDebugEngine().prepareContinue(); + serverContext.prepareContinue(); return finishReplySucceeded(reply, "Continue mode entered"); } }; @@ -306,7 +304,7 @@ public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); int deleteCount = 0; - for (Breakpoint breakpoint : serverContext.getDebugEngine().getBreakpoints()) { + for (Breakpoint breakpoint : serverContext.db().getBreakpoints()) { breakpoint.dispose(); deleteCount++; } @@ -326,7 +324,7 @@ if (breakpointNumber == null) { return finishReplyFailed(reply, "missing breakpoint number"); } - final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); + final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); if (breakpoint == null) { return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); } @@ -345,7 +343,7 @@ if (breakpointNumber == null) { return finishReplyFailed(reply, "missing breakpoint number"); } - final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); + final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); if (breakpoint == null) { return finishReplyFailed(reply, "no breakpoint number " + breakpointNumber); } @@ -395,15 +393,14 @@ if (frameNumber == null) { return finishReplyFailed(reply, "no frame number specified"); } - final List<FrameDebugDescription> stack = serverContext.getDebugEngine().getStack(); + final List<FrameDebugDescription> stack = serverContext.getStack(); if (frameNumber < 0 || frameNumber >= stack.size()) { return finishReplyFailed(reply, "frame number " + frameNumber + " out of range"); } final FrameDebugDescription frameDescription = stack.get(frameNumber); final REPLMessage frameMessage = createFrameInfoMessage(serverContext, frameDescription); final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true); - final Language language = serverContext.getLanguage(); - final Visualizer visualizer = language.getDebugSupport().getVisualizer(); + final Visualizer visualizer = serverContext.getVisualizer(); final FrameDescriptor frameDescriptor = frame.getFrameDescriptor(); try { final StringBuilder sb = new StringBuilder(); @@ -452,7 +449,7 @@ return finishReplyFailed(message, "missing breakpoint number"); } message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); - final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); + final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); if (breakpoint == null) { return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); } @@ -462,7 +459,7 @@ } try { breakpoint.setCondition(expr); - } catch (DebugException ex) { + } catch (IOException ex) { return finishReplyFailed(message, "invalid condition for " + breakpointNumber); } catch (UnsupportedOperationException ex) { return finishReplyFailed(message, "conditions not unsupported by breakpoint " + breakpointNumber); @@ -481,7 +478,7 @@ if (repeat == null) { repeat = 1; } - serverContext.getDebugEngine().prepareStepInto(repeat); + serverContext.prepareStepInto(repeat); return finishReplySucceeded(reply, "StepInto <" + repeat + "> enabled"); } }; @@ -490,7 +487,7 @@ @Override public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { - serverContext.getDebugEngine().prepareStepOut(); + serverContext.prepareStepOut(); return finishReplySucceeded(createReply(), "StepOut enabled"); } }; @@ -504,7 +501,7 @@ if (repeat == null) { repeat = 1; } - debugServerContextFrame.getDebugEngine().prepareStepOver(repeat); + debugServerContextFrame.prepareStepOver(repeat); return finishReplySucceeded(reply, "StepOver <" + repeat + "> enabled"); } }; @@ -514,10 +511,10 @@ @Override public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); - final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter(); + final ASTPrinter astPrinter = serverContext.getVisualizer().getASTPrinter(); final String topic = request.get(REPLMessage.TOPIC); reply.put(REPLMessage.TOPIC, topic); - Node node = serverContext.getNode(); + Node node = serverContext.getNodeAtHalt(); if (node == null) { return finishReplyFailed(reply, "no current AST node"); } @@ -531,7 +528,7 @@ while (node.getParent() != null) { node = node.getParent(); } - final String astText = astPrinter.printTreeToString(node, depth, serverContext.getNode()); + final String astText = astPrinter.printTreeToString(node, depth, serverContext.getNodeAtHalt()); return finishReplySucceeded(reply, astText); case REPLMessage.SUBTREE: case REPLMessage.SUB: @@ -557,13 +554,13 @@ return finishReplyFailed(message, "missing breakpoint number"); } message.put(REPLMessage.BREAKPOINT_ID, Integer.toString(breakpointNumber)); - final Breakpoint breakpoint = serverContext.getDebugEngine().findBreakpoint(breakpointNumber); + final Breakpoint breakpoint = serverContext.findBreakpoint(breakpointNumber); if (breakpoint == null) { return finishReplyFailed(message, "no breakpoint number " + breakpointNumber); } try { breakpoint.setCondition(null); - } catch (DebugException e) { + } catch (IOException e) { return finishReplyFailed(message, e.getMessage()); } return finishReplyFailed(message, "Breakpoint " + breakpointNumber + " condition cleared"); @@ -575,8 +572,8 @@ @Override public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { final REPLMessage reply = createReply(); - final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter(); - final Node node = serverContext.getNode(); + final ASTPrinter astPrinter = serverContext.getVisualizer().getASTPrinter(); + final Node node = serverContext.getNodeAtHalt(); if (node == null) { return finishReplyFailed(reply, "no current AST node"); }