From 3580c7c28c116ccb1d26e42f06d731c42079214a Mon Sep 17 00:00:00 2001 From: Mikhail Bogdanov Date: Tue, 30 Jun 2020 11:42:19 +0200 Subject: [PATCH] Write proto flag about compatibility mode There is no any special aim for this flag now. But it could be useful in future in case of compatibility mode deprecation --- .../codegen/serialization/JvmSerializerExtension.kt | 8 +++++++- .../kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt | 8 +++++++- core/metadata.jvm/src/jvm_metadata.proto | 3 ++- .../kotlin/metadata/jvm/deserialization/JvmFlags.kt | 5 +++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index eb027dfb59d..dfaa74f9b63 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -94,7 +94,13 @@ class JvmSerializerExtension @JvmOverloads constructor( writeVersionRequirementForJvmDefaultIfNeeded(descriptor, proto, versionRequirementTable) if (jvmDefaultMode.forAllMethodsWithBody && isInterface(descriptor)) { - proto.setExtension(JvmProtoBuf.jvmClassFlags, JvmFlags.getClassFlags(true)) + proto.setExtension( + JvmProtoBuf.jvmClassFlags, + JvmFlags.getClassFlags( + jvmDefaultMode.forAllMethodsWithBody, + JvmDefaultMode.ALL_COMPATIBILITY == jvmDefaultMode + ) + ) } } diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt index 2e6a248efc3..0d0de96564f 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt @@ -95,7 +95,13 @@ class FirJvmSerializerExtension @JvmOverloads constructor( writeVersionRequirementForJvmDefaultIfNeeded(klass, proto, versionRequirementTable) if (jvmDefaultMode.forAllMethodsWithBody && klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) { - proto.setExtension(JvmProtoBuf.jvmClassFlags, JvmFlags.getClassFlags(true)) + proto.setExtension( + JvmProtoBuf.jvmClassFlags, + JvmFlags.getClassFlags( + jvmDefaultMode.forAllMethodsWithBody, + JvmDefaultMode.ALL_COMPATIBILITY == jvmDefaultMode + ) + ) } } diff --git a/core/metadata.jvm/src/jvm_metadata.proto b/core/metadata.jvm/src/jvm_metadata.proto index ec6851d1565..6a377f4c78d 100644 --- a/core/metadata.jvm/src/jvm_metadata.proto +++ b/core/metadata.jvm/src/jvm_metadata.proto @@ -129,7 +129,8 @@ extend Class { optional int32 anonymous_object_origin_name = 103 [(string_id_in_table) = true]; - // isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method) + // first bit: isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method) + // second bit: is all-compatibility mode or not, 1 - yes, 0 - no optional int32 jvm_class_flags = 104 [default = 0]; } diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt index b986933ce27..c1471b4cc1a 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt @@ -16,11 +16,12 @@ object JvmFlags { //Class val ARE_INTERFACE_METHOD_BODIES_INSIDE = Flags.FlagField.booleanFirst() + val IS_ALL_COMPATIBILITY_MODE = Flags.FlagField.booleanAfter(ARE_INTERFACE_METHOD_BODIES_INSIDE) fun getPropertyFlags(isMovedFromInterfaceCompanion: Boolean): Int = IS_MOVED_FROM_INTERFACE_COMPANION.toFlags(isMovedFromInterfaceCompanion) - fun getClassFlags(isAllInterfaceBodiesInside: Boolean): Int = - ARE_INTERFACE_METHOD_BODIES_INSIDE.toFlags(isAllInterfaceBodiesInside) + fun getClassFlags(isAllInterfaceBodiesInside: Boolean, isAllCompatibilityMode: Boolean): Int = + ARE_INTERFACE_METHOD_BODIES_INSIDE.toFlags(isAllInterfaceBodiesInside) or IS_ALL_COMPATIBILITY_MODE.toFlags(isAllCompatibilityMode) }