A bit of infrastructure for the klib pretty printer.

This commit is contained in:
Alexander Gorshenev
2017-06-08 13:25:43 +03:00
committed by alexander-gorshenev
parent 9e8ca0fa8d
commit a23c64012b
6 changed files with 77 additions and 30 deletions
@@ -50,15 +50,15 @@ abstract open class FileBasedLibraryReader(
override val moduleName: String
get() = namedModuleData.name
protected val tableOfContentsAsString : String
val tableOfContents : Base64
get() = namedModuleData.base64
protected fun packageMetadata(fqName: String): Base64 =
fun packageMetadata(fqName: String): Base64 =
reader.loadSerializedPackageFragment(fqName)
override fun moduleDescriptor(specifics: LanguageVersionSettings)
= deserializeModule(specifics, {packageMetadata(it)},
tableOfContentsAsString, moduleName)
tableOfContents, moduleName)
}
// This scheme describes the Konan Library (klib) layout.
@@ -45,8 +45,8 @@ override fun loadSerializedModule(currentAbiVersion: Int): NamedModuleData {
throw Error("Expected ABI version ${currentAbiVersion}, but the binary is ${abiVersion}")
}
val moduleName = string(nameNode)
val tableOfContentsAsString = string(dataNode)
return NamedModuleData(moduleName, tableOfContentsAsString)
val tableOfContents = string(dataNode)
return NamedModuleData(moduleName, tableOfContents)
}
override fun loadSerializedPackageFragment(fqName: String): String {
@@ -41,6 +41,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer
import org.jetbrains.kotlin.serialization.KonanLinkData
import org.jetbrains.kotlin.serialization.KonanLinkData.*
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -123,11 +124,13 @@ fun createKonanPackageFragmentProvider(
return provider
}
internal fun deserializePackageFragment(base64: Base64): KonanLinkData.PackageFragment {
return KonanLinkData.PackageFragment
.parseFrom(base64ToStream(base64),
KonanSerializerProtocol.extensionRegistry)
}
public fun parsePackageFragment(base64: Base64): PackageFragment =
PackageFragment.parseFrom(base64ToStream(base64),
KonanSerializerProtocol.extensionRegistry)
public fun parseModuleHeader(base64: Base64): Library =
Library.parseFrom(base64ToStream(base64),
KonanSerializerProtocol.extensionRegistry)
internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings,
packageLoader:(String)->Base64, library: Base64, moduleName: String): ModuleDescriptorImpl {
@@ -139,13 +142,11 @@ internal fun deserializeModule(languageVersionSettings: LanguageVersionSettings,
builtIns.builtInsModule = moduleDescriptor
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
val libraryProto = KonanLinkData.Library
.parseFrom(base64ToStream(library),
KonanSerializerProtocol.extensionRegistry)
val libraryProto = parseModuleHeader(library)
val provider = createKonanPackageFragmentProvider(
libraryProto.packageFragmentNameList,
{it -> deserializePackageFragment(packageLoader(it))},
{it -> parsePackageFragment(packageLoader(it))},
storageManager,
moduleDescriptor, deserializationConfiguration)