From fcab204459832a428e36131a6b7d9e4dc087576c Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Sat, 4 Aug 2012 22:52:02 +0300 Subject: [PATCH] KT-2210: Array> type mapping --- .../jet/codegen/ExpressionCodegen.java | 12 ---- .../jetbrains/jet/codegen/JetTypeMapper.java | 58 +++---------------- .../testData/codegen/regressions/kt2210.kt | 7 +++ .../org/jetbrains/jet/codegen/StdlibTest.java | 5 ++ 4 files changed, 20 insertions(+), 62 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2210.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 48989f693f0..3f6774baa92 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2567,18 +2567,6 @@ public class ExpressionCodegen extends JetVisitor { if (isArray) { gen(args.get(0), Type.INT_TYPE); v.newarray(boxType(asmType(arrayType.getArguments().get(0).getType()))); -/* - JetType elementType = typeMapper.getGenericsElementType(arrayType); - if (elementType != null) { - generateTypeInfo(elementType, null); - gen(args.get(0), Type.INT_TYPE); - v.invokevirtual("jet/TypeInfo", "newArray", "(I)[Ljava/lang/Object;"); - } - else { - gen(args.get(0), Type.INT_TYPE); - v.newarray(boxType(asmType(arrayType.getArguments().get(0).getType()))); - } -*/ } else { Type type = typeMapper.mapType(arrayType, MapTypeMode.VALUE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 65b1f40b6cf..a04cf32445a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -61,7 +61,6 @@ public class JetTypeMapper { public static final Type TYPE_NOTHING = Type.getObjectType("jet/Nothing"); public static final Type JL_NUMBER_TYPE = Type.getObjectType("java/lang/Number"); public static final Type JL_STRING_BUILDER = Type.getObjectType("java/lang/StringBuilder"); - public static final Type JL_ARRAY_LIST = Type.getObjectType("java/util/ArrayList"); public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String"); public static final Type JL_CHAR_SEQUENCE_TYPE = Type.getObjectType("java/lang/CharSequence"); private static final Type JL_COMPARABLE_TYPE = Type.getObjectType("java/lang/Comparable"); @@ -302,19 +301,6 @@ public class JetTypeMapper { return mapType(jetType, signatureVisitor, MapTypeMode.VALUE); } - private String getStableNameForObject(JetObjectDeclaration object, DeclarationDescriptor descriptor) { - String local = getLocalNameForObject(object); - if (local == null) return null; - - ClassDescriptor containingClass = getContainingClass(descriptor); - if (containingClass != null) { - return getClassFQName(containingClass).getInternalName() + "$" + local; - } - else { - return getFQName(getContainingNamespace(descriptor)) + "/" + local; - } - } - public static String getLocalNameForObject(JetObjectDeclaration object) { PsiElement parent = object.getParent(); if (parent instanceof JetClassObject) { @@ -386,18 +372,6 @@ public class JetTypeMapper { return name.getIdentifier(); } - private static ClassDescriptor getContainingClass(DeclarationDescriptor descriptor) { - DeclarationDescriptor parent = descriptor.getContainingDeclaration(); - if (parent == null || parent instanceof ClassDescriptor) return (ClassDescriptor) parent; - return getContainingClass(parent); - } - - private static NamespaceDescriptor getContainingNamespace(DeclarationDescriptor descriptor) { - DeclarationDescriptor parent = descriptor.getContainingDeclaration(); - if (parent == null || parent instanceof NamespaceDescriptor) return (NamespaceDescriptor) parent; - return getContainingNamespace(parent); - } - @NotNull public Type mapType(@NotNull final JetType jetType, @NotNull MapTypeMode kind) { return mapType(jetType, null, kind); @@ -531,6 +505,7 @@ public class JetTypeMapper { Type type = mapType(((TypeParameterDescriptor) descriptor).getUpperBoundsAsType(), kind); if (signatureVisitor != null) { TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) jetType.getConstructor().getDeclarationDescriptor(); + assert typeParameterDescriptor != null; signatureVisitor.writeTypeVariable(typeParameterDescriptor.getName(), jetType.isNullable(), type); } checkValidType(type); @@ -565,11 +540,10 @@ public class JetTypeMapper { private void checkValidType(@NotNull Type type) { if (!mapBuiltinsToJava) { String descriptor = type.getDescriptor(); - if (descriptor.equals("Ljava/lang/Object;")) { - return; - } - else if (descriptor.startsWith("Ljava/")) { - throw new IllegalStateException("builtins must not reference java.* classes: " + descriptor); + if (!descriptor.equals("Ljava/lang/Object;")) { + if (descriptor.startsWith("Ljava/")) { + throw new IllegalStateException("builtins must not reference java.* classes: " + descriptor); + } } } } @@ -849,7 +823,6 @@ public class JetTypeMapper { if(kind == OwnerKind.TRAIT_IMPL) { ClassDescriptor containingDeclaration = (ClassDescriptor) parentDescriptor; - assert containingDeclaration != null; signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); mapType(containingDeclaration.getDefaultType(), signatureWriter, MapTypeMode.IMPL); signatureWriter.writeParameterTypeEnd(); @@ -890,7 +863,6 @@ public class JetTypeMapper { String name = PropertyCodegen.setterName(descriptor.getName()); if (kind == OwnerKind.TRAIT_IMPL) { ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration(); - assert containingDeclaration != null; signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); mapType(containingDeclaration.getDefaultType(), signatureWriter, MapTypeMode.VALUE); signatureWriter.writeParameterTypeEnd(); @@ -1048,7 +1020,7 @@ public class JetTypeMapper { } } - private boolean isForceReal(JvmClassName className) { + private static boolean isForceReal(JvmClassName className) { return JvmPrimitiveType.getByWrapperClass(className) != null || className.getFqName().getFqName().equals("java.lang.String") || className.getFqName().getFqName().equals("java.lang.CharSequence") @@ -1057,22 +1029,8 @@ public class JetTypeMapper { || className.getFqName().getFqName().equals("java.lang.Comparable"); } - public boolean isGenericsArray(JetType type) { - DeclarationDescriptor declarationDescriptor = type.getConstructor().getDeclarationDescriptor(); - if (declarationDescriptor instanceof TypeParameterDescriptor) { - return true; - } - - if (JetStandardLibraryNames.ARRAY.is(type)) { - return isGenericsArray(type.getArguments().get(0).getType()); - } - - return false; - } - - public JetType getGenericsElementType(JetType arrayType) { - JetType type = arrayType.getArguments().get(0).getType(); - return isGenericsArray(type) ? type : null; + public static boolean isGenericsArray(JetType type) { + return JetStandardLibraryNames.ARRAY.is(type) && type.getArguments().get(0).getType().getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor; } public Type getSharedVarType(DeclarationDescriptor descriptor) { diff --git a/compiler/testData/codegen/regressions/kt2210.kt b/compiler/testData/codegen/regressions/kt2210.kt new file mode 100644 index 00000000000..3e1cd2decab --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2210.kt @@ -0,0 +1,7 @@ +class A(t: Array>) { + val a:Array> = t +} + +fun main(args : Array) { + A(array()) // <- java.lang.VerifyError: (class: A, method: getA signature: ()[[Ljava/lang/Object;) Wrong return type in function +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index 90335b34752..484790b3bc4 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -352,4 +352,9 @@ public class StdlibTest extends CodegenTestCase { public void test1779() { blackBoxFile("regressions/kt1779.kt"); } + + public void testKt2210() throws Exception { + blackBoxFile("regressions/kt2210.kt"); +// System.out.println(generateToText()); + } }