public ChildNodeProviderInfo(ulong startIndex, ulong endIndex, uint baseIndex) { StartIndex = startIndex; EndIndex = endIndex; BaseIndex = baseIndex; ValueNode = null; CanHide = false; }
public ChildNodeProviderInfo(ulong startIndex, ulong endIndex, DbgDotNetValueNode valueNode, bool canHide) { StartIndex = startIndex; EndIndex = endIndex; BaseIndex = 0; ValueNode = valueNode; CanHide = canHide; }
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; }
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); }
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); }
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; } }
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; }
internal DbgEngineValueNode Create(DbgDotNetValueNode node) => new DbgEngineValueNodeImpl(this, node);