internal unsafe object[] GetFields() { Type.TypeData *typeData = GetType().GetTypeDataPointer(); object[] fields = new object[typeData->FieldCount]; for (int i = 0; i < typeData->FieldCount; ++i) { // TODO: Create new object using typeData.Fields[i].Type, and then byte copy the field data } return(fields); }
internal static object AllocateObject(Type.TypeData *typeData) { // TODO: Atomic_AquireLock(&sBusy) object obj = Allocate(typeData->Size); GCObject *gco = (GCObject *)((byte *)obj.Internal_ReferenceToPointer() - sizeof(GCObject)); gco->TypeData = typeData; // TODO: Atomic_ReleaseLock(&sBusy) return(obj); }
private static unsafe void Internal_GetInfo(Type enumType, out string[] names, out int[] values) { Type.TypeData *typeData = enumType.GetTypeDataPointer(); names = new string[typeData->EnumerationCount]; values = new int[typeData->EnumerationCount]; for (int i = 0; i < typeData->EnumerationCount; ++i) { names[i] = new string(typeData->Enumerations[i].Name, 0, typeData->Enumerations[i].NameLength); values[i] = typeData->Enumerations[i].Value; } }
internal static unsafe object GetValue(Array array, int index) { Type.TypeData *typeData = array.GetType().GetTypeDataPointer()->ArrayElementType; void * startOfArrayElement = (void *)((byte *)array.Internal_ReferenceToPointer() + sizeof(int) + (typeData->Size * index)); Type type = Type.GetTypeFromHandle(new RuntimeTypeHandle(new IntPtr(typeData))); if (!type.IsValueType) { // TODO: GC support for getting an object, from an existing pointer to an object return(null); } // TODO: GC support to Allocate boxed value type based on typeData return(null); }
public static unsafe void Clear(Array array, int index, int length) { if (array == null) { throw new ArgumentNullException(); } if (index < 0 || length < 0 || (index + length) > array.Length) { throw new IndexOutOfRangeException(); } void *startOfArrayData = (void *)((byte *)array.Internal_ReferenceToPointer() + sizeof(int)); Type.TypeData *typeData = array.GetType().GetTypeDataPointer()->ArrayElementType; Internal_FastZero((void *)((byte *)startOfArrayData + (index * typeData->Size)), (int)(length * typeData->Size)); }
internal static Array AllocateArray(Type.TypeData *typeData, uint count) { uint elementSize = typeData->ArrayElementType->Size; if (!(new RuntimeType(new RuntimeTypeHandle(new IntPtr((void *)typeData->ArrayElementType))).IsValueType)) { elementSize = (uint)sizeof(IntPtr); } // TODO: Atomic_AquireLock(&sBusy) object obj = Allocate((uint)(sizeof(int) + (elementSize * count))); GCObject *gco = (GCObject *)((byte *)obj.Internal_ReferenceToPointer() - sizeof(GCObject)); gco->TypeData = typeData; // TODO: Atomic_ReleaseLock(&sBusy) return((Array)obj); }
internal static unsafe bool SetValue(Array array, object value, int index) { Type.TypeData *typeData = array.GetType().GetTypeDataPointer()->ArrayElementType; if (value.GetType().GetTypeDataPointer() != typeData) { return(false); } void *startOfArrayElement = (void *)((byte *)array.Internal_ReferenceToPointer() + sizeof(int) + (typeData->Size * index)); void *startOfValue = value.Internal_ReferenceToPointer(); Type type = Type.GetTypeFromHandle(new RuntimeTypeHandle(new IntPtr(typeData))); if (!type.IsValueType) { *((void **)startOfArrayElement) = value.Internal_ReferenceToPointer(); return(true); } Internal_FastCopy(startOfValue, startOfArrayElement, (int)typeData->Size); return(true); }
private static GCHeap* AllocateHeap(ulong pHeapSize, bool pSingleObject) { // TODO: Thread-safety if (StringTypeData == null) StringTypeData = typeof(string).GetTypeDataPointer(); GCHeap* heap = HeapAllocator.AllocateHeap(pHeapSize, pSingleObject); if (HeapLast == null) { heap->Prev = null; heap->Next = null; HeapFirst = heap; HeapLast = heap; } else { HeapLast->Next = heap; heap->Prev = HeapLast; heap->Next = null; HeapLast = heap; } return heap; }