CommonInvocationGraphFactory.java
package edu.udel.cis.vsl.abc.analysis.pointsTo.common;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.AssignExprIF;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.InvocationGraphNode;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.InvocationGraphNode.IGNodeKind;
import edu.udel.cis.vsl.abc.analysis.pointsTo.IF.InvocationGraphNodeFactory;
import edu.udel.cis.vsl.abc.ast.entity.IF.Function;
public class CommonInvocationGraphFactory implements InvocationGraphNodeFactory {
@Override
public InvocationGraphNode newNode(Function function,
InvocationGraphNode parent, AssignExprIF returnTo,
AssignExprIF... actualArgs) {
InvocationGraphNode ancestor = parent;
IGNodeKind kind = IGNodeKind.ORDINARY;
// decide kind:
while (ancestor != null) {
if (ancestor.function() == function) {
kind = IGNodeKind.APPROXIMATE;
ancestor.markRecursive();
break;
}
ancestor = ancestor.parent();
}
InvocationGraphNode newNode;
if (kind != IGNodeKind.APPROXIMATE)
newNode = new CommonInvocationGraphNode(parent, function, kind,
returnTo, actualArgs);
else
newNode = new CommonInvocationGraphNode(parent, ancestor, function,
kind, returnTo, actualArgs);
if (parent != null)
parent.addChild(newNode);
return newNode;
}
}