IR interpreter: fix f/o delegation from primitive classes

This commit is contained in:
Mikhail Glukhikh
2022-06-20 10:49:43 +02:00
committed by Space
parent a8ce4e827c
commit 8b4ae3bd70
2 changed files with 15 additions and 2 deletions
@@ -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
@@ -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<T>(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 {