Avoid requesting selectors in Objective-C interop stubs

Selector references aren't DCEed and thus can cause false positive
API usage report from AppStore online validation.
Generate selectors by compiler instead.
This commit is contained in:
Svyatoslav Scherbina
2019-03-14 15:39:33 +03:00
committed by SvyatoslavScherbina
parent 0ff1209d0a
commit f8393819fc
7 changed files with 31 additions and 9 deletions
@@ -125,6 +125,10 @@ annotation class InteropStubs()
@Retention(AnnotationRetention.SOURCE)
internal annotation class ObjCMethodImp(val selector: String, val encoding: String)
@PublishedApi
@TypedIntrinsic(IntrinsicType.OBJC_GET_SELECTOR)
internal external fun objCGetSelector(selector: String): COpaquePointer
@kotlin.native.internal.ExportForCppRuntime("Kotlin_Interop_getObjCClass")
private fun getObjCClassByName(name: NativePtr): NativePtr {
val result = objc_lookUpClass(name)
@@ -178,6 +178,7 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator,
val kniReceiverParameter = "kniR"
val kniSuperClassParameter = "kniSC"
val kniSelectorParameter = "kniSEL"
val voidPtr = PointerType(VoidType)
@@ -199,6 +200,9 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator,
TypedKotlinValue(voidPtr,
"getReceiverOrSuper($kniReceiverParameter, $kniSuperClassParameter)"))
kotlinObjCBridgeParameters.add(KotlinParameter(kniSelectorParameter, KotlinTypes.cOpaquePointer))
nativeBridgeArguments.add(TypedKotlinValue(voidPtr, kniSelectorParameter))
val kotlinParameterNames = method.getKotlinParameterNames()
method.parameters.forEachIndexed { index, it ->
@@ -224,7 +228,6 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator,
returnType,
nativeBridgeArguments
) { nativeValues ->
val selector = "@selector(${method.selector})"
val messengerParameterTypes = mutableListOf<String>()
messengerParameterTypes.add("void*")
messengerParameterTypes.add("SEL")
@@ -239,7 +242,7 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator,
val messenger = "(($messengerType) ${nativeValues.first()})"
val messengerArguments = listOf(nativeValues[1]) + selector + nativeValues.drop(2)
val messengerArguments = nativeValues.drop(1)
"$messenger(${messengerArguments.joinToString()})"
}