[K/N] Fix NPE in special backend checks and interop lowering

^KT-63049 Fixed
This commit is contained in:
Vladimir Sukharev
2023-12-06 21:55:28 +01:00
committed by Space Team
parent b1508a49ac
commit 023cce1fab
2 changed files with 39 additions and 38 deletions
@@ -512,40 +512,40 @@ private class InteropLoweringPart1(val generationState: NativeGenerationState) :
if (!constructedClass.isExternalObjCClass() && if (!constructedClass.isExternalObjCClass() &&
delegatingCallConstructingClass.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(constructedClass.getSuperClassNotAny() == delegatingCallConstructingClass) { renderCompilerError(expression) }
require(expression.symbol.owner.objCConstructorIsDesignated()) { renderCompilerError(expression) } require(expression.symbol.owner.objCConstructorIsDesignated()) { renderCompilerError(expression) }
require(expression.dispatchReceiver == null) { renderCompilerError(expression) } require(expression.dispatchReceiver == null) { renderCompilerError(expression) }
require(expression.extensionReceiver == 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,
val initCall = builder.genLoweredObjCMethodCall( superQualifier = delegatingCallConstructingClass.symbol,
initMethodInfo, receiver = builder.irGet(constructedClass.thisReceiver!!),
superQualifier = delegatingCallConstructingClass.symbol, arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) },
receiver = builder.irGet(constructedClass.thisReceiver!!), call = expression,
arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) }, method = initMethod
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
) )
+irCall(symbols.interopObjCObjectSuperInitCheck).apply {
extensionReceiver = irGet(constructedClass.thisReceiver!!) val superConstructor = delegatingCallConstructingClass
putValueArgument(0, initCall) .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)
}
} }
} }
} }
@@ -301,16 +301,17 @@ private class BackendChecker(
delegatingCallConstructingClass.isExternalObjCClass()) { delegatingCallConstructingClass.isExternalObjCClass()) {
// Calling super constructor from Kotlin Objective-C class. // 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()) if (!expression.symbol.owner.objCConstructorIsDesignated())
reportError(expression, "Unable to call non-designated initializer as super constructor") reportError(expression, "Unable to call non-designated initializer as super constructor")
checkCanGenerateObjCCall( checkCanGenerateObjCCall(
method = initMethod, method = initMethod,
call = expression, call = expression,
arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) } arguments = initMethod.valueParameters.map { expression.getValueArgument(it.index) }
) )
}
} }
} }