[K/N] Fix NPE in special backend checks and interop lowering
^KT-63049 Fixed
This commit is contained in:
committed by
Space Team
parent
b1508a49ac
commit
023cce1fab
+30
-30
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-8
@@ -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) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user