Devirtualization: fixed two bugs with ObjC classes

This commit is contained in:
Igor Chevdar
2018-04-05 14:54:24 +03:00
parent 79945383c6
commit cefe043751
@@ -714,10 +714,10 @@ internal object Devirtualization {
return if (calleeConstraintGraph == null) { return if (calleeConstraintGraph == null) {
constraintGraph.externalFunctions.getOrPut(resolvedCallee) { constraintGraph.externalFunctions.getOrPut(resolvedCallee) {
val fictitiousReturnNode = ordinaryNode { "External$resolvedCallee" } val fictitiousReturnNode = ordinaryNode { "External$resolvedCallee" }
val possibleReturnTypes = typeHierarchy.inheritorsOf(returnType).filter { instantiatingClasses.containsKey(it) } if (returnType.isFinal)
for (type in possibleReturnTypes) { concreteClass(returnType).addEdge(fictitiousReturnNode)
concreteClass(type).addEdge(fictitiousReturnNode) else
} constraintGraph.virtualNode.addEdge(fictitiousReturnNode)
fictitiousReturnNode fictitiousReturnNode
} }
} else { } else {
@@ -802,6 +802,8 @@ internal object Devirtualization {
val returnType = node.returnType.resolved() val returnType = node.returnType.resolved()
val receiverNode = edgeToConstraintNode(node.arguments[0]) val receiverNode = edgeToConstraintNode(node.arguments[0])
if (receiverType == DataFlowIR.Type.Virtual)
constraintGraph.virtualNode.addEdge(receiverNode)
val castedReceiver = ordinaryNode { "CastedReceiver\$${function.symbol}" } val castedReceiver = ordinaryNode { "CastedReceiver\$${function.symbol}" }
val castedEdge = createCastEdge(castedReceiver, receiverType) val castedEdge = createCastEdge(castedReceiver, receiverType)
receiverNode.addCastEdge(castedEdge) receiverNode.addCastEdge(castedEdge)