From 840c2f1b9f9e881beca7943937b6569711f93f85 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 31 Aug 2018 18:42:21 +0300 Subject: [PATCH] Mark KClass for interop classes unimplemented explicitly Also fix https://github.com/JetBrains/kotlin-native/issues/1973#issuecomment-417634981 --- .../jetbrains/kotlin/backend/konan/ir/Ir.kt | 2 + .../kotlin/backend/konan/llvm/IrToBitcode.kt | 2 +- .../backend/konan/lower/DelegationLowering.kt | 42 +++++++++++++++---- .../backend/konan/lower/PostInlineLowering.kt | 6 +-- .../kotlin/native/internal/KClassImpl.kt | 15 +++++++ 5 files changed, 53 insertions(+), 14 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt index 9022a1cd396..6db75b6af8c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/Ir.kt @@ -409,6 +409,8 @@ internal class KonanSymbols(context: Context, val symbolTable: SymbolTable, val val getObjectTypeInfo = internalFunction("getObjectTypeInfo") val kClassImpl = internalClass("KClassImpl") val kClassImplConstructor by lazy { kClassImpl.constructors.single() } + val kClassUnsupportedImpl = internalClass("KClassUnsupportedImpl") + val kClassUnsupportedImplConstructor by lazy { kClassUnsupportedImpl.constructors.single() } val kTypeImpl = internalClass("KTypeImpl") val kTypeImplForGenerics = internalClass("KTypeImplForGenerics") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 3feca64f35f..824f139bb7d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -2257,7 +2257,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map // E.g. for `T::class` in a body of an inline function itself. + irCall(symbols.ThrowNullPointerException.owner) + + symbol.descriptor.isObjCClass() -> + irKClassUnsupported(context, "KClass for Objective-C classes is not supported yet") + + symbol.descriptor.getAllSuperClassifiers().any { + it is ClassDescriptor && it.fqNameUnsafe == InteropFqNames.nativePointed + } -> irKClassUnsupported(context, "KClass for interop types is not supported yet") + + else -> irCall(symbols.kClassImplConstructor.owner).apply { + putValueArgument(0, irCall(symbols.getClassTypeInfo, listOf(symbol.typeWithStarProjections))) + } + } +} + +private fun IrBuilderWithScope.irKClassUnsupported(context: KonanBackendContext, message: String) = + irCall(context.ir.symbols.kClassUnsupportedImplConstructor.owner).apply { + putValueArgument(0, irString(message)) + } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt index 2531e77bdca..44731591bd4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/PostInlineLowering.kt @@ -36,11 +36,7 @@ internal class PostInlineLowering(val context: Context) : FileLoweringPass { val builder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset) - val typeArgument = expression.symbol.typeWithStarProjections - - return builder.irCall(symbols.kClassImplConstructor, listOf(typeArgument)).apply { - putValueArgument(0, builder.irCall(symbols.getClassTypeInfo, listOf(typeArgument))) - } + return builder.irKClass(context, expression.symbol) } override fun visitGetClass(expression: IrGetClass): IrExpression { diff --git a/runtime/src/main/kotlin/kotlin/native/internal/KClassImpl.kt b/runtime/src/main/kotlin/kotlin/native/internal/KClassImpl.kt index e81e60a9c98..cb9a4f12a3a 100644 --- a/runtime/src/main/kotlin/kotlin/native/internal/KClassImpl.kt +++ b/runtime/src/main/kotlin/kotlin/native/internal/KClassImpl.kt @@ -42,6 +42,21 @@ internal class KClassImpl(private val typeInfo: NativePtr) : KClass } } +@PublishedApi +internal class KClassUnsupportedImpl(private val message: String) : KClass { + override val simpleName: String? get() = error(message) + + override val qualifiedName: String? get() = error(message) + + override fun isInstance(value: Any?): Boolean = error(message) + + override fun equals(other: Any?): Boolean = error(message) + + override fun hashCode(): Int = error(message) + + override fun toString(): String = "unreflected class ($message)" +} + @ExportForCompiler @SymbolName("Kotlin_Any_getTypeInfo") internal external fun getObjectTypeInfo(obj: Any): NativePtr