Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2259,5 +2259,53 @@ internal static unsafe void GetStringLiteral(Resolver* pResolver, int token, str
*pException = ex;
}
}

[UnmanagedCallersOnly]
internal static unsafe void ResolveToken(Resolver* pResolver, int token, IntPtr* pTypeHandle, IntPtr* pMethodHandle, IntPtr* pFieldHandle, Exception* pException)
{
try
{
pResolver->ResolveToken(token, out *pTypeHandle, out *pMethodHandle, out *pFieldHandle);
}
catch (Exception ex)
{
*pException = ex;
}
}

[UnmanagedCallersOnly]
internal static unsafe void ResolveSignature(Resolver* pResolver, int token, int fromMethod, byte[]* ppResult, Exception* pException)
{
try
{
*ppResult = pResolver->ResolveSignature(token, fromMethod);
}
catch (Exception ex)
{
*pException = ex;
}
}

[UnmanagedCallersOnly]
internal static unsafe void GetEHInfo(Resolver* pResolver, int EHNumber, byte[]* ppRawEHInfo, void* parsedEHInfo, Exception* pException)
{
try
{
byte[]? rawEHInfo = pResolver->GetRawEHInfo();
if (rawEHInfo != null)
{
*ppRawEHInfo = rawEHInfo;
}
else
{
*ppRawEHInfo = null;
pResolver->GetEHInfo(EHNumber, parsedEHInfo);
}
}
catch (Exception ex)
{
*pException = ex;
}
}
}
}
34 changes: 1 addition & 33 deletions src/coreclr/vm/callhelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -534,38 +534,6 @@ enum DispatchCallSimpleFlags
#define PREPARE_VIRTUAL_CALLSITE_USING_METHODDESC(pMD, objref) \
PCODE __pSlot = pMD->GetCallTarget(&objref);

#ifdef _DEBUG
#define SIMPLE_VIRTUAL_METHOD_CHECK(slotNumber, methodTable) \
{ \
MethodDesc* __pMeth = methodTable->GetMethodDescForSlot(slotNumber); \
_ASSERTE(__pMeth); \
_ASSERTE(!__pMeth->HasMethodInstantiation() && \
!__pMeth->GetMethodTable()->IsInterface()); \
}
#else
#define SIMPLE_VIRTUAL_METHOD_CHECK(slotNumber, objref)
#endif

