Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }