Exemple #1
0
        /// <summary>
        /// Similar with FormatterServices.GetUninitializedObject. Allocate and return zeroed T-typed object.
        /// </summary>
        public static ClassDisposeHandle UninitializedAllocation(Type t, out Object result)
        {
            MethodTable *mt   = MethodTable.GetMethodTable(t);
            int          size = mt->BaseSize;

            ObjectHeader *objHeader = (ObjectHeader *)RawMemoryManager.Allocate(size);

            objHeader->SyncBlock   = 0;
            objHeader->MethodTable = mt;
            RawMemoryManager.FillMemory(objHeader + 1, 0, size - sizeof(ObjectHeader));

            result = TypedReferenceHelper.PointerToObject <Object>(objHeader);
            return(new ClassDisposeHandle(size, objHeader));
        }
Exemple #2
0
        public static ClassDisposeHandle Box <T>(T val, out Object boxed) where T : struct
        {
            MethodTable *mt   = MethodTable.GetMethodTable <T>();
            int          size = mt->BaseSize;

            ObjectHeader *objHeader = (ObjectHeader *)RawMemoryManager.Allocate(size);

            void *src = TypedReferenceHelper.StructToPointer(ref val);

            objHeader->SyncBlock   = 0;
            objHeader->MethodTable = mt;
            RawMemoryManager.MemCpy(objHeader + 1, src, mt->DataSize);

            boxed = TypedReferenceHelper.PointerToObject <Object>(objHeader);
            return(new ClassDisposeHandle(size, objHeader));
        }
Exemple #3
0
        public static ClassDisposeHandle AllocateSZArray <T>(int size, out T[] array)
        {
            MethodTable *pElementMT  = MethodTable.GetMethodTable <T>();
            MethodTable *pArrayMT    = MethodTable.GetMethodTable <T[]>();
            int          elementSize = pElementMT->IsClass ? sizeof(IntPtr) : pElementMT->DataSize;

            int memSize = sizeof(ObjectHeader) + sizeof(SZArrayHeader) + elementSize * size;
            int align   = sizeof(IntPtr) - 1;

            memSize = (memSize + align) & (~align);

            void *         addr          = RawMemoryManager.Allocate(memSize);
            ObjectHeader * objHeader     = (ObjectHeader *)addr;
            SZArrayHeader *szArrayHeader = (SZArrayHeader *)(objHeader + 1);

            objHeader->MethodTable       = pArrayMT;
            szArrayHeader->NumComponents = size;

            array = TypedReferenceHelper.PointerToObject <T[]>(objHeader);
            return(new ClassDisposeHandle(memSize, objHeader));
        }