step into should stop in a different invocation of the same method
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Mon, 8 Jun 2015 10:18:57 +0000 (13:18 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Mon, 8 Jun 2015 10:22:10 +0000 (13:22 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java

index 14226109565f9c1426a26f3b4e657a877c6840ae..9cc66a60b93b98159651202a2cf01e20ac704bb1 100644 (file)
@@ -48,6 +48,7 @@ public class RequestHint {
   private final int myDepth;
   private final SourcePosition myPosition;
   private final int myFrameCount;
+  private boolean mySteppedOut = false;
 
   @Nullable
   private final MethodFilter myMethodFilter;
@@ -139,11 +140,14 @@ public class RequestHint {
     return myMethodFilter instanceof BreakpointStepMethodFilter || myTargetMethodMatched;
   }
 
-  private boolean isTheSameDepth(SuspendContextImpl context) {
+  private boolean isTheSameFrame(SuspendContextImpl context) {
+    if (mySteppedOut) return false;
     final ThreadReferenceProxyImpl contextThread = context.getThread();
     if (contextThread != null) {
       try {
-        return myFrameCount == contextThread.frameCount();
+        int currentDepth = contextThread.frameCount();
+        if (currentDepth < myFrameCount) mySteppedOut = true;
+        return currentDepth == myFrameCount;
       }
       catch (EvaluateException ignored) {
       }
@@ -170,7 +174,7 @@ public class RequestHint {
           frameProxy != null &&
           !(myMethodFilter instanceof BreakpointStepMethodFilter) &&
           myMethodFilter.locationMatches(context.getDebugProcess(), frameProxy.location()) &&
-          !isTheSameDepth(context)
+          !isTheSameFrame(context)
         ) {
         myTargetMethodMatched = true;
         return STOP;
@@ -181,7 +185,7 @@ public class RequestHint {
           public Integer compute() {
             final SourcePosition locationPosition = ContextUtil.getSourcePosition(context);
             if (locationPosition != null) {
-              if (myPosition.getFile().equals(locationPosition.getFile()) && isTheSameDepth(context)) {
+              if (myPosition.getFile().equals(locationPosition.getFile()) && isTheSameFrame(context) && !mySteppedOut) {
                 return isOnTheSameLine(locationPosition) ? myDepth : STOP;
               }
             }