From c8cd000563d467d23448731057c172e3d09fc728 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 15 Jun 2021 14:05:09 +0300 Subject: [PATCH] Simplify work with fake override methods in interpreter --- .../kotlin/ir/interpreter/state/Common.kt | 9 +++++---- .../kotlin/ir/interpreter/state/Complex.kt | 20 ++++++++----------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt index 137d1d2393e..6ed81f4603f 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.types.isNullableAny import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization import org.jetbrains.kotlin.ir.util.nameForIrSerialization +import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.name.Name internal class Common private constructor(override val irClass: IrClass, override val fields: MutableList) : Complex, StateWithClosure { @@ -46,25 +47,25 @@ internal class Common private constructor(override val irClass: IrClass, overrid } fun getEqualsFunction(): IrSimpleFunction { - val equalsFun = irClass.declarations + return irClass.declarations .filterIsInstance() .single { it.name == Name.identifier("equals") && it.dispatchReceiverParameter != null && it.valueParameters.size == 1 && it.valueParameters[0].type.isNullableAny() } - return getOverridden(equalsFun) + .let { it.resolveFakeOverride() as IrSimpleFunction } } fun getHashCodeFunction(): IrSimpleFunction { return irClass.declarations.filterIsInstance() .single { it.name.asString() == "hashCode" && it.valueParameters.isEmpty() } - .let { getOverridden(it) } + .let { it.resolveFakeOverride() as IrSimpleFunction } } fun getToStringFunction(): IrSimpleFunction { return irClass.declarations.filterIsInstance() .single { it.name.asString() == "toString" && it.valueParameters.isEmpty() } - .let { getOverridden(it) } + .let { it.resolveFakeOverride() as IrSimpleFunction } } fun createToStringIrCall(): IrCall { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt index ed2791b2c6c..d374810d27e 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt @@ -5,19 +5,19 @@ package org.jetbrains.kotlin.ir.interpreter.state -import org.jetbrains.kotlin.ir.interpreter.getLastOverridden -import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.stack.CallStack +import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.types.isAny -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization +import org.jetbrains.kotlin.ir.util.overrides +import org.jetbrains.kotlin.ir.util.resolveFakeOverride -internal interface Complex: State { +internal interface Complex : State { var superWrapperClass: Wrapper? var outerClass: Variable? @@ -38,18 +38,14 @@ internal interface Complex: State { } } - fun getOverridden(owner: IrSimpleFunction): IrSimpleFunction { - if (owner.parent == superWrapperClass?.irClass) return owner - if (!owner.isFakeOverride || owner.body != null || owner.parentAsClass.defaultType.isAny()) return owner - - val overriddenOwner = owner.overriddenSymbols.let { it.singleOrNull { it.owner.body != null } ?: it.singleOrNull() }?.owner - return overriddenOwner?.let { getOverridden(it) } ?: owner.getLastOverridden() as IrSimpleFunction + fun getRealFunction(owner: IrSimpleFunction): IrSimpleFunction { + return owner.resolveFakeOverride() as IrSimpleFunction } override fun getIrFunctionByIrCall(expression: IrCall): IrFunction? { val receiver = expression.superQualifierSymbol?.owner ?: irClass val irFunction = getIrFunctionFromGivenClass(receiver, expression.symbol) ?: return null - return getOverridden(irFunction as IrSimpleFunction) + return (irFunction as IrSimpleFunction).resolveFakeOverride() } fun loadOuterClassesInto(callStack: CallStack) {