From 023cce1fabd8bcc1a6a41d07b9693a1423780a02 Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Wed, 6 Dec 2023 21:55:28 +0100 Subject: [PATCH] [K/N] Fix NPE in special backend checks and interop lowering ^KT-63049 Fixed --- .../backend/konan/lower/InteropLowering.kt | 60 +++++++++---------- .../lower/SpecialBackendChecksTraversal.kt | 17 +++--- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index 7d2b189fb1f..55049f1bf82 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -512,40 +512,40 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) : if (!constructedClass.isExternalObjCClass() && delegatingCallConstructingClass.isExternalObjCClass()) { - // Calling super constructor from Kotlin Objective-C class. + expression.symbol.owner.getObjCInitMethod()?.let { initMethod -> + // Calling super constructor from Kotlin Objective-C class. - require(constructedClass.getSuperClassNotAny() == delegatingCallConstructingClass) { renderCompilerError(expression) } - require(expression.symbol.owner.objCConstructorIsDesignated()) { renderCompilerError(expression) } - require(expression.dispatchReceiver == null) { renderCompilerError(expression) } - require(expression.extensionReceiver == null) { renderCompilerError(expression) } + require(constructedClass.getSuperClassNotAny() == delegatingCallConstructingClass) { renderCompilerError(expression) } + require(expression.symbol.owner.objCConstructorIsDesignated()) { renderCompilerError(expression) } + require(expression.dispatchReceiver == null) { renderCompilerError(expression) } + require(expression.extensionReceiver == null) { renderCompilerError(expression) } - val initMethod = expression.symbol.owner.getObjCInitMethod()!! + val initMethodInfo = initMethod.getExternalObjCMethodInfo()!! - val initMethodInfo = initMethod.getExternalObjCMethodInfo()!! - - val initCall = builder.genLoweredObjCMethodCall( - initMethodInfo, - superQualifier = delegatingCallConstructingClass.symbol, - receiver = builder.irGet(constructedClass.thisReceiver!!), - arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) }, - call = expression, - method = initMethod - ) - - val superConstructor = delegatingCallConstructingClass - .constructors.single { it.valueParameters.size == 0 }.symbol - - return builder.irBlock(expression) { - // Required for the IR to be valid, will be ignored in codegen: - +IrDelegatingConstructorCallImpl.fromSymbolDescriptor( - startOffset, - endOffset, - context.irBuiltIns.unitType, - superConstructor + val initCall = builder.genLoweredObjCMethodCall( + initMethodInfo, + superQualifier = delegatingCallConstructingClass.symbol, + receiver = builder.irGet(constructedClass.thisReceiver!!), + arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) }, + call = expression, + method = initMethod ) - +irCall(symbols.interopObjCObjectSuperInitCheck).apply { - extensionReceiver = irGet(constructedClass.thisReceiver!!) - putValueArgument(0, initCall) + + val superConstructor = delegatingCallConstructingClass + .constructors.single { it.valueParameters.size == 0 }.symbol + + return builder.irBlock(expression) { + // Required for the IR to be valid, will be ignored in codegen: + +IrDelegatingConstructorCallImpl.fromSymbolDescriptor( + startOffset, + endOffset, + context.irBuiltIns.unitType, + superConstructor + ) + +irCall(symbols.interopObjCObjectSuperInitCheck).apply { + extensionReceiver = irGet(constructedClass.thisReceiver!!) + putValueArgument(0, initCall) + } } } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt index f649cf3fc62..6a052ad69ec 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/SpecialBackendChecksTraversal.kt @@ -301,16 +301,17 @@ private class BackendChecker( delegatingCallConstructingClass.isExternalObjCClass()) { // Calling super constructor from Kotlin Objective-C class. - val initMethod = expression.symbol.owner.getObjCInitMethod()!! + expression.symbol.owner.getObjCInitMethod()?.let { initMethod -> - if (!expression.symbol.owner.objCConstructorIsDesignated()) - reportError(expression, "Unable to call non-designated initializer as super constructor") + if (!expression.symbol.owner.objCConstructorIsDesignated()) + reportError(expression, "Unable to call non-designated initializer as super constructor") - checkCanGenerateObjCCall( - method = initMethod, - call = expression, - arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) } - ) + checkCanGenerateObjCCall( + method = initMethod, + call = expression, + arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) } + ) + } } }