Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlena Laskavaia2010-04-01 02:14:48 +0000
committerAlena Laskavaia2010-04-01 02:14:48 +0000
commit0908dbf0cd49e593f9de0a285d325bb614c8756f (patch)
tree886e3a3dbde2f3941aa7e7f5c1f49585899846a5 /codan/org.eclipse.cdt.codan.core.cxx
parent21d46e71ee858d35e9bdaa48520ffbc79c625177 (diff)
downloadorg.eclipse.cdt-0908dbf0cd49e593f9de0a285d325bb614c8756f.tar.gz
org.eclipse.cdt-0908dbf0cd49e593f9de0a285d325bb614c8756f.tar.xz
org.eclipse.cdt-0908dbf0cd49e593f9de0a285d325bb614c8756f.zip
- added node factory and cfg for for statement
Diffstat (limited to 'codan/org.eclipse.cdt.codan.core.cxx')
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java57
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java24
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxExitNode.java26
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java56
-rw-r--r--codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxPlainNode.java22
5 files changed, 112 insertions, 73 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 884c1a9a7cb..9fb9923788a 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
@@ -17,10 +17,14 @@ import org.eclipse.cdt.codan.internal.core.cfg.ConnectorNode;
import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode;
import org.eclipse.cdt.codan.internal.core.cfg.JumpNode;
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.IExitNode;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IPlainNode;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
+import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -36,6 +40,7 @@ public class ControlFlowGraphBuilder {
Collection<IExitNode> exits;
Collection<IBasicBlock> dead;
CxxExitNode returnExit;
+ CxxNodeFactory factory = new CxxNodeFactory();
/**
* @param def
@@ -48,7 +53,8 @@ public class ControlFlowGraphBuilder {
dead = new ArrayList<IBasicBlock>();
IBasicBlock last = createSubGraph(start, body);
if (!(last instanceof IExitNode)) {
- returnExit = new CxxExitNode(last, start, null);
+ returnExit = (CxxExitNode) factory.createExitNode(null);
+ returnExit.setStartNode(start);
addOutgoing(last, returnExit);
}
return new CxxControlFlowGraph(start, exits);
@@ -69,11 +75,11 @@ public class ControlFlowGraphBuilder {
}
} else if (body instanceof IASTExpressionStatement
|| body instanceof IASTDeclarationStatement) {
- CxxPlainNode node = new CxxPlainNode(prev, body);
+ CxxPlainNode node = factory.createPlainNode(body);
addOutgoing(prev, node);
return node;
} else if (body instanceof IASTIfStatement) {
- DecisionNode node = new CxxDecisionNode(prev,
+ DecisionNode node = factory.createDecisionNode(
((IASTIfStatement) body).getConditionExpression());
addOutgoing(prev, node);
ConnectorNode conn = new ConnectorNode();
@@ -89,26 +95,57 @@ public class ControlFlowGraphBuilder {
return conn;
} else if (body instanceof IASTWhileStatement) {
// add continue connector
- ConnectorNode nContinue = new ConnectorNode(prev);
+ IConnectorNode nContinue = factory.createConnectorNode();
addOutgoing(prev, nContinue);
// decision node
- CxxDecisionNode decision = new CxxDecisionNode(nContinue,
+ CxxDecisionNode decision = factory.createDecisionNode(
((IASTWhileStatement) body).getCondition());
addOutgoing(nContinue, decision);
// add break connector
- ConnectorNode nBreak = new ConnectorNode(decision);
+ IConnectorNode nBreak = factory.createConnectorNode();
addOutgoing(decision, nBreak);
decision.setConnectorNode(nBreak);
// create body and jump to continue node
IBasicBlock nBody = createSubGraph(decision,
((IASTWhileStatement) body).getBody());
- JumpNode jumpContinue = new JumpNode(nBody, nContinue, true);
+ JumpNode jumpContinue = new JumpNode();
addOutgoing(nBody, jumpContinue);
+ jumpContinue.setJump(nContinue, true);
// connect with backward link
- nContinue.addIncoming(jumpContinue);
+ addOutgoing(jumpContinue, nContinue);
+
+ return nBreak;
+ } else if (body instanceof IASTForStatement) {
+ // add initializer
+ IPlainNode init = factory.createPlainNode(((IASTForStatement) body).getInitializerStatement());
+ addOutgoing(prev, init);
+ prev = init;
+ // add continue connector
+ IConnectorNode nContinue2 = factory.createConnectorNode();
+ addOutgoing(prev, nContinue2);
+ // decision node
+ CxxDecisionNode decision = factory.createDecisionNode(
+ ((IASTForStatement) body).getConditionExpression());
+ addOutgoing(nContinue2, decision);
+ // add break connector
+ IConnectorNode nBreak = factory.createConnectorNode();
+ addOutgoing(decision, nBreak);
+ decision.setConnectorNode(nBreak);
+ // create body and jump to continue node
+ IBasicBlock nBody = createSubGraph(decision,
+ ((IASTForStatement) body).getBody());
+ // inc
+ IPlainNode inc = factory.createPlainNode(((IASTForStatement) body).getIterationExpression());
+ addOutgoing(nBody, inc);
+ JumpNode jumpContinue = new JumpNode();
+ addOutgoing(inc, jumpContinue);
+ jumpContinue.setJump(nContinue2, true);
+ // connect with backward link
+ addOutgoing(jumpContinue, nContinue2);
return nBreak;
} else if (body instanceof IASTReturnStatement) {
- CxxExitNode node = new CxxExitNode(prev, start, body);
+ CxxExitNode node = factory.createExitNode(body);
+ node.setStartNode(start);
addOutgoing(prev, node);
return node;
}
@@ -120,6 +157,8 @@ public class ControlFlowGraphBuilder {
* @param node
*/
private void addOutgoing(IBasicBlock prev, IBasicBlock node) {
+ if (!(node instanceof IStartNode))
+ ((AbstractBasicBlock) node).addIncoming(prev);
if (prev instanceof IExitNode) {
dead.add(node);
} else if (prev instanceof AbstractBasicBlock) {
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java
index d6aafa304e0..8f9a725c1c6 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxDecisionNode.java
@@ -11,34 +11,15 @@
package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode;
-import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.core.dom.ast.IASTNode;
/**
* TODO: add description
*/
public class CxxDecisionNode extends DecisionNode {
-
-
- /**
- * @param prev
- * @param expression
- */
- public CxxDecisionNode(IBasicBlock prev, IASTNode expression) {
- super(prev);
- this.setNode(expression);
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return getNode().getRawSignature();
- }
-
/**
- * @param node the node to set
+ * @param node
+ * the node to set
*/
public void setNode(IASTNode node) {
setData(node);
@@ -50,6 +31,7 @@ public class CxxDecisionNode extends DecisionNode {
public IASTNode getNode() {
return (IASTNode) getData();
}
+
/**
* @return
*/
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxExitNode.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxExitNode.java
index 5a4c5562d64..44005e773bf 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxExitNode.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxExitNode.java
@@ -11,9 +11,7 @@
package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
import org.eclipse.cdt.codan.internal.core.cfg.ExitNode;
-import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.codan.provisional.core.model.cfg.IExitNode;
-import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode;
import org.eclipse.cdt.core.dom.ast.IASTNode;
/**
@@ -21,27 +19,6 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
*/
public class CxxExitNode extends ExitNode implements IExitNode {
/**
- * @param prev
- * @param start
- */
- public CxxExitNode(IBasicBlock prev, IStartNode start, IASTNode node) {
- super(prev, start);
- setNode(node);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- if (getNode()!=null)
- return getNode().getRawSignature();
- return "return; // fake";
- }
-
- /**
* @param node
* the node to set
*/
@@ -55,12 +32,13 @@ public class CxxExitNode extends ExitNode implements IExitNode {
public IASTNode getNode() {
return (IASTNode) getData();
}
+
/**
* @return
*/
public String toStringData() {
if (getNode() == null)
- return "";
+ return "return; // fake";
return getNode().getRawSignature();
}
}
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java
new file mode 100644
index 00000000000..f19c1c98414
--- /dev/null
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Alena Laskavaia
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alena Laskavaia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
+
+import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock;
+import org.eclipse.cdt.codan.internal.core.model.NodeFactory;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IDecisionNode;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IExitNode;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.INodeFactory;
+import org.eclipse.cdt.codan.provisional.core.model.cfg.IPlainNode;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+
+/**
+ * TODO: add description
+ */
+public class CxxNodeFactory extends NodeFactory implements INodeFactory {
+ public CxxNodeFactory() {
+ super();
+ }
+
+ public IPlainNode createPlainNode() {
+ return new CxxPlainNode();
+ }
+
+ public IDecisionNode createDecisionNode() {
+ return new CxxDecisionNode();
+ }
+
+ public IExitNode createExitNode() {
+ return new CxxExitNode();
+ }
+ public CxxPlainNode createPlainNode(IASTNode ast) {
+ IPlainNode node = createPlainNode();
+ ((AbstractBasicBlock) node).setData(ast);
+ return (CxxPlainNode) node;
+ }
+
+ public CxxDecisionNode createDecisionNode(IASTNode ast) {
+ IDecisionNode node = createDecisionNode();
+ ((AbstractBasicBlock) node).setData(ast);
+ return (CxxDecisionNode) node;
+ }
+ public CxxExitNode createExitNode(IASTNode ast) {
+ IExitNode node = createExitNode();
+ ((AbstractBasicBlock) node).setData(ast);
+ return (CxxExitNode) node;
+ }
+}
diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxPlainNode.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxPlainNode.java
index 8cef5c65c3b..37fdf8b1abc 100644
--- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxPlainNode.java
+++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxPlainNode.java
@@ -11,7 +11,6 @@
package org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
import org.eclipse.cdt.codan.internal.core.cfg.PlainNode;
-import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock;
import org.eclipse.cdt.core.dom.ast.IASTNode;
/**
@@ -21,24 +20,8 @@ public class CxxPlainNode extends PlainNode {
/**
- * @param prev
- * @param body
- */
- public CxxPlainNode(IBasicBlock prev, IASTNode body) {
- super(prev, null);
- this.setNode(body);
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return getNode().getRawSignature();
- }
-
- /**
- * @param node the node to set
+ * @param node
+ * the node to set
*/
public void setNode(IASTNode node) {
setData(node);
@@ -50,6 +33,7 @@ public class CxxPlainNode extends PlainNode {
public IASTNode getNode() {
return (IASTNode) getData();
}
+
/**
* @return
*/

Back to the top