From 7dbdb311e1a7b6110d01e67816c29f24a969ef53 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Fri, 5 Mar 2021 17:31:31 +0300 Subject: [PATCH] JVM_IR: read serialized IR from annotation --- ...eadKotlinClassHeaderAnnotationVisitor.java | 32 ++++++++++++++++++- .../load/kotlin/header/KotlinClassHeader.kt | 3 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index 7bf938ecfdf..6d93e07c128 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.SourceElement; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; +import org.jetbrains.kotlin.metadata.jvm.deserialization.BitEncoding; import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; @@ -57,6 +58,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor private String[] strings = null; private String[] incompatibleData = null; private KotlinClassHeader.Kind headerKind = null; + private String[] serializedIrFields = null; @Nullable public KotlinClassHeader createHeader() { @@ -77,7 +79,22 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor return null; } - return new KotlinClassHeader(headerKind, metadataVersion, data, incompatibleData, strings, extraString, extraInt, packageName); + byte[] serializedIr = null; + if (serializedIrFields != null) { + serializedIr = BitEncoding.decodeBytes(serializedIrFields); + } + + return new KotlinClassHeader( + headerKind, + metadataVersion, + data, + incompatibleData, + strings, + extraString, + extraInt, + packageName, + serializedIr + ); } private boolean shouldHaveData() { @@ -161,6 +178,9 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor else if (METADATA_STRINGS_FIELD_NAME.equals(string)) { return stringsArrayVisitor(); } + else if (METADATA_SERIALIZED_IR_FIELD_NAME.equals(string)) { + return serializedIrArrayVisitor(); + } else { return null; } @@ -186,6 +206,16 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor }; } + @NotNull + private AnnotationArrayArgumentVisitor serializedIrArrayVisitor() { + return new CollectStringArrayAnnotationVisitor() { + @Override + protected void visitEnd(@NotNull String[] result) { + serializedIrFields = result; + } + }; + } + @Override public void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName) { } diff --git a/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt b/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt index 9abb0bf0b6c..f0cf70fe6c8 100644 --- a/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt +++ b/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/header/KotlinClassHeader.kt @@ -18,7 +18,8 @@ class KotlinClassHeader( val strings: Array?, private val extraString: String?, val extraInt: Int, - val packageName: String? + val packageName: String?, + val serializedIr: ByteArray?, ) { // See kotlin.Metadata enum class Kind(val id: Int) {