From 6fc801afd200bbdd8b631a6ddf1680600e192690 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 20 Jun 2019 20:18:36 +0900 Subject: [PATCH] Debugger: Make calls to LocalVariableProxyImpl.type lazy Avoid unnecessary calls to getType() in variables and fields. --- .../evaluate/variables/VariableFinder.kt | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt index 89434286133..e186034ac08 100644 --- a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt +++ b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/variables/VariableFinder.kt @@ -123,14 +123,24 @@ class VariableFinder(val context: ExecutionContext) { class Result(val value: Value?) - private class NamedEntity(val name: String, val type: JdiType?, val value: () -> Value?) { + private class NamedEntity(val name: String, val lazyType: Lazy, val lazyValue: Lazy) { + val type: JdiType? + get() = lazyType.value + + val value: Value? + get() = lazyValue.value + companion object { fun of(field: Field, owner: ObjectReference): NamedEntity { - return NamedEntity(field.name(), field.safeType()) { owner.getValue(field) } + val type = lazy(LazyThreadSafetyMode.PUBLICATION) { field.safeType() } + val value = lazy(LazyThreadSafetyMode.PUBLICATION) { owner.getValue(field) } + return NamedEntity(field.name(), type, value) } fun of(variable: LocalVariableProxyImpl, frameProxy: StackFrameProxyImpl): NamedEntity { - return NamedEntity(variable.name(), variable.safeType()) { frameProxy.getValue(variable) } + val type = lazy(LazyThreadSafetyMode.PUBLICATION) { variable.safeType() } + val value = lazy(LazyThreadSafetyMode.PUBLICATION) { frameProxy.getValue(variable) } + return NamedEntity(variable.name(), type, value) } } } @@ -326,7 +336,7 @@ class VariableFinder(val context: ExecutionContext) { continue } - val rawValue = item.value() + val rawValue = item.value val result = evaluatorValueConverter.coerce(getUnwrapDelegate(kind, rawValue), kind.asmType) ?: continue if (!rawValue.isRefType && result.value.isRefType) { @@ -478,8 +488,8 @@ class VariableFinder(val context: ExecutionContext) { return evaluatorValueConverter.typeMatches(asmType, actualType) } - private fun NamedEntity.unwrapAndCheck(kind: VariableKind, value: () -> Value? = this.value): Result? { - return evaluatorValueConverter.coerce(getUnwrapDelegate(kind, value()), kind.asmType) + private fun NamedEntity.unwrapAndCheck(kind: VariableKind): Result? { + return evaluatorValueConverter.coerce(getUnwrapDelegate(kind, value), kind.asmType) } private fun List.namedEntitySequence(owner: ObjectReference): Sequence {