From 82acf7deb6d03cb0714da6e7d7cbf702c869873f Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 25 Mar 2020 15:39:20 +0300 Subject: [PATCH] Change getting function receiver for method with multiple overridden --- .../kotlin/backend/common/interpreter/IrInterpreter.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt index 43c2db179fa..e6ee2f10a6b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt @@ -312,7 +312,7 @@ class IrInterpreter(irModule: IrModuleFragment) { // superQualifier is null for exception state => find method in builtins return calculateBuiltIns(owner.getLastOverridden() as IrSimpleFunction, data) } - val overridden = owner.overriddenSymbols.first { it.getReceiver()?.equalTo(superQualifier.getReceiver()) == true } + val overridden = owner.overriddenSymbols.single() val newStates = InterpreterFrame(mutableListOf(Variable(overridden.getReceiver()!!, superQualifier))) owner.valueParameters.zip(overridden.owner.valueParameters) @@ -398,7 +398,10 @@ class IrInterpreter(irModule: IrModuleFragment) { val rawDispatchReceiver = expression.dispatchReceiver rawDispatchReceiver?.interpret(data)?.check { return it } val dispatchReceiver = rawDispatchReceiver?.let { data.popReturnValue() } - val irFunctionReceiver = if (expression.superQualifierSymbol == null) dispatchReceiver else (dispatchReceiver as Complex).superType + val irFunctionReceiver = when (expression.superQualifierSymbol) { + null -> dispatchReceiver + else -> (dispatchReceiver as Complex).superType?.takeIf { it.irClass.isSubclassOf(expression.superQualifierSymbol!!.owner) } + } // it is important firstly to add receiver, then arguments; this order is used in builtin method call val irFunction = irFunctionReceiver?.getIrFunction(expression.symbol.descriptor) ?: expression.symbol.owner irFunctionReceiver?.let { receiverState ->