[JVM IR] Added null-checks of handler for non-super $default calls

This commit is contained in:
Kristoffer Andersen
2020-02-03 13:46:43 +01:00
committed by Alexander Udalov
parent fe50bb4b93
commit c1d350f8f3
11 changed files with 92 additions and 17 deletions
@@ -54,8 +54,9 @@ open class DefaultArgumentStubGenerator(
private fun lower(irFunction: IrFunction): List<IrFunction>? {
val visibility = defaultArgumentStubVisibility(irFunction)
val newIrFunction = irFunction.generateDefaultsFunction(context, skipInlineMethods, skipExternalMethods, forceSetOverrideSymbols, visibility)
?: return null
val newIrFunction =
irFunction.generateDefaultsFunction(context, skipInlineMethods, skipExternalMethods, forceSetOverrideSymbols, visibility)
?: return null
if (newIrFunction.origin == IrDeclarationOrigin.FAKE_OVERRIDE) {
return listOf(irFunction, newIrFunction)
}
@@ -90,6 +91,8 @@ open class DefaultArgumentStubGenerator(
newIrFunction.valueParameters[it.index]
}
generateSuperCallHandlerCheckIfNeeded(irFunction, newIrFunction)
var sourceParameterIndex = -1
for (valueParameter in irFunction.valueParameters) {
if (!valueParameter.isMovedReceiver()) {
@@ -180,6 +183,12 @@ open class DefaultArgumentStubGenerator(
} else dispatchCall
}
protected open fun IrBlockBodyBuilder.generateSuperCallHandlerCheckIfNeeded(
irFunction: IrFunction,
newIrFunction: IrFunction) {
//NO-OP Stub
}
protected open fun needSpecialDispatch(irFunction: IrSimpleFunction) = false
protected open fun IrBlockBodyBuilder.generateHandleCall(
handlerDeclaration: IrValueParameter,
@@ -506,7 +515,11 @@ private fun IrFunction.generateDefaultsFunctionImpl(
val markerType = context.ir.symbols.defaultConstructorMarker.defaultType.makeNullable()
newFunction.addValueParameter("marker".synthesizedString, markerType, IrDeclarationOrigin.DEFAULT_CONSTRUCTOR_MARKER)
} else if (context.ir.shouldGenerateHandlerParameterForDefaultBodyFun()) {
newFunction.addValueParameter("handler".synthesizedString, context.irBuiltIns.anyNType, IrDeclarationOrigin.METHOD_HANDLER_IN_DEFAULT_FUNCTION)
newFunction.addValueParameter(
"handler".synthesizedString,
context.irBuiltIns.anyNType,
IrDeclarationOrigin.METHOD_HANDLER_IN_DEFAULT_FUNCTION
)
}
// TODO some annotations are needed (e.g. @JvmStatic), others need different values (e.g. @JvmName), the rest are redundant.