private static bool Add(TryHandler tryHandler, SortedList <int, TryHandler> clauses) { int i = 0; while (i < clauses.Values.Count) { TryHandler nestedHandler = clauses.Values[i]; // Find any handlers in the list that need to become children of the new handler if ((tryHandler.TryStartIp <= nestedHandler.TryStartIp) && (tryHandler.TryEndIp >= nestedHandler.HandlerEndIp)) { tryHandler.NestedTry.Add(nestedHandler.TryStartIp, nestedHandler); clauses.Remove(nestedHandler.TryStartIp); continue; } if ((tryHandler.HandlerStartIp <= nestedHandler.TryStartIp) && (tryHandler.HandlerEndIp >= nestedHandler.HandlerEndIp)) { tryHandler.NestedHandler.Add(nestedHandler.TryStartIp, nestedHandler); clauses.Remove(nestedHandler.TryStartIp); continue; } i++; } for (i = 0; i < clauses.Values.Count; i++) { TryHandler nestedHandler = clauses.Values[i]; // Find the parent of this handler if ((nestedHandler.TryStartIp >= tryHandler.TryStartIp) && (nestedHandler.TryEndIp <= tryHandler.HandlerEndIp)) { return(Add(tryHandler, nestedHandler.NestedTry)); } if ((nestedHandler.HandlerStartIp >= tryHandler.TryStartIp) && (nestedHandler.HandlerEndIp <= tryHandler.HandlerEndIp)) { return(Add(tryHandler, nestedHandler.NestedHandler)); } } clauses.Add(tryHandler.TryStartIp, tryHandler); return(true); }
private void TraverseExceptionTree(TryHandler tryHandler) { // Find the right node to add the try node before CallGraphNode tryNode = SplitNode((ushort)tryHandler.TryStartIp, tryHandler.Type); CallGraphNode handlerNode = SplitNode((ushort)tryHandler.HandlerStartIp, NodeType.FallThrough); CallGraphNode followNode = SplitNode((ushort)tryHandler.HandlerEndIp, NodeType.FallThrough); tryNode.HandlerNode = (ICallGraphNode)handlerNode.OutEdges[0]; tryNode.FollowNode = (ICallGraphNode)followNode.OutEdges[0]; // Split the children foreach (TryHandler childTryHandler in tryHandler.NestedTry.Values) { TraverseExceptionTree(childTryHandler); } foreach (TryHandler childTryHandler in tryHandler.NestedHandler.Values) { TraverseExceptionTree(childTryHandler); } }
private static void TraverseExceptionTree(TryHandler tryHandler, List <Node> nodes) { // Find the right node to add the try node before Node tryNode = SplitNode(nodes, (ushort)tryHandler.TryStartIp, "Try"); Node handlerNode = SplitNode(nodes, (ushort)tryHandler.HandlerStartIp, "Handler"); Node followNode = SplitNode(nodes, (ushort)tryHandler.HandlerEndIp, "Follow"); tryNode.HandlerNode = handlerNode.OutEdges[0]; tryNode.FollowNode = followNode.OutEdges[0]; // Split the children foreach (TryHandler childTryHandler in tryHandler.NestedTry.Values) { TraverseExceptionTree(childTryHandler, nodes); } foreach (TryHandler childTryHandler in tryHandler.NestedHandler.Values) { TraverseExceptionTree(childTryHandler, nodes); } }