diff --git a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt index 0fb64c72cf0..713a5e2bf80 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt @@ -418,6 +418,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEquals(old.getExtension(JvmProtoBuf.methodSignature), new.getExtension(JvmProtoBuf.methodSignature))) return false } + if (old.hasExtension(JvmProtoBuf.lambdaClassOriginName) != new.hasExtension(JvmProtoBuf.lambdaClassOriginName)) return false + if (old.hasExtension(JvmProtoBuf.lambdaClassOriginName)) { + if (!checkStringEquals(old.getExtension(JvmProtoBuf.lambdaClassOriginName), new.getExtension(JvmProtoBuf.lambdaClassOriginName))) return false + } + if (old.getExtensionCount(JsProtoBuf.functionAnnotation) != new.getExtensionCount(JsProtoBuf.functionAnnotation)) { return false } @@ -1638,6 +1643,10 @@ fun ProtoBuf.Function.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) hashCode = 31 * hashCode + getExtension(JvmProtoBuf.methodSignature).hashCode(stringIndexes, fqNameIndexes) } + if (hasExtension(JvmProtoBuf.lambdaClassOriginName)) { + hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.lambdaClassOriginName)) + } + for(i in 0..getExtensionCount(JsProtoBuf.functionAnnotation) - 1) { hashCode = 31 * hashCode + getExtension(JsProtoBuf.functionAnnotation, i).hashCode(stringIndexes, fqNameIndexes) } diff --git a/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java index 6cf872f3600..24c61b2f684 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java @@ -9,6 +9,7 @@ public final class DebugJvmProtoBuf { org.jetbrains.kotlin.protobuf.ExtensionRegistry registry) { registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.constructorSignature); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.methodSignature); + registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.lambdaClassOriginName); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.propertySignature); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.isRaw); @@ -4530,6 +4531,22 @@ public final class DebugJvmProtoBuf { .newFileScopedGeneratedExtension( org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.JvmMethodSignature.class, org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.JvmMethodSignature.getDefaultInstance()); + public static final int LAMBDA_CLASS_ORIGIN_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Function { ... } + * + *
+   * For lambdas from bodies of inline functions copied to the use site, the JVM internal name of the original
+   * lambda class this class is copied from
+   * 
+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.Function, + java.lang.Integer> lambdaClassOriginName = org.jetbrains.kotlin.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + java.lang.Integer.class, + null); public static final int PROPERTY_SIGNATURE_FIELD_NUMBER = 100; /** * extend .org.jetbrains.kotlin.serialization.Property { ... } @@ -4705,31 +4722,33 @@ public final class DebugJvmProtoBuf { "JvmMethodSignature:\202\001\n\020method_signature\022" + ",.org.jetbrains.kotlin.serialization.Fun" + "ction\030d \001(\0132:.org.jetbrains.kotlin.seria" + - "lization.jvm.JvmMethodSignature:\206\001\n\022prop" + - "erty_signature\022,.org.jetbrains.kotlin.se" + - "rialization.Property\030d \001(\0132<.org.jetbrai" + - "ns.kotlin.serialization.jvm.JvmPropertyS" + - "ignature:q\n\017type_annotation\022(.org.jetbra" + - "ins.kotlin.serialization.Type\030d \003(\0132..or" + - "g.jetbrains.kotlin.serialization.Annotat", - "ion:8\n\006is_raw\022(.org.jetbrains.kotlin.ser" + - "ialization.Type\030e \001(\010:\204\001\n\031type_parameter" + - "_annotation\0221.org.jetbrains.kotlin.seria" + - "lization.TypeParameter\030d \003(\0132..org.jetbr" + - "ains.kotlin.serialization.Annotation:J\n\021" + - "class_module_name\022).org.jetbrains.kotlin" + - ".serialization.Class\030e \001(\005B\004\230\265\030\001:u\n\024clas" + - "s_local_variable\022).org.jetbrains.kotlin." + - "serialization.Class\030f \003(\0132,.org.jetbrain" + - "s.kotlin.serialization.Property:U\n\034anony", - "mous_object_origin_name\022).org.jetbrains." + - "kotlin.serialization.Class\030g \001(\005B\004\230\265\030\001:N" + - "\n\023package_module_name\022+.org.jetbrains.ko" + - "tlin.serialization.Package\030e \001(\005B\004\230\265\030\001:y" + - "\n\026package_local_variable\022+.org.jetbrains" + - ".kotlin.serialization.Package\030f \003(\0132,.or" + - "g.jetbrains.kotlin.serialization.Propert" + - "yB\022B\020DebugJvmProtoBuf" + "lization.jvm.JvmMethodSignature:T\n\030lambd" + + "a_class_origin_name\022,.org.jetbrains.kotl" + + "in.serialization.Function\030e \001(\005B\004\230\265\030\001:\206\001" + + "\n\022property_signature\022,.org.jetbrains.kot" + + "lin.serialization.Property\030d \001(\0132<.org.j" + + "etbrains.kotlin.serialization.jvm.JvmPro" + + "pertySignature:q\n\017type_annotation\022(.org.", + "jetbrains.kotlin.serialization.Type\030d \003(" + + "\0132..org.jetbrains.kotlin.serialization.A" + + "nnotation:8\n\006is_raw\022(.org.jetbrains.kotl" + + "in.serialization.Type\030e \001(\010:\204\001\n\031type_par" + + "ameter_annotation\0221.org.jetbrains.kotlin" + + ".serialization.TypeParameter\030d \003(\0132..org" + + ".jetbrains.kotlin.serialization.Annotati" + + "on:J\n\021class_module_name\022).org.jetbrains." + + "kotlin.serialization.Class\030e \001(\005B\004\230\265\030\001:u" + + "\n\024class_local_variable\022).org.jetbrains.k", + "otlin.serialization.Class\030f \003(\0132,.org.je" + + "tbrains.kotlin.serialization.Property:U\n" + + "\034anonymous_object_origin_name\022).org.jetb" + + "rains.kotlin.serialization.Class\030g \001(\005B\004" + + "\230\265\030\001:N\n\023package_module_name\022+.org.jetbra" + + "ins.kotlin.serialization.Package\030e \001(\005B\004" + + "\230\265\030\001:y\n\026package_local_variable\022+.org.jet" + + "brains.kotlin.serialization.Package\030f \003(" + + "\0132,.org.jetbrains.kotlin.serialization.P" + + "ropertyB\022B\020DebugJvmProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -4777,15 +4796,16 @@ public final class DebugJvmProtoBuf { new java.lang.String[] { "Field", "SyntheticMethod", "Getter", "Setter", }); constructorSignature.internalInit(descriptor.getExtensions().get(0)); methodSignature.internalInit(descriptor.getExtensions().get(1)); - propertySignature.internalInit(descriptor.getExtensions().get(2)); - typeAnnotation.internalInit(descriptor.getExtensions().get(3)); - isRaw.internalInit(descriptor.getExtensions().get(4)); - typeParameterAnnotation.internalInit(descriptor.getExtensions().get(5)); - classModuleName.internalInit(descriptor.getExtensions().get(6)); - classLocalVariable.internalInit(descriptor.getExtensions().get(7)); - anonymousObjectOriginName.internalInit(descriptor.getExtensions().get(8)); - packageModuleName.internalInit(descriptor.getExtensions().get(9)); - packageLocalVariable.internalInit(descriptor.getExtensions().get(10)); + lambdaClassOriginName.internalInit(descriptor.getExtensions().get(2)); + propertySignature.internalInit(descriptor.getExtensions().get(3)); + typeAnnotation.internalInit(descriptor.getExtensions().get(4)); + isRaw.internalInit(descriptor.getExtensions().get(5)); + typeParameterAnnotation.internalInit(descriptor.getExtensions().get(6)); + classModuleName.internalInit(descriptor.getExtensions().get(7)); + classLocalVariable.internalInit(descriptor.getExtensions().get(8)); + anonymousObjectOriginName.internalInit(descriptor.getExtensions().get(9)); + packageModuleName.internalInit(descriptor.getExtensions().get(10)); + packageLocalVariable.internalInit(descriptor.getExtensions().get(11)); org.jetbrains.kotlin.protobuf.ExtensionRegistry registry = org.jetbrains.kotlin.protobuf.ExtensionRegistry.newInstance(); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); @@ -4795,6 +4815,7 @@ public final class DebugJvmProtoBuf { registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); + registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor .internalUpdateFileDescriptor(descriptor, registry); org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.getDescriptor(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index a5f9861f989..79ad7b1cc4f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -45,7 +45,10 @@ import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import org.jetbrains.org.objectweb.asm.commons.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isBoolean; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isPrimitiveClass; @@ -878,7 +881,12 @@ public class AsmUtil { public static void writeAnnotationData( @NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable ) { - String[] data = BitEncoding.encodeBytes(DescriptorSerializer.serialize(message, stringTable)); + writeAnnotationData(av, BitEncoding.encodeBytes(DescriptorSerializer.serialize(message, stringTable)), stringTable.getStrings()); + } + + public static void writeAnnotationData( + @NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull List strings + ) { AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME); for (String string : data) { dataVisitor.visit(null, string); @@ -886,7 +894,7 @@ public class AsmUtil { dataVisitor.visitEnd(); AnnotationVisitor stringsVisitor = av.visitArray(JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME); - for (String string : stringTable.getStrings()) { + for (String string : strings) { stringsVisitor.visit(null, string); } stringsVisitor.visitEnd(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt index b302663f6a2..103b305616c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt @@ -172,7 +172,7 @@ class AnonymousObjectTransformer( val header = metadataReader.createHeader() if (header != null) { - transformMetadata(header, classBuilder) + writeTransformedMetadata(header, classBuilder) } writeOuterInfo(visitor) @@ -182,26 +182,45 @@ class AnonymousObjectTransformer( return transformationResult } - private fun transformMetadata(header: KotlinClassHeader, classBuilder: ClassBuilder) { - val newProto: MessageLite - val newStringTable: JvmStringTable - - if (header.kind == KotlinClassHeader.Kind.CLASS) { - val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(header.data!!, header.strings!!) - newStringTable = JvmStringTable(state.typeMapper, nameResolver as JvmNameResolver) - newProto = classProto.toBuilder().apply { - setExtension(JvmProtoBuf.anonymousObjectOriginName, newStringTable.getStringIndex(oldObjectType.internalName)) - }.build() - } else if (header.kind == KotlinClassHeader.Kind.SYNTHETIC_CLASS) { - // TODO: transform metadata for synthetic classes - return - } else return - - writeKotlinMetadata(classBuilder, state, header.kind, header.extraInt) { av -> + private fun writeTransformedMetadata(header: KotlinClassHeader, classBuilder: ClassBuilder) { + writeKotlinMetadata(classBuilder, state, header.kind, header.extraInt) action@ { av -> + val (newProto, newStringTable) = transformMetadata(header) ?: run { + val data = header.data + val strings = header.strings + if (data != null && strings != null) { + AsmUtil.writeAnnotationData(av, data, strings.asList()) + } + return@action + } AsmUtil.writeAnnotationData(av, newProto, newStringTable) } } + private fun transformMetadata(header: KotlinClassHeader): Pair? { + val data = header.data ?: return null + val strings = header.strings ?: return null + + when (header.kind) { + KotlinClassHeader.Kind.CLASS -> { + val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(data, strings) + val newStringTable = JvmStringTable(state.typeMapper, nameResolver as JvmNameResolver) + val newProto = classProto.toBuilder().apply { + setExtension(JvmProtoBuf.anonymousObjectOriginName, newStringTable.getStringIndex(oldObjectType.internalName)) + }.build() + return newProto to newStringTable + } + KotlinClassHeader.Kind.SYNTHETIC_CLASS -> { + val (nameResolver, functionProto) = JvmProtoBufUtil.readFunctionDataFrom(data, strings) + val newStringTable = JvmStringTable(state.typeMapper, nameResolver) + val newProto = functionProto.toBuilder().apply { + setExtension(JvmProtoBuf.lambdaClassOriginName, newStringTable.getStringIndex(oldObjectType.internalName)) + }.build() + return newProto to newStringTable + } + else -> return null + } + } + private fun writeOuterInfo(visitor: ClassVisitor) { val info = inliningContext.callSiteInfo visitor.visitOuterClass(info.ownerClassName, info.functionName, info.functionDesc) diff --git a/core/descriptors.jvm/src/jvm_descriptors.proto b/core/descriptors.jvm/src/jvm_descriptors.proto index ff66f9c317a..71da4db1d5b 100644 --- a/core/descriptors.jvm/src/jvm_descriptors.proto +++ b/core/descriptors.jvm/src/jvm_descriptors.proto @@ -94,6 +94,10 @@ extend Constructor { extend Function { optional JvmMethodSignature method_signature = 100; + + // For lambdas from bodies of inline functions copied to the use site, the JVM internal name of the original + // lambda class this class is copied from + optional int32 lambda_class_origin_name = 101 [(string_id_in_table) = true]; } extend Property { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java index 85d65a312b3..b7fa4e25a4c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java @@ -9,6 +9,7 @@ public final class JvmProtoBuf { org.jetbrains.kotlin.protobuf.ExtensionRegistryLite registry) { registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.constructorSignature); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.methodSignature); + registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.lambdaClassOriginName); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.propertySignature); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw); @@ -3820,6 +3821,27 @@ public final class JvmProtoBuf { 100, org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE, org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.JvmMethodSignature.class); + public static final int LAMBDA_CLASS_ORIGIN_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Function { ... } + * + *
+   * For lambdas from bodies of inline functions copied to the use site, the JVM internal name of the original
+   * lambda class this class is copied from
+   * 
+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.Function, + java.lang.Integer> lambdaClassOriginName = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.Function.getDefaultInstance(), + 0, + null, + null, + 101, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, + java.lang.Integer.class); public static final int PROPERTY_SIGNATURE_FIELD_NUMBER = 100; /** * extend .org.jetbrains.kotlin.serialization.Property { ... } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt index 81c95bce0ac..6811eba6bf4 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBufUtil.kt @@ -23,34 +23,40 @@ import org.jetbrains.kotlin.serialization.PackageData import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.* import java.io.ByteArrayInputStream +import java.io.InputStream object JvmProtoBufUtil { - val EXTENSION_REGISTRY: ExtensionRegistryLite = run { - val registry = ExtensionRegistryLite.newInstance() - JvmProtoBuf.registerAllExtensions(registry) - registry - } + val EXTENSION_REGISTRY: ExtensionRegistryLite = ExtensionRegistryLite.newInstance().apply(JvmProtoBuf::registerAllExtensions) - @JvmStatic fun readClassDataFrom(data: Array, strings: Array): ClassData = - readClassDataFrom(BitEncoding.decodeBytes(data), strings) + @JvmStatic + fun readClassDataFrom(data: Array, strings: Array): ClassData = + readClassDataFrom(BitEncoding.decodeBytes(data), strings) - @JvmStatic fun readClassDataFrom(bytes: ByteArray, strings: Array): ClassData { + @JvmStatic + fun readClassDataFrom(bytes: ByteArray, strings: Array): ClassData { val input = ByteArrayInputStream(bytes) - val nameResolver = JvmNameResolver(JvmProtoBuf.StringTableTypes.parseDelimitedFrom(input, EXTENSION_REGISTRY), strings) - val classProto = ProtoBuf.Class.parseFrom(input, EXTENSION_REGISTRY) - return ClassData(nameResolver, classProto) + return ClassData(input.readNameResolver(strings), ProtoBuf.Class.parseFrom(input, EXTENSION_REGISTRY)) } - @JvmStatic fun readPackageDataFrom(data: Array, strings: Array): PackageData = - readPackageDataFrom(BitEncoding.decodeBytes(data), strings) + @JvmStatic + fun readPackageDataFrom(data: Array, strings: Array): PackageData = + readPackageDataFrom(BitEncoding.decodeBytes(data), strings) - @JvmStatic fun readPackageDataFrom(bytes: ByteArray, strings: Array): PackageData { + @JvmStatic + fun readPackageDataFrom(bytes: ByteArray, strings: Array): PackageData { val input = ByteArrayInputStream(bytes) - val nameResolver = JvmNameResolver(JvmProtoBuf.StringTableTypes.parseDelimitedFrom(input, EXTENSION_REGISTRY), strings) - val packageProto = ProtoBuf.Package.parseFrom(input, EXTENSION_REGISTRY) - return PackageData(nameResolver, packageProto) + return PackageData(input.readNameResolver(strings), ProtoBuf.Package.parseFrom(input, EXTENSION_REGISTRY)) } + @JvmStatic + fun readFunctionDataFrom(data: Array, strings: Array): Pair { + val input = ByteArrayInputStream(BitEncoding.decodeBytes(data)) + return Pair(input.readNameResolver(strings), ProtoBuf.Function.parseFrom(input, EXTENSION_REGISTRY)) + } + + private fun InputStream.readNameResolver(strings: Array): JvmNameResolver = + JvmNameResolver(JvmProtoBuf.StringTableTypes.parseDelimitedFrom(this, EXTENSION_REGISTRY), strings) + // returns JVM signature in the format: "equals(Ljava/lang/Object;)Z" fun getJvmMethodSignature( proto: ProtoBuf.Function, diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt index 9b4ee9ed294..619d6b22041 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt @@ -18,12 +18,8 @@ package kotlin.reflect.jvm -import org.jetbrains.kotlin.load.kotlin.JvmNameResolver -import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.MemberDeserializer import org.jetbrains.kotlin.serialization.deserialization.TypeTable -import org.jetbrains.kotlin.serialization.jvm.BitEncoding -import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import kotlin.reflect.KFunction import kotlin.reflect.jvm.internal.EmptyContainerForLocal @@ -38,10 +34,7 @@ import kotlin.reflect.jvm.internal.deserializeToDescriptor fun Function.reflect(): KFunction? { val annotation = javaClass.getAnnotation(Metadata::class.java) ?: return null val data = annotation.d1.takeUnless(Array::isEmpty) ?: return null - val input = BitEncoding.decodeBytes(data).inputStream() - val stringTableTypes = JvmProtoBuf.StringTableTypes.parseDelimitedFrom(input, JvmProtoBufUtil.EXTENSION_REGISTRY) - val nameResolver = JvmNameResolver(stringTableTypes, annotation.d2) - val proto = ProtoBuf.Function.parseFrom(input, JvmProtoBufUtil.EXTENSION_REGISTRY) + val (nameResolver, proto) = JvmProtoBufUtil.readFunctionDataFrom(data, annotation.d2) val descriptor = deserializeToDescriptor(javaClass, proto, nameResolver, TypeTable(proto.typeTable), MemberDeserializer::loadFunction) ?: return null