From 614ee5d690ce71ee8768bce5aba251965bfab262 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 24 Jan 2012 00:38:26 +0400 Subject: [PATCH] java.lang.String in signature should serialized and mapped back to java.lang.String --- .../jet/codegen/BothSignatureWriter.java | 6 ++--- .../codegen/ImplementationBodyCodegen.java | 2 +- .../jetbrains/jet/codegen/JetTypeMapper.java | 23 ++++++++++++++++--- .../java/JetTypeJetSignatureReader.java | 10 ++++---- .../jet/lang/resolve/java/JvmClassName.java | 6 +++++ .../lang/resolve/java/JvmPrimitiveType.java | 5 ++++ .../type/ListOfjlString.kt | 3 +++ .../readKotlinBinaryClass/type/jlInteger.kt | 3 +++ .../readKotlinBinaryClass/type/jlIntegerQ.kt | 3 +++ .../readKotlinBinaryClass/type/jlObject.kt | 3 +++ .../readKotlinBinaryClass/type/jlObjectQ.kt | 3 +++ .../readKotlinBinaryClass/type/jlString.kt | 3 +++ .../readKotlinBinaryClass/type/jlStringQ.kt | 3 +++ compiler/testData/writeSignature/jlString.kt | 6 +++++ .../org/jetbrains/jet/rt/TypeInfoParser.java | 3 ++- .../jet/rt/signature/JetSignatureAdapter.java | 2 +- .../JetSignatureExceptionsAdapter.java | 2 +- .../jet/rt/signature/JetSignatureReader.java | 10 +++++--- .../jet/rt/signature/JetSignatureVisitor.java | 2 +- .../jet/rt/signature/JetSignatureWriter.java | 4 ++-- 20 files changed, 82 insertions(+), 20 deletions(-) create mode 100644 compiler/testData/readKotlinBinaryClass/type/ListOfjlString.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlInteger.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlIntegerQ.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlObject.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlObjectQ.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlString.kt create mode 100644 compiler/testData/readKotlinBinaryClass/type/jlStringQ.kt create mode 100644 compiler/testData/writeSignature/jlString.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java index 807971b9501..b112fc055b4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BothSignatureWriter.java @@ -142,7 +142,7 @@ public class BothSignatureWriter { public void writeAsmType(Type asmType, boolean nullable) { switch (asmType.getSort()) { case Type.OBJECT: - writeClassBegin(asmType.getInternalName(), nullable); + writeClassBegin(asmType.getInternalName(), nullable, false); writeClassEnd(); return; case Type.ARRAY: @@ -182,9 +182,9 @@ public class BothSignatureWriter { } } - public void writeClassBegin(String internalName, boolean nullable) { + public void writeClassBegin(String internalName, boolean nullable, boolean real) { signatureVisitor().visitClassType(internalName); - jetSignatureWriter.visitClassType(internalName, nullable); + jetSignatureWriter.visitClassType(internalName, nullable, real); writeAsmType0(Type.getObjectType(internalName)); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 4ed3ca65957..84526d67d0e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -144,7 +144,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { { // superclass signatureVisitor.writeSuperclass(); if (superClassType == null) { - signatureVisitor.writeClassBegin(superClass, false); + signatureVisitor.writeClassBegin(superClass, false, false); signatureVisitor.writeClassEnd(); } else { typeMapper.mapType(superClassType, OwnerKind.IMPLEMENTATION, signatureVisitor, true); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 35b9d27f0a6..5e393c7f135 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -13,7 +13,9 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.*; @@ -160,6 +162,13 @@ public class JetTypeMapper { return null; } + public JvmClassName getClassFQName(ClassDescriptor classDescriptor) { + return JvmClassName.byInternalName(getFQName(classDescriptor)); + } + + /** + * @return Internal name + */ public String getFQName(DeclarationDescriptor descriptor) { descriptor = descriptor.getOriginal(); @@ -285,6 +294,7 @@ public class JetTypeMapper { if (descriptor instanceof ClassDescriptor) { Type asmType; + boolean forceReal; if (standardLibrary.getComparable().equals(descriptor)) { if (jetType.getArguments().size() != 1) { @@ -292,13 +302,15 @@ public class JetTypeMapper { } asmType = JL_COMPARABLE_TYPE; + forceReal = false; } else { - String name = getFQName(descriptor); - asmType = Type.getObjectType(name + (kind == OwnerKind.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); + JvmClassName name = getClassFQName((ClassDescriptor) descriptor); + asmType = Type.getObjectType(name.getInternalName() + (kind == OwnerKind.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); + forceReal = isForceReal(name); } if (signatureVisitor != null) { - signatureVisitor.writeClassBegin(asmType.getInternalName(), jetType.isNullable()); + signatureVisitor.writeClassBegin(asmType.getInternalName(), jetType.isNullable(), forceReal); for (TypeProjection proj : jetType.getArguments()) { // TODO: +- signatureVisitor.writeTypeArgument(proj.getProjectionKind()); @@ -790,6 +802,11 @@ public class JetTypeMapper { knowTypes.put(standardLibrary.getNullablePrimitiveArrayJetType(primitiveType), jvmPrimitiveType.getAsmArrayType()); } } + + private boolean isForceReal(JvmClassName className) { + return JvmPrimitiveType.getByWrapperClass(className) != null + || className.getFqName().equals("java.lang.String") || className.getFqName().equals("java.lang.Object"); + } public String isKnownTypeInfo(JetType jetType) { return knowTypeNames.get(jetType); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java index 687cb47eaa0..261bc41c70c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java @@ -3,7 +3,6 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lang.types.JetType; @@ -73,12 +72,15 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd private List typeArguments; @Override - public void visitClassType(String name, boolean nullable) { + public void visitClassType(String name, boolean nullable, boolean forceReal) { String ourName = name.replace('/', '.'); - this.classDescriptor = this.javaSemanticServices.getTypeTransformer().getPrimitiveWrappersClassDescriptorMap().get(ourName); + this.classDescriptor = null; + if (this.classDescriptor == null && !forceReal) { + this.classDescriptor = this.javaSemanticServices.getTypeTransformer().getPrimitiveWrappersClassDescriptorMap().get(ourName); + } - if (this.classDescriptor == null && ourName.equals("java.lang.Object")) { + if (this.classDescriptor == null && ourName.equals("java.lang.Object") && !forceReal) { this.classDescriptor = JetStandardClasses.getAny(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java index 165b0039324..a7914728d0c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java @@ -13,6 +13,12 @@ public class JvmClassName { public JvmClassName(@NotNull String fqName) { this.fqName = fqName; } + + public static JvmClassName byInternalName(@NotNull String internalName) { + JvmClassName r = new JvmClassName(internalName.replace('/', '.')); + r.internalName = internalName; + return r; + } public String getFqName() { return fqName; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java index 73daad8a0b8..78376d2eb94 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmPrimitiveType.java @@ -108,4 +108,9 @@ public enum JvmPrimitiveType { public static JvmPrimitiveType getByWrapperAsmType(Type type) { return MapByWrapperAsmTypeHolder.map.get(type); } + + @Nullable + public static JvmPrimitiveType getByWrapperClass(JvmClassName className) { + return getByWrapperAsmType(className.getAsmType()); + } } diff --git a/compiler/testData/readKotlinBinaryClass/type/ListOfjlString.kt b/compiler/testData/readKotlinBinaryClass/type/ListOfjlString.kt new file mode 100644 index 00000000000..df294e16734 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/ListOfjlString.kt @@ -0,0 +1,3 @@ +package test + +fun listOfJlString(): java.util.List = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlInteger.kt b/compiler/testData/readKotlinBinaryClass/type/jlInteger.kt new file mode 100644 index 00000000000..3ab6fd8125a --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlInteger.kt @@ -0,0 +1,3 @@ +package test + +fun integer(): java.lang.Integer = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlIntegerQ.kt b/compiler/testData/readKotlinBinaryClass/type/jlIntegerQ.kt new file mode 100644 index 00000000000..130417485e2 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlIntegerQ.kt @@ -0,0 +1,3 @@ +package test + +fun integerq(): java.lang.Integer? = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlObject.kt b/compiler/testData/readKotlinBinaryClass/type/jlObject.kt new file mode 100644 index 00000000000..7b4adff58d7 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlObject.kt @@ -0,0 +1,3 @@ +package test + +fun obj(): java.lang.Object = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlObjectQ.kt b/compiler/testData/readKotlinBinaryClass/type/jlObjectQ.kt new file mode 100644 index 00000000000..233ec8a3e34 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlObjectQ.kt @@ -0,0 +1,3 @@ +package test + +fun objq(): java.lang.Object? = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlString.kt b/compiler/testData/readKotlinBinaryClass/type/jlString.kt new file mode 100644 index 00000000000..b81d7caed5c --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlString.kt @@ -0,0 +1,3 @@ +package test + +fun fff(): java.lang.String = throw Exception() diff --git a/compiler/testData/readKotlinBinaryClass/type/jlStringQ.kt b/compiler/testData/readKotlinBinaryClass/type/jlStringQ.kt new file mode 100644 index 00000000000..dba2fae63aa --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/type/jlStringQ.kt @@ -0,0 +1,3 @@ +package test + +fun fff(): java.lang.String? = null diff --git a/compiler/testData/writeSignature/jlString.kt b/compiler/testData/writeSignature/jlString.kt new file mode 100644 index 00000000000..e51995cd2d1 --- /dev/null +++ b/compiler/testData/writeSignature/jlString.kt @@ -0,0 +1,6 @@ +fun string(): java.lang.String = throw Exception() + +// method: namespace::string +// jvm signature: ()Ljava/lang/String; +// generic signature: null +// kotlin signature: ()Mjava/lang/String; diff --git a/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java b/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java index b2075b7f4bc..e7e18933eba 100644 --- a/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java +++ b/stdlib/src/org/jetbrains/jet/rt/TypeInfoParser.java @@ -167,8 +167,9 @@ class TypeInfoParser { private List projections; @Override - public void visitClassType(String name, boolean nullable) { + public void visitClassType(String name, boolean nullable, boolean forceReal) { try { + // TODO: real flag klass = classLoader.loadClass(name.replace('/', '.')); } catch (ClassNotFoundException e) { throw new RuntimeException(); diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java index 1f80071f63f..7e7d3ba4f5a 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureAdapter.java @@ -64,7 +64,7 @@ public class JetSignatureAdapter implements JetSignatureVisitor { } @Override - public void visitClassType(String name, boolean nullable) { + public void visitClassType(String name, boolean nullable, boolean forceReal) { } @Override diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java index f65c34c6806..47015620af8 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureExceptionsAdapter.java @@ -67,7 +67,7 @@ public class JetSignatureExceptionsAdapter implements JetSignatureVisitor { } @Override - public void visitClassType(String name, boolean nullable) { + public void visitClassType(String name, boolean nullable, boolean forceReal) { 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 af581935e75..a8cb250e0b5 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -149,7 +149,9 @@ public class JetSignatureReader { v.visitTypeVariable(signature.substring(pos, end), nullable); return end + 1; - default: // case 'L': + case 'L': + case 'M': + boolean forceReal = signature.charAt(pos - 1) == 'M'; start = pos; visited = false; inner = false; @@ -162,7 +164,7 @@ public class JetSignatureReader { if (inner) { v.visitInnerClassType(name, nullable); } else { - v.visitClassType(name, nullable); + v.visitClassType(name, nullable, forceReal); } } if (c == ';') { @@ -179,7 +181,7 @@ public class JetSignatureReader { if (inner) { v.visitInnerClassType(name, nullable); } else { - v.visitClassType(name, nullable); + v.visitClassType(name, nullable, forceReal); } visited = true; top: for (;;) { @@ -205,6 +207,8 @@ public class JetSignatureReader { } } } + default: + throw new IllegalStateException(); } } diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java index a3548d8ce53..dcfb2b916e8 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureVisitor.java @@ -113,7 +113,7 @@ public interface JetSignatureVisitor { * * @param name the internal name of the class or interface. */ - void visitClassType(String name, boolean nullable); + void visitClassType(String name, boolean nullable, boolean forceReal); /** * Visits an inner class. diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java index f7c6086fac9..195b56b31d1 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureWriter.java @@ -145,9 +145,9 @@ public class JetSignatureWriter implements JetSignatureVisitor { } @Override - public void visitClassType(final String name, boolean nullable) { + public void visitClassType(final String name, boolean nullable, boolean forceReal) { visitNullabe(nullable); - buf.append('L'); + buf.append(forceReal ? 'M' : 'L'); buf.append(name); argumentStack *= 2; }