JVM IR: reorder some resolveFakeOverride calls

This commit is contained in:
Alexander Udalov
2023-08-23 16:37:43 +02:00
committed by Space Team
parent 29fab6c3eb
commit 35d498847e
@@ -268,11 +268,10 @@ private class InterfaceObjectCallsLowering(val context: JvmBackendContext) : IrE
if (expression.superQualifierSymbol != null && !expression.isSuperToAny()) return if (expression.superQualifierSymbol != null && !expression.isSuperToAny()) return
val callee = expression.symbol.owner val callee = expression.symbol.owner
if (!callee.isMethodOfAny()) return
if (!callee.hasInterfaceParent() && expression.dispatchReceiver?.run { type.erasedUpperBound.isJvmInterface } != true) return if (!callee.hasInterfaceParent() && expression.dispatchReceiver?.run { type.erasedUpperBound.isJvmInterface } != true) return
val resolved = callee.resolveFakeOverride() val resolved = callee.resolveFakeOverride() ?: return
if (resolved?.isMethodOfAny() != true) return
expression.symbol = resolved.symbol expression.symbol = resolved.symbol
if (expression.superQualifierSymbol != null) { if (expression.superQualifierSymbol != null) {
expression.superQualifierSymbol = context.irBuiltIns.anyClass expression.superQualifierSymbol = context.irBuiltIns.anyClass
@@ -293,6 +292,14 @@ internal fun IrSimpleFunction.findInterfaceImplementation(jvmDefaultMode: JvmDef
val implementation = resolveFakeOverride(toSkip = ::isDefaultImplsBridge) ?: return null val implementation = resolveFakeOverride(toSkip = ::isDefaultImplsBridge) ?: return null
if (!implementation.hasInterfaceParent()
|| DescriptorVisibilities.isPrivate(implementation.visibility)
|| implementation.isDefinitelyNotDefaultImplsMethod(jvmDefaultMode, implementation)
|| implementation.isMethodOfAny()
) {
return null
}
// Only generate interface delegation for functions immediately inherited from an interface. // Only generate interface delegation for functions immediately inherited from an interface.
// (Otherwise, delegation will be present in the parent class) // (Otherwise, delegation will be present in the parent class)
if (overriddenSymbols.any { if (overriddenSymbols.any {
@@ -303,14 +310,6 @@ internal fun IrSimpleFunction.findInterfaceImplementation(jvmDefaultMode: JvmDef
return null return null
} }
if (!implementation.hasInterfaceParent()
|| DescriptorVisibilities.isPrivate(implementation.visibility)
|| implementation.isDefinitelyNotDefaultImplsMethod(jvmDefaultMode)
|| implementation.isMethodOfAny()
) {
return null
}
return implementation return implementation
} }