From de4ecc0117ebd441a397bb5137b53b69b010daf9 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 11 Nov 2016 13:25:54 +0300 Subject: [PATCH] IDEA-163730 Incorrect value of logic operation stringVar == "value" - cache string literal references on our side --- .../expression/LiteralEvaluator.java | 18 ++++++++++-------- .../debugger/jdi/VirtualMachineProxyImpl.java | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LiteralEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LiteralEvaluator.java index 0754fc7c9d34..f33cb466cb7c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LiteralEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/LiteralEvaluator.java @@ -62,15 +62,17 @@ class LiteralEvaluator implements Evaluator { return DebuggerUtilsEx.createValue(vm, myExpectedType, ((Number)myValue).longValue()); } if (myValue instanceof String) { - StringReference str = vm.mirrorOf((String)myValue); - // intern starting from jdk 7 - if (vm.versionHigher("1.7")) { - Method internMethod = ((ClassType)str.referenceType()).concreteMethodByName("intern", "()Ljava/lang/String;"); - if (internMethod != null) { - return context.getDebugProcess().invokeMethod(context, str, internMethod, Collections.emptyList()); + return vm.mirrorOfStringLiteral(((String)myValue), () -> { + StringReference str = vm.mirrorOf((String)myValue); + // intern starting from jdk 7 + if (vm.versionHigher("1.7")) { + Method internMethod = ((ClassType)str.referenceType()).concreteMethodByName("intern", "()Ljava/lang/String;"); + if (internMethod != null) { + return (StringReference)context.getDebugProcess().invokeMethod(context, str, internMethod, Collections.emptyList()); + } } - } - return str; + return str; + }); } throw EvaluateExceptionUtil .createEvaluateException(DebuggerBundle.message("evaluation.error.unknown.expression.type", myExpectedType)); diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java index ec48c6c5b860..0e6c8114e2fc 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java @@ -25,6 +25,7 @@ import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.DebuggerManagerThreadImpl; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.jdi.VirtualMachineProxy; +import com.intellij.debugger.impl.DebuggerUtilsImpl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ReflectionUtil; @@ -52,6 +53,8 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy { // cached data private final Map myObjectReferenceProxies = new HashMap<>(); + private final Map myStringLiteralCache = new HashMap<>(); + @NotNull private Map myAllThreads = new HashMap<>(); private final Map myThreadGroups = new HashMap<>(); @@ -328,6 +331,17 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy { return myVirtualMachine.mirrorOf(s); } + public StringReference mirrorOfStringLiteral(String s, DebuggerUtilsImpl.SupplierThrowing generator) + throws EvaluateException { + StringReference reference = myStringLiteralCache.get(s); + if (reference != null && !reference.isCollected()) { + return reference; + } + reference = generator.get(); + myStringLiteralCache.put(s, reference); + return reference; + } + public Process process() { return myVirtualMachine.process(); }