Example #1
0
        private unsafe static Object NewOperatorHook(IntPtr mt)
        {
            if (IsNoAlloc)
            {
                // TODO:
                // Temporary whitelist. Need some way to allocate AllocationEntry without new operator.
                // @Harnel
                if (mt != (IntPtr)MethodTable.GetMethodTable <AllocationEntry>())
                {
                    try
                    {
                        IsNoAlloc = false;
                        Thread curr = Thread.CurrentThread;

                        throw new MemoryRestrictorException(
                                  $"Tried to allocate in NoAlloc region. Thread: ({curr.Name}, #{curr.ManagedThreadId}), MT: {mt.ToInt64():X}");
                    }
                    finally
                    {
                        IsNoAlloc = true;
                    }
                }
            }

            return(NewOperatorHijackContext.Funclet.Invoke(mt));
        }
Example #2
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));
        }
Example #3
0
        public void StringSize()
        {
            MethodTable *stringMt = MethodTable.GetMethodTable <String>();

            Assert.IsTrue(stringMt->HasComponentSize());
            Assert.AreEqual(
                sizeof(Char),
                stringMt->ComponentSize);

            // Temporary disabled until we implement allocation-free string.
            //Assert.AreEqual(
            //    AlignSizeByPointerSize(sizeof(ObjectHeader) + sizeof(Int32)) + sizeof(Char),
            //    stringMt->BaseSize);
        }
Example #4
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));
        }
Example #5
0
        public void PrimitiveTypeSize()
        {
            MethodTable *byteMt = MethodTable.GetMethodTable <Byte>();

            Assert.AreEqual(
                AlignSizeByPointerSize(sizeof(ObjectHeader) + sizeof(Byte)),
                byteMt->BaseSize);

            MethodTable *intMt = MethodTable.GetMethodTable <Int32>();

            Assert.AreEqual(
                AlignSizeByPointerSize(sizeof(ObjectHeader) + sizeof(Int32)),
                intMt->BaseSize);

            MethodTable *doubleMt = MethodTable.GetMethodTable <Double>();

            Assert.AreEqual(
                AlignSizeByPointerSize(sizeof(ObjectHeader) + sizeof(Double)),
                doubleMt->BaseSize);
        }
Example #6
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));
        }