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