diff options
author | Ruben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com> | 2017-06-27 00:18:19 +0300 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2017-06-26 14:18:19 -0700 |
commit | 8cc7e35dd0a625a3b883703387291739a148e8c8 (patch) | |
tree | 33ea4e95260aba8be3bc63f6ec789dea8c4a9bc0 /src/vm/jithelpers.cpp | |
parent | 959dacc9f0b09eb9f8c418eabb1b9180ceb6f5ac (diff) | |
download | coreclr-8cc7e35dd0a625a3b883703387291739a148e8c8.tar.gz coreclr-8cc7e35dd0a625a3b883703387291739a148e8c8.tar.bz2 coreclr-8cc7e35dd0a625a3b883703387291739a148e8c8.zip |
Replace array type handle with method table in arguments of array allocation helpers (#12369)
* Remove direct usage of type handle in JIT_NewArr1, with except of retrieving template method table.
* Assert that array type descriptor is loaded when array object's method table is set.
* Pass template method tables instead of array type descriptors to array allocation helpers.
Diffstat (limited to 'src/vm/jithelpers.cpp')
-rw-r--r-- | src/vm/jithelpers.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/vm/jithelpers.cpp b/src/vm/jithelpers.cpp index d93331d74e..e5fc596689 100644 --- a/src/vm/jithelpers.cpp +++ b/src/vm/jithelpers.cpp @@ -3001,7 +3001,7 @@ HCIMPLEND //************************************************************* // Array allocation fast path for arrays of value type elements // -HCIMPL2(Object*, JIT_NewArr1VC_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) +HCIMPL2(Object*, JIT_NewArr1VC_MP_FastPortable, CORINFO_CLASS_HANDLE arrayMT, INT_PTR size) { FCALL_CONTRACT; @@ -3027,16 +3027,14 @@ HCIMPL2(Object*, JIT_NewArr1VC_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeHn // some reshuffling of intermediate values into nonvolatile registers around the call. Thread *thread = GetThread(); - TypeHandle arrayTypeHandle(arrayTypeHnd_); - ArrayTypeDesc *arrayTypeDesc = arrayTypeHandle.AsArray(); - MethodTable *arrayMethodTable = arrayTypeDesc->GetTemplateMethodTable(); + MethodTable *pArrayMT = (MethodTable *)arrayMT; - _ASSERTE(arrayMethodTable->HasComponentSize()); - SIZE_T componentSize = arrayMethodTable->RawGetComponentSize(); + _ASSERTE(pArrayMT->HasComponentSize()); + SIZE_T componentSize = pArrayMT->RawGetComponentSize(); SIZE_T totalSize = componentCount * componentSize; _ASSERTE(totalSize / componentSize == componentCount); - SIZE_T baseSize = arrayMethodTable->GetBaseSize(); + SIZE_T baseSize = pArrayMT->GetBaseSize(); totalSize += baseSize; _ASSERTE(totalSize >= baseSize); @@ -3055,7 +3053,7 @@ HCIMPL2(Object*, JIT_NewArr1VC_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeHn _ASSERTE(allocPtr != nullptr); ArrayBase *array = reinterpret_cast<ArrayBase *>(allocPtr); - array->SetMethodTable(arrayMethodTable); + array->SetArrayMethodTable(pArrayMT); _ASSERTE(static_cast<DWORD>(componentCount) == componentCount); array->m_NumComponents = static_cast<DWORD>(componentCount); @@ -3071,14 +3069,14 @@ HCIMPL2(Object*, JIT_NewArr1VC_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeHn // Tail call to the slow helper ENDFORBIDGC(); - return HCCALL2(JIT_NewArr1, arrayTypeHnd_, size); + return HCCALL2(JIT_NewArr1, arrayMT, size); } HCIMPLEND //************************************************************* // Array allocation fast path for arrays of object elements // -HCIMPL2(Object*, JIT_NewArr1OBJ_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) +HCIMPL2(Object*, JIT_NewArr1OBJ_MP_FastPortable, CORINFO_CLASS_HANDLE arrayMT, INT_PTR size) { FCALL_CONTRACT; @@ -3099,14 +3097,12 @@ HCIMPL2(Object*, JIT_NewArr1OBJ_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeH // some reshuffling of intermediate values into nonvolatile registers around the call. Thread *thread = GetThread(); - TypeHandle arrayTypeHandle(arrayTypeHnd_); - ArrayTypeDesc *arrayTypeDesc = arrayTypeHandle.AsArray(); - MethodTable *arrayMethodTable = arrayTypeDesc->GetTemplateMethodTable(); - SIZE_T totalSize = componentCount * sizeof(void *); _ASSERTE(totalSize / sizeof(void *) == componentCount); - SIZE_T baseSize = arrayMethodTable->GetBaseSize(); + MethodTable *pArrayMT = (MethodTable *)arrayMT; + + SIZE_T baseSize = pArrayMT->GetBaseSize(); totalSize += baseSize; _ASSERTE(totalSize >= baseSize); @@ -3123,7 +3119,7 @@ HCIMPL2(Object*, JIT_NewArr1OBJ_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeH _ASSERTE(allocPtr != nullptr); ArrayBase *array = reinterpret_cast<ArrayBase *>(allocPtr); - array->SetMethodTable(arrayMethodTable); + array->SetArrayMethodTable(pArrayMT); _ASSERTE(static_cast<DWORD>(componentCount) == componentCount); array->m_NumComponents = static_cast<DWORD>(componentCount); @@ -3139,14 +3135,14 @@ HCIMPL2(Object*, JIT_NewArr1OBJ_MP_FastPortable, CORINFO_CLASS_HANDLE arrayTypeH // Tail call to the slow helper ENDFORBIDGC(); - return HCCALL2(JIT_NewArr1, arrayTypeHnd_, size); + return HCCALL2(JIT_NewArr1, arrayMT, size); } HCIMPLEND #include <optdefault.h> /*************************************************************/ -HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) +HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayMT, INT_PTR size) { FCALL_CONTRACT; @@ -3154,11 +3150,11 @@ HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame - TypeHandle typeHnd(arrayTypeHnd_); + MethodTable *pArrayMT = (MethodTable *)arrayMT; - _ASSERTE(typeHnd.GetInternalCorElementType() == ELEMENT_TYPE_SZARRAY); - typeHnd.CheckRestore(); - ArrayTypeDesc* pArrayClassRef = typeHnd.AsArray(); + _ASSERTE(pArrayMT->IsFullyLoaded()); + _ASSERTE(pArrayMT->IsArray()); + _ASSERTE(!pArrayMT->IsMultiDimArray()); if (size < 0) COMPlusThrow(kOverflowException); @@ -3175,7 +3171,7 @@ HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) // is this a primitive type? // - CorElementType elemType = pArrayClassRef->GetArrayElementTypeHandle().GetSignatureCorElementType(); + CorElementType elemType = pArrayMT->GetInternalCorElementType(); if (CorTypeInfo::IsPrimitiveType(elemType) #ifdef FEATURE_64BIT_ALIGNMENT @@ -3208,9 +3204,13 @@ HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) #endif if (g_pPredefinedArrayTypes[elemType] == NULL) - g_pPredefinedArrayTypes[elemType] = pArrayClassRef; + { + TypeHandle elemTypeHnd = TypeHandle(MscorlibBinder::GetElementType(elemType)); + + g_pPredefinedArrayTypes[elemType] = ClassLoader::LoadArrayTypeThrowing(elemTypeHnd, ELEMENT_TYPE_SZARRAY, 0).AsArray(); + } - newArray = FastAllocatePrimitiveArray(pArrayClassRef->GetMethodTable(), static_cast<DWORD>(size), bAllocateInLargeHeap); + newArray = FastAllocatePrimitiveArray(pArrayMT, static_cast<DWORD>(size), bAllocateInLargeHeap); } else { @@ -3220,7 +3220,7 @@ HCIMPL2(Object*, JIT_NewArr1, CORINFO_CLASS_HANDLE arrayTypeHnd_, INT_PTR size) } #endif // _DEBUG INT32 size32 = (INT32)size; - newArray = AllocateArrayEx(typeHnd, &size32, 1); + newArray = AllocateArrayEx(pArrayMT, &size32, 1); } HELPER_METHOD_FRAME_END(); |