diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index d91924dccef..e2be5dd6600 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -589,7 +589,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag DataFlowIR.Node.NewObject( symbolTable.mapFunction(callee), arguments, - symbolTable.mapClassReferenceType(callee.constructedClass, false), + symbolTable.mapClassReferenceType(callee.constructedClass), value ) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index b76c1d469db..127ff702edf 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -500,14 +500,11 @@ internal object DataFlowIR { private fun IrClass.isFinal() = modality == Modality.FINAL - fun mapClassReferenceType(irClass: IrClass, eraseLocalObjects: Boolean = true): Type { + fun mapClassReferenceType(irClass: IrClass): Type { // Do not try to devirtualize ObjC classes. if (irClass.module.name == Name.special("") || irClass.isObjCClass()) return Type.Virtual - if (eraseLocalObjects && irClass.isAnonymousObject) - return mapClassReferenceType(irClass.getSuperClassNotAny() ?: context.irBuiltIns.anyClass.owner) - val isFinal = irClass.isFinal() val isAbstract = irClass.isAbstract() val name = irClass.fqNameForIrSerialization.asString() @@ -556,11 +553,11 @@ internal object DataFlowIR { ) } - fun mapType(type: IrType, eraseLocalObjects: Boolean = true): Type { + fun mapType(type: IrType): Type { val binaryType = type.computeBinaryType() return when (binaryType) { is BinaryType.Primitive -> mapPrimitiveBinaryType(binaryType.type) - is BinaryType.Reference -> mapClassReferenceType(choosePrimary(binaryType.types.toList()), eraseLocalObjects) + is BinaryType.Reference -> mapClassReferenceType(choosePrimary(binaryType.types.toList())) } } diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index c248d8b5447..6331b012c06 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2396,6 +2396,12 @@ standaloneTest("devirtualization_getter_looking_as_box_function") { source = "codegen/devirtualization/getter_looking_as_box_function.kt" } +standaloneTest("devirtualization_anonymousObject") { + goldValue = "zzz\n" + flags = ["-opt"] + source = "codegen/devirtualization/anonymousObject.kt" +} + standaloneTest("multiargs") { arguments = ["AAA", "BB", "C"] multiRuns = true diff --git a/backend.native/tests/codegen/devirtualization/anonymousObject.kt b/backend.native/tests/codegen/devirtualization/anonymousObject.kt new file mode 100644 index 00000000000..9eb9165d014 --- /dev/null +++ b/backend.native/tests/codegen/devirtualization/anonymousObject.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the LICENSE file. + */ + +interface I { + fun foo() +} + +fun test() { + val impl = object : I { + override fun foo() { println("zzz") } + } + + val delegating = object: I by impl { } + + delegating.foo() +} + +fun main() { + test() +} \ No newline at end of file