From 309b6b3e0e3ce5a0f507ebeb50f6c9da23d18534 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 24 Jan 2012 23:11:14 +0400 Subject: [PATCH] fix erased parameters codegen and parsing --- .../jetbrains/jet/codegen/BothSignatureWriter.java | 4 ++-- .../org/jetbrains/jet/codegen/FunctionCodegen.java | 6 ++++++ .../org/jetbrains/jet/codegen/JetTypeMapper.java | 2 +- .../lang/resolve/java/JavaDescriptorResolver.java | 14 ++++++++------ ...ctorWithTypeParametersEAndOnePValueParameter.kt | 3 +++ .../FunParamParamErased.kt | 3 +++ .../src/org/jetbrains/jet/rt/TypeInfoParser.java | 2 +- .../jet/rt/signature/JetSignatureAdapter.java | 2 +- .../signature/JetSignatureExceptionsAdapter.java | 2 +- .../jet/rt/signature/JetSignatureReader.java | 8 +++++++- .../jet/rt/signature/JetSignatureVisitor.java | 4 +++- .../jet/rt/signature/JetSignatureWriter.java | 5 ++++- 12 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/readKotlinBinaryClass/constructor/ConstructorWithTypeParametersEAndOnePValueParameter.kt create mode 100644 compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamParamErased.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java index b112fc055b4..4d001636d91 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java @@ -232,11 +232,11 @@ public class BothSignatureWriter { writeAsmType0(asmType); } - public void writeFormalTypeParameter(final String name, Variance variance) { + public void writeFormalTypeParameter(final String name, Variance variance, boolean reified) { checkTopLevel(); signatureVisitor().visitFormalTypeParameter(name); - jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance)); + jetSignatureWriter.visitFormalTypeParameter(name, JetSignatureUtils.translateVariance(variance), reified); generic = true; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 16e20bbdb5d..f71bf092088 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -130,6 +130,9 @@ public class FunctionCodegen { av.visitEnd(); } for (final TypeParameterDescriptor typeParameterDescriptor : typeParameters) { + if (!typeParameterDescriptor.isReified()) { + continue; + } AnnotationVisitor av = mv.visitParameterAnnotation(start++, JvmStdlibNames.JET_TYPE_PARAMETER.getDescriptor(), true); av.visit(JvmStdlibNames.JET_TYPE_PARAMETER_NAME_FIELD, typeParameterDescriptor.getName()); av.visitEnd(); @@ -171,6 +174,9 @@ public class FunctionCodegen { add++; for (final TypeParameterDescriptor typeParameterDescriptor : typeParameters) { + if (!typeParameterDescriptor.isReified()) { + continue; + } int slot = frameMap.enterTemp(); add++; codegen.addTypeParameter(typeParameterDescriptor, StackValue.local(slot, JetTypeMapper.TYPE_TYPEINFO)); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 5e393c7f135..7dca5a3e867 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -495,7 +495,7 @@ public class JetTypeMapper { } private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) { - signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance()); + signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName(), typeParameterDescriptor.getVariance(), typeParameterDescriptor.isReified()); classBound: { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 91cc61ef736..3cb42d49616 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -375,12 +375,13 @@ public class JavaDescriptorResolver { private final DeclarationDescriptor containingDeclaration; private final PsiTypeParameterListOwner psiOwner; private final String name; + private final boolean reified; private final int index; private final TypeInfoVariance variance; private final TypeVariableResolver typeVariableResolver; protected JetSignatureTypeParameterVisitor(DeclarationDescriptor containingDeclaration, PsiTypeParameterListOwner psiOwner, - String name, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver) + String name, boolean reified, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver) { if (name.isEmpty()) { throw new IllegalStateException(); @@ -389,6 +390,7 @@ public class JavaDescriptorResolver { this.containingDeclaration = containingDeclaration; this.psiOwner = psiOwner; this.name = name; + this.reified = reified; this.index = index; this.variance = variance; this.typeVariableResolver = typeVariableResolver; @@ -425,7 +427,7 @@ public class JavaDescriptorResolver { TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification( containingDeclaration, Collections.emptyList(), // TODO: wrong - true, // TODO: wrong + reified, JetSignatureUtils.translateVariance(variance), name, index); @@ -462,8 +464,8 @@ public class JavaDescriptorResolver { private int formalTypeParameterIndex = 0; @Override - public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) { - return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) { + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) { + return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) { @Override protected void done(TypeParameterDescriptor typeParameterDescriptor) { r.add(typeParameterDescriptor); @@ -1269,9 +1271,9 @@ public class JavaDescriptorResolver { private int formalTypeParameterIndex = 0; @Override - public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) { - return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) { + return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) { @Override protected void done(TypeParameterDescriptor typeParameterDescriptor) { r.add(typeParameterDescriptor); diff --git a/compiler/testData/readKotlinBinaryClass/constructor/ConstructorWithTypeParametersEAndOnePValueParameter.kt b/compiler/testData/readKotlinBinaryClass/constructor/ConstructorWithTypeParametersEAndOnePValueParameter.kt new file mode 100644 index 00000000000..67e920489b6 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/constructor/ConstructorWithTypeParametersEAndOnePValueParameter.kt @@ -0,0 +1,3 @@ +package test + +class OneTypeParameterErased(q: Q) diff --git a/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamParamErased.kt b/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamParamErased.kt new file mode 100644 index 00000000000..fe10f80b20c --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/fun/genericWithTypeVariables/FunParamParamErased.kt @@ -0,0 +1,3 @@ +package test + +fun funParamParam(a: Int, b: P) = 1 diff --git a/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java b/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java index e7e18933eba..05f22c83f03 100644 --- a/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java +++ b/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java @@ -74,7 +74,7 @@ class TypeInfoParser { new JetSignatureReader(annotationValue).accept(new JetSignatureExceptionsAdapter() { @Override - public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) { // TODO: nullability diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java index 7e7d3ba4f5a..2e13d47ffd1 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java @@ -7,7 +7,7 @@ import jet.typeinfo.TypeInfoVariance; */ public class JetSignatureAdapter implements JetSignatureVisitor { @Override - public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) { return this; } diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java index 47015620af8..ca7c1f58982 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java @@ -7,7 +7,7 @@ import jet.typeinfo.TypeInfoVariance; */ public class JetSignatureExceptionsAdapter implements JetSignatureVisitor { @Override - public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) { throw new IllegalStateException(); } diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java index a8cb250e0b5..a8491c34589 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -49,6 +49,12 @@ public class JetSignatureReader { pos = 1; do { TypeInfoVariance variance; + boolean reified = true; + + if (signature.substring(pos).startsWith("erased ")) { + reified = false; + pos += "erased ".length(); + } if (signature.substring(pos).startsWith("in ")) { variance = TypeInfoVariance.IN; pos += "in ".length(); @@ -67,7 +73,7 @@ public class JetSignatureReader { if (typeParameterName.isEmpty()) { throw new IllegalStateException("incorrect signature: " + signature); } - JetSignatureVisitor parameterVisitor = v.visitFormalTypeParameter(typeParameterName, variance); + JetSignatureVisitor parameterVisitor = v.visitFormalTypeParameter(typeParameterName, variance, reified); pos = end + 1; c = signature.charAt(pos); diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java index dcfb2b916e8..3f0c2d32c16 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java @@ -28,9 +28,11 @@ public interface JetSignatureVisitor { /** * Visits a formal type parameter. * + * TODO should not store reified flag in signature + * * @param name the name of the formal parameter. */ - JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance); + JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified); void visitFormalTypeParameterEnd(); diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java index 195b56b31d1..c6f3d712a64 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java @@ -43,11 +43,14 @@ public class JetSignatureWriter implements JetSignatureVisitor { // ------------------------------------------------------------------------ @Override - public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance) { + public JetSignatureVisitor visitFormalTypeParameter(final String name, TypeInfoVariance variance, boolean reified) { if (!hasFormals) { hasFormals = true; buf.append('<'); } + if (!reified) { + buf.append("erased "); + } switch (variance) { case OUT: buf.append("out ");