Evaluate expr.
1.1 --- a/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java Fri Jan 31 11:39:25 2014 +0100
1.2 +++ b/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java Fri Jan 31 17:17:15 2014 +0100
1.3 @@ -62,7 +62,6 @@
1.4 import org.netbeans.api.annotations.common.NullAllowed;
1.5 import org.netbeans.api.debugger.DebuggerManager;
1.6 import org.netbeans.api.debugger.DebuggerManagerAdapter;
1.7 -import org.netbeans.api.debugger.DebuggerManagerListener;
1.8 import org.netbeans.api.debugger.Session;
1.9 import org.netbeans.api.debugger.jpda.CallStackFrame;
1.10 import org.netbeans.api.debugger.jpda.DebuggerStartException;
1.11 @@ -76,8 +75,6 @@
1.12 import org.openide.filesystems.FileObject;
1.13 import org.openide.filesystems.FileUtil;
1.14 import org.openide.filesystems.URLMapper;
1.15 -import org.openide.util.Exceptions;
1.16 -import org.openide.util.Lookup;
1.17 import org.openide.util.Parameters;
1.18
1.19 /**
1.20 @@ -90,6 +87,12 @@
1.21
1.22 //@GuardedBy("ActiveSessions.class")
1.23 private static ActiveSessions instance;
1.24 + private static final ThreadLocal<Boolean> inEval = new ThreadLocal<Boolean>() {
1.25 + @Override
1.26 + protected Boolean initialValue() {
1.27 + return Boolean.FALSE;
1.28 + }
1.29 + };
1.30
1.31 private final ConcurrentMap<Integer,Data> active;
1.32 private final AtomicInteger sequencer;
1.33 @@ -151,6 +154,9 @@
1.34 return data == null ? null : data.session;
1.35 }
1.36
1.37 + void setEval(boolean inEval) {
1.38 + ActiveSessions.inEval.set(inEval);
1.39 + }
1.40
1.41 @NonNull
1.42 static synchronized ActiveSessions getInstance() {
1.43 @@ -229,6 +235,9 @@
1.44 sendDisconnected();
1.45 }
1.46 } else if (JPDAThread.PROP_SUSPENDED.equals(propName)) {
1.47 + if (inEval.get() == Boolean.TRUE) {
1.48 + return;
1.49 + }
1.50 assert evt.getSource() == currentThread;
1.51 if (currentThread.isSuspended()) {
1.52 sendSuspend(currentThread);
2.1 --- a/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/EvalHandler.java Fri Jan 31 11:39:25 2014 +0100
2.2 +++ b/dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/EvalHandler.java Fri Jan 31 17:17:15 2014 +0100
2.3 @@ -45,6 +45,8 @@
2.4 import org.netbeans.api.debugger.Session;
2.5 import org.netbeans.api.debugger.jpda.InvalidExpressionException;
2.6 import org.netbeans.api.debugger.jpda.JPDADebugger;
2.7 +import org.netbeans.api.debugger.jpda.ObjectVariable;
2.8 +import org.netbeans.api.debugger.jpda.Variable;
2.9 import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl;
2.10 import org.netbeans.modules.dew4nb.endpoint.BasicRequestHandler;
2.11 import org.netbeans.modules.dew4nb.endpoint.RequestHandler;
2.12 @@ -83,14 +85,31 @@
2.13 if (!(jpda instanceof JPDADebuggerImpl)) {
2.14 throw new IllegalStateException("Wrong debugger service."); //NOI18N
2.15 }
2.16 + status = Status.done;
2.17 for (String toEval : request.getData()) {
2.18 - String value;
2.19 + String evaluated;
2.20 try {
2.21 - value = jpda.evaluate(toEval).getValue();
2.22 + final Variable var = jpda.evaluate(toEval);
2.23 + String value;
2.24 + if (var instanceof ObjectVariable) {
2.25 + ActiveSessions.getInstance().setEval(true);
2.26 + try {
2.27 + value = ((ObjectVariable)var).getToStringValue();
2.28 + } finally {
2.29 + ActiveSessions.getInstance().setEval(false);
2.30 + }
2.31 + } else {
2.32 + value = var.getValue();
2.33 + }
2.34 + final String type = var.getType();
2.35 + evaluated = String.format(
2.36 + "(%s) %s", //NOI18N
2.37 + type,
2.38 + value);
2.39 } catch (InvalidExpressionException ex) {
2.40 - value = null;
2.41 + evaluated = null;
2.42 }
2.43 - response.getValues().add(value);
2.44 + response.getValues().add(evaluated);
2.45 }
2.46 }
2.47 return status;