Exemplo n.º 1
0
 public ChildNodeProviderInfo(ulong startIndex, ulong endIndex, uint baseIndex)
 {
     StartIndex = startIndex;
     EndIndex   = endIndex;
     BaseIndex  = baseIndex;
     ValueNode  = null;
     CanHide    = false;
 }
Exemplo n.º 2
0
 public ChildNodeProviderInfo(ulong startIndex, ulong endIndex, DbgDotNetValueNode valueNode, bool canHide)
 {
     StartIndex = startIndex;
     EndIndex   = endIndex;
     BaseIndex  = 0;
     ValueNode  = valueNode;
     CanHide    = canHide;
 }
Exemplo n.º 3
0
        public DbgEngineValueNodeImpl(DbgDotNetEngineValueNodeFactoryImpl owner, DbgDotNetValueNode dnValueNode)
        {
            if (dnValueNode is null)
            {
                throw new ArgumentNullException(nameof(dnValueNode));
            }
            this.owner = owner ?? throw new ArgumentNullException(nameof(owner));
            var dnValue = dnValueNode.Value;

            value            = dnValue is null ? null : new DbgEngineValueImpl(dnValue);
            this.dnValueNode = dnValueNode;
        }
Exemplo n.º 4
0
        public override DbgDotNetValueNode[] GetChildren(DbgEvaluationInfo evalInfo, ulong index, int count, DbgValueNodeEvaluationOptions options)
        {
            var res = new DbgDotNetValueNode[count];

            try {
                for (int i = 0, j = (int)index; i < count; i++, j++)
                {
                    res[i] = new TypeVariableValueNode(valueNodeFactory, typeVariableInfos[j]);
                }
            }
            catch {
                evalInfo.Context.Process.DbgManager.Close(res.Where(a => !(a is null)));
                throw;
            }
            return(res);
        }
Exemplo n.º 5
0
        public override DbgDotNetValueNode[] GetChildren(DbgEvaluationContext context, DbgStackFrame frame, ulong index, int count, DbgValueNodeEvaluationOptions options, CancellationToken cancellationToken)
        {
            var res = new DbgDotNetValueNode[count];

            try {
                for (int i = 0, j = (int)index; i < count; i++, j++)
                {
                    res[i] = new TypeVariableValueNode(valueNodeFactory, typeVariableInfos[j]);
                }
            }
            catch {
                context.Process.DbgManager.Close(res.Where(a => a != null));
                throw;
            }
            return(res);
        }
Exemplo n.º 6
0
        public override DbgDotNetValueNode[] GetChildren(LanguageValueNodeFactory valueNodeFactory, DbgEvaluationInfo evalInfo, ulong index, int count, DbgValueNodeEvaluationOptions options, ReadOnlyCollection <string> formatSpecifiers)
        {
            if (count == 0)
            {
                return(Array.Empty <DbgDotNetValueNode>());
            }

            var   first      = providers[0];
            ulong childCount = first.GetChildCount(evalInfo);

            if (index + (uint)count <= childCount)
            {
                return(first.GetChildren(valueNodeFactory, evalInfo, index, count, options, formatSpecifiers));
            }

            var res = new DbgDotNetValueNode[count];

            try {
                int w = 0;
                if (index < childCount)
                {
                    var tmp = first.GetChildren(valueNodeFactory, evalInfo, index, (int)(childCount - index), options, formatSpecifiers);
                    Array.Copy(tmp, res, tmp.Length);
                    w += tmp.Length;
                }
                for (int i = (int)(index - childCount) + 1; i < providers.Length && w < count; i++)
                {
                    evalInfo.CancellationToken.ThrowIfCancellationRequested();
                    var provider = providers[i];
                    res[w++] = valueNodeFactory.Create(evalInfo, provider.Name, provider, formatSpecifiers, options, provider.Expression, provider.ImageName, provider.ValueText);
                }
                if (w != res.Length)
                {
                    throw new InvalidOperationException();
                }
                return(res);
            }
            catch {
                evalInfo.Context.Runtime.Process.DbgManager.Close(res.Where(a => a != null));
                throw;
            }
        }
Exemplo n.º 7
0
        void Initialize(DbgEvaluationInfo evalInfo)
        {
            if (hasInitialized)
            {
                return;
            }
            errorMessage = InitializeCore(evalInfo);
            if (realProvider != null)
            {
                return;
            }
            Debug.Assert(errorMessage != null || membersCollection.Members != null);
            if (errorMessage == null && membersCollection.Members == null)
            {
                errorMessage = PredefinedEvaluationErrorMessages.InternalDebuggerError;
            }
            dbgManager = evalInfo.Runtime.Process.DbgManager;
            if (errorMessage != null)
            {
                childNodeProviderInfos = new ChildNodeProviderInfo[] { new ChildNodeProviderInfo(0, 1, 0) }
            }
            ;
            else if ((evalOptions & DbgValueNodeEvaluationOptions.NoHideRoots) != 0 || !membersCollection.HasHideRoot || (evalOptions & DbgValueNodeEvaluationOptions.RawView) != 0 || membersCollection.Members.Length == 0)
            {
                childNodeProviderInfos = new ChildNodeProviderInfo[] { new ChildNodeProviderInfo(0, (uint)membersCollection.Members.Length, 0) }
            }
            ;
            else
            {
                DbgDotNetValueNode valueNode = null;
                var list = Cache.AllocProviderList();
                try {
                    var   members          = membersCollection.Members;
                    int   membersBaseIndex = 0;
                    ulong baseIndex        = 0;
                    int   i;
                    for (i = 0; i < members.Length; i++)
                    {
                        if (!members[i].HasDebuggerBrowsableState_RootHidden)
                        {
                            continue;
                        }
                        if (membersBaseIndex != i)
                        {
                            list.Add(new ChildNodeProviderInfo(baseIndex, baseIndex + (uint)(i - membersBaseIndex), (uint)membersBaseIndex));
                            baseIndex       += (uint)(i - membersBaseIndex);
                            membersBaseIndex = i;
                        }

                        evalInfo.CancellationToken.ThrowIfCancellationRequested();
                        // Format specifiers get updated in GetChildren()
                        var info = CreateValueNode(evalInfo, membersBaseIndex, evalOptions, formatSpecifiers: null);
                        valueNode = info.node;
                        ulong childCount = info.canHide ? valueNode.GetChildCount(evalInfo) : 1;
                        list.Add(new ChildNodeProviderInfo(baseIndex, baseIndex + childCount, valueNode, info.canHide));

                        membersBaseIndex++;
                        baseIndex += childCount;
                        valueNode  = null;
                    }
                    if (membersBaseIndex != i)
                    {
                        list.Add(new ChildNodeProviderInfo(baseIndex, baseIndex + (uint)(i - membersBaseIndex), (uint)membersBaseIndex));
                    }
                    if (list.Count == 0)
                    {
                        list.Add(new ChildNodeProviderInfo(0, 0, 0));
                    }
                    childNodeProviderInfos = Cache.FreeAndToArray(ref list);
                }
                catch {
                    if (valueNode != null)
                    {
                        dbgManager.Close(valueNode);
                    }
                    dbgManager.Close(list.Select(a => a.ValueNode));
                    throw;
                }
            }
            hasInitialized = true;
        }
Exemplo n.º 8
0
 internal DbgEngineValueNode Create(DbgDotNetValueNode node) => new DbgEngineValueNodeImpl(this, node);