Debugger: Fix lvalue evaluation (KT-11663, KT-19980)

This commit is contained in:
Yan Zhulanow
2019-04-18 23:41:37 +03:00
parent bb0bc8a38a
commit 0a6a811c57
12 changed files with 174 additions and 51 deletions
@@ -36,6 +36,7 @@ class CodeFragmentCodegenInfo(
interface IParameter {
val targetDescriptor: DeclarationDescriptor
val targetType: KotlinType
val isLValue: Boolean
}
}
@@ -210,7 +211,7 @@ class CodeFragmentCodegen private constructor(
val asmType: Type
val stackValue: StackValue
val sharedAsmType = getSharedTypeIfApplicable(parameter.targetDescriptor, typeMapper)
val sharedAsmType = getSharedTypeIfApplicable(parameter, typeMapper)
if (sharedAsmType != null) {
asmType = sharedAsmType
val unwrappedType = typeMapper.mapType(parameter.targetType)
@@ -229,9 +230,15 @@ class CodeFragmentCodegen private constructor(
return CalculatedCodeFragmentCodegenInfo(parameters, methodSignature.returnType)
}
fun getSharedTypeIfApplicable(descriptor: DeclarationDescriptor, typeMapper: KotlinTypeMapper): Type? {
return when (descriptor) {
is LocalVariableDescriptor -> typeMapper.getSharedVarType(descriptor)
fun getSharedTypeIfApplicable(parameter: IParameter, typeMapper: KotlinTypeMapper): Type? {
return when (val descriptor = parameter.targetDescriptor) {
is LocalVariableDescriptor -> {
var result = typeMapper.getSharedVarType(descriptor)
if (result == null && parameter.isLValue) {
result = StackValue.sharedTypeForType(typeMapper.mapType(descriptor.type))
}
result
}
else -> null
}
}