本文整理汇总了C++中MethodDesc类的典型用法代码示例。如果您正苦于以下问题:C++ MethodDesc类的具体用法?C++ MethodDesc怎么用?C++ MethodDesc使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了MethodDesc类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: BEGINCANNOTTHROWCOMPLUSEXCEPTION
HRESULT CorHost::UnloadDomain(IUnknown *pUnkDomain)
{
HRESULT hr = S_OK;
if(!pUnkDomain) return E_POINTER;
BEGINCANNOTTHROWCOMPLUSEXCEPTION();
Thread* pThread = GetThread();
if (!pThread)
IfFailGo(E_UNEXPECTED);
IfFailGo(QuickCOMStartup());
BEGIN_ENSURE_COOPERATIVE_GC();
COMPLUS_TRY {
// unload doesn't need to switch to the domain to be unloaded
OBJECTREF pRef = NULL;
GCPROTECT_BEGIN(pRef);
pRef = GetObjectRefFromComIP(pUnkDomain);
MethodDesc* pMD = g_Mscorlib.GetMethod(METHOD__APP_DOMAIN__UNLOAD);
ARG_SLOT arg = ObjToArgSlot((OBJECTREF) pRef);
pMD->Call(&arg, METHOD__APP_DOMAIN__UNLOAD);
GCPROTECT_END();
} COMPLUS_CATCH {
hr = SecurityHelper::MapToHR(GETTHROWABLE());
} COMPLUS_END_CATCH
END_ENSURE_COOPERATIVE_GC();
ErrExit:
ENDCANNOTTHROWCOMPLUSEXCEPTION();
return hr;
}
示例2: FCIMPL1
FCIMPLEND
// Return a method info for the method were the exception was thrown
FCIMPL1(ReflectMethodObject*, SystemNative::GetMethodFromStackTrace, ArrayBase* pStackTraceUNSAFE)
{
FCALL_CONTRACT;
I1ARRAYREF pArray(static_cast<I1Array *>(pStackTraceUNSAFE));
StackTraceArray stackArray(pArray);
if (!stackArray.Size())
return NULL;
// The managed stacktrace classes always returns typical method definition, so we don't need to bother providing exact instantiation.
// Generics::GetExactInstantiationsOfMethodAndItsClassFromCallInformation(pElements[0].pFunc, pElements[0].pExactGenericArgsToken, pTypeHandle, &pMD);
MethodDesc* pFunc = stackArray[0].pFunc;
// Strip the instantiation to make sure that the reflection never gets a bad method desc back.
REFLECTMETHODREF refRet = NULL;
HELPER_METHOD_FRAME_BEGIN_RET_0()
pFunc = pFunc->LoadTypicalMethodDefinition();
refRet = pFunc->GetStubMethodInfo();
_ASSERTE(pFunc->IsRuntimeMethodHandle());
HELPER_METHOD_FRAME_END();
return (ReflectMethodObject*)OBJECTREFToObject(refRet);
}
示例3: printDotHeader
void PrintDotFile::printDotHeader(MethodDesc& mh) {
*os << "digraph dotgraph {" << ::std::endl
<< "node [shape=record,fontname=\"Courier\",fontsize=9];" << ::std::endl
<< "label=\""
<< mh.getParentType()->getName()
<< "::"
<< mh.getName()
<< "\";" << ::std::endl;
}
示例4: run
virtual void run () {
CompilationContext* cc = getCompilationContext();
CompilationInterface* ci = cc->getVMCompilationInterface();
ci->lockMethodData();
MethodDesc* methDesc = ci->getMethodToCompile();
if (methDesc->getCodeBlockSize(0) > 0 || methDesc->getCodeBlockSize(1) > 0){
cc->setCompilationFinished(true);
ci->unlockMethodData();
}
}
示例5: THROWSCOMPLUSEXCEPTION
MethodDesc *Binder::GetMethod(BinderMethodID id)
{
THROWSCOMPLUSEXCEPTION();
MethodDesc *pMD = FetchMethod(id);
CheckInit(pMD->GetMethodTable());
return pMD;
}
示例6: 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;
}
示例7: FunctionIdToMethodDesc
/*
* ProfileArgIterator::GetHiddenArgValue
*
* Called after initialization, any number of times, to retrieve any
* hidden argument, so that resolution for Generics can be done.
*
* Parameters:
* None.
*
* Returns:
* Value of the hidden parameter, or NULL if none exists.
*/
LPVOID ProfileArgIterator::GetHiddenArgValue(void)
{
//
// It would be really nice to contract this, but the underlying functions are convolutedly
// contracted. Basically everything should be loaded by the time the profiler gets a call
// back, so everything is NOTHROW/NOTRIGGER, but there is not mechanism for saying that the
// contracts in called functions should be for the best case, not the worst case, now.
//
WRAPPER_NO_CONTRACT;
PROFILE_PLATFORM_SPECIFIC_DATA *pData = (PROFILE_PLATFORM_SPECIFIC_DATA *)m_handle;
MethodDesc *pMethodDesc = FunctionIdToMethodDesc(pData->functionId);
if (!pMethodDesc->RequiresInstArg())
{
return NULL;
}
//
// The ArgIterator::GetParamTypeOffset() can only be called after calling GetNextOffset until the
// entire signature has been walked, but *before* GetNextOffset returns TransitionBlock::InvalidOffset
// - indicating the end.
//
//
// Get the offset of the hidden arg
//
int argOffset = m_argIterator.GetParamTypeArgOffset();
//
// If this is not enregistered, return the value
//
if (TransitionBlock::IsStackArgumentOffset(argOffset))
{
return *(LPVOID *)(((LPBYTE)pData->esp) + (argOffset - TransitionBlock::GetOffsetOfArgs()));
}
switch (argOffset - TransitionBlock::GetOffsetOfArgumentRegisters())
{
case offsetof(ArgumentRegisters, ECX):
return (LPVOID)(pData->ecx);
case offsetof(ArgumentRegisters, EDX):
return (LPVOID)(pData->edx);
}
_ASSERTE(!"Arg is an unsaved register!");
return NULL;
}
示例8: GetInvokeMemberMD
static MethodDesc* GetInvokeMemberMD()
{
static MethodDesc* s_pInvokeMemberMD = NULL;
// If we already have retrieved the specified MD then just return it.
if (s_pInvokeMemberMD == NULL)
{
// The method desc has not been retrieved yet so find it.
MethodDesc *pMD = g_Mscorlib.GetMethod(METHOD__CLASS__INVOKE_MEMBER);
// Ensure that the value types in the signature are loaded.
MetaSig::EnsureSigValueTypesLoaded(pMD->GetSig(), pMD->GetModule());
// Cache the method desc.
s_pInvokeMemberMD = pMD;
}
// Return the specified method desc.
return s_pInvokeMemberMD;
}
示例9: translateMethod
void JavaTranslator::translateMethod(CompilationInterface& ci, MethodDesc& methodDesc, IRBuilder& irBuilder) {
U_32 byteCodeSize = methodDesc.getByteCodeSize();
const unsigned char* byteCodes = methodDesc.getByteCodes();
MemoryManager translatorMemManager("JavaTranslator::translateMethod.translatorMemManager");
JavaFlowGraphBuilder cfgBuilder(irBuilder.getInstFactory()->getMemManager(),irBuilder);
ByteCodeParser parser((const U_8*)byteCodes,byteCodeSize);
// generate code
JavaByteCodeTranslator translator(ci,
translatorMemManager,
irBuilder,
parser,
methodDesc,
*irBuilder.getTypeManager(),
cfgBuilder);
// isInlined
parser.parse(&translator);
cfgBuilder.build();
}
示例10: _ASSERTE
MethodDesc *Binder::LookupMethod(BinderMethodID id)
{
_ASSERTE(m_pModule != NULL);
_ASSERTE(id != METHOD__NIL);
_ASSERTE(id <= m_cMethodRIDs);
THROWSCOMPLUSEXCEPTION();
const MethodDescription *d = m_methodDescriptions + id - 1;
MethodTable *pMT = FetchClass(d->classID);
MethodDesc *pMD = pMT->GetClass()->FindMethod(d->name, d->sig);
_ASSERTE(pMD != NULL || !"EE expects method to exist");
_ASSERTE(pMD->GetSlot()+1 <= USHRT_MAX);
m_pMethodRIDs[id-1] = (USHORT) pMD->GetSlot()+1;
// Go ahead and fill in the rid map since we're here anyway
m_pModule->StoreMethodDef(pMD->GetMemberDef(), pMD);
return pMD;
}
示例11: FCIMPL7
//+----------------------------------------------------------------------------
//
// Method: CStackBuilderSink::PrivateProcessMessage, public
//
// Synopsis: Builds the stack and calls an object
//
//+----------------------------------------------------------------------------
FCIMPL7(Object*, CStackBuilderSink::PrivateProcessMessage, Object* pSBSinkUNSAFE, ReflectBaseObject* pMethodBaseUNSAFE, PTRArray* pArgsUNSAFE, Object* pServerUNSAFE, void* iMethodPtr, BOOL fContext, PTRARRAYREF* ppVarOutParams)
{
OBJECTREF ret = NULL;
struct _gc
{
REFLECTBASEREF pMethodBase;
PTRARRAYREF pArgs;
OBJECTREF pServer;
OBJECTREF pSBSink;
} gc;
gc.pMethodBase = (REFLECTBASEREF) pMethodBaseUNSAFE;
gc.pArgs = (PTRARRAYREF) pArgsUNSAFE;
gc.pServer = (OBJECTREF) pServerUNSAFE;
gc.pSBSink = (OBJECTREF) pSBSinkUNSAFE;
HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB_NOPOLL(Frame::FRAME_ATTR_RETURNOBJ);
GCPROTECT_BEGIN(gc);
HELPER_METHOD_POLL();
//-[autocvtpro]-------------------------------------------------------
THROWSCOMPLUSEXCEPTION();
TRIGGERSGC();
LOG((LF_REMOTING, LL_INFO10,
"CStackBuilderSink::PrivateProcessMessage\n"));
_ASSERTE(gc.pMethodBase != NULL);
ReflectMethod *pRM = (ReflectMethod *)gc.pMethodBase->GetData();
MethodDesc *pMD = pRM->pMethod;
// Either pServer is non-null or the method is static (but not both)
_ASSERTE((gc.pServer!=NULL) == !(pMD->IsStatic()));
// Check if this is an interface invoke, if yes, then we have to find the
// real method descriptor on the class of the server object.
if(pMD->GetMethodTable()->IsInterface())
{
_ASSERTE(gc.pServer != NULL);
MethodDesc* pTemp = pMD;
// NOTE: This method can trigger GC
pMD = gc.pServer->GetMethodTable()->GetMethodDescForInterfaceMethod(pMD, gc.pServer);
if(NULL == pMD)
{
MAKE_WIDEPTR_FROMUTF8(wName, pTemp->GetName())
COMPlusThrow(kMissingMethodException, IDS_EE_MISSING_METHOD, NULL, wName);
}
}
MetaSig mSig(pMD->GetSig(), pMD->GetModule());
// get the target depending on whether the method is virtual or non-virtual
// like a constructor, private or final method
const BYTE* pTarget = NULL;
if (iMethodPtr)
{
pTarget = (const BYTE*) iMethodPtr;
}
else
{
// Get the address of the code
pTarget = MethodTable::GetTargetFromMethodDescAndServer(pMD, &(gc.pServer), fContext);
}
VASigCookie *pCookie = NULL;
_ASSERTE(NULL != pTarget);
GCPROTECT_BEGIN (ret);
// this function does the work
::CallDescrWithObjectArray(
gc.pServer,
pRM,
pTarget,
&mSig,
pCookie,
gc.pServer==NULL?TRUE:FALSE, //fIsStatic
gc.pArgs,
&ret,
ppVarOutParams);
GCPROTECT_END ();
LOG((LF_REMOTING, LL_INFO10,
"CStackBuilderSink::PrivateProcessMessage OUT\n"));
//-[autocvtepi]-------------------------------------------------------
GCPROTECT_END();
HELPER_METHOD_FRAME_END();
return OBJECTREFToObject(ret);
}
示例12: excOpnds
/**
* Executes lazy exception optimization pass.
*/
void
LazyExceptionOpt::doLazyExceptionOpt() {
MethodDesc &md = irManager.getMethodDesc();
BitSet excOpnds(leMemManager,irManager.getOpndManager().getNumSsaOpnds());
StlDeque<Inst*> candidateSet(leMemManager);
optCandidates = new (leMemManager) OptCandidates(leMemManager);
Method_Side_Effects m_sideEff = md.getSideEffect();
const Nodes& nodes = irManager.getFlowGraph().getNodes();
Nodes::const_iterator niter;
#ifdef _DEBUG
mtdDesc=&md;
#endif
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << std::endl;
for (int i=0; i<level; i++) Log::out() << " ";
Log::out() << "doLE ";
md.printFullName(Log::out());
Log::out() << " SideEff " << (int)m_sideEff << std::endl;
}
#endif
level++;
U_32 opndId = 0;
isArgCheckNull = false;
isExceptionInit = md.isInstanceInitializer() &&
md.getParentType()->isLikelyExceptionType();
// core api exception init
if (m_sideEff == MSE_Unknown && isExceptionInit
&& strncmp(md.getParentType()->getName(),"java/lang/",10) == 0) {
m_sideEff = MSE_False;
md.setSideEffect(m_sideEff);
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " core api exc ";
md.printFullName(Log::out());
Log::out() << " SideEff " << (int)m_sideEff << std::endl;
}
#endif
}
for(niter = nodes.begin(); niter != nodes.end(); ++niter) {
Node* node = *niter;
Inst *headInst = (Inst*)node->getFirstInst();
for (Inst* inst=headInst->getNextInst(); inst!=NULL; inst=inst->getNextInst()) {
#ifdef _DEBUG
if (inst->getOpcode()==Op_DefArg && isExceptionInit) {
if (Log::isEnabled()) {
Log::out() << " defarg: ";
inst->print(Log::out());
Log::out() << std::endl;
Log::out() << " ";
Log::out() << (int)(inst->getDefArgModifier()) << " " <<
(inst->getDefArgModifier()==DefArgNoModifier) << " " <<
(inst->getDefArgModifier()==NonNullThisArg) << " " <<
(inst->getDefArgModifier()==SpecializedToExactType) << " " <<
(inst->getDefArgModifier()==DefArgBothModifiers) << std::endl;
}
}
#endif
if (inst->getOpcode()==Op_Throw) {
if (inst->getSrc(0)->getInst()->getOpcode()==Op_NewObj) {
excOpnds.setBit(opndId=inst->getSrc(0)->getId(),true);
if (!addOptCandidates(opndId,inst))
excOpnds.setBit(opndId,false); // different exc. edges
#ifdef _DEBUG
if (excOpnds.getBit(opndId)==1) {
if (Log::isEnabled()) {
Log::out() << " add opnd: ";
inst->print(Log::out());
Log::out() << std::endl;
Log::out() << " add obj: ";
inst->getSrc(0)->getInst()->print(Log::out());
Log::out() << std::endl;
}
}
#endif
}
}
if (m_sideEff == MSE_Unknown)
if (instHasSideEffect(inst)) {
m_sideEff = MSE_True;
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << "~~~~~~inst sideEff ";
inst->print(Log::out());
Log::out() << std::endl;
}
#endif
}
}
}
if (md.getSideEffect() == MSE_Unknown) {
if (m_sideEff == MSE_Unknown) {
//.........这里部分代码省略.........
示例13: m_NativeSize
CustomMarshalerInfo::CustomMarshalerInfo(BaseDomain *pDomain, TypeHandle hndCustomMarshalerType, TypeHandle hndManagedType, LPCUTF8 strCookie, DWORD cCookieStrBytes)
: m_NativeSize(0)
, m_hndManagedType(hndManagedType)
, m_hndCustomMarshaler(NULL)
, m_pMarshalNativeToManagedMD(NULL)
, m_pMarshalManagedToNativeMD(NULL)
, m_pCleanUpNativeDataMD(NULL)
, m_pCleanUpManagedDataMD(NULL)
, m_bDataIsByValue(FALSE)
{
CONTRACTL
{
THROWS;
GC_TRIGGERS;
MODE_COOPERATIVE;
PRECONDITION(CheckPointer(pDomain));
}
CONTRACTL_END;
// Make sure the custom marshaller implements ICustomMarshaler.
if (!hndCustomMarshalerType.GetMethodTable()->CanCastToNonVariantInterface(MscorlibBinder::GetClass(CLASS__ICUSTOM_MARSHALER)))
{
DefineFullyQualifiedNameForClassW()
COMPlusThrow(kApplicationException,
IDS_EE_ICUSTOMMARSHALERNOTIMPL,
GetFullyQualifiedNameForClassW(hndCustomMarshalerType.GetMethodTable()));
}
// Determine if this type is a value class.
m_bDataIsByValue = m_hndManagedType.GetMethodTable()->IsValueType();
// Custom marshalling of value classes is not currently supported.
if (m_bDataIsByValue)
COMPlusThrow(kNotSupportedException, W("NotSupported_ValueClassCM"));
#ifndef CROSSGEN_COMPILE
// Run the <clinit> on the marshaler since it might not have run yet.
hndCustomMarshalerType.GetMethodTable()->EnsureInstanceActive();
hndCustomMarshalerType.GetMethodTable()->CheckRunClassInitThrowing();
// Create a COM+ string that will contain the string cookie.
STRINGREF CookieStringObj = StringObject::NewString(strCookie, cCookieStrBytes);
GCPROTECT_BEGIN(CookieStringObj);
#endif
// Load the method desc's for all the methods in the ICustomMarshaler interface.
m_pMarshalNativeToManagedMD = GetCustomMarshalerMD(CustomMarshalerMethods_MarshalNativeToManaged, hndCustomMarshalerType);
m_pMarshalManagedToNativeMD = GetCustomMarshalerMD(CustomMarshalerMethods_MarshalManagedToNative, hndCustomMarshalerType);
m_pCleanUpNativeDataMD = GetCustomMarshalerMD(CustomMarshalerMethods_CleanUpNativeData, hndCustomMarshalerType);
m_pCleanUpManagedDataMD = GetCustomMarshalerMD(CustomMarshalerMethods_CleanUpManagedData, hndCustomMarshalerType);
// Load the method desc for the static method to retrieve the instance.
MethodDesc *pGetCustomMarshalerMD = GetCustomMarshalerMD(CustomMarshalerMethods_GetInstance, hndCustomMarshalerType);
// If the GetInstance method is generic, get an instantiating stub for it -
// the CallDescr infrastructure doesn't know how to pass secret generic arguments.
if (pGetCustomMarshalerMD->RequiresInstMethodTableArg())
{
pGetCustomMarshalerMD = MethodDesc::FindOrCreateAssociatedMethodDesc(
pGetCustomMarshalerMD,
hndCustomMarshalerType.GetMethodTable(),
FALSE, // forceBoxedEntryPoint
Instantiation(), // methodInst
FALSE, // allowInstParam
FALSE); // forceRemotableMethod
_ASSERTE(!pGetCustomMarshalerMD->RequiresInstMethodTableArg());
}
#ifndef CROSSGEN_COMPILE
MethodDescCallSite getCustomMarshaler(pGetCustomMarshalerMD, (OBJECTREF*)&CookieStringObj);
pGetCustomMarshalerMD->EnsureActive();
// Prepare the arguments that will be passed to GetCustomMarshaler.
ARG_SLOT GetCustomMarshalerArgs[] = {
ObjToArgSlot(CookieStringObj)
};
// Call the GetCustomMarshaler method to retrieve the custom marshaler to use.
OBJECTREF CustomMarshalerObj = getCustomMarshaler.Call_RetOBJECTREF(GetCustomMarshalerArgs);
if (!CustomMarshalerObj)
{
DefineFullyQualifiedNameForClassW()
COMPlusThrow(kApplicationException,
IDS_EE_NOCUSTOMMARSHALER,
GetFullyQualifiedNameForClassW(hndCustomMarshalerType.GetMethodTable()));
}
m_hndCustomMarshaler = pDomain->CreateHandle(CustomMarshalerObj);
// Retrieve the size of the native data.
if (m_bDataIsByValue)
{
// <TODO>@TODO(DM): Call GetNativeDataSize() to retrieve the size of the native data.</TODO>
_ASSERTE(!"Value classes are not yet supported by the custom marshaler!");
}
else
{
m_NativeSize = sizeof(void *);
//.........这里部分代码省略.........
示例14: strncmp
/**
* Checks a callee method side effect.
* @param inst - method call instruction
* @return <code>true</code> if method has side effect;
* <code>false<code> if method has no side effect.
*/
bool
LazyExceptionOpt::methodCallHasSideEffect(Inst* inst) {
U_32 opcode = inst->getOpcode();
MethodDesc* cmd = NULL;
Method_Side_Effects mse = MSE_Unknown;
if (opcode==Op_DirectCall || opcode==Op_TauVirtualCall) {
cmd = inst->asMethodCallInst()->getMethodDesc();
} else {
if (opcode==Op_IndirectCall || opcode==Op_IndirectMemoryCall) {
Type* type = inst->asCallInst()->getFunPtr()->getType();
if (type->isUnresolvedType()) {
return true;
}
cmd = type->asMethodPtrType()->getMethodDesc();
} else {
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " checkMC: no check ";
inst->print(Log::out());
Log::out() << std::endl;
}
#endif
return true;
}
}
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " checkMC: ";
cmd->printFullName(Log::out());
Log::out() << std::endl;
}
#endif
mse = cmd->getSideEffect();
#ifdef _DEBUG
if (mse != MSE_Unknown) {
if (Log::isEnabled()) {
Log::out() << " checkMC: prev.set sideEff " << mse << " ";
inst->print(Log::out());
Log::out() << std::endl;
}
}
#endif
if (mse == MSE_True) {
return true;
}
if (mse == MSE_False) {
return false;
}
// core api exception init
if (cmd->isInstanceInitializer() && cmd->getParentType()->isLikelyExceptionType()
&& strncmp(cmd->getParentType()->getName(),"java/lang/",10) == 0) {
cmd->setSideEffect(MSE_False);
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " checkMC: core api exc ";
inst->print(Log::out());
Log::out() << std::endl;
}
#endif
return false;
}
if ( opcode!=Op_DirectCall && !cmd->isFinal() ) {
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " checkMC: not DirCall not final ";
inst->print(Log::out());
Log::out() << std::endl;
}
#endif
return true;
}
if (!isExceptionInit &&
!(cmd->isInstanceInitializer()&&cmd->getParentType()->isLikelyExceptionType())) {
#ifdef _DEBUG
if (Log::isEnabled()) {
Log::out() << " checkMC: no init ";
Log::out() << isExceptionInit << " ";
Log::out() << cmd->isInstanceInitializer() << " ";
Log::out() << cmd->getParentType()->isLikelyExceptionType() << " ";
inst->print(Log::out());
Log::out() << std::endl;
}
#endif
return true;
}
/*
if (cmd->getParentType()->needsInitialization()) {
#ifdef _DEBUG
if (Log::isEnabled()) {
//.........这里部分代码省略.........
示例15: LoadedMethodDescIterator
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;
}