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]);
         }
     };