From 64b48f4458e183bba480112c33a0a60d77ac3c32 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 23 Dec 2015 23:39:16 +0300 Subject: [PATCH] Drop compatibility flag, suppressing optimized generation of delegated property metadata --- .../kotlin/codegen/ExpressionCodegen.java | 10 ++-- .../kotlin/codegen/MemberCodegen.java | 47 +++++++------------ .../codegen/PropertyReferenceCodegen.kt | 11 ++--- .../build.log | 3 -- .../build.log | 3 -- 5 files changed, 25 insertions(+), 49 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 59fbb73f72f..bf2d437fffe 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2732,19 +2732,17 @@ public class ExpressionCodegen extends KtVisitor impleme VariableDescriptor variableDescriptor = bindingContext.get(VARIABLE, expression); if (variableDescriptor != null) { - return generatePropertyReference(expression, variableDescriptor, (VariableDescriptor) resolvedCall.getResultingDescriptor(), - resolvedCall.getDispatchReceiver()); + return generatePropertyReference(expression, variableDescriptor, resolvedCall); } throw new UnsupportedOperationException("Unsupported callable reference expression: " + expression.getText()); } @NotNull - public StackValue generatePropertyReference( + private StackValue generatePropertyReference( @NotNull KtElement element, @NotNull VariableDescriptor variableDescriptor, - @NotNull VariableDescriptor target, - @Nullable ReceiverValue dispatchReceiver + @NotNull ResolvedCall resolvedCall ) { ClassDescriptor classDescriptor = CodegenBinding.anonymousClassForCallable(bindingContext, variableDescriptor); @@ -2756,7 +2754,7 @@ public class ExpressionCodegen extends KtVisitor impleme PropertyReferenceCodegen codegen = new PropertyReferenceCodegen( state, parentCodegen, context.intoAnonymousClass(classDescriptor, this, OwnerKind.IMPLEMENTATION), - element, classBuilder, classDescriptor, target, dispatchReceiver + element, classBuilder, resolvedCall ); codegen.generate(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 91f5eea8a08..82fd5f3645e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.jvm.AsmTypes; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; -import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver; import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.storage.NotNullLazyValue; @@ -498,37 +497,23 @@ public abstract class MemberCodegen", - Type.getMethodDescriptor(Type.VOID_TYPE, K_DECLARATION_CONTAINER_TYPE, JAVA_STRING_TYPE, JAVA_STRING_TYPE), false - ); - value = StackValue.onStack(implType); - Method wrapper = PropertyReferenceCodegen.getWrapperMethodForPropertyReference(property, receiverCount); - iv.invokestatic(REFLECTION, wrapper.getName(), wrapper.getDescriptor(), false); - } - else { - ReceiverParameterDescriptor dispatchReceiver = property.getDispatchReceiverParameter(); + int receiverCount = (property.getDispatchReceiverParameter() != null ? 1 : 0) + + (property.getExtensionReceiverParameter() != null ? 1 : 0); + Type implType = property.isVar() ? MUTABLE_PROPERTY_REFERENCE_IMPL[receiverCount] : PROPERTY_REFERENCE_IMPL[receiverCount]; + iv.anew(implType); + iv.dup(); + // TODO: generate the container once and save to a local field instead (KT-10495) + ClosureCodegen.generateCallableReferenceDeclarationContainer(iv, property, state); + iv.aconst(property.getName().asString()); + iv.aconst(PropertyReferenceCodegen.getPropertyReferenceSignature(property, state)); + iv.invokespecial( + implType.getInternalName(), "", + Type.getMethodDescriptor(Type.VOID_TYPE, K_DECLARATION_CONTAINER_TYPE, JAVA_STRING_TYPE, JAVA_STRING_TYPE), false + ); + Method wrapper = PropertyReferenceCodegen.getWrapperMethodForPropertyReference(property, receiverCount); + iv.invokestatic(REFLECTION, wrapper.getName(), wrapper.getDescriptor(), false); - //noinspection ConstantConditions - value = createOrGetClInitCodegen().generatePropertyReference( - delegatedProperties.get(i).getDelegate(), property, property, - dispatchReceiver != null ? new TransientReceiver(dispatchReceiver.getType()) : null - ); - } - - value.put(K_PROPERTY_TYPE, iv); + StackValue.onStack(implType).put(K_PROPERTY_TYPE, iv); iv.astore(K_PROPERTY_TYPE); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 3d168f4d64d..193bd93b1d5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -28,11 +28,11 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.PropertyImportedFromObject +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny import org.jetbrains.kotlin.resolve.jvm.AsmTypes.* import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.utils.sure import org.jetbrains.org.objectweb.asm.Opcodes.* import org.jetbrains.org.objectweb.asm.Type @@ -45,14 +45,13 @@ public class PropertyReferenceCodegen( context: ClassContext, expression: KtElement, classBuilder: ClassBuilder, - private val classDescriptor: ClassDescriptor, - private val target: VariableDescriptor, - dispatchReceiver: ReceiverValue? + resolvedCall: ResolvedCall<*> ) : MemberCodegen(state, parentCodegen, context, expression, classBuilder) { + private val classDescriptor = context.contextDescriptor private val asmType = typeMapper.mapClass(classDescriptor) - private val dispatchReceiverType = dispatchReceiver?.type - + private val target = resolvedCall.resultingDescriptor as VariableDescriptor + private val dispatchReceiverType = resolvedCall.dispatchReceiver?.type private val extensionReceiverType = target.extensionReceiverParameter?.type private val receiverCount = diff --git a/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineExtensionAccessor/build.log b/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineExtensionAccessor/build.log index 2e91170dfdf..c874c387c3b 100644 --- a/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineExtensionAccessor/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineExtensionAccessor/build.log @@ -6,9 +6,7 @@ Compiling files: src/inlineGet.kt End of files Cleaning output files: -out/production/module/usage/UsageVal$x$1.class out/production/module/usage/UsageVal.class -out/production/module/usage/UsageVar$x$1.class out/production/module/usage/UsageVar.class End of files Compiling files: @@ -25,7 +23,6 @@ Compiling files: src/inlineSet.kt End of files Cleaning output files: -out/production/module/usage/UsageVar$x$1.class out/production/module/usage/UsageVar.class End of files Compiling files: diff --git a/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineMethodAccessor/build.log b/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineMethodAccessor/build.log index b85fde4388d..eafebdfd179 100644 --- a/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineMethodAccessor/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/delegatedPropertyInlineMethodAccessor/build.log @@ -5,9 +5,7 @@ Compiling files: src/inline.kt End of files Cleaning output files: -out/production/module/usage/UsageVal$x$1.class out/production/module/usage/UsageVal.class -out/production/module/usage/UsageVar$x$1.class out/production/module/usage/UsageVar.class End of files Compiling files: @@ -23,7 +21,6 @@ Compiling files: src/inline.kt End of files Cleaning output files: -out/production/module/usage/UsageVar$x$1.class out/production/module/usage/UsageVar.class End of files Compiling files: