From 8b4ae3bd70eaeb9879642f4144f0b0cbdf6709b7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 20 Jun 2022 10:49:43 +0200 Subject: [PATCH] IR interpreter: fix f/o delegation from primitive classes --- .../org/jetbrains/kotlin/ir/interpreter/Utils.kt | 13 +++++++++++++ .../kotlin/ir/interpreter/state/Primitive.kt | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt index c5c9e2f0a40..5cce7de824f 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.interpreter import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.StandardNames +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* @@ -87,6 +88,18 @@ internal fun getPrimitiveClass(irType: IrType, asObject: Boolean = false): Class } } +fun IrFunction.getFirstNonInterfaceOverridden(): IrFunction { + if (this !is IrSimpleFunction) return this + + return generateSequence(listOf(this)) { + it.firstOrNull()?.overriddenSymbols?.map { overriddenSymbol -> overriddenSymbol.owner } + }.flatten().first { overriddenFunction -> + if (overriddenFunction.isFakeOverride) return@first false + val kind = overriddenFunction.parentClassOrNull?.kind + kind != ClassKind.INTERFACE + } +} + fun IrFunction.getLastOverridden(): IrFunction { if (this !is IrSimpleFunction) return this diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt index 443aeeaa426..fed467ddcba 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.ir.interpreter.state import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.IrCall -import org.jetbrains.kotlin.ir.interpreter.getLastOverridden +import org.jetbrains.kotlin.ir.interpreter.getFirstNonInterfaceOverridden import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType @@ -23,7 +23,7 @@ internal class Primitive(val value: T, val type: IrType) : State { override fun getIrFunctionByIrCall(expression: IrCall): IrFunction { val owner = expression.symbol.owner - return if (owner.isFakeOverride) owner.getLastOverridden() else owner + return if (owner.isFakeOverride) owner.getFirstNonInterfaceOverridden() else owner } override fun toString(): String {