Minor: reformat
This commit is contained in:
@@ -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<FieldInfo>): Pair<Int, Type>? {
|
||||
fun InstructionAdapter.generateClosureFieldsInitializationFromParameters(
|
||||
closure: CalculatedClosure,
|
||||
args: List<FieldInfo>
|
||||
): Pair<Int, Type>? {
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user