Devirtualization: fixed two bugs with ObjC classes
This commit is contained in:
+6
-4
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user