IR: move defaultParameterDeclarationsCache access up one level
to avoid recomputing overriddenSymbols for fake overrides of default stubs on repeated calls to generateDefaultsFunction.
This commit is contained in:
+7
-5
@@ -312,11 +312,13 @@ private fun IrFunction.generateDefaultsFunction(
|
||||
context: CommonBackendContext,
|
||||
skipInlineMethods: Boolean,
|
||||
skipExternalMethods: Boolean
|
||||
): IrFunction? = when {
|
||||
): IrFunction? = context.ir.defaultParameterDeclarationsCache[this] ?: when {
|
||||
skipInlineMethods && isInline -> null
|
||||
skipExternalMethods && isExternalOrInheritedFromExternal() -> null
|
||||
valueParameters.any { it.defaultValue != null } ->
|
||||
generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER)
|
||||
generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER).also {
|
||||
context.ir.defaultParameterDeclarationsCache[this] = it
|
||||
}
|
||||
this is IrSimpleFunction -> {
|
||||
// If this is an override of a function with default arguments, produce a fake override of a default stub.
|
||||
val overriddenStubs = overriddenSymbols.mapNotNull {
|
||||
@@ -325,6 +327,7 @@ private fun IrFunction.generateDefaultsFunction(
|
||||
if (overriddenStubs.isNotEmpty())
|
||||
generateDefaultsFunctionImpl(context, IrDeclarationOrigin.FAKE_OVERRIDE).also {
|
||||
(it as IrSimpleFunction).overriddenSymbols.addAll(overriddenStubs)
|
||||
context.ir.defaultParameterDeclarationsCache[this] = it
|
||||
}
|
||||
else
|
||||
null
|
||||
@@ -332,8 +335,7 @@ private fun IrFunction.generateDefaultsFunction(
|
||||
else -> null
|
||||
}
|
||||
|
||||
private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContext, newOrigin: IrDeclarationOrigin): IrFunction =
|
||||
context.ir.defaultParameterDeclarationsCache.getOrPut(this) {
|
||||
private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContext, newOrigin: IrDeclarationOrigin): IrFunction {
|
||||
val newFunction = when (this) {
|
||||
is IrConstructor ->
|
||||
buildConstructor {
|
||||
@@ -379,5 +381,5 @@ private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContex
|
||||
|
||||
// TODO some annotations are needed (e.g. @JvmStatic), others need different values (e.g. @JvmName), the rest are redundant.
|
||||
annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
|
||||
newFunction
|
||||
return newFunction
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user