Use the new API to get properties of values. new_truffle_debug_multi
authormentlicher@netbeans.org
Mon, 21 Nov 2016 18:04:14 +0100
branchnew_truffle_debug_multi
changeset 313341d693d6dacfee
parent 313340 21468b64d603
child 313342 2057938d3a64
Use the new API to get properties of values.
debugger.jpda.truffle/external/binaries-list
debugger.jpda.truffle/nbproject/project.properties
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleStackVariable.java
debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java
debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java
debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java
     1.1 --- a/debugger.jpda.truffle/external/binaries-list	Fri Oct 21 11:38:33 2016 +0200
     1.2 +++ b/debugger.jpda.truffle/external/binaries-list	Mon Nov 21 18:04:14 2016 +0100
     1.3 @@ -1,2 +1,2 @@
     1.4 -1E47CB66111D4BE9E0BB81E763F750CB7BDAB8EB truffle-api-0.18-20160922.121100-22.jar
     1.5 -75732570B3066CDDE24F621D2F259C3EB27C8F45 truffle-sl-0.18-20160922.121114-22.jar
     1.6 +AFE481630977FEBA638C90BBFE6FDDCD29C43C7A truffle-api-0.20-20161119.074802-8.jar
     1.7 +CD21404BCD4A8BFF37EBF19D32562B2DDDE5EB73 truffle-sl-0.20-20161119.074817-8.jar
     2.1 --- a/debugger.jpda.truffle/nbproject/project.properties	Fri Oct 21 11:38:33 2016 +0200
     2.2 +++ b/debugger.jpda.truffle/nbproject/project.properties	Mon Nov 21 18:04:14 2016 +0100
     2.3 @@ -45,8 +45,8 @@
     2.4  javadoc.arch=${basedir}/arch.xml
     2.5  nbm.module.author=Martin Entlicher
     2.6  requires.nb.javac=true
     2.7 -truffle-backend.cp.extra=external/truffle-api-0.18-20160922.121100-22.jar
     2.8 -truffle.sl=external/truffle-sl-0.18-20160922.121114-22.jar
     2.9 +truffle-backend.cp.extra=external/truffle-api-0.20-20161119.074802-8.jar
    2.10 +truffle.sl=external/truffle-sl-0.20-20161119.074817-8.jar
    2.11  cp.extra=${tools.jar}:${truffle-backend.cp.extra}:${truffle.sl}
    2.12  test-unit-sys-prop.test.dir.src=${basedir}/test/unit/src/
    2.13  test-unit-sys-prop.netbeans.user=${basedir}/work/nb_user_dir
     3.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleStackVariable.java	Fri Oct 21 11:38:33 2016 +0200
     3.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleStackVariable.java	Mon Nov 21 18:04:14 2016 +0100
     3.3 @@ -55,18 +55,19 @@
     3.4      private final String name;
     3.5      private final String type;
     3.6      private final boolean writable;
     3.7 -    private String valueStr;
     3.8 -    private ObjectVariable value;
     3.9 -    private TruffleVariableImpl truffleVariable;
    3.10 +    private final String valueStr;
    3.11 +    private final ObjectVariable truffleObj;
    3.12 +    private final boolean leaf;
    3.13      
    3.14      public TruffleStackVariable(JPDADebugger debugger, String name, String type,
    3.15 -                                boolean writable, String valueStr, ObjectVariable value) {
    3.16 +                                boolean writable, String valueStr, ObjectVariable truffleObj) {
    3.17          this.debugger = debugger;
    3.18          this.name = name;
    3.19          this.type = type;
    3.20          this.writable = writable;
    3.21          this.valueStr = valueStr;
    3.22 -        this.value = value;
    3.23 +        this.truffleObj = truffleObj;
    3.24 +        this.leaf = TruffleVariableImpl.isLeaf(truffleObj);
    3.25      }
    3.26  
    3.27      @Override
    3.28 @@ -86,23 +87,11 @@
    3.29      
    3.30      @Override
    3.31      public boolean isLeaf() {
    3.32 -        if (truffleVariable == null) {
    3.33 -            if ("Object".equals(type)) {
    3.34 -                return false;
    3.35 -            } else {
    3.36 -                return true;
    3.37 -            }
    3.38 -        } else {
    3.39 -            return truffleVariable.isLeaf();
    3.40 -        }
    3.41 +        return leaf;
    3.42      }
    3.43      
    3.44      @Override
    3.45      public Object[] getChildren() {
    3.46 -        if (truffleVariable != null) {
    3.47 -            return truffleVariable.getChildren();
    3.48 -        } else {
    3.49 -            return new Object[] {};
    3.50 -        }
    3.51 +        return TruffleVariableImpl.getChildren(truffleObj);
    3.52      }
    3.53  }
     4.1 --- a/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java	Fri Oct 21 11:38:33 2016 +0200
     4.2 +++ b/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariableImpl.java	Mon Nov 21 18:04:14 2016 +0100
     4.3 @@ -59,8 +59,8 @@
     4.4      private static final String FIELD_TYPE = "type";                            // NOI18N
     4.5      private static final String FIELD_LEAF = "leaf";                            // NOI18N
     4.6      private static final String FIELD_DISPLAY_VALUE = "displayValue";           // NOI18N
     4.7 -    private static final String METHOD_GET_CHILDREN = "getChildren";            // NOI18N
     4.8 -    private static final String METHOD_GET_CHILDREN_SIG = "()[Ljava/lang/Object;";  // NOI18N
     4.9 +    private static final String METHOD_GET_CHILDREN = "getProperties";          // NOI18N
    4.10 +    private static final String METHOD_GET_CHILDREN_SIG = "()[Lorg/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject;";  // NOI18N
    4.11      
    4.12      private final ObjectVariable truffleObject;
    4.13      private final String name;
    4.14 @@ -98,22 +98,31 @@
    4.15                  return null;
    4.16              }
    4.17              String dispVal = (String) f.createMirrorObject();
    4.18 -            f = truffleObj.getField(FIELD_LEAF);
    4.19 -            if (f == null) {
    4.20 -                return null;
    4.21 -            }
    4.22 -            Boolean mirrorLeaf = (Boolean) f.createMirrorObject();
    4.23 -            boolean leaf;
    4.24 -            if (mirrorLeaf == null) {
    4.25 -                leaf = false;
    4.26 -            } else {
    4.27 -                leaf = mirrorLeaf;
    4.28 -            }
    4.29 +            boolean leaf = isLeaf(truffleObj);
    4.30              return new TruffleVariableImpl(truffleObj, name, type, dispVal, leaf);
    4.31          } else {
    4.32              return null;
    4.33          }
    4.34      }
    4.35 +
    4.36 +    static boolean isLeaf(ObjectVariable truffleObj) {
    4.37 +        Field f = truffleObj.getField(FIELD_LEAF);
    4.38 +        if (f == null) {
    4.39 +            try {
    4.40 +                throw new IllegalStateException("No "+FIELD_LEAF+" field in "+truffleObj.getToStringValue());
    4.41 +            } catch (InvalidExpressionException iex) {
    4.42 +                throw new IllegalStateException("No "+FIELD_LEAF+" field in "+truffleObj);
    4.43 +            }
    4.44 +        }
    4.45 +        Boolean mirrorLeaf = (Boolean) f.createMirrorObject();
    4.46 +        boolean leaf;
    4.47 +        if (mirrorLeaf == null) {
    4.48 +            leaf = false;
    4.49 +        } else {
    4.50 +            leaf = mirrorLeaf;
    4.51 +        }
    4.52 +        return leaf;
    4.53 +    }
    4.54      
    4.55      @Override
    4.56      public String getName() {
    4.57 @@ -141,6 +150,10 @@
    4.58      
    4.59      @Override
    4.60      public Object[] getChildren() {
    4.61 +        return getChildren(truffleObject);
    4.62 +    }
    4.63 +
    4.64 +    static Object[] getChildren(ObjectVariable truffleObject) {
    4.65          try {
    4.66              Variable children = truffleObject.invokeMethod(METHOD_GET_CHILDREN, METHOD_GET_CHILDREN_SIG, new Variable[] {});
    4.67              if (children instanceof ObjectVariable) {
     5.1 --- a/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java	Fri Oct 21 11:38:33 2016 +0200
     5.2 +++ b/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java	Mon Nov 21 18:04:14 2016 +0100
     5.3 @@ -374,7 +374,7 @@
     5.4              vars[vi + 1] = "";  // TODO
     5.5              vars[vi + 2] = value.isWriteable();
     5.6              vars[vi + 3] = value.as(String.class);
     5.7 -            vars[vi + 4] = value;
     5.8 +            vars[vi + 4] = new TruffleObject(value);
     5.9          }
    5.10          return vars;
    5.11      }
     6.1 --- a/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java	Fri Oct 21 11:38:33 2016 +0200
     6.2 +++ b/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/TruffleObject.java	Mon Nov 21 18:04:14 2016 +0100
     6.3 @@ -44,16 +44,9 @@
     6.4  
     6.5  package org.netbeans.modules.debugger.jpda.backend.truffle;
     6.6  
     6.7 -import com.oracle.truffle.api.ExecutionContext;
     6.8 -import com.oracle.truffle.api.debug.SuspendedEvent;
     6.9 -import com.oracle.truffle.api.frame.FrameInstance;
    6.10 -import com.oracle.truffle.api.frame.FrameSlotKind;
    6.11 -import com.oracle.truffle.api.object.DynamicObject;
    6.12 -import com.oracle.truffle.api.object.ObjectType;
    6.13 -import com.oracle.truffle.api.object.Property;
    6.14 -import java.util.ArrayList;
    6.15 +import com.oracle.truffle.api.debug.DebugValue;
    6.16 +import java.util.Collection;
    6.17  import java.util.List;
    6.18 -import java.util.Objects;
    6.19  
    6.20  /**
    6.21   *
    6.22 @@ -65,111 +58,62 @@
    6.23      
    6.24      final String name;
    6.25      final String type;
    6.26 -    final Object object;
    6.27      final String displayValue;
    6.28      final boolean leaf;
    6.29 -    final SuspendedEvent event;
    6.30 -    final FrameInstance fi;
    6.31 -    
    6.32 -    TruffleObject(String name, Object object, SuspendedEvent event, FrameInstance fi) {
    6.33 -        this.name = name;
    6.34 -        this.object = object;
    6.35 -        this.event = event;
    6.36 -        this.fi = fi;
    6.37 -        if (event != null) {
    6.38 -            this.displayValue = event.toString(object, fi);
    6.39 +    final boolean isArray;
    6.40 +    final Collection<DebugValue> properties;
    6.41 +    final List<DebugValue> array;
    6.42 +
    6.43 +    TruffleObject(DebugValue value) {
    6.44 +        this.name = value.getName();
    6.45 +        this.type = ""; // TODO?
    6.46 +        //this.object = value;
    6.47 +        this.displayValue = value.as(String.class);
    6.48 +        this.properties = value.getProperties();
    6.49 +        this.leaf = properties == null || properties.isEmpty();
    6.50 +        this.isArray = value.isArray();
    6.51 +        if (isArray) {
    6.52 +            this.array = value.getArray();
    6.53          } else {
    6.54 -            this.displayValue = Objects.toString(object);
    6.55 +            this.array = null;
    6.56          }
    6.57 -        if (object instanceof String) {
    6.58 -            this.type = String.class.getSimpleName();
    6.59 -        } else if (object instanceof Number) {
    6.60 -            this.type = object.getClass().getSimpleName();
    6.61 -        } else {
    6.62 -            this.type = FrameSlotKind.Object.name();
    6.63 -        }
    6.64 -        this.leaf = isLeaf(object);
    6.65 -        /*
    6.66 -        System.err.println("new TruffleObject("+name+", "+object+"): type = "+type+", displayValue = "+displayValue+", leaf = "+leaf);
    6.67 -        if (object != null) {
    6.68 -            System.err.println("Object's class = "+object.getClass()+", is DynamicObject = "+(object instanceof DynamicObject));
    6.69 -        }*/
    6.70 +        //System.err.println("new TruffleObject("+name+") displayValue = "+displayValue+", leaf = "+leaf+", properties = "+properties);
    6.71      }
    6.72  
    6.73 -    public Object[] getChildren() {
    6.74 +    public TruffleObject[] getProperties() {
    6.75          // TODO: Handle arrays in a special way
    6.76 -        return getChildrenGeneric();
    6.77 +        if (properties == null) {
    6.78 +            return new TruffleObject[]{};
    6.79 +        }
    6.80 +        int n = properties.size();
    6.81 +        TruffleObject[] children = new TruffleObject[n];
    6.82 +        int i = 0;
    6.83 +        for (DebugValue ch : properties) {
    6.84 +            children[i++] = new TruffleObject(ch);
    6.85 +        }
    6.86 +        return children;
    6.87      }
    6.88 -    
    6.89 -    private static boolean isLeaf(Object object) {
    6.90 -        return isLeafGeneric(object);
    6.91 +
    6.92 +    public int getArraySize() {
    6.93 +        return (array != null) ? array.size() : 0;
    6.94      }
    6.95 -    /*
    6.96 -    private static boolean isLeafJS(Object object) {
    6.97 -        if (object instanceof DynamicObject) {
    6.98 -            DynamicObject dobj = (DynamicObject) object;
    6.99 -            Iterable<Property> enumerableProperties = JSObject.getEnumerableProperties(dobj);
   6.100 -            return !enumerableProperties.iterator().hasNext();
   6.101 -        } else {
   6.102 -            return true;
   6.103 +
   6.104 +    public TruffleObject[] getArrayElements() {
   6.105 +        int n = getArraySize();
   6.106 +        TruffleObject[] elements = new TruffleObject[n];
   6.107 +        if (n == 0) {
   6.108 +            return elements;
   6.109          }
   6.110 -    }
   6.111 -    */
   6.112 -    private static boolean isLeafGeneric(Object object) {
   6.113 -        if (object instanceof DynamicObject) {
   6.114 -            List<Property> props = ((DynamicObject) object).getShape().getPropertyListInternal(true);
   6.115 -            return props.isEmpty();
   6.116 -            /*if (((DynamicObject) object).getShape().getPropertyCount() > 0 ) {//||
   6.117 -                //((DynamicObject) object).getShape().getEnumerablePropertyCount() > 0) {
   6.118 -                return false;
   6.119 -            } else {
   6.120 -                return true;
   6.121 -            }*/
   6.122 -        } else {
   6.123 -            return true;
   6.124 +        int i = 0;
   6.125 +        for (DebugValue elm : array) {
   6.126 +            elements[i++] = new TruffleObject(elm);
   6.127          }
   6.128 -    }
   6.129 -    /*
   6.130 -    private Object[] getChildrenJS() {
   6.131 -        //if (object instanceof JSObject) {
   6.132 -        //    JSObject jso = (JSObject) object;
   6.133 -        if (object instanceof DynamicObject) {
   6.134 -            DynamicObject dobj = (DynamicObject) object;
   6.135 -            Iterable<Property> enumerableProperties = JSObject.getEnumerableProperties(dobj);
   6.136 -            List<Object> ch = new ArrayList<>();
   6.137 -            for (Property p : enumerableProperties) {
   6.138 -                String name = p.getKey().toString();
   6.139 -                Object obj = JSObject.getProperty(dobj, name);
   6.140 -                //Object obj = p.get(dobj, );//jso.getProperty((JSContext) context, name);
   6.141 -                ch.add(new TruffleObject(visualizer, name, obj));
   6.142 -            }
   6.143 -            return ch.toArray();
   6.144 -        } else {
   6.145 -            return null;
   6.146 -        }
   6.147 -    }
   6.148 -    */
   6.149 -    private Object[] getChildrenGeneric() {
   6.150 -        if (object instanceof DynamicObject) {
   6.151 -            DynamicObject dobj = (DynamicObject) object;
   6.152 -            //System.err.println("getChildrenGeneric("+object+"): property count = "+dobj.getShape().getPropertyCount()+", property map = "+dobj.getShape().getPropertyMap()+", property list = "+dobj.getShape().getPropertyList());
   6.153 -            List<Property> props = dobj.getShape().getPropertyListInternal(true);
   6.154 -            int n = props.size();
   6.155 -            Object[] ch = new Object[n];
   6.156 -            for (int i = 0; i < n; i++) {
   6.157 -                String name = props.get(i).getKey().toString();
   6.158 -                Object obj = props.get(i).get(dobj, true);
   6.159 -                ch[i] = new TruffleObject(name, obj, event, fi);
   6.160 -            }
   6.161 -            return ch;
   6.162 -        } else {
   6.163 -            return null;
   6.164 -        }
   6.165 +        return elements;
   6.166      }
   6.167  
   6.168      @Override
   6.169      public String toString() {
   6.170          return name + " = " + displayValue;
   6.171      }
   6.172 -    
   6.173 +
   6.174  }