Ejemplo n.º 1
0
        // Expanded is passed so that the correct ContentNodes are expanded in the PositionedNode
        PositionedGraph BuildPositionedGraph(ObjectGraph objectGraph, Expanded expanded)
        {
            var positionedNodeFor = new Dictionary <ObjectGraphNode, PositionedNode>();
            var positionedGraph   = new PositionedGraph();

            // create empty PositionedNodes
            foreach (ObjectGraphNode objectNode in objectGraph.ReachableNodes)
            {
                var posNode = new PositionedNode(objectNode, expanded);
                posNode.MeasureVisualControl();
                positionedGraph.AddNode(posNode);
                positionedNodeFor[objectNode] = posNode;
            }

            // create edges
            foreach (PositionedNode posNode in positionedGraph.Nodes)
            {
                foreach (PositionedNodeProperty property in posNode.Properties)
                {
                    if (property.ObjectGraphProperty.TargetNode != null)
                    {
                        ObjectGraphNode targetObjectNode = property.ObjectGraphProperty.TargetNode;
                        PositionedNode  edgeTarget       = positionedNodeFor[targetObjectNode];
                        property.Edge = new PositionedEdge {
                            Name = property.Name, Source = property, Target = edgeTarget
                        };
                    }
                }
            }
            positionedGraph.Root = positionedNodeFor[objectGraph.Root];
            return(positionedGraph);
        }
Ejemplo n.º 2
0
		public static TreeGraphNode Create(LayoutDirection direction, ObjectGraphNode objectNode)
		{
			switch (direction) {
					case LayoutDirection.TopBottom:	return new TreeNodeTB(objectNode);
					case LayoutDirection.LeftRight: return new TreeNodeLR(objectNode);
					default: throw new DebuggerVisualizerException("Unsupported layout direction: " + direction.ToString());
			}
		}
Ejemplo n.º 3
0
        private TreeGraphNode createNewTreeGraphNode(ObjectGraphNode objectGraphNode)
        {
            var newGraphNode = TreeGraphNode.Create(this.layoutDirection, objectGraphNode);

            newGraphNode.HorizontalMargin = horizNodeMargin;
            newGraphNode.VerticalMargin   = vertNodeMargin;
            return(newGraphNode);
        }
Ejemplo n.º 4
0
        private void LinkObjectToNode(ObjectGraphNode node, object targetObject)
        {
            if (m_links.ContainsValue(node.RefId))
            {
                m_links.RemoveValue(node.RefId);
            }

            m_links.Add(targetObject, node.RefId);
        }
Ejemplo n.º 5
0
        public static TreeGraphNode Create(LayoutDirection direction, ObjectGraphNode objectNode)
        {
            switch (direction)
            {
            case LayoutDirection.TopBottom: return(new TreeNodeTB(objectNode));

            case LayoutDirection.LeftRight: return(new TreeNodeLR(objectNode));

            default: throw new DebuggerVisualizerException("Unsupported layout direction: " + direction.ToString());
            }
        }
Ejemplo n.º 6
0
        public IObjectGraphNode GetObjectDataForRefId(int refid)
        {
            ObjectGraphNode node;

            if (m_refs.TryGetValue(refid, out node))
            {
                return(node);
            }

            node          = new ObjectGraphNode(refid, this);
            m_refs[refid] = node;
            return(node);
        }
