Example #1
0
 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);
 }
Example #2
0
        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);
        }
Example #3
0
 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;
     }
 }
Example #4
0
        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);
        }
Example #5
0
        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));
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
		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;
		}