[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:
@@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user