[KLIB] Add API to access file's part of data as ByteArray

It requires for computing fingerprint of IrFile in IC infra
This commit is contained in:
Roman Artemev
2021-08-20 16:05:25 +03:00
committed by TeamCityServer
parent e4c2d4937f
commit 7d8c86caf1
4 changed files with 75 additions and 5 deletions
@@ -84,6 +84,16 @@ class ICKotlinLibrary(private val icData: List<SerializedIrFile>) : IrLibrary {
override fun file(index: Int): ByteArray = icData[index].fileData
override fun fileCount(): Int = icData.size
override fun types(fileIndex: Int): ByteArray = icData[fileIndex].types
override fun signatures(fileIndex: Int): ByteArray = icData[fileIndex].signatures
override fun strings(fileIndex: Int): ByteArray = icData[fileIndex].strings
override fun declarations(fileIndex: Int): ByteArray = icData[fileIndex].declarations
override fun bodies(fileIndex: Int): ByteArray = icData[fileIndex].bodies
}
class CurrentModuleWithICDeserializer(
@@ -67,6 +67,12 @@ interface IrLibrary {
fun debugInfo(index: Int, fileIndex: Int): ByteArray?
fun file(index: Int): ByteArray
fun fileCount(): Int
fun types(fileIndex: Int): ByteArray
fun signatures(fileIndex: Int): ByteArray
fun strings(fileIndex: Int): ByteArray
fun declarations(fileIndex: Int): ByteArray
fun bodies(fileIndex: Int): ByteArray
}
val BaseKotlinLibrary.uniqueName: String
@@ -99,12 +99,12 @@ abstract class IrMultiArrayReader(private val buffer: ReadBuffer) {
fun tableItemBytes(row: Int, column: Int): ByteArray {
val rowOffset = indexToOffset[row]
val collumnOffsets = indexIndexToOffset.getOrPut(row) {
val columnOffsets = indexIndexToOffset.getOrPut(row) {
readOffsets(rowOffset)
}
val dataOffset = collumnOffsets[column]
val dataSize = collumnOffsets[column + 1] - dataOffset
val dataOffset = columnOffsets[column]
val dataSize = columnOffsets[column + 1] - dataOffset
val result = ByteArray(dataSize)
buffer.position = rowOffset + dataOffset
@@ -155,6 +155,16 @@ abstract class IrMultiTableReader<K>(private val buffer: ReadBuffer, private val
return result
}
fun tableItemBytes(idx: Int): ByteArray {
val rowOffset = indexToOffset[idx]
val nextOffset = indexToOffset[idx + 1]
val size = nextOffset - rowOffset
val result = ByteArray(size)
buffer.position = rowOffset
buffer.get(result, 0, size)
return result
}
fun tableItemBytes(row: Int, id: K): ByteArray {
val rowOffset = indexToOffset[row]
@@ -156,6 +156,26 @@ class IrMonoliticLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) :
it.irFiles
})
}
override fun types(fileIndex: Int): ByteArray {
return types.tableItemBytes(fileIndex)
}
override fun signatures(fileIndex: Int): ByteArray {
return signatures.tableItemBytes(fileIndex)
}
override fun strings(fileIndex: Int): ByteArray {
return strings.tableItemBytes(fileIndex)
}
override fun declarations(fileIndex: Int): ByteArray {
return combinedDeclarations.tableItemBytes(fileIndex)
}
override fun bodies(fileIndex: Int): ByteArray {
return bodies.tableItemBytes(fileIndex)
}
}
class IrPerFileLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) : IrLibraryImpl(_access) {
@@ -188,13 +208,17 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) : Ir
return dataReader.tableItemBytes(index)
}
override fun signature(index: Int, fileIndex: Int): ByteArray {
val dataReader = fileToTypeMap.getOrPut(fileIndex) {
private fun signatureDataReader(fileIndex: Int): IrArrayFileReader {
return fileToTypeMap.getOrPut(fileIndex) {
val fileDirectory = directories[fileIndex]
IrArrayFileReader(access.realFiles {
it.irSignatures(fileDirectory)
})
}
}
override fun signature(index: Int, fileIndex: Int): ByteArray {
val dataReader = signatureDataReader(fileIndex)
return dataReader.tableItemBytes(index)
}
@@ -246,6 +270,26 @@ class IrPerFileLibraryImpl(_access: IrLibraryAccess<IrKotlinLibraryLayout>) : Ir
override fun fileCount(): Int {
return directories.size
}
override fun types(fileIndex: Int): ByteArray {
TODO("Not yet implemented")
}
override fun signatures(fileIndex: Int): ByteArray {
TODO("Not yet implemented")
}
override fun strings(fileIndex: Int): ByteArray {
TODO("Not yet implemented")
}
override fun declarations(fileIndex: Int): ByteArray {
TODO("Not yet implemented")
}
override fun bodies(fileIndex: Int): ByteArray {
TODO("Not yet implemented")
}
}
open class KotlinLibraryImpl(