diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/callableReferenceUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/callableReferenceUtil.kt index 879cfb23be6..acad038362b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/callableReferenceUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/callableReferenceUtil.kt @@ -28,26 +28,26 @@ import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter fun capturedBoundReferenceReceiver(ownerType: Type, expectedReceiverType: Type, isInliningStrategy: Boolean): StackValue = - StackValue.operation(expectedReceiverType) { iv -> - iv.load(0, ownerType) - iv.getfield( - ownerType.internalName, - //HACK for inliner - it should recognize field as captured receiver - if (isInliningStrategy) AsmUtil.CAPTURED_RECEIVER_FIELD else AsmUtil.BOUND_REFERENCE_RECEIVER, - AsmTypes.OBJECT_TYPE.descriptor - ) - StackValue.coerce(AsmTypes.OBJECT_TYPE, expectedReceiverType, iv) - } + StackValue.operation(expectedReceiverType) { iv -> + iv.load(0, ownerType) + iv.getfield( + ownerType.internalName, + //HACK for inliner - it should recognize field as captured receiver + if (isInliningStrategy) AsmUtil.CAPTURED_RECEIVER_FIELD else AsmUtil.BOUND_REFERENCE_RECEIVER, + AsmTypes.OBJECT_TYPE.descriptor + ) + StackValue.coerce(AsmTypes.OBJECT_TYPE, expectedReceiverType, iv) + } fun ClassDescriptor.isSyntheticClassForCallableReference(): Boolean = - this is SyntheticClassDescriptorForLambda && - (this.source as? KotlinSourceElement)?.psi is KtCallableReferenceExpression + this is SyntheticClassDescriptorForLambda && + (this.source as? KotlinSourceElement)?.psi is KtCallableReferenceExpression fun CalculatedClosure.isForCallableReference(): Boolean = - closureClass.isSyntheticClassForCallableReference() + closureClass.isSyntheticClassForCallableReference() fun CalculatedClosure.isForBoundCallableReference(): Boolean = - isForCallableReference() && capturedReceiverFromOuterContext != null + isForCallableReference() && capturedReceiverFromOuterContext != null fun InstructionAdapter.loadBoundReferenceReceiverParameter(index: Int, type: Type) { load(index, type) @@ -55,10 +55,13 @@ fun InstructionAdapter.loadBoundReferenceReceiverParameter(index: Int, type: Typ } fun CalculatedClosure.isBoundReferenceReceiverField(fieldInfo: FieldInfo): Boolean = - isForBoundCallableReference() && - fieldInfo.fieldName == AsmUtil.CAPTURED_RECEIVER_FIELD + isForBoundCallableReference() && + fieldInfo.fieldName == AsmUtil.CAPTURED_RECEIVER_FIELD -fun InstructionAdapter.generateClosureFieldsInitializationFromParameters(closure: CalculatedClosure, args: List): Pair? { +fun InstructionAdapter.generateClosureFieldsInitializationFromParameters( + closure: CalculatedClosure, + args: List +): Pair? { var k = 1 var boundReferenceReceiverParameterIndex = -1 var boundReferenceReceiverType: Type? = null @@ -82,11 +85,12 @@ fun InstructionAdapter.generateClosureFieldsInitializationFromParameters(closure fun computeExpectedNumberOfReceivers(referencedFunction: FunctionDescriptor, isBound: Boolean): Int { val receivers = (if (referencedFunction.dispatchReceiverParameter != null) 1 else 0) + - (if (referencedFunction.extensionReceiverParameter != null) 1 else 0) - - (if (isBound) 1 else 0) + (if (referencedFunction.extensionReceiverParameter != null) 1 else 0) - + (if (isBound) 1 else 0) if (receivers < 0 && referencedFunction is ConstructorDescriptor && - DescriptorUtils.isObject(referencedFunction.containingDeclaration.containingDeclaration)) { + DescriptorUtils.isObject(referencedFunction.containingDeclaration.containingDeclaration) + ) { //reference to object nested class //TODO: seems problem should be fixed on frontend side (note that object instance are captured by generated class) return 0