本文整理汇总了C++中MethodDesc::StripMethodInstantiation方法的典型用法代码示例。如果您正苦于以下问题:C++ MethodDesc::StripMethodInstantiation方法的具体用法?C++ MethodDesc::StripMethodInstantiation怎么用?C++ MethodDesc::StripMethodInstantiation使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MethodDesc
的用法示例。
在下文中一共展示了MethodDesc::StripMethodInstantiation方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: StartUpdateILCodes
BOOL CInjection::StartUpdateILCodes( MethodTable * pMethodTable
, CORINFO_METHOD_HANDLE pMethodHandle
, mdMethodDef md
, LPBYTE pBuffer
, DWORD dwSize
)
{
if( s_nStatus != Status_Ready || !pMethodHandle )
return FALSE;
MethodDesc * pMethodDesc = (MethodDesc*)pMethodHandle;
pMethodDesc->Reset();
MethodDesc * pStripMethodDesc = pMethodDesc->StripMethodInstantiation();
if( pStripMethodDesc )
pStripMethodDesc->Reset();
ILCodeBuffer tILCodeBuffer;
tILCodeBuffer.pBuffer = pBuffer;
tILCodeBuffer.dwSize = dwSize;
tILCodeBuffer.bIsGeneric = FALSE;
// this is a generic method
if( pMethodDesc->ContainsGenericVariables() || pMethodDesc->HasClassOrMethodInstantiation() )
{
tILCodeBuffer.bIsGeneric = TRUE;
MethodDesc * pWrappedMethodDesc = pMethodDesc->GetWrappedMethodDesc();
if( pWrappedMethodDesc )
{
pWrappedMethodDesc->Reset();
}
// find out all the instantiations of this generic method
Module * pModule = pMethodDesc->GetLoaderModule();
AppDomain * pAppDomain = pMethodDesc->GetDomain();
if( pModule )
{
LoadedMethodDescIterator * pLoadedMethodDescIter = new LoadedMethodDescIterator( pAppDomain, pModule, md);
while(pLoadedMethodDescIter->Next())
{
MethodDesc * pMD = pLoadedMethodDescIter->Current();
if( pMD )
pMD->Reset();
}
delete pLoadedMethodDescIter;
}
}
std::map< CORINFO_METHOD_HANDLE, ILCodeBuffer>::iterator iter = s_mpILBuffers.find(pMethodHandle);
if( iter != s_mpILBuffers.end() )
{
LocalFree(iter->second.pBuffer);
s_mpILBuffers.erase(iter);
}
s_mpILBuffers.insert( std::pair< CORINFO_METHOD_HANDLE, ILCodeBuffer>( pMethodHandle, tILCodeBuffer) );
return TRUE;
}
示例2: compileMethod
CorJitResult __stdcall CInjection::compileMethod(ICorJitInfo * pJitInfo
, CORINFO_METHOD_INFO * pCorMethodInfo
, UINT nFlags
, LPBYTE * pEntryAddress
, ULONG * pSizeOfCode
)
{
ICorJitCompiler * pCorJitCompiler = (ICorJitCompiler *)this;
LPBYTE pOriginalILCode = pCorMethodInfo->ILCode;
unsigned int nOriginalSize = pCorMethodInfo->ILCodeSize;
// find the method to be replaced
ILCodeBuffer tILCodeBuffer = {0};
if( pCorMethodInfo && GetStatus() == Status_Ready )
{
MethodDesc * pMethodDesc = (MethodDesc*)pCorMethodInfo->ftn;
std::map< CORINFO_METHOD_HANDLE, ILCodeBuffer>::iterator iter = s_mpILBuffers.find((CORINFO_METHOD_HANDLE)pMethodDesc);
// if the current method is not found, try to search its generic definition method
if( iter == s_mpILBuffers.end() && pMethodDesc->HasClassOrMethodInstantiation() )
{
MethodDesc * pStripMD = pMethodDesc->StripMethodInstantiation();
if( pStripMD )
iter = s_mpILBuffers.find((CORINFO_METHOD_HANDLE)pStripMD);
if( iter == s_mpILBuffers.end() )
{
MethodDesc * pWrappedMD = pMethodDesc->GetWrappedMethodDesc();
if( pWrappedMD )
iter = s_mpILBuffers.find((CORINFO_METHOD_HANDLE)pWrappedMD);
}
}
if( iter != s_mpILBuffers.end() )
{
tILCodeBuffer = iter->second;
pCorMethodInfo->ILCode = tILCodeBuffer.pBuffer;
pCorMethodInfo->ILCodeSize = tILCodeBuffer.dwSize;
if( !tILCodeBuffer.bIsGeneric )
s_mpILBuffers.erase(iter);
}
}
CorJitResult result = pCorJitCompiler->compileMethod( pJitInfo, pCorMethodInfo, nFlags, pEntryAddress, pSizeOfCode);
if( tILCodeBuffer.pBuffer )
{
pCorMethodInfo->ILCode = pOriginalILCode;
pCorMethodInfo->ILCodeSize = nOriginalSize;
if( !tILCodeBuffer.bIsGeneric )
LocalFree(tILCodeBuffer.pBuffer);
}
return result;
}