From 5fa37aa8000f01ff0f2a53c2f33b0617788f70fe Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Thu, 24 Jan 2019 16:56:26 +0300 Subject: [PATCH] Eliminated a little more descriptor usage. --- .../kotlin/backend/konan/cgen/CBridgeGen.kt | 11 ++++------- .../backend/konan/irasdescriptors/NewIrUtils.kt | 12 ++++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index 96431b5929f..a8ca6242cf3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -6,7 +6,6 @@ import org.jetbrains.kotlin.backend.common.lower.irNot import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.descriptors.createAnnotation -import org.jetbrains.kotlin.backend.konan.descriptors.getStringValue import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols import org.jetbrains.kotlin.backend.konan.irasdescriptors.* import org.jetbrains.kotlin.builtins.UnsignedType @@ -162,7 +161,7 @@ internal fun KotlinStubs.generateCCall(expression: IrCall, builder: IrBuilderWit if (isInvoke) { callBuilder.cBridgeBodyLines.add(0, "$targetFunctionVariable = ${targetPtrParameter!!};") } else { - val cCallSymbolName = callee.descriptor.annotations.findAnnotation(cCall)!!.getStringValue("id") + val cCallSymbolName = callee.annotations.getAnnotationArgumentValue(cCall, "id")!! cLines += "extern const $targetFunctionVariable __asm(\"$cCallSymbolName\");" // Exported from cinterop stubs. } @@ -345,15 +344,13 @@ private fun IrType.isCEnumType(): Boolean { } private fun IrValueParameter.isWCStringParameter() = - this.descriptor.annotations.hasAnnotation(cCall.child(Name.identifier("WCString"))) + this.annotations.hasAnnotation(cCall.child(Name.identifier("WCString"))) private fun IrValueParameter.isCStringParameter() = - this.descriptor.annotations.hasAnnotation(cCall.child(Name.identifier("CString"))) + this.annotations.hasAnnotation(cCall.child(Name.identifier("CString"))) private fun getStructSpelling(kotlinClass: IrClass): String? = - kotlinClass.descriptor.annotations - .findAnnotation(FqName("kotlinx.cinterop.internal.CStruct")) - ?.getStringValue("spelling") + kotlinClass.annotations.getAnnotationArgumentValue(FqName("kotlinx.cinterop.internal.CStruct"), "spelling") private fun getCStructType(kotlinClass: IrClass): CType? = getStructSpelling(kotlinClass)?.let { CTypes.simple(it) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt index 6736b119e36..5bdefec8cf6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/irasdescriptors/NewIrUtils.kt @@ -166,6 +166,18 @@ fun List.findAnnotation(fqName: FqName): IrCall? = this.firstOrNull { it.annotationClass.fqNameSafe == fqName } +fun List.getAnnotationArgumentValue(fqName: FqName, argumentName: String): T? { + val annotation = this.findAnnotation(fqName) ?: return null + for (index in 0 until annotation.valueArgumentsCount) { + val parameter = annotation.symbol.owner.valueParameters[index] + if (parameter.name == Name.identifier(argumentName)) { + val actual = annotation.getValueArgument(index) as? IrConst + return actual?.value + } + } + return null +} + fun IrValueParameter.isInlineParameter(): Boolean = !this.isNoinline && (this.type.isFunction() || this.type.isSuspendFunction()) && !this.type.isMarkedNullable()