From 00366197f88e35da518498047da6b62a61dfd283 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 10 Jun 2020 21:54:01 +0300 Subject: [PATCH] Implement interpretation of Enum class hashCode method --- .../backend/common/interpreter/IrInterpreter.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt index c946a59905d..2cdde04aa88 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt @@ -258,6 +258,17 @@ class IrInterpreter(irModule: IrModuleFragment) { } data.pushReturnValue(result.toState(irBuiltIns.stringType)) } + "hashCode" -> { + if (irFunction.parentAsClass.isEnumClass) { + var anyHashCode = irFunction as IrFunctionImpl + while (anyHashCode.overriddenSymbols.isNotEmpty()) { + anyHashCode = anyHashCode.overriddenSymbols.first().owner as IrFunctionImpl + } + calculateBuiltIns(anyHashCode as IrFunctionImpl, data) + } else { + throw AssertionError("Hash code function intrinsic is supported only for enum class") + } + } else -> throw AssertionError("Unsupported intrinsic ${irFunction.name}") } @@ -301,8 +312,6 @@ class IrInterpreter(irModule: IrModuleFragment) { val overriddenOwner = overridden.owner as IrFunctionImpl return when { - // TODO figure something better - superQualifier.irClassFqName() == "kotlin.Enum" && owner.name.asString() == "hashCode" -> calculateOverridden(overriddenOwner, newStates) overriddenOwner.body != null -> overriddenOwner.interpret(newStates) superQualifier.superType == null -> calculateBuiltIns(overriddenOwner, newStates) else -> calculateOverridden(overriddenOwner, newStates)