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.PrimitiveType
import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.* 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 { fun IrFunction.getLastOverridden(): IrFunction {
if (this !is IrSimpleFunction) return this 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.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.IrCall 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.interpreter.stack.Fields
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrType 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 { override fun getIrFunctionByIrCall(expression: IrCall): IrFunction {
val owner = expression.symbol.owner 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 { override fun toString(): String {