From 17fdde66d94155fc62a034fa6658995bef6fd6e5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Mar 2016 13:02:25 -0700 Subject: Initial import --- .../FlowAnalysis/ControlFlowEdge.cs | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 ICSharpCode.Decompiler/FlowAnalysis/ControlFlowEdge.cs (limited to 'ICSharpCode.Decompiler/FlowAnalysis/ControlFlowEdge.cs') diff --git a/ICSharpCode.Decompiler/FlowAnalysis/ControlFlowEdge.cs b/ICSharpCode.Decompiler/FlowAnalysis/ControlFlowEdge.cs new file mode 100644 index 00000000..98bd4399 --- /dev/null +++ b/ICSharpCode.Decompiler/FlowAnalysis/ControlFlowEdge.cs @@ -0,0 +1,78 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; + +namespace ICSharpCode.Decompiler.FlowAnalysis +{ + /// + /// Describes the type of a control flow egde. + /// + public enum JumpType + { + /// + /// A regular control flow edge. + /// + Normal, + /// + /// Jump to exception handler (an exception occurred) + /// + JumpToExceptionHandler, + /// + /// Jump from try block to leave target: + /// This is not a real jump, as the finally handler is executed first! + /// + LeaveTry, + /// + /// Jump at endfinally (to any of the potential leave targets). + /// For any leave-instruction, control flow enters the finally block - the edge to the leave target (LeaveTry) is not a real control flow edge. + /// EndFinally edges are inserted at the end of the finally block, jumping to any of the targets of the leave instruction. + /// This edge type is only used when copying of finally blocks is disabled (with copying, a normal deterministic edge is used at each copy of the endfinally node). + /// + EndFinally + } + + /// + /// Represents an edge in the control flow graph, pointing from Source to Target. + /// + public sealed class ControlFlowEdge + { + public readonly ControlFlowNode Source; + public readonly ControlFlowNode Target; + public readonly JumpType Type; + + public ControlFlowEdge(ControlFlowNode source, ControlFlowNode target, JumpType type) + { + Source = source; + Target = target; + Type = type; + } + + public override string ToString() + { + switch (Type) { + case JumpType.Normal: + return "#" + Target.BlockIndex; + case JumpType.JumpToExceptionHandler: + return "e:#" + Target.BlockIndex; + default: + return Type.ToString() + ":#" + Target.BlockIndex; + } + } + } +} -- cgit v1.2.3