Change getting function receiver for method with multiple overridden
This commit is contained in:
+5
-2
@@ -312,7 +312,7 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
// superQualifier is null for exception state => find method in builtins
|
// superQualifier is null for exception state => find method in builtins
|
||||||
return calculateBuiltIns(owner.getLastOverridden() as IrSimpleFunction, data)
|
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)))
|
val newStates = InterpreterFrame(mutableListOf(Variable(overridden.getReceiver()!!, superQualifier)))
|
||||||
owner.valueParameters.zip(overridden.owner.valueParameters)
|
owner.valueParameters.zip(overridden.owner.valueParameters)
|
||||||
@@ -398,7 +398,10 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
val rawDispatchReceiver = expression.dispatchReceiver
|
val rawDispatchReceiver = expression.dispatchReceiver
|
||||||
rawDispatchReceiver?.interpret(data)?.check { return it }
|
rawDispatchReceiver?.interpret(data)?.check { return it }
|
||||||
val dispatchReceiver = rawDispatchReceiver?.let { data.popReturnValue() }
|
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
|
// 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
|
val irFunction = irFunctionReceiver?.getIrFunction(expression.symbol.descriptor) ?: expression.symbol.owner
|
||||||
irFunctionReceiver?.let { receiverState ->
|
irFunctionReceiver?.let { receiverState ->
|
||||||
|
|||||||
Reference in New Issue
Block a user