Mercurial > hg > truffle
changeset 22462:460f85e7c64c
Truffle/REPL debugger: handle stack frames more explicitly
author | Michael Van De Vanter <michael.van.de.vanter@oracle.com> |
---|---|
date | Tue, 17 Nov 2015 19:41:18 -0800 |
parents | c17794973b64 |
children | a4dea4ed3339 |
files | truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/REPLMessage.java truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/REPLRemoteCommand.java truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/SimpleREPLClient.java truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java |
diffstat | 4 files changed, 27 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/REPLMessage.java Tue Nov 17 17:29:52 2015 -0800 +++ b/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/REPLMessage.java Tue Nov 17 19:41:18 2015 -0800 @@ -93,6 +93,9 @@ public static final String SET = "set"; public static final String SET_BREAK_CONDITION = "set-breakpoint-condition"; public static final String SET_LANGUAGE = "set-language"; + public static final String SLOT_ID = "slot-identifier"; + public static final String SLOT_INDEX = "slot-index"; + public static final String SLOT_VALUE = "slot-value"; public static final String SOURCE_LINE_TEXT = "source-line-text"; public static final String SOURCE_LOCATION = "source-location"; public static final String SOURCE_NAME = "source-name";
--- a/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/REPLRemoteCommand.java Tue Nov 17 17:29:52 2015 -0800 +++ b/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/REPLRemoteCommand.java Tue Nov 17 19:41:18 2015 -0800 @@ -504,9 +504,11 @@ context.selectFrameNumber(frameNumber); context.displayReply("Frame " + frameNumber + ":"); for (REPLMessage message : replies) { - for (String line : message.get(REPLMessage.DISPLAY_MSG).split("\n")) { - context.displayInfo(line); - } + final StringBuilder sb = new StringBuilder(); + sb.append("#" + message.get(REPLMessage.SLOT_INDEX) + ": "); + sb.append(message.get(REPLMessage.SLOT_ID) + " = "); + sb.append(message.get(REPLMessage.SLOT_VALUE)); + context.displayInfo(sb.toString()); } } }
--- a/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/SimpleREPLClient.java Tue Nov 17 17:29:52 2015 -0800 +++ b/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/client/SimpleREPLClient.java Tue Nov 17 19:41:18 2015 -0800 @@ -126,7 +126,7 @@ private final LocalOption listSizeOption = new IntegerOption(25, "listsize", "default number of lines to list"); - private final LocalOption traceMessagesOption = new BooleanOption(false, "tracemessages", "trace REPL messages between client and server"); + private final LocalOption traceMessagesOption = new BooleanOption(true, "tracemessages", "trace REPL messages between client and server"); private final LocalOption verboseBreakpointInfoOption = new BooleanOption(true, "verbosebreakpointinfo", "\"info breakpoint\" displays more info");
--- a/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java Tue Nov 17 17:29:52 2015 -0800 +++ b/truffle/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java Tue Nov 17 19:41:18 2015 -0800 @@ -445,36 +445,35 @@ @Override public REPLMessage[] receive(REPLMessage request, REPLServer replServer) { - final REPLMessage reply = createReply(); final Integer frameNumber = request.getIntValue(REPLMessage.FRAME_NUMBER); if (frameNumber == null) { - return finishReplyFailed(reply, "no frame number specified"); + return finishReplyFailed(createReply(), "no frame number specified"); } final List<FrameDebugDescription> stack = replServer.getCurrentContext().getStack(); if (frameNumber < 0 || frameNumber >= stack.size()) { - return finishReplyFailed(reply, "frame number " + frameNumber + " out of range"); + return finishReplyFailed(createReply(), "frame number " + frameNumber + " out of range"); } + final FrameDebugDescription frameDescription = stack.get(frameNumber); - final REPLMessage frameMessage = createFrameInfoMessage(replServer, frameDescription); final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true); final Visualizer visualizer = replServer.getVisualizer(); final FrameDescriptor frameDescriptor = frame.getFrameDescriptor(); - try { - final StringBuilder sb = new StringBuilder(); - for (FrameSlot slot : frameDescriptor.getSlots()) { - sb.append(Integer.toString(slot.getIndex()) + ": " + visualizer.displayIdentifier(slot) + " = "); - try { - final Object value = frame.getValue(slot); - sb.append(visualizer.displayValue(value, 0)); - } catch (Exception ex) { - sb.append("???"); - } - sb.append("\n"); - } - return finishReplySucceeded(frameMessage, sb.toString()); - } catch (Exception ex) { - return finishReplyFailed(frameMessage, ex); + final List<? extends FrameSlot> slots = frameDescriptor.getSlots(); + if (slots.size() == 0) { + final REPLMessage emptyFrameMessage = createFrameInfoMessage(replServer, frameDescription); + return finishReplySucceeded(emptyFrameMessage, "empty frame"); } + final ArrayList<REPLMessage> replies = new ArrayList<>(); + + for (FrameSlot slot : slots) { + final REPLMessage slotMessage = createFrameInfoMessage(replServer, frameDescription); + slotMessage.put(REPLMessage.SLOT_INDEX, Integer.toString(slot.getIndex())); + slotMessage.put(REPLMessage.SLOT_ID, visualizer.displayIdentifier(slot)); + slotMessage.put(REPLMessage.SLOT_VALUE, visualizer.displayValue(frame.getValue(slot), 0)); + slotMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); + replies.add(slotMessage); + } + return replies.toArray(new REPLMessage[0]); } };