Debugger: Make calls to LocalVariableProxyImpl.type lazy

Avoid unnecessary calls to getType() in variables and fields.
This commit is contained in:
Yan Zhulanow
2019-06-20 20:18:36 +09:00
parent 91565076e2
commit 6fc801afd2
@@ -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<JdiType?>, val lazyValue: Lazy<Value?>) {
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<Field>.namedEntitySequence(owner: ObjectReference): Sequence<NamedEntity> {