Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/codan
diff options
context:
space:
mode:
authorAlena Laskavaia2010-05-25 02:16:11 +0000
committerAlena Laskavaia2010-05-25 02:16:11 +0000
commit3ec7ac60faf78569c1550ca5cb85b1deb29278fd (patch)
tree13c361ac52cfab280fcbc2e42ac234e73d32d6fa /codan
parent6a49ab36dda815d12ed681325b8e9a2f9ce4241e (diff)
downloadorg.eclipse.cdt-3ec7ac60faf78569c1550ca5cb85b1deb29278fd.tar.gz
org.eclipse.cdt-3ec7ac60faf78569c1550ca5cb85b1deb29278fd.tar.xz
org.eclipse.cdt-3ec7ac60faf78569c1550ca5cb85b1deb29278fd.zip
Clean up interfaces for control flow graph
Diffstat (limited to 'codan')
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java24
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cfg/ControlFlowGraphTest.java112
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastCxxAstTestCase.java3
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastTestSuite.java2
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java5
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractBasicBlock.java13
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleIncomingNode.java6
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleOutgoingNode.java6
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java5
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java13
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java5
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java8
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java6
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java6
-rw-r--r--codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java8
-rw-r--r--codan/org.eclipse.cdt.codan.ui.cfgview/src/org/eclipse/cdt/codan/ui/cfgview/views/ControlFlowGraphView.java13
16 files changed, 114 insertions, 121 deletions
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
index ffdbd54f999..c91f3c1c0ff 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java
@@ -161,6 +161,8 @@ public class ControlFlowGraphBuilder {
CxxPlainNode node = factory.createPlainNode(body);
addOutgoing(prev, node);
return node;
+ } else if (body == null) {
+ // skip - sometimes body is empty such as no else
} else {
System.err.println("unknown statement for cfg: " + body); //$NON-NLS-1$
}
@@ -172,16 +174,24 @@ public class ControlFlowGraphBuilder {
* @return
*/
private boolean isThrowStatement(IASTNode body) {
- if (!(body instanceof IASTExpressionStatement)) return false;
- IASTExpression expression = ((IASTExpressionStatement) body).getExpression();
- if (!(expression instanceof IASTUnaryExpression)) return false;
+ if (!(body instanceof IASTExpressionStatement))
+ return false;
+ IASTExpression expression = ((IASTExpressionStatement) body)
+ .getExpression();
+ if (!(expression instanceof IASTUnaryExpression))
+ return false;
return ((IASTUnaryExpression) expression).getOperator() == IASTUnaryExpression.op_throw;
}
+
private boolean isExitStatement(IASTNode body) {
- if (!(body instanceof IASTExpressionStatement)) return false;
- IASTExpression expression = ((IASTExpressionStatement) body).getExpression();
- if (!(expression instanceof IASTFunctionCallExpression)) return false;
- IASTExpression functionNameExpression = ((IASTFunctionCallExpression) expression).getFunctionNameExpression();
+ if (!(body instanceof IASTExpressionStatement))
+ return false;
+ IASTExpression expression = ((IASTExpressionStatement) body)
+ .getExpression();
+ if (!(expression instanceof IASTFunctionCallExpression))
+ return false;
+ IASTExpression functionNameExpression = ((IASTFunctionCallExpression) expression)
+ .getFunctionNameExpression();
return functionNameExpression.getRawSignature().equals("exit"); //$NON-NLS-1$
}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cfg/ControlFlowGraphTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cfg/ControlFlowGraphTest.java
index 01684540742..e399ee3eb46 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cfg/ControlFlowGraphTest.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/cfg/ControlFlowGraphTest.java
@@ -14,6 +14,7 @@ import java.util.Collection;
import java.util.Iterator;
import org.eclipse.cdt.codan.core.cxx.internal.model.cfg.ControlFlowGraphBuilder;
+import org.eclipse.cdt.codan.core.model.IChecker;
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IBranchNode;
import org.eclipse.cdt.codan.core.model.cfg.IConnectorNode;
@@ -23,48 +24,21 @@ import org.eclipse.cdt.codan.core.model.cfg.IJumpNode;
import org.eclipse.cdt.codan.core.model.cfg.IPlainNode;
import org.eclipse.cdt.codan.core.model.cfg.ISingleOutgoing;
import org.eclipse.cdt.codan.core.model.cfg.IStartNode;
-import org.eclipse.cdt.codan.core.test.CodanTestCase;
+import org.eclipse.cdt.codan.core.test.CodanFastCxxAstTestCase;
import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock;
import org.eclipse.cdt.codan.internal.core.cfg.ControlFlowGraph;
-import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
-import org.eclipse.cdt.core.index.IIndex;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
+import org.eclipse.cdt.core.parser.ParserLanguage;
/**
* TODO: add description
*/
-public class ControlFlowGraphTest extends CodanTestCase {
+public class ControlFlowGraphTest extends CodanFastCxxAstTestCase {
ControlFlowGraph graph;
- void processFile(IFile file) throws CoreException, InterruptedException {
- // create translation unit and access index
- ICElement model = CoreModel.getDefault().create(file);
- if (!(model instanceof ITranslationUnit))
- return; // not a C/C++ file
- ITranslationUnit tu = (ITranslationUnit) model;
- IIndex index = CCorePlugin.getIndexManager().getIndex(tu.getCProject());
- // lock the index for read access
- index.acquireReadLock();
- try {
- // create index based ast
- IASTTranslationUnit ast = tu.getAST(index,
- ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
- // traverse the ast using the visitor pattern.
- processAst(ast);
- } finally {
- index.releaseReadLock();
- }
- }
-
/**
* @param ast
*/
@@ -74,6 +48,7 @@ public class ControlFlowGraphTest extends CodanTestCase {
shouldVisitDeclarations = true;
}
+ @Override
public int visit(IASTDeclaration decl) {
if (decl instanceof IASTFunctionDefinition) {
graph = new ControlFlowGraphBuilder()
@@ -86,17 +61,6 @@ public class ControlFlowGraphTest extends CodanTestCase {
ast.accept(visitor);
}
- void buildCfg() {
- try {
- IResource el = cproject.getProject().findMember(
- currentFile.getName());
- processFile((IFile) el);
- } catch (Exception e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
-
/**
*
*/
@@ -115,16 +79,16 @@ public class ControlFlowGraphTest extends CodanTestCase {
* @param node
*/
private void checkNode(IBasicBlock node) {
- for (Iterator<IBasicBlock> iterator = node.getIncomingIterator(); iterator
- .hasNext();) {
- IBasicBlock b = iterator.next();
- if (!contains(node, b.getOutgoingIterator()))
+ IBasicBlock[] incomingNodes = node.getIncomingNodes();
+ for (int i = 0; i < incomingNodes.length; i++) {
+ IBasicBlock b = incomingNodes[i];
+ if (!contains(node, b.getOutgoingNodes()))
fail("Block " + node + " inconsitent prev/next " + b);
}
- for (Iterator<IBasicBlock> iterator = node.getOutgoingIterator(); iterator
- .hasNext();) {
- IBasicBlock b = iterator.next();
- if (!contains(node, b.getIncomingIterator()))
+ IBasicBlock[] outgoingNodes = node.getOutgoingNodes();
+ for (int i = 0; i < outgoingNodes.length; i++) {
+ IBasicBlock b = outgoingNodes[i];
+ if (!contains(node, b.getIncomingNodes()))
fail("Block " + node + " inconsitent next/prev " + b);
}
if (node instanceof IDecisionNode) {
@@ -139,9 +103,9 @@ public class ControlFlowGraphTest extends CodanTestCase {
* @param outgoingIterator
* @return
*/
- private boolean contains(IBasicBlock node, Iterator<IBasicBlock> iterator) {
- for (; iterator.hasNext();) {
- IBasicBlock b = iterator.next();
+ private boolean contains(IBasicBlock node, IBasicBlock[] blocks) {
+ for (int i = 0; i < blocks.length; i++) {
+ IBasicBlock b = blocks[i];
if (b.equals(node))
return true;
}
@@ -151,19 +115,29 @@ public class ControlFlowGraphTest extends CodanTestCase {
protected void buildAndCheck(String code) {
buildAndCheck(code, false);
}
+
protected void buildAndCheck_cpp(String code) {
buildAndCheck(code, true);
}
+
/**
* @param file
*/
protected void buildAndCheck(String code, boolean cpp) {
- loadcode(code, cpp);
- buildCfg();
+ buildCfg(code, cpp);
checkCfg();
}
/**
+ * @param code
+ * @param cpp
+ */
+ private void buildCfg(String code, boolean cpp) {
+ parse(code, cpp ? ParserLanguage.CPP : ParserLanguage.C, true);
+ processAst(tu);
+ }
+
+ /**
* @param des
* @return
*/
@@ -178,9 +152,10 @@ public class ControlFlowGraphTest extends CodanTestCase {
* @return
*/
private IBasicBlock branchEnd(IDecisionNode des, String label) {
- for (Iterator<IBasicBlock> iterator = des.getOutgoingIterator(); iterator
- .hasNext();) {
- IBranchNode bn = (IBranchNode) iterator.next();
+ IBasicBlock[] outgoingNodes = des.getOutgoingNodes();
+ for (int i = 0; i < outgoingNodes.length; i++) {
+ IBasicBlock iBasicBlock = outgoingNodes[i];
+ IBranchNode bn = (IBranchNode) iBasicBlock;
if (label.equals(bn.getLabel()))
return bn.getOutgoing();
}
@@ -274,6 +249,17 @@ public class ControlFlowGraphTest extends CodanTestCase {
}
// main() {
+ // return;
+ // a++;
+ // }
+ public void test_dead() {
+ buildCfg(getAboveComment(), false);
+ IStartNode startNode = graph.getStartNode();
+ IExitNode ret = (IExitNode) startNode.getOutgoing();
+ assertEquals(1, graph.getUnconnectedNodeSize());
+ }
+
+ // main() {
// int a=10;
// if (a--) {
// return;
@@ -281,7 +267,7 @@ public class ControlFlowGraphTest extends CodanTestCase {
// }
// }
public void test_if_dead() {
- buildAndCheck(getAboveComment());
+ buildCfg(getAboveComment(), false);
IStartNode startNode = graph.getStartNode();
IPlainNode decl = (IPlainNode) startNode.getOutgoing();
IDecisionNode des = (IDecisionNode) decl.getOutgoing();
@@ -337,4 +323,14 @@ public class ControlFlowGraphTest extends CodanTestCase {
IExitNode exit = exitNodeIterator.next();
assertEquals("exit(0);", data(exit));
}
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.cdt.codan.core.test.CodanFastCxxAstTestCase#getChecker()
+ */
+ @Override
+ public IChecker getChecker() {
+ return null;
+ }
}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastCxxAstTestCase.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastCxxAstTestCase.java
index 10f221d380e..553caead16b 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastCxxAstTestCase.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastCxxAstTestCase.java
@@ -48,7 +48,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
*/
@SuppressWarnings("restriction")
public abstract class CodanFastCxxAstTestCase extends TestCase {
- IASTTranslationUnit tu;
+ protected IASTTranslationUnit tu;
protected String getAboveComment() {
return getContents(1)[0].toString();
@@ -118,6 +118,7 @@ public abstract class CodanFastCxxAstTestCase extends TestCase {
assertEquals(problems.length, 0);
}
}
+ this.tu = tu;
return tu;
}
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastTestSuite.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastTestSuite.java
index bba33cc52bc..c05bc11feea 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastTestSuite.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/test/CodanFastTestSuite.java
@@ -14,6 +14,7 @@ package org.eclipse.cdt.codan.core.test;
import junit.framework.Test;
import junit.framework.TestSuite;
+import org.eclipse.cdt.codan.core.cfg.ControlFlowGraphTest;
import org.eclipse.cdt.codan.core.cxx.CxxAstUtilsTest;
import org.eclipse.cdt.codan.core.param.BasicProblemPreferenceTest;
import org.eclipse.cdt.codan.core.param.ListProblemPreferenceTest;
@@ -41,6 +42,7 @@ public class CodanFastTestSuite extends TestSuite {
suite.addTestSuite(ListProblemPreferenceTest.class);
suite.addTestSuite(MapProblemPreferenceTest.class);
suite.addTestSuite(CxxAstUtilsTest.class);
+ suite.addTestSuite(ControlFlowGraphTest.class);
return suite;
}
}
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java
index eaa21f3be2f..f1414733349 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java
@@ -1,6 +1,5 @@
package org.eclipse.cdt.codan.core.model.cfg;
-import java.util.Iterator;
/**
*
@@ -12,9 +11,9 @@ import java.util.Iterator;
* <li>{@link I}
*/
public interface IBasicBlock {
- Iterator<IBasicBlock> getIncomingIterator();
+ IBasicBlock[] getIncomingNodes();
- Iterator<IBasicBlock> getOutgoingIterator();
+ IBasicBlock[] getOutgoingNodes();
int getIncomingSize();
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractBasicBlock.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractBasicBlock.java
index d7a970cf249..254d15167d0 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractBasicBlock.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractBasicBlock.java
@@ -6,17 +6,24 @@ import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.ICfgData;
public abstract class AbstractBasicBlock implements IBasicBlock, ICfgData {
+ public final static IBasicBlock[] EMPTY_LIST = new IBasicBlock[0];
private Object data;
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see org.eclipse.cdt.codan.internal.core.cfg.ICfgData#getData()
*/
public Object getData() {
return data;
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.internal.core.cfg.ICfgData#setData(java.lang.Object)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.internal.core.cfg.ICfgData#setData(java.lang.Object
+ * )
*/
public void setData(Object data) {
this.data = data;
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleIncomingNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleIncomingNode.java
index 8f0d93b47b1..ab3bcbbd16a 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleIncomingNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleIncomingNode.java
@@ -1,7 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.ISingleIncoming;
@@ -17,8 +15,8 @@ public abstract class AbstractSingleIncomingNode extends AbstractBasicBlock
super();
}
- public Iterator<IBasicBlock> getIncomingIterator() {
- return new OneElementIterator<IBasicBlock>(prev);
+ public IBasicBlock[] getIncomingNodes() {
+ return new IBasicBlock[] { prev };
}
public int getIncomingSize() {
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleOutgoingNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleOutgoingNode.java
index 915693a5679..5b99dfc1c05 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleOutgoingNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/AbstractSingleOutgoingNode.java
@@ -1,7 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.ISingleOutgoing;
@@ -17,8 +15,8 @@ public abstract class AbstractSingleOutgoingNode extends AbstractBasicBlock
super();
}
- public Iterator<IBasicBlock> getOutgoingIterator() {
- return new OneElementIterator<IBasicBlock>(next);
+ public IBasicBlock[] getOutgoingNodes() {
+ return new IBasicBlock[] { next };
}
public int getOutgoingSize() {
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java
index cd7af61d8fc..ad75fe8201f 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java
@@ -11,7 +11,6 @@
package org.eclipse.cdt.codan.internal.core.cfg;
import java.util.ArrayList;
-import java.util.Iterator;
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IConnectorNode;
@@ -39,8 +38,8 @@ public class ConnectorNode extends AbstractSingleOutgoingNode implements
* @seeorg.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock#
* getIncomingIterator()
*/
- public Iterator<IBasicBlock> getIncomingIterator() {
- return incoming.iterator();
+ public IBasicBlock[] getIncomingNodes() {
+ return incoming.toArray(new IBasicBlock[incoming.size()]);
}
/*
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java
index 3d6a33069f9..3de49942596 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java
@@ -79,10 +79,9 @@ public class ControlFlowGraph implements IControlFlowGraph {
+ ((AbstractBasicBlock) node).toStringData());
if (node instanceof IDecisionNode) {
// todo
- Iterator<IBasicBlock> branches = ((IDecisionNode) node)
- .getOutgoingIterator();
- for (; branches.hasNext();) {
- IBasicBlock brNode = branches.next();
+ IBasicBlock[] branches = ((IDecisionNode) node).getOutgoingNodes();
+ for (int i = 0; i < branches.length; i++) {
+ IBasicBlock brNode = branches[i];
System.out.println("{"); //$NON-NLS-1$
print(brNode);
System.out.println("}"); //$NON-NLS-1$
@@ -139,9 +138,9 @@ public class ControlFlowGraph implements IControlFlowGraph {
if (result.contains(start))
return;
result.add(start);
- for (Iterator<IBasicBlock> outgoingIterator = start
- .getOutgoingIterator(); outgoingIterator.hasNext();) {
- IBasicBlock b = outgoingIterator.next();
+ IBasicBlock[] outgoingNodes = start.getOutgoingNodes();
+ for (int i = 0; i < outgoingNodes.length; i++) {
+ IBasicBlock b = outgoingNodes[i];
getNodes(b, result);
}
}
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java
index 6dc045a18e8..437816ade0c 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java
@@ -11,7 +11,6 @@
package org.eclipse.cdt.codan.internal.core.cfg;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
@@ -46,8 +45,8 @@ public class DecisionNode extends AbstractSingleIncomingNode implements
* @seeorg.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock#
* getOutgoingIterator()
*/
- public Iterator<IBasicBlock> getOutgoingIterator() {
- return next.iterator();
+ public IBasicBlock[] getOutgoingNodes() {
+ return next.toArray(new IBasicBlock[next.size()]);
}
/*
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java
index 1858e19a8ae..ef6d36788c9 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java
@@ -1,8 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Collections;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IExitNode;
import org.eclipse.cdt.codan.core.model.cfg.IStartNode;
@@ -18,9 +15,8 @@ public class ExitNode extends AbstractSingleIncomingNode implements IExitNode {
super();
}
- @SuppressWarnings("unchecked")
- public Iterator<IBasicBlock> getOutgoingIterator() {
- return Collections.EMPTY_LIST.iterator();
+ public IBasicBlock[] getOutgoingNodes() {
+ return EMPTY_LIST;
}
public int getOutgoingSize() {
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java
index 470891b0793..1657239df91 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java
@@ -1,7 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IConnectorNode;
import org.eclipse.cdt.codan.core.model.cfg.IJumpNode;
@@ -19,8 +17,8 @@ public class JumpNode extends AbstractSingleIncomingNode implements IJumpNode {
super();
}
- public Iterator<IBasicBlock> getOutgoingIterator() {
- return new OneElementIterator<IBasicBlock>(jump);
+ public IBasicBlock[] getOutgoingNodes() {
+ return new IBasicBlock[] { jump };
}
public int getOutgoingSize() {
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java
index 448eef436fb..ecd49a0721a 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java
@@ -1,7 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IPlainNode;
@@ -16,8 +14,8 @@ public class PlainNode extends AbstractSingleIncomingNode implements IPlainNode
super();
}
- public Iterator<IBasicBlock> getOutgoingIterator() {
- return new OneElementIterator<IBasicBlock>(next);
+ public IBasicBlock[] getOutgoingNodes() {
+ return new IBasicBlock[] { next };
}
public int getOutgoingSize() {
diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java
index 99e218667df..90c44c4e1ea 100644
--- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java
+++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java
@@ -1,8 +1,5 @@
package org.eclipse.cdt.codan.internal.core.cfg;
-import java.util.Collections;
-import java.util.Iterator;
-
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.core.model.cfg.IStartNode;
@@ -15,9 +12,8 @@ public class StartNode extends AbstractSingleOutgoingNode implements IStartNode
super();
}
- @SuppressWarnings("unchecked")
- public Iterator<IBasicBlock> getIncomingIterator() {
- return Collections.EMPTY_LIST.iterator();
+ public IBasicBlock[] getIncomingNodes() {
+ return EMPTY_LIST;
}
public int getIncomingSize() {
diff --git a/codan/org.eclipse.cdt.codan.ui.cfgview/src/org/eclipse/cdt/codan/ui/cfgview/views/ControlFlowGraphView.java b/codan/org.eclipse.cdt.codan.ui.cfgview/src/org/eclipse/cdt/codan/ui/cfgview/views/ControlFlowGraphView.java
index 71f51bbaef8..ccb391c52eb 100644
--- a/codan/org.eclipse.cdt.codan.ui.cfgview/src/org/eclipse/cdt/codan/ui/cfgview/views/ControlFlowGraphView.java
+++ b/codan/org.eclipse.cdt.codan.ui.cfgview/src/org/eclipse/cdt/codan/ui/cfgview/views/ControlFlowGraphView.java
@@ -2,7 +2,6 @@ package org.eclipse.cdt.codan.ui.cfgview.views;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import org.eclipse.cdt.codan.core.cxx.internal.model.cfg.ControlFlowGraphBuilder;
import org.eclipse.cdt.codan.core.cxx.internal.model.cfg.CxxControlFlowGraph;
@@ -122,13 +121,11 @@ public class ControlFlowGraphView extends ViewPart {
return blocks.toArray();
} else if (parent instanceof IDecisionNode) {
ArrayList blocks = new ArrayList();
- Iterator<IBasicBlock> iter = ((IDecisionNode) parent)
- .getOutgoingIterator();
- if (iter.hasNext()) {
- for (; iter.hasNext();) {
- IBasicBlock arc = iter.next();
- blocks.add(arc);
- }
+ IBasicBlock[] outgoingNodes = ((IDecisionNode) parent)
+ .getOutgoingNodes();
+ for (int i = 0; i < outgoingNodes.length; i++) {
+ IBasicBlock arc= outgoingNodes[i];
+ blocks.add(arc);
}
blocks.add(((IDecisionNode) parent).getMergeNode());
return blocks.toArray();

Back to the top