comparison graal/com.oracle.truffle.tools.debug.shell/src/com/oracle/truffle/tools/debug/shell/server/REPLHandler.java @ 21890:894f82515e38

Truffle/APIs and Debugging: Evolutionary steps to integrating debugging and tool support with TruffleVM APIs - Add a version string to language registration: Language.getShortName() produces a string with both language and version - Rename SLMain --> SLLanguage (little change current machinery) - Remove DebugEngine dependence on ExecutionContext: Visualizer access migrated to TruffleLanguage - ExecutionContext now has only one method left: getCompilerOptions() - Rename SourceExecutionProvider to DebugSupportProvider, now supplied by implementing abstract TruffleLanguage.getDebugSupport() - Revise DebugEngine and its helper classes to work with the new APIs
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Tue, 09 Jun 2015 15:20:30 -0700
parents 3b8bbf51d320
children
comparison
equal deleted inserted replaced
21889:45083be8a812 21890:894f82515e38
24 */ 24 */
25 package com.oracle.truffle.tools.debug.shell.server; 25 package com.oracle.truffle.tools.debug.shell.server;
26 26
27 import java.util.*; 27 import java.util.*;
28 28
29 import com.oracle.truffle.api.*;
30 import com.oracle.truffle.api.frame.*; 29 import com.oracle.truffle.api.frame.*;
31 import com.oracle.truffle.api.instrument.*; 30 import com.oracle.truffle.api.instrument.*;
32 import com.oracle.truffle.api.nodes.*; 31 import com.oracle.truffle.api.nodes.*;
33 import com.oracle.truffle.api.source.*; 32 import com.oracle.truffle.api.source.*;
33 import com.oracle.truffle.api.vm.TruffleVM.Language;
34 import com.oracle.truffle.tools.debug.engine.*;
34 import com.oracle.truffle.tools.debug.shell.*; 35 import com.oracle.truffle.tools.debug.shell.*;
35 import com.oracle.truffle.tools.debug.engine.*;
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>
40 * The language-agnostic handlers are implemented here. 40 * The language-agnostic handlers are implemented here.
113 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED); 113 infoMessage.put(REPLMessage.STATUS, REPLMessage.SUCCEEDED);
114 return infoMessage; 114 return infoMessage;
115 } 115 }
116 116
117 protected static REPLMessage createFrameInfoMessage(final REPLServerContext serverContext, FrameDebugDescription frame) { 117 protected static REPLMessage createFrameInfoMessage(final REPLServerContext serverContext, FrameDebugDescription frame) {
118 final Visualizer visualizer = serverContext.getLanguageContext().getVisualizer(); 118 final Visualizer visualizer = serverContext.getLanguage().getDebugSupport().getVisualizer();
119 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.FRAME_INFO); 119 final REPLMessage infoMessage = new REPLMessage(REPLMessage.OP, REPLMessage.FRAME_INFO);
120 infoMessage.put(REPLMessage.FRAME_NUMBER, Integer.toString(frame.index())); 120 infoMessage.put(REPLMessage.FRAME_NUMBER, Integer.toString(frame.index()));
121 final Node node = frame.node(); 121 final Node node = frame.node();
122 122
123 infoMessage.put(REPLMessage.SOURCE_LOCATION, visualizer.displaySourceLocation(node)); 123 infoMessage.put(REPLMessage.SOURCE_LOCATION, visualizer.displaySourceLocation(node));
400 return finishReplyFailed(reply, "frame number " + frameNumber + " out of range"); 400 return finishReplyFailed(reply, "frame number " + frameNumber + " out of range");
401 } 401 }
402 final FrameDebugDescription frameDescription = stack.get(frameNumber); 402 final FrameDebugDescription frameDescription = stack.get(frameNumber);
403 final REPLMessage frameMessage = createFrameInfoMessage(serverContext, frameDescription); 403 final REPLMessage frameMessage = createFrameInfoMessage(serverContext, frameDescription);
404 final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true); 404 final Frame frame = frameDescription.frameInstance().getFrame(FrameInstance.FrameAccess.READ_ONLY, true);
405 final ExecutionContext context = serverContext.getLanguageContext(); 405 final Language language = serverContext.getLanguage();
406 final Visualizer visualizer = language.getDebugSupport().getVisualizer();
406 final FrameDescriptor frameDescriptor = frame.getFrameDescriptor(); 407 final FrameDescriptor frameDescriptor = frame.getFrameDescriptor();
407 try { 408 try {
408 final StringBuilder sb = new StringBuilder(); 409 final StringBuilder sb = new StringBuilder();
409 for (FrameSlot slot : frameDescriptor.getSlots()) { 410 for (FrameSlot slot : frameDescriptor.getSlots()) {
410 sb.append(Integer.toString(slot.getIndex()) + ": " + context.getVisualizer().displayIdentifier(slot) + " = "); 411 sb.append(Integer.toString(slot.getIndex()) + ": " + visualizer.displayIdentifier(slot) + " = ");
411 try { 412 try {
412 final Object value = frame.getValue(slot); 413 final Object value = frame.getValue(slot);
413 sb.append(context.getVisualizer().displayValue(context, value, 0)); 414 sb.append(visualizer.displayValue(value, 0));
414 } catch (Exception ex) { 415 } catch (Exception ex) {
415 sb.append("???"); 416 sb.append("???");
416 } 417 }
417 sb.append("\n"); 418 sb.append("\n");
418 } 419 }
511 public static final REPLHandler TRUFFLE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE) { 512 public static final REPLHandler TRUFFLE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE) {
512 513
513 @Override 514 @Override
514 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { 515 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) {
515 final REPLMessage reply = createReply(); 516 final REPLMessage reply = createReply();
516 final ASTPrinter astPrinter = serverContext.getLanguageContext().getVisualizer().getASTPrinter(); 517 final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter();
517 final String topic = request.get(REPLMessage.TOPIC); 518 final String topic = request.get(REPLMessage.TOPIC);
518 reply.put(REPLMessage.TOPIC, topic); 519 reply.put(REPLMessage.TOPIC, topic);
519 Node node = serverContext.getNode(); 520 Node node = serverContext.getNode();
520 if (node == null) { 521 if (node == null) {
521 return finishReplyFailed(reply, "no current AST node"); 522 return finishReplyFailed(reply, "no current AST node");
572 public static final REPLHandler TRUFFLE_NODE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE_NODE) { 573 public static final REPLHandler TRUFFLE_NODE_HANDLER = new REPLHandler(REPLMessage.TRUFFLE_NODE) {
573 574
574 @Override 575 @Override
575 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) { 576 public REPLMessage[] receive(REPLMessage request, REPLServerContext serverContext) {
576 final REPLMessage reply = createReply(); 577 final REPLMessage reply = createReply();
577 final ASTPrinter astPrinter = serverContext.getLanguageContext().getVisualizer().getASTPrinter(); 578 final ASTPrinter astPrinter = serverContext.getLanguage().getDebugSupport().getVisualizer().getASTPrinter();
578 final Node node = serverContext.getNode(); 579 final Node node = serverContext.getNode();
579 if (node == null) { 580 if (node == null) {
580 return finishReplyFailed(reply, "no current AST node"); 581 return finishReplyFailed(reply, "no current AST node");
581 } 582 }
582 583