From cefe043751dc10702438b0891b666ec65ffc4405 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 5 Apr 2018 14:54:24 +0300 Subject: [PATCH] Devirtualization: fixed two bugs with ObjC classes --- .../backend/konan/optimizations/Devirtualization.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt index f2b7ec917b1..49e9595049b 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt @@ -714,10 +714,10 @@ internal object Devirtualization { return if (calleeConstraintGraph == null) { constraintGraph.externalFunctions.getOrPut(resolvedCallee) { val fictitiousReturnNode = ordinaryNode { "External$resolvedCallee" } - val possibleReturnTypes = typeHierarchy.inheritorsOf(returnType).filter { instantiatingClasses.containsKey(it) } - for (type in possibleReturnTypes) { - concreteClass(type).addEdge(fictitiousReturnNode) - } + if (returnType.isFinal) + concreteClass(returnType).addEdge(fictitiousReturnNode) + else + constraintGraph.virtualNode.addEdge(fictitiousReturnNode) fictitiousReturnNode } } else { @@ -802,6 +802,8 @@ internal object Devirtualization { val returnType = node.returnType.resolved() val receiverNode = edgeToConstraintNode(node.arguments[0]) + if (receiverType == DataFlowIR.Type.Virtual) + constraintGraph.virtualNode.addEdge(receiverNode) val castedReceiver = ordinaryNode { "CastedReceiver\$${function.symbol}" } val castedEdge = createCastEdge(castedReceiver, receiverType) receiverNode.addCastEdge(castedEdge)