From 96f892d60c5327f07e2e8d3c4fc0ebe954ac44da Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Tue, 12 Apr 2016 14:44:14 +0300 Subject: [PATCH] Obtain class file version from GenerationState --- .../src/org/jetbrains/kotlin/codegen/ClosureCodegen.java | 2 +- .../kotlin/codegen/ImplementationBodyCodegen.java | 3 ++- .../jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt | 2 +- .../jetbrains/kotlin/codegen/MultifileClassCodegen.kt | 2 +- .../kotlin/codegen/MultifileClassPartCodegen.kt | 4 ++-- .../org/jetbrains/kotlin/codegen/PackagePartCodegen.java | 2 +- .../jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt | 2 +- .../org/jetbrains/kotlin/codegen/SamWrapperCodegen.java | 2 +- .../src/org/jetbrains/kotlin/codegen/ScriptCodegen.java | 2 +- .../codegen/inline/AnonymousObjectTransformer.java | 2 +- .../jetbrains/kotlin/codegen/inline/InlineCodegen.java | 5 +++-- .../kotlin/codegen/inline/InlineCodegenUtil.java | 9 +++++---- .../jetbrains/kotlin/codegen/inline/ObjectTransformer.kt | 2 +- .../jetbrains/kotlin/codegen/state/GenerationState.kt | 3 +++ .../codegen/when/MappingClassesForWhenByEnumCodegen.java | 2 +- 15 files changed, 25 insertions(+), 19 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index ee31db560c0..f6e95f09117 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -150,7 +150,7 @@ public class ClosureCodegen extends MemberCodegen { } v.defineClass(element, - V1_6, + state.getClassFileVersion(), ACC_FINAL | ACC_SUPER | visibilityFlag, asmType.getInternalName(), sw.makeJavaGenericSignature(), diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index ede976e20d6..d35a5f8a8db 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -211,7 +211,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } v.defineClass( - myClass, V1_6, + myClass, + state.getClassFileVersion(), access, signature.getName(), signature.getJavaGenericSignature(), diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt index a1795e59c2b..ef1cffa7bc7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/InterfaceImplBodyCodegen.kt @@ -49,7 +49,7 @@ class InterfaceImplBodyCodegen( override fun generateDeclaration() { v.defineClass( - myClass, V1_6, ACC_PUBLIC or ACC_FINAL or ACC_SUPER, + myClass, state.classFileVersion, ACC_PUBLIC or ACC_FINAL or ACC_SUPER, typeMapper.mapDefaultImpls(descriptor).internalName, null, "java/lang/Object", ArrayUtil.EMPTY_STRING_ARRAY ) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 04abcbb9074..91a23b8cbf8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -134,7 +134,7 @@ class MultifileClassCodegen( J_L_OBJECT state.factory.newVisitor(declarationOrigin, facadeClassType, files).apply { - defineClass(singleSourceFile, Opcodes.V1_6, FACADE_CLASS_ATTRIBUTES, + defineClass(singleSourceFile, state.classFileVersion, FACADE_CLASS_ATTRIBUTES, facadeClassType.internalName, null, superClassForFacade, ArrayUtil.EMPTY_STRING_ARRAY) if (singleSourceFile != null) { visitSource(singleSourceFile.name, null) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index d199919bb21..e79d6a62a22 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -64,7 +64,7 @@ class MultifileClassPartCodegen( private val staticInitClassBuilder = ClassBuilderOnDemand { state.factory.newVisitor(MultifileClass(file, packageFragment), staticInitClassType, file).apply { - defineClass(file, Opcodes.V1_6, STATE_INITIALIZER_CLASS_ATTRIBUTES, + defineClass(file, state.classFileVersion, STATE_INITIALIZER_CLASS_ATTRIBUTES, staticInitClassType.internalName, null, "java/lang/Object", ArrayUtil.EMPTY_STRING_ARRAY) visitSource(file.name, null) @@ -119,7 +119,7 @@ class MultifileClassPartCodegen( } override fun generateDeclaration() { - v.defineClass(element, Opcodes.V1_6, partClassAttributes, partType.internalName, null, superClassInternalName, ArrayUtil.EMPTY_STRING_ARRAY) + v.defineClass(element, state.classFileVersion, partClassAttributes, partType.internalName, null, superClassInternalName, ArrayUtil.EMPTY_STRING_ARRAY) v.visitSource(element.name, null) generatePropertyMetadataArrayFieldIfNeeded(partType) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 247a985d81e..96b0c92c578 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -62,7 +62,7 @@ public class PackagePartCodegen extends MemberCodegen { @Override protected void generateDeclaration() { - v.defineClass(element, V1_6, + v.defineClass(element, state.getClassFileVersion(), ACC_PUBLIC | ACC_FINAL | ACC_SUPER, packagePartType.getInternalName(), null, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 8a601c22e41..c061f2842d2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -82,7 +82,7 @@ class PropertyReferenceCodegen( override fun generateDeclaration() { v.defineClass( element, - V1_6, + state.classFileVersion, ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor), asmType.internalName, null, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index 26f5166c60a..384d3bdb059 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -97,7 +97,7 @@ public class SamWrapperCodegen { ClassBuilder cv = state.getFactory().newVisitor(JvmDeclarationOriginKt.OtherOrigin(erasedInterfaceFunction), asmType, file); cv.defineClass(file, - V1_6, + state.getClassFileVersion(), ACC_FINAL | ACC_SUPER | visibility, asmType.getInternalName(), null, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java index aa317f318e0..df5284523bc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java @@ -89,7 +89,7 @@ public class ScriptCodegen extends MemberCodegen { @Override protected void generateDeclaration() { v.defineClass(scriptDeclaration, - V1_6, + state.getClassFileVersion(), ACC_PUBLIC | ACC_SUPER, classAsmType.getInternalName(), null, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java index e26ae895183..71f09e24d91 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java @@ -65,7 +65,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer Opcodes.V1_6 && !"true".equals(System.getProperty("kotlin.skip.bytecode.version.check"))) { + if (version > state.getClassFileVersion() && !"true".equals(System.getProperty("kotlin.skip.bytecode.version.check"))) { throw new UnsupportedOperationException( "Cannot inline bytecode of class " + internalName + " which has version " + version + ". " + "This compiler can only inline Java 1.6 bytecode (version " + Opcodes.V1_6 + ")" diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt index 1d5f8633f71..a69ed979a52 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt @@ -66,7 +66,7 @@ class WhenMappingTransformer( val fieldNode = transformationInfo.fieldNode classReader.accept(object : ClassVisitor(InlineCodegenUtil.API, classBuilder.visitor) { override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array) { - InlineCodegenUtil.assertVersionNotGreaterThanJava6(version, name) + InlineCodegenUtil.assertVersionNotGreaterThanGeneratedOne(version, name, state) classBuilder.defineClass(null, version, access, name, signature, superName, interfaces) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index 8abae97bf47..05b25ad36e7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.jvm.JvmClassName +import org.jetbrains.org.objectweb.asm.Opcodes import java.io.File class GenerationState @JvmOverloads constructor( @@ -157,6 +158,8 @@ class GenerationState @JvmOverloads constructor( val rootContext: CodegenContext<*> = RootContext(this) + val classFileVersion: Int = Opcodes.V1_6 + init { this.interceptedBuilderFactory = builderFactory .wrapWith( diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java index 104c7cc664a..f96f00394ac 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java @@ -46,7 +46,7 @@ public class MappingClassesForWhenByEnumCodegen { ClassBuilder cb = state.getFactory().newVisitor(JvmDeclarationOrigin.NO_ORIGIN, mappingsClass, srcFile); cb.defineClass( srcFile, - V1_6, + state.getClassFileVersion(), ACC_PUBLIC | ACC_FINAL | ACC_SUPER | ACC_SYNTHETIC, mappingsClass.getInternalName(), null,