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
This commit is contained in:
Alexander Udalov
2013-10-22 15:43:33 +04:00
parent 41e2300473
commit 464b0dea4b
3 changed files with 28 additions and 13 deletions
@@ -16,31 +16,46 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl { 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.<AnnotationDescriptor>emptyList(), super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(),
Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName())+ "$b$" + index), Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName()) + "$b$" + index),
Kind.DECLARATION); Kind.DECLARATION);
FunctionDescriptor fd = (FunctionDescriptor) descriptor; initialize(DescriptorUtils.getReceiverParameterType(descriptor.getReceiverParameter()),
descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : descriptor.getExpectedThisObject(),
initialize(DescriptorUtils.getReceiverParameterType(fd.getReceiverParameter()), Collections.<TypeParameterDescriptor>emptyList(),
descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : fd.getExpectedThisObject(), copyValueParameters(descriptor),
Collections.<TypeParameterDescriptor>emptyList(), descriptor.getReturnType(),
fd.getValueParameters(), Modality.FINAL,
fd.getReturnType(), Visibilities.INTERNAL,
Modality.FINAL,
Visibilities.INTERNAL,
/*isInline = */ false); /*isInline = */ false);
} }
@NotNull
private List<ValueParameterDescriptor> copyValueParameters(@NotNull FunctionDescriptor descriptor) {
List<ValueParameterDescriptor> valueParameters = descriptor.getValueParameters();
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(valueParameters.size());
for (ValueParameterDescriptor valueParameter : valueParameters) {
result.add(valueParameter.copy(this, valueParameter.getName()));
}
return result;
}
} }
@@ -253,7 +253,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
} }
if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof ConstructorDescriptor) { 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) { else if (descriptor instanceof PropertyDescriptor) {
accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size()); accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size());
@@ -57,7 +57,7 @@ public interface ValueParameterDescriptor extends VariableDescriptor {
ValueParameterDescriptor getOriginal(); ValueParameterDescriptor getOriginal();
@NotNull @NotNull
ValueParameterDescriptor copy(DeclarationDescriptor newOwner, Name newName); ValueParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner, @NotNull Name newName);
/** /**
* Parameter p1 overrides p2 iff * Parameter p1 overrides p2 iff