Don't cast receiver to super type on super calls
This commit is contained in:
+11
-8
@@ -214,25 +214,28 @@ class ExpressionCodegen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun generateCall(expression: IrMemberAccessExpression, superQualifier: ClassDescriptor?, data: BlockInfo): StackValue {
|
private fun generateCall(expression: IrMemberAccessExpression, superQualifier: ClassDescriptor?, data: BlockInfo): StackValue {
|
||||||
val callable = resolveToCallable(expression, superQualifier != null)
|
val isSuperCall = superQualifier != null
|
||||||
if (callable is IrIntrinsicFunction) {
|
val callable = resolveToCallable(expression, isSuperCall)
|
||||||
return callable.invoke(mv, this, data)
|
return if (callable is IrIntrinsicFunction) {
|
||||||
|
callable.invoke(mv, this, data)
|
||||||
} else {
|
} else {
|
||||||
return generateCall(expression, callable, data)
|
generateCall(expression, callable, data, isSuperCall)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateCall(expression: IrMemberAccessExpression, callable: Callable, data: BlockInfo): StackValue {
|
fun generateCall(expression: IrMemberAccessExpression, callable: Callable, data: BlockInfo, isSuperCall: Boolean = false): StackValue {
|
||||||
val callGenerator = getOrCreateCallGenerator(expression, expression.descriptor)
|
val callGenerator = getOrCreateCallGenerator(expression, expression.descriptor)
|
||||||
|
|
||||||
val receiver = expression.dispatchReceiver
|
val receiver = expression.dispatchReceiver
|
||||||
receiver?.apply {
|
receiver?.apply {
|
||||||
//gen(receiver, callable.dispatchReceiverType!!, data)
|
callGenerator.genValueAndPut(
|
||||||
callGenerator.genValueAndPut(null, this, callable.dispatchReceiverType!!, -1, this@ExpressionCodegen, data)
|
null, this,
|
||||||
|
if (isSuperCall) receiver.asmType else callable.dispatchReceiverType!!,
|
||||||
|
-1, this@ExpressionCodegen, data
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
expression.extensionReceiver?.apply {
|
expression.extensionReceiver?.apply {
|
||||||
//gen(this, callable.extensionReceiverType!!, data)
|
|
||||||
callGenerator.genValueAndPut(null, this, callable.extensionReceiverType!!, -1, this@ExpressionCodegen, data)
|
callGenerator.genValueAndPut(null, this, callable.extensionReceiverType!!, -1, this@ExpressionCodegen, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user