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; }
ulong GetChildCountCore(DbgEvaluationInfo evalInfo) => dnValueNode.GetChildCount(evalInfo);
ulong GetChildCountCore(DbgEvaluationContext context, DbgStackFrame frame, CancellationToken cancellationToken) => dnValueNode.GetChildCount(context, frame, cancellationToken);