Minor, extract function in FunctionReferenceLowering

Also simplify the expectedArity computation a few lines above.
This commit is contained in:
Alexander Udalov
2020-04-21 16:18:44 +02:00
parent b77e5a21ec
commit de461dd9a5
@@ -247,11 +247,9 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
val constructor = if (samSuperType != null) { val constructor = if (samSuperType != null) {
context.irBuiltIns.anyClass.owner.constructors.single() context.irBuiltIns.anyClass.owner.constructors.single()
} else { } else {
val expectedArity = when { val expectedArity =
adaptedReferenceOriginalTarget != null -> 5 + (if (boundReceiver != null) 1 else 0) if (isLambda && adaptedReferenceOriginalTarget == null) 1
isLambda -> 1 else 1 + (if (boundReceiver != null) 1 else 0) + (if (useOptimizedSuperClass) 4 else 0)
else -> 1 + (if (boundReceiver != null) 1 else 0) + (if (useOptimizedSuperClass) 4 else 0)
}
superType.getClass()!!.constructors.single { superType.getClass()!!.constructors.single {
it.valueParameters.size == expectedArity it.valueParameters.size == expectedArity
} }
@@ -259,12 +257,24 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
body = context.createJvmIrBuilder(symbol).run { body = context.createJvmIrBuilder(symbol).run {
irBlockBody(startOffset, endOffset) { irBlockBody(startOffset, endOffset) {
+irDelegatingConstructorCall(constructor).apply { +irDelegatingConstructorCall(constructor).also { call ->
if (samSuperType == null) { if (samSuperType == null) {
generateConstructorCallArguments(call) { irGet(valueParameters.first()) }
}
}
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, context.irBuiltIns.unitType)
}
}
}
private fun JvmIrBuilder.generateConstructorCallArguments(
call: IrFunctionAccessExpression,
generateBoundReceiver: IrBuilder.() -> IrExpression
) {
var index = 0 var index = 0
putValueArgument(index++, irInt(argumentTypes.size + if (irFunctionReference.isSuspend) 1 else 0)) call.putValueArgument(index++, irInt(argumentTypes.size + if (irFunctionReference.isSuspend) 1 else 0))
if (boundReceiver != null) { if (boundReceiver != null) {
putValueArgument(index++, irGet(valueParameters.first())) call.putValueArgument(index++, generateBoundReceiver())
} }
val callableReferenceTarget = when { val callableReferenceTarget = when {
adaptedReferenceOriginalTarget != null -> adaptedReferenceOriginalTarget adaptedReferenceOriginalTarget != null -> adaptedReferenceOriginalTarget
@@ -273,18 +283,10 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
} }
if (callableReferenceTarget != null) { if (callableReferenceTarget != null) {
val owner = calculateOwnerKClass(callableReferenceTarget.parent, backendContext) val owner = calculateOwnerKClass(callableReferenceTarget.parent, backendContext)
putValueArgument(index++, kClassToJavaClass(owner, backendContext)) call.putValueArgument(index++, kClassToJavaClass(owner, backendContext))
putValueArgument(index++, irString(callableReferenceTarget.originalName.asString())) call.putValueArgument(index++, irString(callableReferenceTarget.originalName.asString()))
putValueArgument(index++, generateSignature(callableReferenceTarget.symbol)) call.putValueArgument(index++, generateSignature(callableReferenceTarget.symbol))
putValueArgument( call.putValueArgument(index, irInt(getFunctionReferenceFlags(callableReferenceTarget)))
index,
irInt(getFunctionReferenceFlags(callableReferenceTarget))
)
}
}
}
+IrInstanceInitializerCallImpl(startOffset, endOffset, functionReferenceClass.symbol, context.irBuiltIns.unitType)
}
} }
} }