From aadbf2a4774c66a27f5d0d3ff2869e6d98988107 Mon Sep 17 00:00:00 2001 From: Alena Laskavaia Date: Wed, 9 Feb 2011 02:24:19 +0000 Subject: [PATCH] Bug 335909 - Exception in switch statement --- .../internal/model/cfg/ControlFlowGraphBuilder.java | 12 +++++++++--- .../ui/cfgview/views/ControlFlowGraphView.java | 13 ++++++++++++- 2 files changed, 21 insertions(+), 4 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 90c3e018084..0e020a97e2f 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 @@ -18,6 +18,7 @@ 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.ICfgData; import org.eclipse.cdt.codan.core.model.cfg.IConnectorNode; +import org.eclipse.cdt.codan.core.model.cfg.IDecisionNode; import org.eclipse.cdt.codan.core.model.cfg.IExitNode; import org.eclipse.cdt.codan.core.model.cfg.IJumpNode; import org.eclipse.cdt.codan.core.model.cfg.IPlainNode; @@ -191,10 +192,11 @@ public class ControlFlowGraphBuilder { ICPPASTCatchHandler[] catchHandlers = body.getCatchHandlers(); for (int i = 0; i < catchHandlers.length; i++) { ICPPASTCatchHandler handler = catchHandlers[i]; - IBranchNode handlerNode = factory - .createBranchNode(handler.getDeclaration()); + IBranchNode handlerNode = factory.createBranchNode(handler + .getDeclaration()); addOutgoing(ifNode, handlerNode); - IBasicBlock els = createSubGraph(handlerNode, handler.getCatchBody()); + IBasicBlock els = createSubGraph(handlerNode, + handler.getCatchBody()); addJump(els, mergeNode); } return mergeNode; @@ -483,6 +485,10 @@ public class ControlFlowGraphBuilder { dead.add(node); return; } else if (prev instanceof ICfgData) { + if (prev instanceof IDecisionNode && !(node instanceof IBranchNode)) { + dead.add(node); + return; + } ((AbstractBasicBlock) prev).addOutgoing(node); } if (!(node instanceof IStartNode)) 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 ccb391c52eb..66c3755c9b1 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,6 +2,7 @@ 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; @@ -95,6 +96,7 @@ public class ControlFlowGraphView extends ViewPart { private Action action1; private Action doubleClickAction; + class DeadNodes extends ArrayList {} class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { @@ -118,7 +120,16 @@ public class ControlFlowGraphView extends ViewPart { Collection blocks = getFlat( ((IControlFlowGraph) parent).getStartNode(), new ArrayList()); - return blocks.toArray(); + DeadNodes dead = new DeadNodes(); + Iterator iter = ((IControlFlowGraph) parent).getUnconnectedNodeIterator(); + for (; iter.hasNext();) { + IBasicBlock iBasicBlock = (IBasicBlock) iter.next(); + dead.add(iBasicBlock); + } + ArrayList all = new ArrayList(); + all.addAll(blocks); + if (dead.size()>0) all.add(dead); + return all.toArray(); } else if (parent instanceof IDecisionNode) { ArrayList blocks = new ArrayList(); IBasicBlock[] outgoingNodes = ((IDecisionNode) parent)