internal RhHeap(RhRuntime runtime, RhModule[] modules, TextWriter log) : base(runtime) { Log = log; m_runtime = runtime; m_modules = modules; m_mrtModule = FindMrtModule(); CreateFreeType(); InitSegments(runtime); }
public RhType(RhHeap heap, int index, RhModule module, string name, ulong eeType, Microsoft.Diagnostics.Runtime.Desktop.IMethodTableData mtData) { m_heap = heap; m_module = module; m_name = name; m_eeType = eeType; m_index = index; m_baseSize = mtData.BaseSize; m_componentSize = mtData.ComponentSize; m_containsPointers = mtData.ContainsPointers; }
private RhModule[] ConvertModuleList(List <ModuleInfo> modules) { RhModule[] result = new RhModule[modules.Count]; int i = 0; foreach (var module in modules) { result[i++] = new RhModule(this, module); } return(result); }
private RhModule[] ConvertModuleList(List<ModuleInfo> modules) { RhModule[] result = new RhModule[modules.Count]; int i = 0; foreach (var module in modules) result[i++] = new RhModule(this, module); return result; }
private ClrType ConstructObjectType(ulong eeType) { IMethodTableData mtData = m_runtime.GetMethodTableData(eeType); if (mtData == null) { return(null); } ulong componentType = mtData.ElementTypeHandle; bool isArray = componentType != 0; // EEClass is the canonical method table. I stuffed the pointer there instead of creating a new property. ulong canonType = isArray ? componentType : mtData.EEClass; if (!isArray && canonType != 0) { int index; if (!isArray && m_indices.TryGetValue(canonType, out index)) { m_indices[eeType] = index; // Link the original eeType to its canonical GCHeapType. return(m_types[index]); } ulong tmp = eeType; eeType = canonType; canonType = tmp; } string name = m_runtime.ResolveSymbol(eeType); if (string.IsNullOrEmpty(name)) { name = m_runtime.ResolveSymbol(canonType); if (name == null) { name = string.Format("unknown type {0:x}", eeType); } } int len = name.Length; if (name.EndsWith("::`vftable'")) { len -= 11; } int i = name.IndexOf('!') + 1; name = name.Substring(i, len - i); if (isArray) { name += "[]"; } RhModule module = FindContainingModule(eeType); if (module == null && canonType != 0) { module = FindContainingModule(canonType); } if (module == null) { module = m_mrtModule; } RhType type = new RhType(this, m_types.Count, module, name, eeType, mtData); m_indices[eeType] = m_types.Count; if (!isArray) { m_indices[canonType] = m_types.Count; } m_types.Add(type); return(type); }