summaryrefslogtreecommitdiff
path: root/src/vm/jithelpers.cpp
diff options
context:
space:
mode:
authorRuben Ayrapetyan <ruben-ayrapetyan@users.noreply.github.com>2017-06-27 00:18:19 +0300
committerJan Kotas <jkotas@microsoft.com>2017-06-26 14:18:19 -0700
commit8cc7e35dd0a625a3b883703387291739a148e8c8 (patch)
tree33ea4e95260aba8be3bc63f6ec789dea8c4a9bc0 /src/vm/jithelpers.cpp
parent959dacc9f0b09eb9f8c418eabb1b9180ceb6f5ac (diff)
downloadcoreclr-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.cpp52
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();