From 22883374ac12091dc2eb3b6901a1ad7cd363efe7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 23 Dec 2013 22:32:28 +0400 Subject: [PATCH] Drop BothSignatureWriter.needGenerics It's OK to always make JVM generic signature since it's already constructed at the end anyway --- .../jetbrains/jet/codegen/ClosureCodegen.java | 2 +- .../jetbrains/jet/codegen/CodegenUtil.java | 7 +++- .../jet/codegen/FunctionCodegen.java | 2 +- .../codegen/ImplementationBodyCodegen.java | 11 ++--- .../signature/BothSignatureWriter.java | 24 +---------- .../codegen/signature/JvmMethodSignature.java | 7 ++-- .../jet/codegen/state/JetTypeMapper.java | 41 +++++++------------ 7 files changed, 31 insertions(+), 63 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 9e9d404c8c0..dc429ed0a6e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -292,7 +292,7 @@ public class ClosureCodegen extends ParentCodegenAwareImpl { assert supertypes.size() == 1 : "Closure must have exactly one supertype: " + funDescriptor; JetType supertype = supertypes.iterator().next(); - BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.CLASS, true); + BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.CLASS); typeMapper.writeFormalTypeParameters(Collections.emptyList(), sw); sw.writeSuperclass(); typeMapper.mapSupertype(supertype, sw); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 670dfd40699..99733227c85 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -41,7 +41,10 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import static org.jetbrains.jet.lang.descriptors.Modality.ABSTRACT; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; @@ -84,7 +87,7 @@ public class CodegenUtil { } public static JvmMethodSignature erasedInvokeSignature(FunctionDescriptor fd) { - BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false); + BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); boolean isExtensionFunction = fd.getReceiverParameter() != null; int paramCount = fd.getValueParameters().size(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 196e088c2db..0074b63abfd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -77,7 +77,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl { "in " + function.getContainingFile().getVirtualFile(); OwnerKind kind = owner.getContextKind(); - JvmMethodSignature method = typeMapper.mapSignature(functionDescriptor, true, kind); + JvmMethodSignature method = typeMapper.mapSignature(functionDescriptor, kind); if (kind != OwnerKind.TRAIT_IMPL || function.getBodyExpression() != null) { generateMethod(function, method, functionDescriptor, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index e0eb7123c4a..088ac68b2d9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -334,13 +334,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private JvmClassSignature signature() { - List superInterfaces; - - LinkedHashSet superInterfacesLinkedHashSet = new LinkedHashSet(); - - // TODO: generics signature is not always needed - BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.CLASS, true); - + BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.CLASS); { // type parameters List typeParameters = descriptor.getTypeConstructor().getParameters(); @@ -360,7 +354,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } + List superInterfaces; { // superinterfaces + LinkedHashSet superInterfacesLinkedHashSet = new LinkedHashSet(); + superInterfacesLinkedHashSet.add(JvmAbi.JET_OBJECT.getInternalName()); for (JetDelegationSpecifier specifier : myClass.getDelegationSpecifiers()) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java index 620f6746312..39442e49e73 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java @@ -24,7 +24,6 @@ import org.jetbrains.asm4.commons.Method; import org.jetbrains.asm4.signature.SignatureVisitor; import org.jetbrains.asm4.signature.SignatureWriter; import org.jetbrains.asm4.util.CheckSignatureAdapter; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.Variance; @@ -55,13 +54,9 @@ public class BothSignatureWriter { private JvmMethodParameterKind currentParameterKind; - private final boolean needGenerics; - private boolean generic = false; - public BothSignatureWriter(Mode mode, boolean needGenerics) { - this.needGenerics = needGenerics; - + public BothSignatureWriter(@NotNull Mode mode) { this.signatureVisitor = new CheckSignatureAdapter(mode.asmType, signatureWriter); } @@ -99,17 +94,6 @@ public class BothSignatureWriter { } } - public void writeNothing() { - signatureVisitor().visitBaseType('V'); - writeAsmType0(Type.VOID_TYPE); - } - - public void writeNullableNothing() { - signatureVisitor().visitClassType("java/lang/Object"); - signatureVisitor().visitEnd(); - writeAsmType0(AsmTypeConstants.OBJECT_TYPE); - } - private String makeArrayPrefix() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < jvmCurrentTypeArrayLevel; ++i) { @@ -268,11 +252,7 @@ public class BothSignatureWriter { @NotNull public JvmMethodSignature makeJvmMethodSignature(String name) { - return new JvmMethodSignature( - makeAsmMethod(name), - needGenerics ? makeJavaGenericSignature() : null, - kotlinParameterTypes - ); + return new JvmMethodSignature(makeAsmMethod(name), makeJavaGenericSignature(), kotlinParameterTypes); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java index 830dd960f66..82ef7c6fac9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/JvmMethodSignature.java @@ -25,12 +25,9 @@ import java.util.ArrayList; import java.util.List; public class JvmMethodSignature { - @NotNull private final Method asmMethod; - /** - * Null when we don't care about type parameters - */ + @Nullable private final String genericsSignature; @NotNull private final List kotlinParameterTypes; @@ -50,6 +47,7 @@ public class JvmMethodSignature { return asmMethod; } + @Nullable public String getGenericsSignature() { return genericsSignature; } @@ -59,6 +57,7 @@ public class JvmMethodSignature { return kotlinParameterTypes; } + @NotNull public List getValueParameterTypes() { List r = new ArrayList(kotlinParameterTypes.size()); for (JvmMethodParameterSignature p : kotlinParameterTypes) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index dbb0c40db8c..7bdb54acb5e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -412,7 +412,7 @@ public class JetTypeMapper extends BindingTraceAware { functionDescriptor = unwrapFakeOverride(functionDescriptor.getOriginal()); - JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind); + JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), kind); Type owner; Type ownerForDefaultImpl; Type ownerForDefaultParam; @@ -433,7 +433,7 @@ public class JetTypeMapper extends BindingTraceAware { owner = asmTypeForAnonymousClass(bindingContext, functionDescriptor); ownerForDefaultImpl = ownerForDefaultParam = thisClass = owner; invokeOpcode = INVOKEVIRTUAL; - descriptor = mapSignature("invoke", functionDescriptor, true, kind); + descriptor = mapSignature("invoke", functionDescriptor, kind); calleeType = owner; } else if (functionParent instanceof PackageFragmentDescriptor) { @@ -498,7 +498,7 @@ public class JetTypeMapper extends BindingTraceAware { } if (isInterface && superCall) { - descriptor = mapSignature(functionDescriptor, false, OwnerKind.TRAIT_IMPL); + descriptor = mapSignature(functionDescriptor, OwnerKind.TRAIT_IMPL); owner = Type.getObjectType(owner.getInternalName() + JvmAbi.TRAIT_IMPL_SUFFIX); } thisClass = mapType(receiver.getDefaultType()); @@ -564,32 +564,23 @@ public class JetTypeMapper extends BindingTraceAware { } @NotNull - public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, boolean needGenericSignature, @NotNull OwnerKind kind) { - return mapSignature(mapFunctionName(f), f, needGenericSignature, kind); + public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) { + return mapSignature(mapFunctionName(f), f, kind); } @NotNull public JvmMethodSignature mapSignature(@NotNull Name functionName, @NotNull FunctionDescriptor f) { - return mapSignature(functionName.asString(), f, false, OwnerKind.IMPLEMENTATION); + return mapSignature(functionName.asString(), f, OwnerKind.IMPLEMENTATION); } @NotNull public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f) { - return mapSignature(mapFunctionName(f), f, false, OwnerKind.IMPLEMENTATION); + return mapSignature(mapFunctionName(f), f, OwnerKind.IMPLEMENTATION); } @NotNull - private JvmMethodSignature mapSignature( - @NotNull String methodName, - @NotNull FunctionDescriptor f, - boolean needGenericSignature, - @NotNull OwnerKind kind - ) { - if (kind == OwnerKind.TRAIT_IMPL) { - needGenericSignature = false; - } - - BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, needGenericSignature); + private JvmMethodSignature mapSignature(@NotNull String methodName, @NotNull FunctionDescriptor f, @NotNull OwnerKind kind) { + BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); writeFormalTypeParameters(f.getTypeParameters(), signatureVisitor); @@ -623,7 +614,7 @@ public class JetTypeMapper extends BindingTraceAware { @Nullable public String mapFieldSignature(@NotNull JetType backingFieldType) { - BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE, true); + BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE); mapType(backingFieldType, signatureVisitor, JetTypeMapperMode.VALUE); return signatureVisitor.makeJavaGenericSignature(); } @@ -721,8 +712,7 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull public JvmMethodSignature mapGetterSignature(PropertyDescriptor descriptor, OwnerKind kind) { - // TODO: do not genClassOrObject generics if not needed - BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true); + BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter); @@ -743,8 +733,7 @@ public class JetTypeMapper extends BindingTraceAware { public JvmMethodSignature mapSetterSignature(PropertyDescriptor descriptor, OwnerKind kind) { assert descriptor.isVar(); - // TODO: generics signature is not always needed - BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true); + BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter); @@ -767,9 +756,9 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull public JvmMethodSignature mapConstructorSignature(@NotNull ConstructorDescriptor descriptor) { - BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true); + BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); - // constructor type parmeters are fake + // constructor type parameters are fake writeFormalTypeParameters(Collections.emptyList(), signatureWriter); signatureWriter.writeParametersStart(); @@ -850,7 +839,7 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull public JvmMethodSignature mapScriptSignature(@NotNull ScriptDescriptor script, @NotNull List importedScripts) { - BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false); + BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD); writeFormalTypeParameters(Collections.emptyList(), signatureWriter);