From 74132fbc03668da37522975d5a0b352c48cedbe0 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 2 Apr 2020 10:39:44 +0300 Subject: [PATCH] [KLIB] Fix IO API - Implement abstract IR raw data readers - Add file and memory based specializations of IR data readers --- .../kotlin/library/impl/IrFileReaders.kt | 31 +++++++++----- .../kotlin/library/impl/KotlinLibraryImpl.kt | 42 +++++++++---------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrFileReaders.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrFileReaders.kt index 1b575ca0f13..2797991f46d 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrFileReaders.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/IrFileReaders.kt @@ -9,8 +9,7 @@ import org.jetbrains.kotlin.konan.file.File import java.nio.ByteBuffer import java.nio.channels.FileChannel -class IrArrayReader(file: File) { - private val buffer = file.map(FileChannel.MapMode.READ_ONLY) +abstract class IrArrayReader(private val buffer: ByteBuffer) { private val indexToOffset: IntArray fun entryCount() = indexToOffset.size - 1 @@ -35,8 +34,10 @@ class IrArrayReader(file: File) { } } -class IrMultiArrayReader(file: File) { - private val buffer = file.map(FileChannel.MapMode.READ_ONLY) +class IrArrayFileReader(file: File) : IrArrayReader(file.memoryMappedBuffer) +class IrArrayMemoryReader(bytes: ByteArray) : IrArrayReader(bytes.buffer) + +abstract class IrMultiArrayReader(private val buffer: ByteBuffer) { private val indexToOffset: IntArray private val indexIndexToOffset = mutableMapOf() @@ -84,8 +85,10 @@ class IrMultiArrayReader(file: File) { } } -abstract class IrMultiTableReader(file: File, private val keyReader: ByteBuffer.() -> K) { - private val buffer = file.map(FileChannel.MapMode.READ_ONLY) +class IrMultiArrayFileReader(file: File) : IrMultiArrayReader(file.memoryMappedBuffer) +class IrMultiArrayMemoryReader(bytes: ByteArray) : IrMultiArrayReader(bytes.buffer) + +abstract class IrMultiTableReader(private val buffer: ByteBuffer, private val keyReader: ByteBuffer.() -> K) { private val indexToOffset: IntArray private val indexToIndexMap = mutableMapOf>>() @@ -141,8 +144,7 @@ abstract class IrMultiTableReader(file: File, private val keyReader: ByteBuff } } -abstract class IrTableReader(file: File, keyReader: ByteBuffer.() -> K) { - private val buffer = file.map(FileChannel.MapMode.READ_ONLY) +abstract class IrTableReader(private val buffer: ByteBuffer, keyReader: ByteBuffer.() -> K) { private val indexToOffset = mutableMapOf>() init { @@ -167,9 +169,16 @@ abstract class IrTableReader(file: File, keyReader: ByteBuffer.() -> K) { } } -class IndexIrTableReader(file: File) : IrTableReader(file, { long }) +val File.memoryMappedBuffer: ByteBuffer get() = map(FileChannel.MapMode.READ_ONLY) +val ByteArray.buffer: ByteBuffer get() = ByteBuffer.wrap(this) + +class IndexIrTableFileReader(file: File) : IrTableReader(file.memoryMappedBuffer, { long }) +class IndexIrTableMemoryReader(bytes: ByteArray) : IrTableReader(bytes.buffer, { long }) data class DeclarationId(val id: Int) -class DeclarationIrTableReader(file: File) : IrTableReader(file, { DeclarationId(int) }) -class DeclarationIrMultiTableReader(file: File) : IrMultiTableReader(file, { DeclarationId(int) }) \ No newline at end of file +class DeclarationIrTableFileReader(file: File) : IrTableReader(file.memoryMappedBuffer, { DeclarationId(int) }) +class DeclarationIrTableMemoryReader(bytes: ByteArray) : IrTableReader(bytes.buffer, { DeclarationId(int) }) + +class DeclarationIrMultiTableFileReader(file: File) : IrMultiTableReader(file.memoryMappedBuffer, { DeclarationId(int) }) +class DeclarationIrMultiTableMemoryReader(bytes: ByteArray) : IrMultiTableReader(bytes.buffer, { DeclarationId(int) }) \ No newline at end of file diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt index 7fa4666b124..c9f2c898b7d 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryImpl.kt @@ -112,38 +112,38 @@ class IrMonoliticLibraryImpl(_access: IrLibraryAccess) : private fun loadIrDeclaration(index: Int, fileIndex: Int) = combinedDeclarations.tableItemBytes(fileIndex, DeclarationId(index)) - private val combinedDeclarations: DeclarationIrMultiTableReader by lazy { - DeclarationIrMultiTableReader(access.realFiles { + private val combinedDeclarations: DeclarationIrMultiTableFileReader by lazy { + DeclarationIrMultiTableFileReader(access.realFiles { it.irDeclarations }) } - private val types: IrMultiArrayReader by lazy { - IrMultiArrayReader(access.realFiles { + private val types: IrMultiArrayFileReader by lazy { + IrMultiArrayFileReader(access.realFiles { it.irTypes }) } - private val signatures: IrMultiArrayReader by lazy { - IrMultiArrayReader(access.realFiles { + private val signatures: IrMultiArrayFileReader by lazy { + IrMultiArrayFileReader(access.realFiles { it.irSignatures }) } - private val strings: IrMultiArrayReader by lazy { - IrMultiArrayReader(access.realFiles { + private val strings: IrMultiArrayFileReader by lazy { + IrMultiArrayFileReader(access.realFiles { it.irStrings }) } - private val bodies: IrMultiArrayReader by lazy { - IrMultiArrayReader(access.realFiles { + private val bodies: IrMultiArrayFileReader by lazy { + IrMultiArrayFileReader(access.realFiles { it.irBodies }) } - private val files: IrArrayReader by lazy { - IrArrayReader(access.realFiles { + private val files: IrArrayFileReader by lazy { + IrArrayFileReader(access.realFiles { it.irFiles }) } @@ -157,22 +157,22 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess) : Ir } } - private val fileToDeclarationMap = mutableMapOf() + private val fileToDeclarationMap = mutableMapOf() override fun irDeclaration(index: Int, fileIndex: Int): ByteArray { val dataReader = fileToDeclarationMap.getOrPut(fileIndex) { val fileDirectory = directories[fileIndex] - DeclarationIrTableReader(access.realFiles { + DeclarationIrTableFileReader(access.realFiles { it.irDeclarations(fileDirectory) }) } return dataReader.tableItemBytes(DeclarationId(index)) } - private val fileToTypeMap = mutableMapOf() + private val fileToTypeMap = mutableMapOf() override fun type(index: Int, fileIndex: Int): ByteArray { val dataReader = fileToTypeMap.getOrPut(fileIndex) { val fileDirectory = directories[fileIndex] - IrArrayReader(access.realFiles { + IrArrayFileReader(access.realFiles { it.irTypes(fileDirectory) }) } @@ -182,29 +182,29 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess) : Ir override fun signature(index: Int, fileIndex: Int): ByteArray { val dataReader = fileToTypeMap.getOrPut(fileIndex) { val fileDirectory = directories[fileIndex] - IrArrayReader(access.realFiles { + IrArrayFileReader(access.realFiles { it.irSignatures(fileDirectory) }) } return dataReader.tableItemBytes(index) } - private val fileToStringMap = mutableMapOf() + private val fileToStringMap = mutableMapOf() override fun string(index: Int, fileIndex: Int): ByteArray { val dataReader = fileToStringMap.getOrPut(fileIndex) { val fileDirectory = directories[fileIndex] - IrArrayReader(access.realFiles { + IrArrayFileReader(access.realFiles { it.irStrings(fileDirectory) }) } return dataReader.tableItemBytes(index) } - private val fileToBodyMap = mutableMapOf() + private val fileToBodyMap = mutableMapOf() override fun body(index: Int, fileIndex: Int): ByteArray { val dataReader = fileToBodyMap.getOrPut(fileIndex) { val fileDirectory = directories[fileIndex] - IrArrayReader(access.realFiles { + IrArrayFileReader(access.realFiles { it.irBodies(fileDirectory) }) }