// a simple virtual method is a non-interface/non-generic method
// Note: objref has to be protected!
#define PREPARE_SIMPLE_VIRTUAL_CALLSITE(id, objref) \
static WORD s_slot##id = MethodTable::NO_SLOT; \
WORD __slot = VolatileLoad(&s_slot##id); \
if (__slot == MethodTable::NO_SLOT) \
{ \
MethodDesc *pMeth = CoreLibBinder::GetMethod(id); \
_ASSERTE(pMeth); \
__slot = pMeth->GetSlot(); \
VolatileStore(&s_slot##id, __slot); \
} \
PREPARE_SIMPLE_VIRTUAL_CALLSITE_USING_SLOT(__slot, objref) \

// a simple virtual method is a non-interface/non-generic method
#define PREPARE_SIMPLE_VIRTUAL_CALLSITE_USING_SLOT(slotNumber, objref) \
MethodTable* __pObjMT = (objref)->GetMethodTable(); \
SIMPLE_VIRTUAL_METHOD_CHECK(slotNumber, __pObjMT); \
PCODE __pSlot = (PCODE) __pObjMT->GetRestoredSlot(slotNumber);

#define PREPARE_NONVIRTUAL_CALLSITE_USING_METHODDESC(pMD) \
PCODE __pSlot = (pMD)->GetSingleCallableAddrOfCode();

Expand Down Expand Up @@ -761,7 +729,7 @@ class UnmanagedCallersOnlyCaller final
MODE_COOPERATIVE;
}
CONTRACTL_END;

// Sanity check - UnmanagedCallersOnly methods must be in CoreLib.
// See below load level override.
_ASSERTE(_pMD->GetModule()->IsSystem());
Expand Down
7 changes: 3 additions & 4 deletions src/coreclr/vm/corelib.h
Original file line number Diff line number Diff line change
Expand Up @@ -661,11 +661,10 @@ DEFINE_CLASS(RESOLVER, System, Resolver)
DEFINE_METHOD(RESOLVER, GET_JIT_CONTEXT, GetJitContext, SM_PtrResolver_PtrInt_PtrClass_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, GET_CODE_INFO, GetCodeInfo, SM_PtrResolver_PtrInt_PtrInt_PtrInt_PtrArrByte_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, GET_LOCALS_SIGNATURE, GetLocalsSignature, SM_PtrResolver_PtrArrByte_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, GET_EH_INFO, GetEHInfo, IM_Int_VoidPtr_RetVoid)
DEFINE_METHOD(RESOLVER, GET_RAW_EH_INFO, GetRawEHInfo, IM_RetArrByte)
DEFINE_METHOD(RESOLVER, GET_EH_INFO, GetEHInfo, SM_PtrResolver_Int_PtrArrByte_PtrVoid_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, GET_STRING_LITERAL, GetStringLiteral, SM_PtrResolver_Int_PtrStr_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, RESOLVE_TOKEN, ResolveToken, IM_Int_RefIntPtr_RefIntPtr_RefIntPtr_RetVoid)
DEFINE_METHOD(RESOLVER, RESOLVE_SIGNATURE, ResolveSignature, IM_IntInt_RetArrByte)
DEFINE_METHOD(RESOLVER, RESOLVE_TOKEN, ResolveToken, SM_PtrResolver_Int_PtrIntPtr_PtrIntPtr_PtrIntPtr_PtrException_RetVoid)
DEFINE_METHOD(RESOLVER, RESOLVE_SIGNATURE, ResolveSignature, SM_PtrResolver_Int_Int_PtrArrByte_PtrException_RetVoid)

DEFINE_CLASS(RESOURCE_MANAGER, Resources, ResourceManager)

Expand Down
173 changes: 90 additions & 83 deletions src/coreclr/vm/dynamicmethod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1179,11 +1179,10 @@ BYTE* LCGMethodResolver::GetCodeInfo(unsigned *pCodeSize, unsigned *pStackSize,
struct
{
OBJECTREF Resolver;
OBJECTREF DataArray;
U1ARRAYREF DataArray;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.DataArray = NULL;
VALIDATEOBJECTREF(gc.Resolver); // gc root must be up the stack

GCPROTECT_BEGIN(gc);

Expand All @@ -1192,10 +1191,9 @@ BYTE* LCGMethodResolver::GetCodeInfo(unsigned *pCodeSize, unsigned *pStackSize,
UnmanagedCallersOnlyCaller getCodeInfo(METHOD__RESOLVER__GET_CODE_INFO);
getCodeInfo.InvokeThrowing(&gc.Resolver, &stackSize, &initLocals, &EHSize, &gc.DataArray);

U1ARRAYREF dataArray = (U1ARRAYREF)gc.DataArray;
DWORD codeSize = dataArray->GetNumComponents();
DWORD codeSize = gc.DataArray->GetNumComponents();
NewArrayHolder<BYTE> code(new BYTE[codeSize]);
memcpy(code, dataArray->GetDataPtr(), codeSize);
memcpy(code, gc.DataArray->GetDataPtr(), codeSize);
m_CodeSize = codeSize;
_ASSERTE(FitsIn<unsigned short>(stackSize));
m_StackSize = static_cast<unsigned short>(stackSize);
Expand Down Expand Up @@ -1236,21 +1234,19 @@ LCGMethodResolver::GetLocalSig()
struct
{
OBJECTREF Resolver;
OBJECTREF DataArray;
U1ARRAYREF DataArray;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.DataArray = NULL;
VALIDATEOBJECTREF(gc.Resolver); // gc root must be up the stack

GCPROTECT_BEGIN(gc);

UnmanagedCallersOnlyCaller getLocalsSignature(METHOD__RESOLVER__GET_LOCALS_SIGNATURE);
getLocalsSignature.InvokeThrowing(&gc.Resolver, &gc.DataArray);

U1ARRAYREF dataArray = (U1ARRAYREF)gc.DataArray;
DWORD localSigSize = dataArray->GetNumComponents();
DWORD localSigSize = gc.DataArray->GetNumComponents();
NewArrayHolder<COR_SIGNATURE> localSig(new COR_SIGNATURE[localSigSize]);
memcpy((void *)localSig, dataArray->GetDataPtr(), localSigSize);
memcpy((void *)localSig, gc.DataArray->GetDataPtr(), localSigSize);

m_LocalSig = SigPointer((PCCOR_SIGNATURE)localSig, localSigSize);
localSig.SuppressRelease();
Expand Down Expand Up @@ -1320,7 +1316,6 @@ LCGMethodResolver::GetStringLiteral(
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.Result = NULL;
VALIDATEOBJECTREF(gc.Resolver); // gc root must be up the stack

GCPROTECT_BEGIN(gc);

Expand Down Expand Up @@ -1398,20 +1393,25 @@ void LCGMethodResolver::ResolveToken(mdToken token, ResolvedToken* resolvedToken

GCX_COOP();

PREPARE_SIMPLE_VIRTUAL_CALLSITE(METHOD__RESOLVER__RESOLVE_TOKEN, ObjectFromHandle(m_managedResolver));

DECLARE_ARGHOLDER_ARRAY(args, 5);
struct
{
OBJECTREF Resolver;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);

TypeHandle handle;
MethodDesc* pMD = NULL;
FieldDesc* pFD = NULL;
args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(ObjectFromHandle(m_managedResolver));
args[ARGNUM_1] = DWORD_TO_ARGHOLDER(token);
args[ARGNUM_2] = &handle;
args[ARGNUM_3] = &pMD;
args[ARGNUM_4] = &pFD;
MethodDesc* pMD;
FieldDesc* pFD;

CALL_MANAGED_METHOD_NORET(args);
GCPROTECT_BEGIN(gc);

UnmanagedCallersOnlyCaller resolveToken(METHOD__RESOLVER__RESOLVE_TOKEN);
TADDR typeHandleValue = 0;
resolveToken.InvokeThrowing(&gc.Resolver, static_cast<int32_t>(token), &typeHandleValue, &pMD, &pFD);

handle = TypeHandle::FromTAddr(typeHandleValue);

GCPROTECT_END();

_ASSERTE(pMD == NULL || pFD == NULL);

Expand Down Expand Up @@ -1443,24 +1443,33 @@ LCGMethodResolver::ResolveSignature(

GCX_COOP();

U1ARRAYREF dataArray = NULL;

PREPARE_SIMPLE_VIRTUAL_CALLSITE(METHOD__RESOLVER__RESOLVE_SIGNATURE, ObjectFromHandle(m_managedResolver));
struct
{
OBJECTREF Resolver;
U1ARRAYREF DataArray;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.DataArray = NULL;

DECLARE_ARGHOLDER_ARRAY(args, 3);
DWORD cbSig = 0;
PCCOR_SIGNATURE pSig = NULL;

args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(ObjectFromHandle(m_managedResolver));
args[ARGNUM_1] = DWORD_TO_ARGHOLDER(token);
args[ARGNUM_2] = DWORD_TO_ARGHOLDER(0);
GCPROTECT_BEGIN(gc);

CALL_MANAGED_METHOD_RETREF(dataArray, U1ARRAYREF, args);
UnmanagedCallersOnlyCaller resolveSignature(METHOD__RESOLVER__RESOLVE_SIGNATURE);
resolveSignature.InvokeThrowing(&gc.Resolver, static_cast<int32_t>(token), 0, &gc.DataArray);

if (dataArray == NULL)
if (gc.DataArray == NULL)
{
COMPlusThrow(kInvalidProgramException);
}

cbSig = gc.DataArray->GetNumComponents();
pSig = (PCCOR_SIGNATURE)m_jitTempData.New(cbSig);
memcpy((void *)pSig, gc.DataArray->GetDataPtr(), cbSig);

GCPROTECT_END();

DWORD cbSig = dataArray->GetNumComponents();
PCCOR_SIGNATURE pSig = (PCCOR_SIGNATURE)m_jitTempData.New(cbSig);
memcpy((void *)pSig, dataArray->GetDataPtr(), cbSig);
return SigPointer(pSig, cbSig);
} // LCGMethodResolver::ResolveSignature

Expand All @@ -1474,24 +1483,33 @@ LCGMethodResolver::ResolveSignatureForVarArg(

GCX_COOP();

U1ARRAYREF dataArray = NULL;

PREPARE_SIMPLE_VIRTUAL_CALLSITE(METHOD__RESOLVER__RESOLVE_SIGNATURE, ObjectFromHandle(m_managedResolver));
struct
{
OBJECTREF Resolver;
U1ARRAYREF DataArray;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.DataArray = NULL;

DECLARE_ARGHOLDER_ARRAY(args, 3);
DWORD cbSig = 0;
PCCOR_SIGNATURE pSig = NULL;

args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(ObjectFromHandle(m_managedResolver));
args[ARGNUM_1] = DWORD_TO_ARGHOLDER(token);
args[ARGNUM_2] = DWORD_TO_ARGHOLDER(1);
GCPROTECT_BEGIN(gc);

CALL_MANAGED_METHOD_RETREF(dataArray, U1ARRAYREF, args);
UnmanagedCallersOnlyCaller resolveSignature(METHOD__RESOLVER__RESOLVE_SIGNATURE);
resolveSignature.InvokeThrowing(&gc.Resolver, static_cast<int32_t>(token), 1, &gc.DataArray);

if (dataArray == NULL)
if (gc.DataArray == NULL)
{
COMPlusThrow(kInvalidProgramException);
}

cbSig = gc.DataArray->GetNumComponents();
pSig = (PCCOR_SIGNATURE)m_jitTempData.New(cbSig);
memcpy((void *)pSig, gc.DataArray->GetDataPtr(), cbSig);

GCPROTECT_END();

DWORD cbSig = dataArray->GetNumComponents();
PCCOR_SIGNATURE pSig = (PCCOR_SIGNATURE)m_jitTempData.New(cbSig);
memcpy((void *)pSig, dataArray->GetDataPtr(), cbSig);
return SigPointer(pSig, cbSig);
} // LCGMethodResolver::ResolveSignatureForVarArg

Expand All @@ -1503,49 +1521,38 @@ void LCGMethodResolver::GetEHInfo(unsigned EHnumber, CORINFO_EH_CLAUSE* clause)

GCX_COOP();

// attempt to get the raw EHInfo first
struct
{
U1ARRAYREF dataArray;

PREPARE_SIMPLE_VIRTUAL_CALLSITE(METHOD__RESOLVER__GET_RAW_EH_INFO, ObjectFromHandle(m_managedResolver));

DECLARE_ARGHOLDER_ARRAY(args, 1);

args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(ObjectFromHandle(m_managedResolver));
OBJECTREF Resolver;
U1ARRAYREF DataArray;
} gc;
gc.Resolver = ObjectFromHandle(m_managedResolver);
gc.DataArray = NULL;

CALL_MANAGED_METHOD_RETREF(dataArray, U1ARRAYREF, args);
GCPROTECT_BEGIN(gc);

if (dataArray != NULL)
{
COR_ILMETHOD_SECT_EH* pEH = (COR_ILMETHOD_SECT_EH*)dataArray->GetDataPtr();

COR_ILMETHOD_SECT_EH_CLAUSE_FAT ehClause;
const COR_ILMETHOD_SECT_EH_CLAUSE_FAT* ehInfo;
ehInfo = (COR_ILMETHOD_SECT_EH_CLAUSE_FAT*)pEH->EHClause(EHnumber, &ehClause);

clause->Flags = (CORINFO_EH_CLAUSE_FLAGS)ehInfo->GetFlags();
clause->TryOffset = ehInfo->GetTryOffset();
clause->TryLength = ehInfo->GetTryLength();
clause->HandlerOffset = ehInfo->GetHandlerOffset();
clause->HandlerLength = ehInfo->GetHandlerLength();
clause->ClassToken = ehInfo->GetClassToken();
clause->FilterOffset = ehInfo->GetFilterOffset();
return;
}
}
UnmanagedCallersOnlyCaller getEhInfo(METHOD__RESOLVER__GET_EH_INFO);
getEhInfo.InvokeThrowing(&gc.Resolver, EHnumber, &gc.DataArray, clause);

// failed, get the info off the ilgenerator
if (gc.DataArray != NULL)
{
PREPARE_SIMPLE_VIRTUAL_CALLSITE(METHOD__RESOLVER__GET_EH_INFO, ObjectFromHandle(m_managedResolver));

DECLARE_ARGHOLDER_ARRAY(args, 3);

args[ARGNUM_0] = OBJECTREF_TO_ARGHOLDER(ObjectFromHandle(m_managedResolver));
args[ARGNUM_1] = DWORD_TO_ARGHOLDER(EHnumber);
args[ARGNUM_2] = PTR_TO_ARGHOLDER(clause);

CALL_MANAGED_METHOD_NORET(args);
// If we have raw EH info, we need to parse the clause manually.
COR_ILMETHOD_SECT_EH* pEH = (COR_ILMETHOD_SECT_EH*)gc.DataArray->GetDataPtr();

COR_ILMETHOD_SECT_EH_CLAUSE_FAT ehClause;
const COR_ILMETHOD_SECT_EH_CLAUSE_FAT* ehInfo;
ehInfo = (COR_ILMETHOD_SECT_EH_CLAUSE_FAT*)pEH->EHClause(EHnumber, &ehClause);

clause->Flags = (CORINFO_EH_CLAUSE_FLAGS)ehInfo->GetFlags();
clause->TryOffset = ehInfo->GetTryOffset();
clause->TryLength = ehInfo->GetTryLength();
clause->HandlerOffset = ehInfo->GetHandlerOffset();
clause->HandlerLength = ehInfo->GetHandlerLength();
clause->ClassToken = ehInfo->GetClassToken();
clause->FilterOffset = ehInfo->GetFilterOffset();
}

GCPROTECT_END();
}

#endif // !DACCESS_COMPILE
Expand Down
Loading
Loading