From 464b0dea4b60e1e33e1540114658ff6bb85bc9e0 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 22 Oct 2013 15:43:33 +0400 Subject: [PATCH] Don't reuse other descriptor's value parameters This resulted in a rewrite at INDEX_FOR_VALUE_PARAMETER slice, since some value parameters were found twice in different function descriptors --- .../AccessorForFunctionDescriptor.java | 37 +++++++++++++------ .../jet/codegen/context/CodegenContext.java | 2 +- .../descriptors/ValueParameterDescriptor.java | 2 +- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java index b7aa398b948..15baab745f7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java @@ -16,31 +16,46 @@ package org.jetbrains.jet.codegen; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.Name; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl { - public AccessorForFunctionDescriptor(DeclarationDescriptor descriptor, DeclarationDescriptor containingDeclaration, int index) { + public AccessorForFunctionDescriptor( + @NotNull FunctionDescriptor descriptor, + @NotNull DeclarationDescriptor containingDeclaration, + int index + ) { super(containingDeclaration, Collections.emptyList(), - Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName())+ "$b$" + index), + Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName()) + "$b$" + index), Kind.DECLARATION); - FunctionDescriptor fd = (FunctionDescriptor) descriptor; - - initialize(DescriptorUtils.getReceiverParameterType(fd.getReceiverParameter()), - descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : fd.getExpectedThisObject(), - Collections.emptyList(), - fd.getValueParameters(), - fd.getReturnType(), - Modality.FINAL, - Visibilities.INTERNAL, + initialize(DescriptorUtils.getReceiverParameterType(descriptor.getReceiverParameter()), + descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : descriptor.getExpectedThisObject(), + Collections.emptyList(), + copyValueParameters(descriptor), + descriptor.getReturnType(), + Modality.FINAL, + Visibilities.INTERNAL, /*isInline = */ false); } + + @NotNull + private List copyValueParameters(@NotNull FunctionDescriptor descriptor) { + List valueParameters = descriptor.getValueParameters(); + List result = new ArrayList(valueParameters.size()); + for (ValueParameterDescriptor valueParameter : valueParameters) { + result.add(valueParameter.copy(this, valueParameter.getName())); + } + return result; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java index 29cd9584637..ea2c494703a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java @@ -253,7 +253,7 @@ public abstract class CodegenContext { } if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof ConstructorDescriptor) { - accessor = new AccessorForFunctionDescriptor(descriptor, contextDescriptor, accessors.size()); + accessor = new AccessorForFunctionDescriptor((FunctionDescriptor) descriptor, contextDescriptor, accessors.size()); } else if (descriptor instanceof PropertyDescriptor) { accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size()); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ValueParameterDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ValueParameterDescriptor.java index c367471d058..e919cfd8fd1 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ValueParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ValueParameterDescriptor.java @@ -57,7 +57,7 @@ public interface ValueParameterDescriptor extends VariableDescriptor { ValueParameterDescriptor getOriginal(); @NotNull - ValueParameterDescriptor copy(DeclarationDescriptor newOwner, Name newName); + ValueParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner, @NotNull Name newName); /** * Parameter p1 overrides p2 iff