JVM_IR: avoid double encoding of byte strings

IrLibraryFile, ingerited from Klib code, needed types, bodies, strings,
signatures encoded as byte strings.
When we store this data as class annotations, it is better to store it
as protobuf structs, to avoid re-encoding byte streams twice.
This commit is contained in:
Georgy Bronnikov
2021-09-27 19:41:49 +03:00
committed by TeamCityServer
parent b61389f6f9
commit 8a459821d0
13 changed files with 686 additions and 326 deletions
@@ -23,13 +23,12 @@ import org.jetbrains.kotlin.library.impl.DeclarationIrTableMemoryReader
import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader
import org.jetbrains.kotlin.library.impl.IrLongArrayMemoryReader
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
import org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration as ProtoIrDeclaration
import org.jetbrains.kotlin.backend.common.serialization.proto.IrFile as ProtoIrFile
class IcFileDeserializer(
val linker: JsIrLinker,
private val file: IrFile,
originalFileReader: IrLibraryFile,
originalFileReader: IrLibraryFileFromBytes,
fileProto: ProtoIrFile,
deserializeBodies: Boolean,
allowErrorNodes: Boolean,
@@ -115,7 +114,7 @@ class IcFileDeserializer(
// IC data processing starts here
private val icFileReader = FileReaderFromSerializedIrFile(icFileData.file)
private val icFileReader = IrLibraryFileFromBytes(FileReaderFromSerializedIrFile(icFileData.file))
val symbolDeserializer = IrSymbolDeserializer(
linker.symbolTable,
@@ -195,8 +194,7 @@ class IcFileDeserializer(
cachedDeclaration(idSig)?.let { return it }
val idSigIndex = reversedSignatureIndex[idSig] ?: return null
val declarationStream = icFileReader.irDeclaration(idSigIndex).codedInputStream
val declarationProto = ProtoIrDeclaration.parseFrom(declarationStream, extensionRegistryLite)
val declarationProto = icFileReader.declaration(idSigIndex)
return declarationDeserializer.deserializeDeclaration(declarationProto)
}
@@ -221,8 +219,7 @@ class IcFileDeserializer(
}
reversedSignatureIndex[maybeTopLevel]?.let { idSigIndex ->
val declarationStream = icFileReader.irDeclaration(idSigIndex).codedInputStream
val declarationProto = ProtoIrDeclaration.parseFrom(declarationStream, extensionRegistryLite)
val declarationProto = icFileReader.declaration(idSigIndex)
return declarationDeserializer.deserializeDeclaration(declarationProto)
}
@@ -250,9 +247,7 @@ class IcFileDeserializer(
}
}
private val extensionRegistryLite = ExtensionRegistryLite.newInstance()
private class FileReaderFromSerializedIrFile(val irFile: SerializedIrFile) : IrLibraryFile() {
private class FileReaderFromSerializedIrFile(val irFile: SerializedIrFile) : IrLibraryBytesSource() {
private val declarationReader = DeclarationIrTableMemoryReader(irFile.declarations)
private val typeReader = IrArrayMemoryReader(irFile.types)
private val signatureReader = IrArrayMemoryReader(irFile.signatures)
@@ -127,7 +127,7 @@ class IcModuleDeserializer(
allowErrorNodes: Boolean
): IrFile {
val fileReader = IrLibraryFileFromKlib(moduleDeserializer.klib, fileIndex)
val fileReader = IrLibraryFileFromBytes(IrKlibBytesSource(moduleDeserializer.klib, fileIndex))
val file = fileReader.createFile(moduleFragment, fileProto)
val fileStrategy = strategyResolver(file.fileEntry.name)