Update JVM metadata version to 1.4.0

This commit is contained in:
Alexander Udalov
2020-01-24 18:27:40 +01:00
parent 4d93b3d5ab
commit c08c3d4d9b
9 changed files with 47 additions and 22 deletions
@@ -263,7 +263,11 @@ class GenerationState private constructor(
val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false) val disableOptimization = configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)
val metadataVersion = configuration.get(CommonConfigurationKeys.METADATA_VERSION) ?: JvmMetadataVersion.INSTANCE val metadataVersion =
configuration.get(CommonConfigurationKeys.METADATA_VERSION)
?: if (languageVersionSettings.languageVersion >= LanguageVersion.LATEST_STABLE) JvmMetadataVersion.INSTANCE
else JvmMetadataVersion(1, 1, 18)
val isIrWithStableAbi = configuration.getBoolean(JVMConfigurationKeys.IS_IR_WITH_STABLE_ABI) val isIrWithStableAbi = configuration.getBoolean(JVMConfigurationKeys.IS_IR_WITH_STABLE_ABI)
val globalSerializationBindings = JvmSerializationBindings() val globalSerializationBindings = JvmSerializationBindings()
@@ -0,0 +1,3 @@
class Foo
fun bar() {}
@@ -1,7 +1,7 @@
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlinInNestedClassesAgainst14/source.kt:3:19: error: 'Nested' is only available since Kotlin 1.44 and cannot be used in Kotlin 1.4 compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlinInNestedClassesAgainst13/source.kt:3:19: error: 'Nested' is only available since Kotlin 1.44 and cannot be used in Kotlin 1.4
fun test(a: Outer.Nested) { fun test(a: Outer.Nested) {
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlinInNestedClassesAgainst14/source.kt:4:7: error: 'f(): Unit' is only available since Kotlin 1.88 and cannot be used in Kotlin 1.4 compiler/testData/compileKotlinAgainstCustomBinaries/requireKotlinInNestedClassesAgainst13/source.kt:4:7: error: 'f(): Unit' is only available since Kotlin 1.88 and cannot be used in Kotlin 1.4
a.f() a.f()
^ ^
COMPILATION_ERROR COMPILATION_ERROR
@@ -1,6 +1,6 @@
error: incompatible classes were found in dependencies. Remove them from the classpath or use '-Xskip-metadata-version-check' to suppress errors error: incompatible classes were found in dependencies. Remove them from the classpath or use '-Xskip-metadata-version-check' to suppress errors
$TMP_DIR$/library.jar!/META-INF/main.kotlin_module: error: module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.4.0, expected version is $ABI_VERSION$. $TMP_DIR$/library.jar!/META-INF/main.kotlin_module: error: module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.0, expected version is $ABI_VERSION$.
compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:3:13: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.4.0, expected version is $ABI_VERSION$. compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:3:13: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.0, expected version is $ABI_VERSION$.
The class is loaded from $TMP_DIR$/library.jar!/a/C.class The class is loaded from $TMP_DIR$/library.jar!/a/C.class
fun test(c: C) { fun test(c: C) {
^ ^
@@ -10,15 +10,15 @@ compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemant
compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:5:5: error: unresolved reference: v compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:5:5: error: unresolved reference: v
v v
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:5: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.4.0, expected version is $ABI_VERSION$. compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:5: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.0, expected version is $ABI_VERSION$.
The class is loaded from $TMP_DIR$/library.jar!/a/C.class The class is loaded from $TMP_DIR$/library.jar!/a/C.class
c.let { C() } c.let { C() }
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:7: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.4.0, expected version is $ABI_VERSION$. compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:7: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.0, expected version is $ABI_VERSION$.
The class is loaded from $TMP_DIR$/library.jar!/a/C.class The class is loaded from $TMP_DIR$/library.jar!/a/C.class
c.let { C() } c.let { C() }
^ ^
compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:13: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.4.0, expected version is $ABI_VERSION$. compiler/testData/compileKotlinAgainstCustomBinaries/strictMetadataVersionSemanticsOldVersion/source.kt:6:13: error: class 'a.C' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.0, expected version is $ABI_VERSION$.
The class is loaded from $TMP_DIR$/library.jar!/a/C.class The class is loaded from $TMP_DIR$/library.jar!/a/C.class
c.let { C() } c.let { C() }
^ ^
@@ -26,7 +26,10 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion.TEST_IS_PRE_RELEASE_SYS
import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.incremental.LocalFileKotlinClass
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.isObject import org.jetbrains.kotlin.resolve.DescriptorUtils.isObject
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
@@ -39,6 +42,8 @@ import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode
import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.io.ByteArrayInputStream
import java.io.DataInputStream
import java.io.File import java.io.File
import java.net.URLClassLoader import java.net.URLClassLoader
import java.util.jar.JarEntry import java.util.jar.JarEntry
@@ -364,8 +369,8 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
compileKotlin("source.kt", File(tmpdir, "usage.js"), listOf(compileJsLibrary("library")), K2JSCompiler()) compileKotlin("source.kt", File(tmpdir, "usage.js"), listOf(compileJsLibrary("library")), K2JSCompiler())
} }
fun testRequireKotlinInNestedClassesAgainst14() { fun testRequireKotlinInNestedClassesAgainst13() {
val library = compileLibrary("library", additionalOptions = listOf("-Xmetadata-version=1.4.0")) val library = compileLibrary("library", additionalOptions = listOf("-language-version", "1.3"))
compileKotlin("source.kt", tmpdir, listOf(library)) compileKotlin("source.kt", tmpdir, listOf(library))
} }
@@ -384,11 +389,23 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
fun testStrictMetadataVersionSemanticsOldVersion() { fun testStrictMetadataVersionSemanticsOldVersion() {
val library = compileLibrary( val library = compileLibrary(
"library", additionalOptions = listOf("-Xgenerate-strict-metadata-version", "-Xmetadata-version=1.4.0") "library", additionalOptions = listOf("-Xgenerate-strict-metadata-version", "-Xmetadata-version=1.5.0")
) )
compileKotlin("source.kt", tmpdir, listOf(library)) compileKotlin("source.kt", tmpdir, listOf(library))
} }
fun testMetadataVersionDerivedFromLanguage() {
compileKotlin("source.kt", tmpdir, additionalOptions = listOf("-language-version", "1.3"), expectedFileName = null)
val expectedVersion = JvmMetadataVersion(1, 1, 18)
val topLevelClass = LocalFileKotlinClass.create(File(tmpdir.absolutePath, "Foo.class"))!!
assertEquals(expectedVersion, topLevelClass.classHeader.metadataVersion)
val moduleFile = File(tmpdir.absolutePath, "META-INF/main.kotlin_module").readBytes()
val versionNumber = ModuleMapping.readVersionNumber(DataInputStream(ByteArrayInputStream(moduleFile)))!!
assertEquals(expectedVersion, JvmMetadataVersion(*versionNumber))
}
/*test source mapping generation when source info is absent*/ /*test source mapping generation when source info is absent*/
fun testInlineFunWithoutDebugInfo() { fun testInlineFunWithoutDebugInfo() {
compileKotlin("sourceInline.kt", tmpdir) compileKotlin("sourceInline.kt", tmpdir)
@@ -20,14 +20,13 @@ class JvmMetadataVersion(versionArray: IntArray, val isStrictSemantics: Boolean)
if (isStrictSemantics) { if (isStrictSemantics) {
isCompatibleTo(INSTANCE) isCompatibleTo(INSTANCE)
} else { } else {
// In Kotlin 1.4, JVM metadata version is going to be advanced to 1.4.0. // Kotlin 1.N is able to read metadata of versions up to Kotlin 1.{N+1} (unless the version has strict semantics).
// Kotlin 1.3 is able to read metadata of versions up to Kotlin 1.4 (unless the version has strict semantics). major == INSTANCE.major && minor <= INSTANCE.minor + 1
major == 1 && minor <= 4
} }
companion object { companion object {
@JvmField @JvmField
val INSTANCE = JvmMetadataVersion(1, 1, 17) val INSTANCE = JvmMetadataVersion(1, 4, 0)
@JvmField @JvmField
val INVALID_VERSION = JvmMetadataVersion() val INVALID_VERSION = JvmMetadataVersion()
@@ -33,12 +33,19 @@ class ModuleMapping private constructor(
const val STRICT_METADATA_VERSION_SEMANTICS_FLAG = 1 shl 0 const val STRICT_METADATA_VERSION_SEMANTICS_FLAG = 1 shl 0
fun readVersionNumber(stream: DataInputStream): IntArray? =
try {
IntArray(stream.readInt()) { stream.readInt() }
} catch (e: IOException) {
null
}
fun loadModuleMapping( fun loadModuleMapping(
bytes: ByteArray?, bytes: ByteArray?,
debugName: String, debugName: String,
skipMetadataVersionCheck: Boolean, skipMetadataVersionCheck: Boolean,
isJvmPackageNameSupported: Boolean, isJvmPackageNameSupported: Boolean,
reportIncompatibleVersionError: (JvmMetadataVersion) -> Unit reportIncompatibleVersionError: (JvmMetadataVersion) -> Unit,
): ModuleMapping { ): ModuleMapping {
if (bytes == null) { if (bytes == null) {
return EMPTY return EMPTY
@@ -46,12 +53,7 @@ class ModuleMapping private constructor(
val stream = DataInputStream(ByteArrayInputStream(bytes)) val stream = DataInputStream(ByteArrayInputStream(bytes))
val versionNumber = try { val versionNumber = readVersionNumber(stream) ?: return CORRUPTED
IntArray(stream.readInt()) { stream.readInt() }
} catch (e: IOException) {
return CORRUPTED
}
val preVersion = JvmMetadataVersion(*versionNumber) val preVersion = JvmMetadataVersion(*versionNumber)
if (!skipMetadataVersionCheck && !preVersion.isCompatible()) { if (!skipMetadataVersionCheck && !preVersion.isCompatible()) {
reportIncompatibleVersionError(preVersion) reportIncompatibleVersionError(preVersion)