public static int GetArraySize([NotNull] ES_ObjectAddress arrayPointer) { var arrayType = (ES_ArrayTypeData *)arrayPointer.Header->TypeData; var arrayHeader = (ES_ArrayHeader *)arrayPointer.Address; return( sizeof(ES_ObjectHeader) + GetArrayHeaderSize(arrayHeader->Rank) + arrayType->ElementType->RuntimeSize * arrayHeader->Length ); }
static bool MarkObject(ES_ObjectAddress obj, bool flipMark) { var curFlags = obj.Header->Flags; var isMarked = !IsMarked(curFlags, flipMark); obj.Header->Flags = flipMark ? (curFlags & ~ES_ObjectFlags.Marked) : (curFlags | ES_ObjectFlags.Marked); return(isMarked); }
static bool HandleForwarding(ref ES_ObjectAddress obj) { var objFlags = obj.Header->Flags; if (objFlags.HasFlag(ES_ObjectFlags.Forwarded)) { obj.Address = *(void **)obj.Address; return(true); } else if (objFlags.HasFlag(ES_ObjectFlags.DoRemove) && !objFlags.HasFlag(ES_ObjectFlags.Pinned)) { obj.Address = null; return(true); } return(false); }