IR interpreter: fix f/o delegation from primitive classes
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user