From 56acd57e73df1201de87668ed3a830939242bb9f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sat, 19 Jan 2013 18:35:40 -0800 Subject: [PATCH] KT-3267 Put binary format version into the generated class files #KT-3267 Fixed --- .../jetbrains/jet/codegen/ImplementationBodyCodegen.java | 6 ++---- .../src/org/jetbrains/jet/codegen/NamespaceCodegen.java | 9 +++++---- .../src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java | 6 ++++++ .../jetbrains/jet/lang/resolve/java/JvmStdlibNames.java | 2 ++ runtime/src/jet/runtime/typeinfo/JetClass.java | 2 ++ runtime/src/jet/runtime/typeinfo/JetPackageClass.java | 1 + 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 5ae6a136f46..28c9d0827a3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -43,10 +43,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; -import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; -import org.jetbrains.jet.lang.resolve.java.JvmAbi; -import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; @@ -242,6 +239,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flags) { annotationVisitor.visit(JvmStdlibNames.JET_FLAGS_FIELD, flags); } + annotationVisitor.visit(JvmStdlibNames.ABI_VERSION_NAME, JvmAbi.VERSION); annotationVisitor.visitEnd(); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 297b60b4dde..f7874607a7f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; +import org.jetbrains.asm4.AnnotationVisitor; import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; @@ -33,9 +34,7 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; -import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; +import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -86,7 +85,9 @@ public class NamespaceCodegen extends MemberCodegen { boolean multiFile = CodegenBinding.isMultiFileNamespace(state.getBindingContext(), name); if (shouldGenerateNSClass(files)) { - v.getClassBuilder().newAnnotation(JvmStdlibNames.JET_PACKAGE_CLASS.getDescriptor(), true); + AnnotationVisitor packageClassAnnotation = v.getClassBuilder().newAnnotation(JvmStdlibNames.JET_PACKAGE_CLASS.getDescriptor(), true); + packageClassAnnotation.visit(JvmStdlibNames.ABI_VERSION_NAME, JvmAbi.VERSION); + packageClassAnnotation.visitEnd(); } for (JetFile file : files) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index ac7d4b613e1..8b00731a4cb 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -17,6 +17,12 @@ package org.jetbrains.jet.lang.resolve.java; public class JvmAbi { + /** + * This constant is used to identify binary format (class file) versions + * If you change class file metadata format and/or naming conventions, please increase this number + */ + public static final int VERSION = 0; + public static final String TRAIT_IMPL_CLASS_NAME = "$TImpl"; public static final String TRAIT_IMPL_SUFFIX = "$" + TRAIT_IMPL_CLASS_NAME; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index 5f3f6ccecfe..00e7a5b4242 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -71,6 +71,8 @@ public class JvmStdlibNames { public static final JvmClassName JET_PACKAGE_CLASS = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetPackageClass"); + public static final String ABI_VERSION_NAME = "abiVersion"; + public static final String JET_CLASS_SIGNATURE = "signature"; diff --git a/runtime/src/jet/runtime/typeinfo/JetClass.java b/runtime/src/jet/runtime/typeinfo/JetClass.java index a46bf16cf96..46e0ad91655 100644 --- a/runtime/src/jet/runtime/typeinfo/JetClass.java +++ b/runtime/src/jet/runtime/typeinfo/JetClass.java @@ -31,4 +31,6 @@ public @interface JetClass { * @return flags for class */ int flags() default 0; + + int abiVersion(); } diff --git a/runtime/src/jet/runtime/typeinfo/JetPackageClass.java b/runtime/src/jet/runtime/typeinfo/JetPackageClass.java index 92938b7c0ed..cb89663957f 100644 --- a/runtime/src/jet/runtime/typeinfo/JetPackageClass.java +++ b/runtime/src/jet/runtime/typeinfo/JetPackageClass.java @@ -24,4 +24,5 @@ import java.lang.annotation.RetentionPolicy; */ @Retention(RetentionPolicy.RUNTIME) public @interface JetPackageClass { + int abiVersion(); }