diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt index 67b84dc07ed..7faa91551d9 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt @@ -117,7 +117,11 @@ fun IrFunctionAccessExpression.getBody(): IrBody? { return this.symbol.owner.body } -fun DeclarationDescriptor.isSubtypeOf(other: DeclarationDescriptor): Boolean { +fun DeclarationDescriptor.equalTo(other: DeclarationDescriptor): Boolean { + return this.isSubtypeOf(other) || this.hasSameNameAs(other) || this == other +} + +private fun DeclarationDescriptor.isSubtypeOf(other: DeclarationDescriptor): Boolean { if (this !is ReceiverParameterDescriptor || other !is ReceiverParameterDescriptor) return false return when { this.value is ImplicitClassReceiver && other.value is ImplicitClassReceiver -> this.value.type.isSubtypeOf(other.value.type) @@ -126,7 +130,7 @@ fun DeclarationDescriptor.isSubtypeOf(other: DeclarationDescriptor): Boolean { } } -fun DeclarationDescriptor.hasSameNameAs(other: DeclarationDescriptor): Boolean { +private fun DeclarationDescriptor.hasSameNameAs(other: DeclarationDescriptor): Boolean { return this is ValueParameterDescriptor && other is ValueParameterDescriptor && this.name == other.name } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Frame.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Frame.kt index f01bbc6cee5..f10be0a6334 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Frame.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/Frame.kt @@ -5,8 +5,7 @@ package org.jetbrains.kotlin.backend.common.interpreter.stack -import org.jetbrains.kotlin.backend.common.interpreter.hasSameNameAs -import org.jetbrains.kotlin.backend.common.interpreter.isSubtypeOf +import org.jetbrains.kotlin.backend.common.interpreter.equalTo import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import java.util.* @@ -39,9 +38,8 @@ class InterpreterFrame(val pool: MutableList = mutableListOf()) : Fram } override fun getVariableState(variableDescriptor: DeclarationDescriptor): State { - return pool.firstOrNull { - it.descriptor.isSubtypeOf(variableDescriptor) || it.descriptor.hasSameNameAs(variableDescriptor) || it.descriptor == variableDescriptor - }?.state ?: throw NoSuchElementException("Frame pool doesn't contains variable with descriptor $variableDescriptor") + return pool.firstOrNull { it.descriptor.equalTo(variableDescriptor) }?.state + ?: throw NoSuchElementException("Frame pool doesn't contains variable with descriptor $variableDescriptor") } override fun getAll(): List { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt index 75312362c07..ebfe3dfd406 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt @@ -5,8 +5,7 @@ package org.jetbrains.kotlin.backend.common.interpreter.stack -import org.jetbrains.kotlin.backend.common.interpreter.hasSameNameAs -import org.jetbrains.kotlin.backend.common.interpreter.isSubtypeOf +import org.jetbrains.kotlin.backend.common.interpreter.equalTo import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction @@ -62,9 +61,7 @@ class Complex(private var classOfObject: IrClass, private val values: MutableLis } override fun getState(descriptor: DeclarationDescriptor): State? { - return values.firstOrNull { - it.descriptor.isSubtypeOf(descriptor) || it.descriptor.hasSameNameAs(descriptor) || it.descriptor == descriptor - }?.state + return values.firstOrNull { it.descriptor.equalTo(descriptor) }?.state } override fun setState(newVar: Variable) {