Ejemplo n.º 7
0
        private static Dictionary <ulong, List <ulong> > PathToGcRoots(ClrHeap heap, ulong objRef, ClrRoot root)
        {
            const int maxSteps    = 65536;
            var       sourceNode  = new ObjectGraphNode(objRef, heap.GetObjectType(objRef).Name);
            var       considered  = new HashSet <ulong>();
            var       gcRootNodes = new HashSet <ulong>();
            var       count       = 0;
            var       eval        = new Stack <ObjectGraphNode>();

            eval.Push(sourceNode);

            while (eval.Count > 0)
            {
                var node = eval.Pop();
                if (considered.Contains(node.ObjRef))
                {
                    continue;
                }

                considered.Add(node.ObjRef);

                if (gcRootsByRef.ContainsKey(node.ObjRef))
                {
                    gcRootNodes.Add(node.ObjRef);
                    continue;
                }

                var type = heap.GetObjectType(node.ObjRef);
                if (type == null)
                {
                    continue;
                }

                count++;
                if (count >= maxSteps)
                {
                    return(null);
                }

                type.EnumerateRefsOfObject(node.ObjRef, (child, offset) =>
                {
                    if (child != 0 && !considered.Contains(child))
                    {
                        var typeName = heap.GetObjectType(child).Name;
                        eval.Push(new ObjectGraphNode(child, typeName));
                    }
                });
            }

            return(null);
        }
Ejemplo n.º 8
0
        public bool GetObjectNode(object obj, out IObjectGraphNode dataNode)
        {
            int id;

            if (m_links.TryGetValue(obj, out id))
            {
                dataNode = m_refs[id];
                return(false);
            }

            var node = new ObjectGraphNode(m_idCounter++, this);

            m_refs[node.RefId] = node;
            m_links[obj]       = node.RefId;
            dataNode           = node;
            return(true);
        }
Ejemplo n.º 9
0
        private PositionedGraph buildTreeGraph(ObjectGraph objectGraph, Expanded expanded)
        {
            var resultGraph = new PositionedGraph();

            // create empty PosNodes
            foreach (ObjectGraphNode objectGraphNode in objectGraph.ReachableNodes)
            {
                TreeGraphNode posNode = createNewTreeGraphNode(objectGraphNode);
                resultGraph.AddNode(posNode);
                treeNodeFor[objectGraphNode] = posNode;
                posNode.InitContentFromObjectNode(expanded);
            }

            // create edges
            foreach (PositionedGraphNode posNode in resultGraph.Nodes)
            {
                // create edges outgoing from this posNode
                foreach (PositionedNodeProperty property in posNode.Properties)
                {
                    //property.IsPropertyExpanded = expanded.Expressions.IsExpanded(property.Expression);

                    if (property.ObjectGraphProperty.TargetNode != null)
                    {
                        ObjectGraphNode     targetObjectNode = property.ObjectGraphProperty.TargetNode;
                        PositionedGraphNode edgeTarget       = treeNodeFor[targetObjectNode];
                        property.Edge = new TreeGraphEdge
                        {
                            IsTreeEdge = false, Name = property.Name, Source = property, Target = edgeTarget
                        };
                    }
                }
            }

            resultGraph.Root = treeNodeFor[objectGraph.Root];
            return(resultGraph);
        }
Ejemplo n.º 10
0
		protected TreeGraphNode(ObjectGraphNode objectNode) : base(objectNode)
		{
		}
