1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

- added methods to get all nodes from cfg

This commit is contained in:
Alena Laskavaia 2010-03-31 00:50:44 +00:00
parent e1b6394c31
commit 506daf12cd
2 changed files with 55 additions and 2 deletions

View file

@ -14,7 +14,9 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.provisional.core.model.cfg.IConnectorNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IConnectorNode;
import org.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph; import org.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph;
@ -29,6 +31,7 @@ import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode;
*/ */
public class ControlFlowGraph implements IControlFlowGraph { public class ControlFlowGraph implements IControlFlowGraph {
private List<IExitNode> exitNodes; private List<IExitNode> exitNodes;
private List<IBasicBlock> deadNodes = new ArrayList<IBasicBlock>();
private IStartNode start; private IStartNode start;
public ControlFlowGraph(IStartNode start, Collection<IExitNode> exitNodes) { public ControlFlowGraph(IStartNode start, Collection<IExitNode> exitNodes) {
@ -67,8 +70,10 @@ public class ControlFlowGraph implements IControlFlowGraph {
} }
public void print(IBasicBlock node) { public void print(IBasicBlock node) {
System.out.println(node.toString()); System.out.println(node.getClass().getSimpleName() + ": "
+ ((AbstractBasicBlock) node).toStringData());
if (node instanceof IConnectorNode) if (node instanceof IConnectorNode)
if (((IConnectorNode) node).hasBackwardIncoming() == false)
return; return;
if (node instanceof IDecisionNode) { if (node instanceof IDecisionNode) {
// todo // todo
@ -96,4 +101,47 @@ public class ControlFlowGraph implements IControlFlowGraph {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }
/*
* (non-Javadoc)
*
* @seeorg.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph#
* getUnconnectedNodeSize()
*/
public int getUnconnectedNodeSize() {
// TODO Auto-generated method stub
return 0;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph#getNodes
* ()
*/
public Collection<IBasicBlock> getNodes() {
Collection<IBasicBlock> result = new LinkedHashSet<IBasicBlock>();
getNodes(getStartNode(), result);
for (Iterator iterator = deadNodes.iterator(); iterator.hasNext();) {
IBasicBlock d = (IBasicBlock) iterator.next();
getNodes(d, result);
}
return result;
}
/**
* @param d
* @param result
*/
private void getNodes(IBasicBlock start, Collection<IBasicBlock> result) {
if (result.contains(start))
return;
result.add(start);
for (Iterator<IBasicBlock> outgoingIterator = start
.getOutgoingIterator(); outgoingIterator.hasNext();) {
IBasicBlock b = outgoingIterator.next();
getNodes(b, result);
}
}
} }

View file

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.codan.provisional.core.model.cfg; package org.eclipse.cdt.codan.provisional.core.model.cfg;
import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
/** /**
@ -27,4 +28,8 @@ public interface IControlFlowGraph {
int getExitNodeSize(); int getExitNodeSize();
Iterator<IBasicBlock> getUnconnectedNodeIterator(); Iterator<IBasicBlock> getUnconnectedNodeIterator();
int getUnconnectedNodeSize();
Collection<IBasicBlock> getNodes();
} }