[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.ByteBuffer
import java.nio.channels.FileChannel import java.nio.channels.FileChannel
class IrArrayReader(file: File) { abstract class IrArrayReader(private val buffer: ByteBuffer) {
private val buffer = file.map(FileChannel.MapMode.READ_ONLY)
private val indexToOffset: IntArray private val indexToOffset: IntArray
fun entryCount() = indexToOffset.size - 1 fun entryCount() = indexToOffset.size - 1
@@ -35,8 +34,10 @@ class IrArrayReader(file: File) {
} }
} }
class IrMultiArrayReader(file: File) { class IrArrayFileReader(file: File) : IrArrayReader(file.memoryMappedBuffer)
private val buffer = file.map(FileChannel.MapMode.READ_ONLY) class IrArrayMemoryReader(bytes: ByteArray) : IrArrayReader(bytes.buffer)
abstract class IrMultiArrayReader(private val buffer: ByteBuffer) {
private val indexToOffset: IntArray private val indexToOffset: IntArray
private val indexIndexToOffset = mutableMapOf<Int, 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) { class IrMultiArrayFileReader(file: File) : IrMultiArrayReader(file.memoryMappedBuffer)
private val buffer = file.map(FileChannel.MapMode.READ_ONLY) 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 indexToOffset: IntArray
private val indexToIndexMap = mutableMapOf<Int, Map<K, Pair<Int, Int>>>() 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) { abstract class IrTableReader<K>(private val buffer: ByteBuffer, keyReader: ByteBuffer.() -> K) {
private val buffer = file.map(FileChannel.MapMode.READ_ONLY)
private val indexToOffset = mutableMapOf<K, Pair<Int, Int>>() private val indexToOffset = mutableMapOf<K, Pair<Int, Int>>()
init { 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) data class DeclarationId(val id: Int)
class DeclarationIrTableReader(file: File) : IrTableReader<DeclarationId>(file, { DeclarationId(int) }) class DeclarationIrTableFileReader(file: File) : IrTableReader<DeclarationId>(file.memoryMappedBuffer, { DeclarationId(int) })
class DeclarationIrMultiTableReader(file: File) : IrMultiTableReader<DeclarationId>(file, { 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) = private fun loadIrDeclaration(index: Int, fileIndex: Int) =
combinedDeclarations.tableItemBytes(fileIndex, DeclarationId(index)) combinedDeclarations.tableItemBytes(fileIndex, DeclarationId(index))
private val combinedDeclarations: DeclarationIrMultiTableReader by lazy { private val combinedDeclarations: DeclarationIrMultiTableFileReader by lazy {
DeclarationIrMultiTableReader(access.realFiles { DeclarationIrMultiTableFileReader(access.realFiles {
it.irDeclarations it.irDeclarations
}) })
} }
private val types: IrMultiArrayReader by lazy { private val types: IrMultiArrayFileReader by lazy {
IrMultiArrayReader(access.realFiles { IrMultiArrayFileReader(access.realFiles {
it.irTypes it.irTypes
}) })
} }
private val signatures: IrMultiArrayReader by lazy { private val signatures: IrMultiArrayFileReader by lazy {
IrMultiArrayReader(access.realFiles { IrMultiArrayFileReader(access.realFiles {
it.irSignatures it.irSignatures
}) })
} }
private val strings: IrMultiArrayReader by lazy { private val strings: IrMultiArrayFileReader by lazy {
IrMultiArrayReader(access.realFiles { IrMultiArrayFileReader(access.realFiles {
it.irStrings it.irStrings
}) })
} }
private val bodies: IrMultiArrayReader by lazy { private val bodies: IrMultiArrayFileReader by lazy {
IrMultiArrayReader(access.realFiles { IrMultiArrayFileReader(access.realFiles {
it.irBodies it.irBodies
}) })
} }
private val files: IrArrayReader by lazy { private val files: IrArrayFileReader by lazy {
IrArrayReader(access.realFiles { IrArrayFileReader(access.realFiles {
it.irFiles 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 { override fun irDeclaration(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToDeclarationMap.getOrPut(fileIndex) { val dataReader = fileToDeclarationMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex] val fileDirectory = directories[fileIndex]
DeclarationIrTableReader(access.realFiles { DeclarationIrTableFileReader(access.realFiles {
it.irDeclarations(fileDirectory) it.irDeclarations(fileDirectory)
}) })
} }
return dataReader.tableItemBytes(DeclarationId(index)) 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 { override fun type(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToTypeMap.getOrPut(fileIndex) { val dataReader = fileToTypeMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex] val fileDirectory = directories[fileIndex]
IrArrayReader(access.realFiles { IrArrayFileReader(access.realFiles {
it.irTypes(fileDirectory) it.irTypes(fileDirectory)
}) })
} }
@@ -182,29 +182,29 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) : Ir
override fun signature(index: Int, fileIndex: Int): ByteArray { override fun signature(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToTypeMap.getOrPut(fileIndex) { val dataReader = fileToTypeMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex] val fileDirectory = directories[fileIndex]
IrArrayReader(access.realFiles { IrArrayFileReader(access.realFiles {
it.irSignatures(fileDirectory) it.irSignatures(fileDirectory)
}) })
} }
return dataReader.tableItemBytes(index) return dataReader.tableItemBytes(index)
} }
private val fileToStringMap = mutableMapOf<Int, IrArrayReader>() private val fileToStringMap = mutableMapOf<Int, IrArrayFileReader>()
override fun string(index: Int, fileIndex: Int): ByteArray { override fun string(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToStringMap.getOrPut(fileIndex) { val dataReader = fileToStringMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex] val fileDirectory = directories[fileIndex]
IrArrayReader(access.realFiles { IrArrayFileReader(access.realFiles {
it.irStrings(fileDirectory) it.irStrings(fileDirectory)
}) })
} }
return dataReader.tableItemBytes(index) return dataReader.tableItemBytes(index)
} }
private val fileToBodyMap = mutableMapOf<Int, IrArrayReader>() private val fileToBodyMap = mutableMapOf<Int, IrArrayFileReader>()
override fun body(index: Int, fileIndex: Int): ByteArray { override fun body(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToBodyMap.getOrPut(fileIndex) { val dataReader = fileToBodyMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex] val fileDirectory = directories[fileIndex]
IrArrayReader(access.realFiles { IrArrayFileReader(access.realFiles {
it.irBodies(fileDirectory) it.irBodies(fileDirectory)
}) })
} }