From ce4128707fea4e80148d4e86f6f4b93e36500e18 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 8 Jun 2015 13:18:57 +0300 Subject: [PATCH] step into should stop in a different invocation of the same method --- .../com/intellij/debugger/engine/RequestHint.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java index 14226109565f..9cc66a60b93b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java @@ -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; } }