Collected klib scheme to a single interface.
This commit is contained in:
committed by
alexander-gorshenev
parent
bca34894d3
commit
53473fc0dd
+32
-20
@@ -65,13 +65,36 @@ abstract class FileBasedLibraryReader(
|
||||
}
|
||||
}
|
||||
|
||||
// This scheme describes the Konan Library (klib) layout.
|
||||
interface SplitScheme {
|
||||
val libDir: File
|
||||
val target: String?
|
||||
// This is a default implementation. Can't make it an assignment.
|
||||
get() = null
|
||||
val klibFile
|
||||
get() = File("${libDir.path}.klib")
|
||||
val moduleFile
|
||||
get() = File(libDir, "module")
|
||||
val linkdataDir
|
||||
get() = File(libDir, "linkdata")
|
||||
val resourcesDir
|
||||
get() = File(libDir, "resources")
|
||||
val targetDir
|
||||
get() = File(libDir, target!!)
|
||||
val kotlinDir
|
||||
get() = File(targetDir, "kotlin")
|
||||
val nativeDir
|
||||
get() = File(targetDir, "native")
|
||||
}
|
||||
|
||||
// TODO: Get rid of the configuration here.
|
||||
class SplitLibraryReader(val libDir: File, configuration: CompilerConfiguration)
|
||||
: FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)) {
|
||||
class SplitLibraryReader(override val libDir: File, configuration: CompilerConfiguration)
|
||||
: FileBasedLibraryReader(libDir, configuration, SplitMetadataReader(libDir)),
|
||||
SplitScheme {
|
||||
|
||||
public constructor(path: String, configuration: CompilerConfiguration) : this(File(path), configuration)
|
||||
|
||||
val klibFile = File("${libDir.path}.klib")
|
||||
override val target: String? = TargetManager(configuration).currentName
|
||||
|
||||
init {
|
||||
unpackIfNeeded()
|
||||
@@ -98,16 +121,9 @@ class SplitLibraryReader(val libDir: File, configuration: CompilerConfiguration)
|
||||
private val File.dirAbsolutePaths: List<String>
|
||||
get() = this.listFiles!!.toList()!!.map{it->it.absolutePath}
|
||||
|
||||
private val targetDir: File
|
||||
get() {
|
||||
val target = TargetManager(configuration).currentName
|
||||
val dir = File(libDir, target)
|
||||
return dir
|
||||
}
|
||||
|
||||
override val bitcodePaths: List<String>
|
||||
get() = File(targetDir, "kotlin").dirAbsolutePaths +
|
||||
File(targetDir, "native").dirAbsolutePaths
|
||||
get() = kotlinDir.dirAbsolutePaths +
|
||||
nativeDir.dirAbsolutePaths
|
||||
|
||||
}
|
||||
/* ------------ writer part ----------------*/
|
||||
@@ -133,15 +149,11 @@ abstract class FileBasedLibraryWriter (
|
||||
val file: File): KonanLibraryWriter {
|
||||
}
|
||||
|
||||
class SplitLibraryWriter(val libDir: File, target: String, val nopack: Boolean = false): FileBasedLibraryWriter(libDir) {
|
||||
class SplitLibraryWriter(override val libDir: File, override val target: String?, val nopack: Boolean = false):
|
||||
FileBasedLibraryWriter(libDir), SplitScheme {
|
||||
|
||||
public constructor(path: String, target: String, nopack: Boolean): this(File(path), target, nopack)
|
||||
|
||||
val klibFile = File("${libDir.path}.klib")
|
||||
val linkdataDir = File(libDir, "linkdata")
|
||||
val resourcesDir = File(libDir, "resources")
|
||||
val targetDir = File(libDir, target)
|
||||
val kotlinDir = File(targetDir, "kotlin")
|
||||
val nativeDir = File(targetDir, "native")
|
||||
// TODO: Experiment with separate bitcode files.
|
||||
// Per package or per class.
|
||||
val mainBitcodeFile = File(kotlinDir, "program.kt.bc")
|
||||
@@ -167,7 +179,7 @@ class SplitLibraryWriter(val libDir: File, target: String, val nopack: Boolean =
|
||||
}
|
||||
|
||||
override fun addLinkData(linkData: LinkData) {
|
||||
SplitMetadataGenerator(linkdataDir).addLinkData(linkData)
|
||||
SplitMetadataGenerator(libDir).addLinkData(linkData)
|
||||
}
|
||||
|
||||
override fun addNativeBitcode(library: String) {
|
||||
|
||||
+7
-9
@@ -26,14 +26,11 @@ interface MetadataReader {
|
||||
fun loadSerializedPackageFragment(fqName: String): String
|
||||
}
|
||||
|
||||
class SplitMetadataReader(file: File) : MetadataReader {
|
||||
|
||||
val linkDataDir = File(file, "linkdata")
|
||||
class SplitMetadataReader(override val libDir: File) : MetadataReader, SplitScheme {
|
||||
|
||||
override fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData {
|
||||
val header = Properties()
|
||||
val file = File(linkDataDir, "module")
|
||||
file.bufferedReader().use { reader ->
|
||||
moduleFile.bufferedReader().use { reader ->
|
||||
header.load(reader)
|
||||
}
|
||||
val headerAbiVersion = header.getProperty("abi_version")!!
|
||||
@@ -49,27 +46,28 @@ class SplitMetadataReader(file: File) : MetadataReader {
|
||||
override fun loadSerializedPackageFragment(fqName: String): String {
|
||||
val realName = if (fqName == "") "<root>" else fqName
|
||||
|
||||
return File(linkDataDir, realName).readText()
|
||||
return File(linkdataDir, realName).readText()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
internal class SplitMetadataGenerator(val file: File) {
|
||||
internal class SplitMetadataGenerator(override val libDir: File): SplitScheme {
|
||||
|
||||
fun addLinkData(linkData: LinkData) {
|
||||
|
||||
val linkdataDir = File(libDir, "linkdata")
|
||||
val header = Properties()
|
||||
header.putAll(hashMapOf(
|
||||
"abi_version" to "${linkData.abiVersion}",
|
||||
"module_name" to "${linkData.moduleName}",
|
||||
"module_data" to "${linkData.module}"
|
||||
))
|
||||
header.store(File(file, "module").outputStream(), null)
|
||||
header.store(moduleFile.outputStream(), null)
|
||||
|
||||
linkData.fragments.forEachIndexed { index, it ->
|
||||
val name = linkData.fragmentNames[index]
|
||||
val realName = if (name == "") "<root>" else name
|
||||
File(file, realName).writeText(it)
|
||||
File(linkdataDir, realName).writeText(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user