IDEA-139945 When putting a watch on a breakpoint, Java debugger produces a boxed...
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 14 May 2015 13:28:30 +0000 (16:28 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Thu, 14 May 2015 13:30:23 +0000 (16:30 +0300)
java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/MethodEvaluator.java

index bb36ecf04672b1318b309981b7fb92c3e243f83f..7a2aa5b3634bd60b761ed8e27cdd8c3c8f2cb51c 100644 (file)
@@ -30,6 +30,7 @@ import com.intellij.debugger.impl.ClassLoadingUtils;
 import com.intellij.debugger.impl.DebuggerUtilsEx;
 import com.intellij.debugger.jdi.VirtualMachineProxyImpl;
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.util.SystemInfo;
 import com.intellij.rt.debugger.DefaultMethodInvoker;
 import com.sun.jdi.*;
 
@@ -47,6 +48,9 @@ public class MethodEvaluator implements Evaluator {
   private final boolean myCheckDefaultInterfaceMethod;
   private final boolean myMustBeVararg;
 
+  // see IDEA-139945, corresponding jdk bug was fixed in 8u45
+  private static boolean ourUseDefaultInvoker = !SystemInfo.isJavaVersionAtLeast("1.8.0_45");
+
   public MethodEvaluator(Evaluator objectEvaluator,
                          JVMName className,
                          String methodName,
@@ -180,7 +184,7 @@ public class MethodEvaluator implements Evaluator {
         return debugProcess.invokeInstanceMethod(context, objRef, jdiMethod, args, ObjectReference.INVOKE_NONVIRTUAL);
       }
       // fix for default methods in interfaces, see IDEA-124066
-      if (myCheckDefaultInterfaceMethod && jdiMethod.declaringType() instanceof InterfaceType) {
+      if (ourUseDefaultInvoker && myCheckDefaultInterfaceMethod && jdiMethod.declaringType() instanceof InterfaceType) {
         try {
           return invokeDefaultMethod(debugProcess, context, objRef, myMethodName);
         } catch (EvaluateException e) {