diff options
author | Alena Laskavaia | 2010-04-01 02:14:48 +0000 |
---|---|---|
committer | Alena Laskavaia | 2010-04-01 02:14:48 +0000 |
commit | 0908dbf0cd49e593f9de0a285d325bb614c8756f (patch) | |
tree | 886e3a3dbde2f3941aa7e7f5c1f49585899846a5 /codan/org.eclipse.cdt.codan.core.cxx | |
parent | 21d46e71ee858d35e9bdaa48520ffbc79c625177 (diff) | |
download | org.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')
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 */ |