Watches and tooltips are using the TruffleObject now. truffle_debug
authormentlicher@netbeans.org
Fri, 12 Dec 2014 16:18:31 +0100
branchtruffle_debug
changeset 293110237eba15362d
parent 293109 67c872b8203a
child 293114 234526f8abcf
Watches and tooltips are using the TruffleObject now.
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleEval.java
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/resources/JPDATruffleBackend.jar
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesTableModel.java
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/tooltip/ToolTipAnnotation.java
debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java
debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java
     1.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleEval.java	Fri Dec 12 14:41:01 2014 +0100
     1.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleEval.java	Fri Dec 12 16:18:31 2014 +0100
     1.3 @@ -59,7 +59,7 @@
     1.4  public class TruffleEval {
     1.5      
     1.6      private static final String METHOD_EVALUATE = "evaluate";                   // NOI18N
     1.7 -    private static final String METHOD_EVALUATE_SIG = "(Ljava/lang/String;)Ljava/lang/String;"; // NOI18N
     1.8 +    private static final String METHOD_EVALUATE_SIG = "(Ljava/lang/String;)Ljava/lang/Object;"; // NOI18N
     1.9      private static final String METHOD_EVALUATE_ON_FRAME_SIG = "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;"; // NOI18N
    1.10      
    1.11      private TruffleEval() {}
     2.1 Binary file debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/resources/JPDATruffleBackend.jar has changed
     3.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java	Fri Dec 12 14:41:01 2014 +0100
     3.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java	Fri Dec 12 16:18:31 2014 +0100
     3.3 @@ -81,24 +81,33 @@
     3.4      public static TruffleVariableImpl get(Variable var) {
     3.5          if (TRUFFLE_OBJECT_TYPE.equals(var.getType())) {
     3.6              ObjectVariable truffleObj = (ObjectVariable) var;
     3.7 -            String name = (String) truffleObj.getField(FIELD_NAME).createMirrorObject();
     3.8 -            String type = (String) truffleObj.getField(FIELD_TYPE).createMirrorObject();
     3.9 -            String dispVal = (String) truffleObj.getField(FIELD_DISPLAY_VALUE).createMirrorObject();
    3.10 +            //System.err.println("TruffleVariableImpl.get("+var+") fields on "+truffleObj+", class "+truffleObj.getClassType().getName());
    3.11 +            // The inner value can change in watches.
    3.12 +            Field f = truffleObj.getField(FIELD_NAME);
    3.13 +            if (f == null) {
    3.14 +                return null;
    3.15 +            }
    3.16 +            String name = (String) f.createMirrorObject();
    3.17 +            f = truffleObj.getField(FIELD_TYPE);
    3.18 +            if (f == null) {
    3.19 +                return null;
    3.20 +            }
    3.21 +            String type = (String) f.createMirrorObject();
    3.22 +            f = truffleObj.getField(FIELD_DISPLAY_VALUE);
    3.23 +            if (f == null) {
    3.24 +                return null;
    3.25 +            }
    3.26 +            String dispVal = (String) f.createMirrorObject();
    3.27 +            f = truffleObj.getField(FIELD_LEAF);
    3.28 +            if (f == null) {
    3.29 +                return null;
    3.30 +            }
    3.31 +            Boolean mirrorLeaf = (Boolean) f.createMirrorObject();
    3.32              boolean leaf;
    3.33 -            if (truffleObj.getField(FIELD_LEAF) == null) {
    3.34 -                System.err.println("No "+FIELD_LEAF+" field on "+truffleObj+", class "+truffleObj.getClassType().getName());
    3.35 +            if (mirrorLeaf == null) {
    3.36                  leaf = false;
    3.37              } else {
    3.38 -                try {
    3.39 -                    leaf = (Boolean) truffleObj.getField(FIELD_LEAF).createMirrorObject();
    3.40 -                } catch (NullPointerException npe) {
    3.41 -                    Boolean mirrorLeaf = (Boolean) truffleObj.getField(FIELD_LEAF).createMirrorObject();
    3.42 -                    if (mirrorLeaf == null) {
    3.43 -                        leaf = false;
    3.44 -                    } else {
    3.45 -                        leaf = mirrorLeaf;
    3.46 -                    }
    3.47 -                }
    3.48 +                leaf = mirrorLeaf;
    3.49              }
    3.50              return new TruffleVariableImpl(truffleObj, name, type, dispVal, leaf);
    3.51          } else {
     4.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesTableModel.java	Fri Dec 12 14:41:01 2014 +0100
     4.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesTableModel.java	Fri Dec 12 16:18:31 2014 +0100
     4.3 @@ -44,14 +44,19 @@
     4.4  
     4.5  import org.netbeans.api.debugger.jpda.JPDADebugger;
     4.6  import org.netbeans.api.debugger.jpda.JPDAWatch;
     4.7 +import org.netbeans.api.debugger.jpda.Variable;
     4.8  import org.netbeans.modules.debugger.jpda.truffle.access.TruffleStrataProvider;
     4.9  import org.netbeans.modules.debugger.jpda.truffle.vars.TruffleVariable;
    4.10 +import org.netbeans.modules.debugger.jpda.truffle.vars.TruffleVariableImpl;
    4.11  import org.netbeans.spi.debugger.ContextProvider;
    4.12  import org.netbeans.spi.debugger.DebuggerServiceRegistration;
    4.13  import org.netbeans.spi.debugger.DebuggerServiceRegistrations;
    4.14  import static org.netbeans.spi.debugger.ui.Constants.LOCALS_TO_STRING_COLUMN_ID;
    4.15  import static org.netbeans.spi.debugger.ui.Constants.LOCALS_TYPE_COLUMN_ID;
    4.16  import static org.netbeans.spi.debugger.ui.Constants.LOCALS_VALUE_COLUMN_ID;
    4.17 +import static org.netbeans.spi.debugger.ui.Constants.WATCH_TO_STRING_COLUMN_ID;
    4.18 +import static org.netbeans.spi.debugger.ui.Constants.WATCH_TYPE_COLUMN_ID;
    4.19 +import static org.netbeans.spi.debugger.ui.Constants.WATCH_VALUE_COLUMN_ID;
    4.20  import org.netbeans.spi.viewmodel.ModelListener;
    4.21  import org.netbeans.spi.viewmodel.TableHTMLModel;
    4.22  import org.netbeans.spi.viewmodel.TableHTMLModelFilter;
    4.23 @@ -79,17 +84,29 @@
    4.24  
    4.25      @Override
    4.26      public Object getValueAt(TableModel original, Object node, String columnID) throws UnknownTypeException {
    4.27 -        /*if (node instanceof JPDAWatch && !isEnabled((JPDAWatch) node)) {
    4.28 -            return original.getValueAt(node, columnID);
    4.29 -        }*/
    4.30 +        TruffleVariable tv = null;
    4.31 +        if (node instanceof JPDAWatch) {// && !isEnabled((JPDAWatch) node)) {
    4.32 +            Object orig = original.getValueAt(node, columnID); // Call in any case because of error displaying
    4.33 +            if (node instanceof Variable) {
    4.34 +                tv = TruffleVariableImpl.get((Variable) node);
    4.35 +            }
    4.36 +            if (tv == null) {
    4.37 +                return orig;
    4.38 +            }
    4.39 +        }
    4.40          if (node instanceof TruffleVariable) {
    4.41 -            TruffleVariable tv = (TruffleVariable) node;
    4.42 +            tv = (TruffleVariable) node;
    4.43 +        }
    4.44 +        if (tv != null) {
    4.45              switch (columnID) {
    4.46                  case LOCALS_TYPE_COLUMN_ID:
    4.47 +                case WATCH_TYPE_COLUMN_ID:
    4.48                      return tv.getType();
    4.49                  case LOCALS_VALUE_COLUMN_ID:
    4.50 +                case WATCH_VALUE_COLUMN_ID:
    4.51                      return tv.getValue();
    4.52                  case LOCALS_TO_STRING_COLUMN_ID:
    4.53 +                case WATCH_TO_STRING_COLUMN_ID:
    4.54                      Object var = tv.getValue();
    4.55                      return String.valueOf(var);
    4.56              }
     5.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/tooltip/ToolTipAnnotation.java	Fri Dec 12 14:41:01 2014 +0100
     5.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/tooltip/ToolTipAnnotation.java	Fri Dec 12 16:18:31 2014 +0100
     5.3 @@ -61,6 +61,7 @@
     5.4  import org.netbeans.api.debugger.jpda.Variable;
     5.5  import org.netbeans.modules.debugger.jpda.truffle.access.TruffleEval;
     5.6  import org.netbeans.modules.debugger.jpda.truffle.access.TruffleStrataProvider;
     5.7 +import org.netbeans.modules.debugger.jpda.truffle.vars.TruffleVariableImpl;
     5.8  import org.netbeans.spi.debugger.ui.EditorContextDispatcher;
     5.9  import org.openide.cookies.EditorCookie;
    5.10  import org.openide.loaders.DataObject;
    5.11 @@ -200,7 +201,18 @@
    5.12              }
    5.13              toolTipText = expression + " = " + DebuggerSupport.getVarValue(d, result);
    5.14                      */
    5.15 -            toolTipText = expression + " = " + TruffleEval.evaluate(d, expression).getValue();
    5.16 +            Variable result = TruffleEval.evaluate(d, expression);
    5.17 +            if (result == null) {
    5.18 +                return ; // Something went wrong...
    5.19 +            }
    5.20 +            TruffleVariableImpl tv = TruffleVariableImpl.get(result);
    5.21 +            String displayVal;
    5.22 +            if (tv != null) {
    5.23 +                displayVal = tv.getDisplayValue();
    5.24 +            } else {
    5.25 +                displayVal = result.getValue();
    5.26 +            }
    5.27 +            toolTipText = expression + " = " + displayVal;
    5.28          } catch (InvalidExpressionException ex) {
    5.29              toolTipText = expression + " = >" + ex.getMessage () + "<";
    5.30          }
     6.1 --- a/debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java	Fri Dec 12 14:41:01 2014 +0100
     6.2 +++ b/debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java	Fri Dec 12 16:18:31 2014 +0100
     6.3 @@ -335,7 +335,7 @@
     6.4          ((Breakpoint) br).dispose();
     6.5      }
     6.6      
     6.7 -    static String evaluate(String expression) {
     6.8 +    static String evaluateToStr(String expression) {
     6.9          //System.err.println("evaluate("+expression+")");
    6.10          final Source source = Source.fromText(expression, "EVAL");
    6.11          Object value = debugManager.eval(source);
    6.12 @@ -349,6 +349,21 @@
    6.13          return strValue;
    6.14      }
    6.15      
    6.16 +    static Object evaluate(String expression) {
    6.17 +        //System.err.println("evaluate("+expression+")");
    6.18 +        final Source source = Source.fromText(expression, "EVAL");
    6.19 +        Object value = debugManager.eval(source);
    6.20 +        //System.err.println("  value = "+value);
    6.21 +        if (value == null) {
    6.22 +            return null;
    6.23 +        }
    6.24 +        ExecutionContext context = debugManager.getContext();
    6.25 +        Visualizer visualizer = context.getVisualizer();
    6.26 +        String strValue = visualizer.displayValue(context, value);
    6.27 +        TruffleObject to = new TruffleObject(context, strValue, value);
    6.28 +        return to;
    6.29 +    }
    6.30 +    
    6.31      static Object evaluate(String expression, Object frameInstance) {
    6.32          FrameInstance fi = (FrameInstance) frameInstance;
    6.33          MaterializedFrame frame = fi.getFrame(FrameInstance.FrameAccess.MATERIALIZE, true).materialize();
     7.1 --- a/debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java	Fri Dec 12 14:41:01 2014 +0100
     7.2 +++ b/debugger.jpda.truffle/truffle_backend/JPDATruffleBackend/src/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java	Fri Dec 12 16:18:31 2014 +0100
     7.3 @@ -35,6 +35,8 @@
     7.4          this.displayValue = context.getVisualizer().displayValue(context, object);
     7.5          if (object instanceof String) {
     7.6              this.type = String.class.getSimpleName();
     7.7 +        } else if (object instanceof Number) {
     7.8 +            this.type = object.getClass().getSimpleName();
     7.9          } else {
    7.10              this.type = FrameSlotKind.Object.name();
    7.11          }