Write and read built-ins binary version

This commit is contained in:
Alexander Udalov
2015-12-23 21:32:00 +03:00
parent 906d706961
commit ddcdc11099
5 changed files with 29 additions and 14 deletions
@@ -22,6 +22,7 @@ import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleContent import org.jetbrains.kotlin.analyzer.ModuleContent
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.builtins.BuiltInsSerializedResourcePaths import org.jetbrains.kotlin.builtins.BuiltInsSerializedResourcePaths
import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
@@ -149,11 +150,9 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) {
val builtinsFileStream = ByteArrayOutputStream() val builtinsFileStream = ByteArrayOutputStream()
with(DataOutputStream(builtinsFileStream)) { with(DataOutputStream(builtinsFileStream)) {
// TODO: write version properly val version = BuiltinsPackageFragment.VERSION.toArray()
writeInt(3) writeInt(version.size)
writeInt(1) version.forEach { writeInt(it) }
writeInt(0)
writeInt(0)
} }
message.build().writeTo(builtinsFileStream) message.build().writeTo(builtinsFileStream)
write(destDir, BuiltInsSerializedResourcePaths.getBuiltInsFilePath(fqName), builtinsFileStream) write(destDir, BuiltInsSerializedResourcePaths.getBuiltInsFilePath(fqName), builtinsFileStream)
@@ -23,8 +23,7 @@ public final class AbiVersionUtil {
public static final BinaryVersion INVALID_VERSION = BinaryVersion.create(new int[0]); public static final BinaryVersion INVALID_VERSION = BinaryVersion.create(new int[0]);
public static boolean isAbiVersionCompatible(@NotNull BinaryVersion actual) { public static boolean isAbiVersionCompatible(@NotNull BinaryVersion actual) {
return actual.getMajor() == JvmAbi.VERSION.getMajor() && return actual.isCompatibleTo(JvmAbi.VERSION);
actual.getMinor() <= JvmAbi.VERSION.getMinor();
} }
private AbiVersionUtil() { private AbiVersionUtil() {
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import java.io.InputStream import java.io.InputStream
@@ -35,4 +36,9 @@ public class BuiltinsPackageFragment(
protected override fun loadClassNames(packageProto: ProtoBuf.Package): Collection<Name> { protected override fun loadClassNames(packageProto: ProtoBuf.Package): Collection<Name> {
return packageProto.getExtension(BuiltInsProtoBuf.className)?.map { id -> nameResolver.getName(id) } ?: listOf() return packageProto.getExtension(BuiltInsProtoBuf.className)?.map { id -> nameResolver.getName(id) } ?: listOf()
} }
companion object {
// Advance this version when the common or builtins-specific binary metadata format is changed
val VERSION = BinaryVersion.create(1, 0, 0)
}
} }
@@ -25,6 +25,17 @@ data class BinaryVersion private constructor(
fun toArray(): IntArray = fun toArray(): IntArray =
intArrayOf(major, minor, patch, *rest.toIntArray()) intArrayOf(major, minor, patch, *rest.toIntArray())
/**
* Returns true if this version of some format loaded from some binaries is compatible
* to the expected version of that format in the current compiler.
*
* @param ourVersion the version of this format in the current compiler
*/
fun isCompatibleTo(ourVersion: BinaryVersion): Boolean {
return if (major == 0) ourVersion.major == 0 && minor == ourVersion.minor
else major == ourVersion.major && minor <= ourVersion.minor
}
override fun toString(): String { override fun toString(): String {
val versions = toArray().takeWhile { it != UNKNOWN } val versions = toArray().takeWhile { it != UNKNOWN }
return if (versions.isEmpty()) "unknown" else versions.joinToString(".") return if (versions.isEmpty()) "unknown" else versions.joinToString(".")
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.serialization.deserialization package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.BuiltinsPackageFragment
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -40,15 +41,14 @@ public abstract class DeserializedPackageFragment(
val builtinsMessage = serializedResourcePaths.getBuiltInsFilePath(fqName)?.let(loadResource)?.let { stream -> val builtinsMessage = serializedResourcePaths.getBuiltInsFilePath(fqName)?.let(loadResource)?.let { stream ->
val dataInput = DataInputStream(stream) val dataInput = DataInputStream(stream)
val version = (1..dataInput.readInt()).map { dataInput.readInt() } val version = BinaryVersion.create((1..dataInput.readInt()).map { dataInput.readInt() }.toIntArray())
// TODO: check version correctly if (!version.isCompatibleTo(BuiltinsPackageFragment.VERSION)) {
if (!(version.size == 3 && version.let { // TODO: report a proper diagnostic
val (major, minor, patch) = it
major == 1 && minor == 0 && patch == 0
})) {
throw UnsupportedOperationException( throw UnsupportedOperationException(
"Kotlin built-in definition format version is not supported: expected 1.0.0, actual ${version.joinToString(".")}" "Kotlin built-in definition format version is not supported: " +
"expected ${BuiltinsPackageFragment.VERSION}, actual $version. " +
"Please update Kotlin"
) )
} }