Use the new API to get properties of values.
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 }