Properly calculate safe call receivers

This commit is contained in:
Michael Bogdanov
2016-10-01 14:55:44 +03:00
committed by Dmitry Petrov
parent bc6f691405
commit e543972dad
6 changed files with 40 additions and 17 deletions
@@ -86,12 +86,9 @@ fun StatementGenerator.generateCallReceiver(
return when {
!isSafe ->
SimpleCallReceiver(dispatchReceiverValue, extensionReceiverValue)
extensionReceiverValue != null ->
extensionReceiverValue != null || dispatchReceiverValue != null->
SafeCallReceiver(this, ktDefaultElement.startOffset, ktDefaultElement.endOffset,
extensionReceiverValue.load(), dispatchReceiverValue, isAssignmentReceiver)
dispatchReceiverValue != null ->
SafeCallReceiver(this, ktDefaultElement.startOffset, ktDefaultElement.endOffset,
dispatchReceiverValue.load(), null, isAssignmentReceiver)
extensionReceiverValue, dispatchReceiverValue, isAssignmentReceiver)
else ->
throw AssertionError("Safe call should have an explicit receiver: ${ktDefaultElement.text}")
}
@@ -31,18 +31,18 @@ class SafeCallReceiver(
val generator: GeneratorWithScope,
val startOffset: Int,
val endOffset: Int,
val explicitReceiver: IrExpression,
val implicitDispatchReceiverValue: IntermediateValue?,
val extensionReceiver: IntermediateValue?,
val dispatchReceiver: IntermediateValue?,
val isAssignmentReceiver: Boolean
) : CallReceiver {
override fun call(withDispatchAndExtensionReceivers: (IntermediateValue?, IntermediateValue?) -> IrExpression): IrExpression {
val irTmp = generator.scope.createTemporaryVariable(explicitReceiver, "safe_receiver")
val irTmp = generator.scope.createTemporaryVariable(extensionReceiver?.load() ?: dispatchReceiver!!.load(), "safe_receiver")
val safeReceiverValue = VariableLValue(irTmp)
val dispatchReceiverValue: IntermediateValue
val dispatchReceiverValue: IntermediateValue?
val extensionReceiverValue: IntermediateValue?
if (implicitDispatchReceiverValue != null) {
dispatchReceiverValue = implicitDispatchReceiverValue
if (extensionReceiver != null) {
dispatchReceiverValue = dispatchReceiver
extensionReceiverValue = safeReceiverValue
}
else {