Don't cast receiver to super type on super calls

This commit is contained in:
Mikhael Bogdanov
2017-11-30 14:08:23 +01:00
parent a936f75423
commit 4657ae06f4
@@ -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)
} }