Ejemplo n.º 11
0
 protected TreeGraphNode(ObjectGraphNode objectNode) : base(objectNode)
 {
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Creates new PositionedNode.
 /// </summary>
 /// <param name="objectNode">Underlying ObjectNode.</param>
 public PositionedGraphNode(ObjectGraphNode objectNode)
 {
     this.objectNode = objectNode;
     initVisualControl();
 }
Ejemplo n.º 13
0
		public TreeNodeTB(ObjectGraphNode objectNode) : base(objectNode)
		{
		}
Ejemplo n.º 14
0
        public IGraphNode BuildNode(object obj, Type fieldType)
        {
            if (obj == null)
            {
                return(null);
            }

            IGraphNode result;
            Type       objType = obj.GetType();

            if (typeof(Type).IsAssignableFrom(objType))
            {
                return(GetTypeEntry((Type)obj));
            }

            var formatter = GetFormatter(objType);

            if (formatter != null)
            {
                var node = formatter.ObjectToGraphNode(obj, this);
                var fieldTypeFormatter = fieldType != null?GetFormatter(fieldType) : null;

                if (formatter != fieldTypeFormatter)
                {
                    //Value needs to be boxed
                    ObjectGraphNode box = node as ObjectGraphNode;
                    if (box == null)
                    {
                        box = (ObjectGraphNode)CreateObjectData();
                        box[DEFAULT_BOXED_VALUE_FIELD_NAME] = node;
                    }

                    if (box.ObjectType == null)
                    {
                        box.ObjectType = GetTypeEntry(objType);
                    }
                    return(box);
                }
                return(node);
            }

            if (objType.IsArray || objType.IsPrimitiveData())
            {
                //Boxable Values (arrays, bools, numbers, strings)
                IGraphNode valueNode;
                if (objType.IsArray)
                {
                    Type elemType            = objType.GetElementType();
                    ISequenceGraphNode array = BuildSequenceNode();
                    IEnumerator        it    = ((IEnumerable)obj).GetEnumerator();
                    while (it.MoveNext())
                    {
                        IGraphNode elem = BuildNode(it.Current, elemType);
                        array.Add(elem);
                    }
                    valueNode = array;
                }
                else
                {
                    //Primitive data type
                    if (objType == typeof(string))
                    {
                        valueNode = BuildStringNode(obj as string);
                    }
                    else
                    {
                        if (objType.IsEnum)
                        {
                            obj = Convert.ChangeType(obj, ((Enum)obj).GetTypeCode());
                        }

                        valueNode = BuildPrimitiveNode(obj as ValueType);
                    }
                }

                if (objType != fieldType)
                {
                    //Value needs to be boxed
                    var boxNode = CreateObjectData();
                    boxNode.ObjectType = GetTypeEntry(objType);
                    boxNode[DEFAULT_BOXED_VALUE_FIELD_NAME] = valueNode;
                    valueNode = boxNode;
                }

                result = valueNode;
            }
            else
            {
                //Non-Boxable Values (structs and objects)
                IObjectGraphNode objReturnData;
                bool             extractData = true;
                if (objType.IsValueType)
                {
                    //Structure
                    objReturnData = CreateObjectData();
                }
                else
                {
                    //Classes
                    if (!GetObjectNode(obj, out objReturnData))
                    {
                        extractData = false;
                    }
                }

                if (extractData)
                {
                    var surrogate = SerializationServices.GetDefaultSerializationSurrogate(objType);
                    surrogate.GetObjectData(obj, objReturnData);
                }

                if ((objReturnData.ObjectType == null) && (objType != fieldType))
                {
                    objReturnData.ObjectType = GetTypeEntry(objType);
                }

                result = objReturnData;
            }
            return(result);
        }
 /// <summary>
 /// Creates new PositionedNode.
 /// </summary>
 /// <param name="objectNode">Underlying ObjectNode.</param>
 public PositionedNode(ObjectGraphNode objectNode, Expanded expanded)
 {
     this.ObjectNode = objectNode;
     InitVisualControl();
     InitContentFromObjectNode(expanded);
 }
Ejemplo n.º 16
0
 public TreeNodeTB(ObjectGraphNode objectNode) : base(objectNode)
 {
 }
Ejemplo n.º 17
0
		/// <summary>
		/// Creates new PositionedNode.
		/// </summary>
		/// <param name="objectNode">Underlying ObjectNode.</param>
		public PositionedGraphNode(ObjectGraphNode objectNode)
		{
			this.objectNode = objectNode;
			initVisualControl();
		}
Ejemplo n.º 18
0
		/// <summary>
		/// Creates new PositionedNode.
		/// </summary>
		/// <param name="objectNode">Underlying ObjectNode.</param>
		public PositionedNode(ObjectGraphNode objectNode, Expanded expanded)
		{
			this.ObjectNode = objectNode;
			InitVisualControl();
			InitContentFromObjectNode(expanded);
		}
Ejemplo n.º 19
0
		private TreeGraphNode createNewTreeGraphNode(ObjectGraphNode objectGraphNode)
		{
			var newGraphNode = TreeGraphNode.Create(this.layoutDirection, objectGraphNode);
			newGraphNode.HorizontalMargin = horizNodeMargin;
			newGraphNode.VerticalMargin = vertNodeMargin;
			return newGraphNode;
		}