Properly calculate safe call receivers
This commit is contained in:
committed by
Dmitry Petrov
parent
bc6f691405
commit
e543972dad
+2
-5
@@ -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}")
|
||||
}
|
||||
|
||||
+6
-6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user