[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() &&
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-8
@@ -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) }
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user