Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.objcexport.ObjCExportCodeGenerato
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageUtil
import org.jetbrains.kotlin.config.nativeBinaryOptions.BinaryOptions
import org.jetbrains.kotlin.config.parallelBackendThreads
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.konan.exec.Command
import org.jetbrains.kotlin.konan.file.File
Expand Down Expand Up @@ -85,7 +86,7 @@ internal fun produceObjCExportInterface(
val additionalImports = context.config.configuration.getNotNull(KonanConfigKeys.FRAMEWORK_IMPORT_HEADERS)
val headerGenerator = ObjCExportHeaderGenerator.createInstance(
moduleDescriptors, mapper, namer, problemCollector, objcGenerics, objcExportBlockExplicitParameterNames, shouldExportKDoc = shouldExportKDoc,
additionalImports = additionalImports)
additionalImports = additionalImports, config.threadsCount)
headerGenerator.translateModule()
return headerGenerator.buildInterface()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.SourceFile
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import java.util.Collections.synchronizedList

abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
val moduleDescriptors: List<ModuleDescriptor>,
Expand All @@ -22,6 +25,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
val objcGenerics: Boolean,
val objcExportBlockExplicitParameterNames: Boolean,
problemCollector: ObjCExportProblemCollector,
val threadsCount: Int = Runtime.getRuntime().availableProcessors()
) {
private val stubs = mutableListOf<ObjCExportStub>()

Expand Down Expand Up @@ -117,31 +121,49 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
.flatMap { it.getPackageFragments() }
.makePackagesOrderStable()

val classesToTranslate = synchronizedList(mutableListOf<ClassDescriptor>())

val executor = if (threadsCount > 1) {
Executors.newFixedThreadPool(threadsCount)
} else {
null
}


packageFragments.forEach { packageFragment ->
packageFragment.getMemberScope().getContributedDescriptors()
val memberScope = packageFragment.getMemberScope()

val task = {
memberScope.getContributedDescriptors()
.asSequence()
.filterIsInstance<CallableMemberDescriptor>()
.filter { mapper.shouldBeExposed(it) }
.forEach {
val classDescriptor = getClassIfCategory(it)
if (classDescriptor == null) {
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
synchronized(topLevel) {
topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it
}
} else {
// If a class is hidden from Objective-C API then it is meaningless
// to export its extensions.
if (!classDescriptor.isHiddenFromObjC()) {
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
synchronized(extensions) {
extensions.getOrPut(classDescriptor, { mutableListOf() }) += it
}
}
}
}
}
}

val classesToTranslate = mutableListOf<ClassDescriptor>()
executor?.submit(task) ?: task()

packageFragments.forEach { packageFragment ->
packageFragment.getMemberScope().collectClasses(classesToTranslate)
memberScope.collectClasses(classesToTranslate)
}

executor?.shutdown()
executor?.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS)

classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }

extensions.makeCategoriesOrderStable().forEach { (classDescriptor, declarations) ->
Expand Down Expand Up @@ -247,6 +269,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
objcExportBlockExplicitParameterNames: Boolean,
shouldExportKDoc: Boolean,
additionalImports: List<String>,
threadsCount: Int
): ObjCExportHeaderGenerator = ObjCExportHeaderGeneratorImpl(
moduleDescriptors,
mapper,
Expand All @@ -255,7 +278,8 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
objcGenerics,
objcExportBlockExplicitParameterNames,
shouldExportKDoc,
additionalImports
additionalImports,
threadsCount
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@ internal class ObjCExportHeaderGeneratorImpl(
objcExportBlockExplicitParameterNames: Boolean,
override val shouldExportKDoc: Boolean,
private val additionalImports: List<String>,
) : ObjCExportHeaderGenerator(moduleDescriptors, mapper, namer, objcGenerics, objcExportBlockExplicitParameterNames, problemCollector) {
threadsCount: Int,
) : ObjCExportHeaderGenerator(
moduleDescriptors,
mapper,
namer,
objcGenerics,
objcExportBlockExplicitParameterNames,
problemCollector,
threadsCount
) {
override fun getAdditionalImports(): List<String> =
additionalImports
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,16 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
objcGenerics: Boolean,
objcExportBlockExplicitParameterNames: Boolean,
private val restrictToLocalModules: Boolean,
) : ObjCExportHeaderGenerator(moduleDescriptors, mapper, namer, objcGenerics, objcExportBlockExplicitParameterNames, problemCollector) {
threadsCount: Int,
) : ObjCExportHeaderGenerator(
moduleDescriptors,
mapper,
namer,
objcGenerics,
objcExportBlockExplicitParameterNames,
problemCollector,
threadsCount
) {

companion object {
fun createInstance(
Expand All @@ -30,6 +39,7 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
deprecationResolver: DeprecationResolver? = null,
local: Boolean = false,
restrictToLocalModules: Boolean = false,
threadsCount: Int = Runtime.getRuntime().availableProcessors(),
): ObjCExportHeaderGenerator {
val mapper = ObjCExportMapper(deprecationResolver, local, configuration.unitSuspendFunctionExport, configuration.entryPoints)
val namerConfiguration = createNamerConfiguration(configuration)
Expand All @@ -42,7 +52,8 @@ class ObjcExportHeaderGeneratorMobile internal constructor(
problemCollector,
configuration.objcGenerics,
configuration.objcExportBlockExplicitParameterNames,
restrictToLocalModules
restrictToLocalModules,
threadsCount,
)
}
}
Expand Down