Evaluate expr.
authorTomas Zezula <tzezula@netbeans.org>
Fri, 31 Jan 2014 17:17:15 +0100
changeset 18148e95910fa1d67
parent 18147 a337983c4e59
child 18149 9701fc78fe62
Evaluate expr.
dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/ActiveSessions.java
dew4nb/src/org/netbeans/modules/dew4nb/services/debugger/EvalHandler.java
     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;