public override ClrType GetObjectType(ulong objRef) { ulong mt; if (_lastObject.Address == objRef) { return(_lastObject.Type); } if (IsHeapCached) { return(base.GetObjectType(objRef)); } MemoryReader cache = MemoryReader; if (cache.Contains(objRef)) { if (!cache.ReadPtr(objRef, out mt)) { return(null); } } else if (DesktopRuntime.MemoryReader.Contains(objRef)) { cache = DesktopRuntime.MemoryReader; if (!cache.ReadPtr(objRef, out mt)) { return(null); } } else { cache = null; mt = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef); } unchecked { if (((byte)mt & 3) != 0) { mt &= ~3UL; } } ClrType type = GetTypeByMethodTable(mt, 0, objRef); _lastObject = ClrObject.Create(objRef, type); return(type); }
public override ClrType GetObjectType(ulong objRef) { ulong mt, cmt = 0; if (_lastObject.Address == objRef) { return(_lastObject.Type); } if (IsHeapCached) { return(base.GetObjectType(objRef)); } MemoryReader cache = MemoryReader; if (cache.Contains(objRef)) { if (!cache.ReadPtr(objRef, out mt)) { return(null); } } else if (DesktopRuntime.MemoryReader.Contains(objRef)) { cache = DesktopRuntime.MemoryReader; if (!cache.ReadPtr(objRef, out mt)) { return(null); } } else { cache = null; mt = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef); } if (((int)mt & 3) != 0) { mt &= ~3UL; } if (mt == DesktopRuntime.ArrayMethodTable) { uint elemenTypeOffset = (uint)PointerSize * 2; if (cache == null) { cmt = DesktopRuntime.DataReader.ReadPointerUnsafe(objRef + elemenTypeOffset); } else if (!cache.ReadPtr(objRef + elemenTypeOffset, out cmt)) { return(null); } } else { cmt = 0; } ClrType type = GetTypeByMethodTable(mt, cmt, objRef); _lastObject = ClrObject.Create(objRef, type); return(type); }