[KLIB] Fix IO API

- Implement abstract IR raw data readers
 - Add file and memory based specializations of IR data readers
This commit is contained in:
Roman Artemev
2020-04-02 10:39:44 +03:00
committed by romanart
parent 5385e0cf1c
commit 74132fbc03
2 changed files with 41 additions and 32 deletions
@@ -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<Int, IntArray>()
@@ -84,8 +85,10 @@ class IrMultiArrayReader(file: File) {
}
}
abstract class IrMultiTableReader<K>(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<K>(private val buffer: ByteBuffer, private val keyReader: ByteBuffer.() -> K) {
private val indexToOffset: IntArray
private val indexToIndexMap = mutableMapOf<Int, Map<K, Pair<Int, Int>>>()
@@ -141,8 +144,7 @@ abstract class IrMultiTableReader<K>(file: File, private val keyReader: ByteBuff
}
}
abstract class IrTableReader<K>(file: File, keyReader: ByteBuffer.() -> K) {
private val buffer = file.map(FileChannel.MapMode.READ_ONLY)
abstract class IrTableReader<K>(private val buffer: ByteBuffer, keyReader: ByteBuffer.() -> K) {
private val indexToOffset = mutableMapOf<K, Pair<Int, Int>>()
init {
@@ -167,9 +169,16 @@ abstract class IrTableReader<K>(file: File, keyReader: ByteBuffer.() -> K) {
}
}
class IndexIrTableReader(file: File) : IrTableReader<Long>(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<Long>(file.memoryMappedBuffer, { long })
class IndexIrTableMemoryReader(bytes: ByteArray) : IrTableReader<Long>(bytes.buffer, { long })
data class DeclarationId(val id: Int)
class DeclarationIrTableReader(file: File) : IrTableReader<DeclarationId>(file, { DeclarationId(int) })
class DeclarationIrMultiTableReader(file: File) : IrMultiTableReader<DeclarationId>(file, { DeclarationId(int) })
class DeclarationIrTableFileReader(file: File) : IrTableReader<DeclarationId>(file.memoryMappedBuffer, { DeclarationId(int) })
class DeclarationIrTableMemoryReader(bytes: ByteArray) : IrTableReader<DeclarationId>(bytes.buffer, { DeclarationId(int) })
class DeclarationIrMultiTableFileReader(file: File) : IrMultiTableReader<DeclarationId>(file.memoryMappedBuffer, { DeclarationId(int) })
class DeclarationIrMultiTableMemoryReader(bytes: ByteArray) : IrMultiTableReader<DeclarationId>(bytes.buffer, { DeclarationId(int) })
@@ -112,38 +112,38 @@ class IrMonoliticLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) :
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<IrKotlinLibraryLayout>) : Ir
}
}
private val fileToDeclarationMap = mutableMapOf<Int, DeclarationIrTableReader>()
private val fileToDeclarationMap = mutableMapOf<Int, DeclarationIrTableFileReader>()
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<Int, IrArrayReader>()
private val fileToTypeMap = mutableMapOf<Int, IrArrayFileReader>()
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<IrKotlinLibraryLayout>) : 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<Int, IrArrayReader>()
private val fileToStringMap = mutableMapOf<Int, IrArrayFileReader>()
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<Int, IrArrayReader>()
private val fileToBodyMap = mutableMapOf<Int, IrArrayFileReader>()
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)
})
}