Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update the StubManager for better debugger stepping. #65947

Merged
merged 13 commits into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from 2 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
4 changes: 2 additions & 2 deletions src/coreclr/debug/daccess/fntableaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ struct FakeStubUnwindInfoHeapSegment
struct FakeStub
{
ULONG m_refcount;
ULONG m_patchOffset;
ULONG m_Offset;

UINT m_numCodeBytes;
#ifdef _DEBUG
Expand Down Expand Up @@ -168,7 +168,7 @@ class CheckDuplicatedStructLayouts


CHECK_OFFSET(Stub, m_refcount);
CHECK_OFFSET(Stub, m_patchOffset);
CHECK_OFFSET(Stub, m_Offset);
CHECK_OFFSET(Stub, m_numCodeBytes);
#ifdef _DEBUG
CHECK_OFFSET(Stub, m_signature);
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/debug/ee/amd64/amd64walker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void NativeWalker::Decode()

BYTE rex = NULL;

LOG((LF_CORDB, LL_INFO100000, "NW:Decode: m_ip 0x%x\n", m_ip));
LOG((LF_CORDB, LL_INFO100000, "NW:Decode: m_ip 0x%p\n", m_ip));

BYTE prefix = *ip;
if (prefix == 0xcc)
Expand Down Expand Up @@ -103,7 +103,7 @@ void NativeWalker::Decode()
// Read the opcode
m_opcode = *ip++;

LOG((LF_CORDB, LL_INFO100000, "NW:Decode: ip 0x%x, m_opcode:%0.2x\n", ip, m_opcode));
LOG((LF_CORDB, LL_INFO100000, "NW:Decode: ip 0x%p, m_opcode:%0.2x\n", ip, m_opcode));
AaronRobinsonMSFT marked this conversation as resolved.
Show resolved Hide resolved

// Don't remove this, when we did the check above for the prefix we didn't modify the codestream
// and since m_opcode was just taken directly from the code stream it will be patched if we
Expand Down
53 changes: 25 additions & 28 deletions src/coreclr/debug/ee/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,8 +592,8 @@ DebuggerControllerPatch *DebuggerPatchTable::AddPatchForAddress(DebuggerControll

_ASSERTE(kind == PATCH_KIND_NATIVE_MANAGED || kind == PATCH_KIND_NATIVE_UNMANAGED);
LOG((LF_CORDB,LL_INFO10000,"DCP:AddPatchForAddress bound "
"absolute to 0x%x with dji 0x%x (mdDef:0x%x) "
"controller:0x%x AD:0x%x\n",
"absolute to 0x%p with dji 0x%p (mdDef:0x%x) "
"controller:0x%xp AD:0x%p\n",
AaronRobinsonMSFT marked this conversation as resolved.
Show resolved Hide resolved
address, dji, (fd!=NULL?fd->GetMemberDef():0), controller,
pAppDomain));

Expand Down Expand Up @@ -2094,7 +2094,7 @@ BOOL DebuggerController::AddBindAndActivatePatchForMethodDesc(MethodDesc *fd,
ControllerLockHolder ch;

LOG((LF_CORDB|LF_ENC,LL_INFO10000,"DC::AP: Add to %s::%s, at offs 0x%x "
"fp:0x%x AD:0x%x\n", fd->m_pszDebugClassName,
"fp:0x%p AD:0x%p\n", fd->m_pszDebugClassName,
fd->m_pszDebugMethodName,
nativeOffset, fp.GetSPValue(), pAppDomain));

Expand Down Expand Up @@ -3222,7 +3222,7 @@ void DebuggerController::DisableSingleStep()
//
void DebuggerController::ApplyTraceFlag(Thread *thread)
{
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag thread:0x%x [0x%0x]\n", thread, Debugger::GetThreadIdHelper(thread)));
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag thread:0x%p [0x%0x]\n", thread, Debugger::GetThreadIdHelper(thread)));

CONTEXT *context;
if(thread->GetInteropDebuggingHijacked())
Expand All @@ -3241,7 +3241,6 @@ void DebuggerController::ApplyTraceFlag(Thread *thread)
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag marked thread for debug stepping\n"));

SetSSFlag(reinterpret_cast<DT_CONTEXT *>(context) ARM_ARG(thread) ARM64_ARG(thread));
LOG((LF_CORDB,LL_INFO1000, "DC::ApplyTraceFlag Leaving, baby!\n"));
}

//
Expand All @@ -3251,7 +3250,7 @@ void DebuggerController::ApplyTraceFlag(Thread *thread)

void DebuggerController::UnapplyTraceFlag(Thread *thread)
{
LOG((LF_CORDB,LL_INFO1000, "DC::UnapplyTraceFlag thread:0x%x\n", thread));
LOG((LF_CORDB,LL_INFO1000, "DC::UnapplyTraceFlag thread:0x%p\n", thread));


// Either this is the helper thread, or we're manipulating our own context.
Expand Down Expand Up @@ -5107,7 +5106,7 @@ bool DebuggerStepper::ShouldContinueStep( ControllerStackInfo *info,

bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
{
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info:0x%x \n", info));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info:0x%p \n", info));
if (m_range == NULL)
{
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_range == NULL, returning FALSE\n"));
Expand All @@ -5129,8 +5128,8 @@ bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
realFrame = &(info->m_activeFrame);
}

LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info->m_activeFrame.fp:0x%x m_fp:0x%x\n", info->m_activeFrame.fp, m_fp));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_fdException:0x%x realFrame->md:0x%x realFrame->fp:0x%x m_fpException:0x%x\n",
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: info->m_activeFrame.fp:0x%p m_fp:0x%p\n", info->m_activeFrame.fp, m_fp));
LOG((LF_CORDB,LL_INFO10000, "DS::IRA: m_fdException:0x%p realFrame->md:0x%p realFrame->fp:0x%p m_fpException:0x%p\n",
m_fdException, realFrame->md, realFrame->fp, m_fpException));
if ( (info->m_activeFrame.fp == m_fp) ||
( (m_fdException != NULL) && (realFrame->md == m_fdException) &&
Expand Down Expand Up @@ -5179,7 +5178,7 @@ bool DebuggerStepper::IsRangeAppropriate(ControllerStackInfo *info)
bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T rangeCount,
ControllerStackInfo *pInfo)
{
LOG((LF_CORDB,LL_INFO10000,"DS::IIR: off=0x%x\n", ip));
LOG((LF_CORDB,LL_INFO10000,"DS::IIR: off=0x%p\n", ip));

if (range == NULL)
{
Expand All @@ -5204,7 +5203,7 @@ bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T r

if (ip >= r->startOffset && ip < endOffset)
{
LOG((LF_CORDB,LL_INFO1000,"DS::IIR:this:0x%x Found native offset "
LOG((LF_CORDB,LL_INFO1000,"DS::IIR:this:0x%p Found native offset "
"0x%x to be in the range"
"[0x%x, 0x%x), index 0x%x\n\n", this, ip, r->startOffset,
endOffset, ((r-range)/sizeof(COR_DEBUG_STEP_RANGE *)) ));
Expand All @@ -5227,7 +5226,7 @@ bool DebuggerStepper::IsInRange(SIZE_T ip, COR_DEBUG_STEP_RANGE *range, SIZE_T r
bool DebuggerStepper::DetectHandleInterceptors(ControllerStackInfo *info)
{
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: Start DetectHandleInterceptors\n"));
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: active frame=0x%08x, has return frame=%d, return frame=0x%08x m_reason:%d\n",
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: active frame=0x%p, has return frame=%d, return frame=0x%p m_reason:%d\n",
info->m_activeFrame.frame, info->HasReturnFrame(), info->GetReturnFrame().frame, m_reason));

// If this is a normal step, then we want to continue stepping, even if we
Expand Down Expand Up @@ -5255,7 +5254,7 @@ bool DebuggerStepper::DetectHandleInterceptors(ControllerStackInfo *info)
}
else
{
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: 0x%x set to STEP_INTERCEPT\n", this));
LOG((LF_CORDB,LL_INFO10000,"DS::DHI: 0x%p set to STEP_INTERCEPT\n", this));

m_reason = STEP_INTERCEPT; //remember why we've stopped
}
Expand Down Expand Up @@ -5547,7 +5546,7 @@ bool DebuggerStepper::TrapStepInto(ControllerStackInfo *info,
if (IsCloserToRoot(info->m_activeFrame.fp, m_fpStepInto))
m_fpStepInto = info->m_activeFrame.fp;

LOG((LF_CORDB, LL_INFO1000, "Ds::TSI this:0x%x m_fpStepInto:0x%x\n",
LOG((LF_CORDB, LL_INFO1000, "DS::TSI this:0x%p m_fpStepInto:0x%p\n",
this, m_fpStepInto.GetSPValue()));

TraceDestination trace;
Expand Down Expand Up @@ -5867,8 +5866,6 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
// assume our context is bogus.
if (fIsActiveFrameLive)
{
LOG((LF_CORDB,LL_INFO10000, "DC::TS: immediate?\n"));

// Note that by definition our walker must always be able to step
// through a single instruction, so any return
// of NULL IP's from those cases on the first step
Expand Down Expand Up @@ -5980,7 +5977,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
}
if (walker.GetSkipIP() == NULL)
{
LOG((LF_CORDB,LL_INFO10000,"DS::TS 0x%x m_reason = STEP_CALL (skip)\n",
LOG((LF_CORDB,LL_INFO10000,"DS::TS 0x%p m_reason = STEP_CALL (skip)\n",
this));
m_reason = STEP_CALL;

Expand All @@ -5994,8 +5991,8 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)

case WALK_UNKNOWN:
LWALK_UNKNOWN:
LOG((LF_CORDB,LL_INFO10000,"DS::TS:WALK_UNKNOWN - curIP:0x%x "
"nextIP:0x%x skipIP:0x%x 1st byte of opcode:0x%x\n", (BYTE*)GetControlPC(&(info->m_activeFrame.
LOG((LF_CORDB,LL_INFO10000,"DS::TS:WALK_UNKNOWN - curIP:0x%p "
"nextIP:0x%p skipIP:0x%p 1st byte of opcode:0x%x\n", (BYTE*)GetControlPC(&(info->m_activeFrame.
registers)), walker.GetNextIP(),walker.GetSkipIP(),
*(BYTE*)GetControlPC(&(info->m_activeFrame.registers))));

Expand Down Expand Up @@ -6145,7 +6142,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
info->GetReturnFrame().fp,
NULL);

LOG((LF_CORDB,LL_INFO10000,"DS 0x%x m_reason=STEP_CALL4\n",this));
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p m_reason=STEP_CALL4\n",this));
m_reason = STEP_CALL;

return true;
Expand Down Expand Up @@ -6716,7 +6713,7 @@ bool DebuggerStepper::SetRangesFromIL(DebuggerJitInfo *dji, COR_DEBUG_STEP_RANGE

if (dji != NULL)
{
LOG((LF_CORDB,LL_INFO10000,"DeSt::St: For code md=0x%x, got DJI 0x%x, from 0x%x to 0x%x\n",
LOG((LF_CORDB,LL_INFO10000,"DeSt::St: For code md=0x%p, got DJI 0x%p, from 0x%p to 0x%p\n",
fd,
dji, dji->m_addrOfCode, (ULONG)dji->m_addrOfCode
+ (ULONG)dji->m_sizeOfCode));
Expand Down Expand Up @@ -6981,7 +6978,7 @@ bool DebuggerStepper::Step(FramePointer fp, bool in,
}
m_eMode = m_stepIn ? cStepIn : cStepOver;

LOG((LF_CORDB,LL_INFO10000,"DS 0x%x STep: STEP_NORMAL\n",this));
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p Step: STEP_NORMAL\n",this));
m_reason = STEP_NORMAL; //assume it'll be a normal step & set it to
//something else if we walk over it
if (fIsILStub)
Expand Down Expand Up @@ -7035,7 +7032,7 @@ TP_RESULT DebuggerStepper::TriggerPatch(DebuggerControllerPatch *patch,
Thread *thread,
TRIGGER_WHY tyWhy)
{
LOG((LF_CORDB, LL_INFO10000, "DeSt::TP\n"));
LOG((LF_CORDB, LL_INFO10000, "DS::TP\n"));

// If we're frozen, we may hit a patch but we just ignore it
if (IsFrozen())
Expand Down Expand Up @@ -7221,7 +7218,7 @@ TP_RESULT DebuggerStepper::TriggerPatch(DebuggerControllerPatch *patch,

m_reason = STEP_NORMAL; //we tried to do a STEP_CALL, but since it didn't
//work, we're doing what amounts to a normal step.
LOG((LF_CORDB,LL_INFO10000,"DS 0x%x m_reason = STEP_NORMAL"
LOG((LF_CORDB,LL_INFO10000,"DS 0x%p m_reason = STEP_NORMAL"
"(attempted call thru stub manager, SM didn't know where"
" we're going, so did a step out to original call\n",this));
}
Expand Down Expand Up @@ -7337,13 +7334,13 @@ void DebuggerStepper::TriggerMethodEnter(Thread * thread,
_ASSERTE(!IsFrozen());

MethodDesc * pDesc = dji->m_nativeCodeVersion.GetMethodDesc();
LOG((LF_CORDB, LL_INFO10000, "DJMCStepper::TME, desc=%p, addr=%p\n",
LOG((LF_CORDB, LL_INFO10000, "DebuggerStepper::TME, desc=%p, addr=%p\n",
pDesc, ip));

// JMC steppers won't stop in Lightweight delegates. Just return & keep executing.
// JMC steppers won't stop in Lightweight codegen (LCG). Just return & keep executing.
if (pDesc->IsNoMetadata())
{
LOG((LF_CORDB, LL_INFO100000, "DJMCStepper::TME, skipping b/c it's lw-codegen\n"));
LOG((LF_CORDB, LL_INFO100000, "DebuggerStepper::TME, skipping b/c it's dynamic code (LCG)\n"));
return;
}

Expand Down Expand Up @@ -7450,7 +7447,7 @@ bool DebuggerStepper::TriggerSingleStep(Thread *thread, const BYTE *ip)
}

// If we EnC the method, we'll blast the function address,
// and so have to get it from teh DJI that we'll have. If
// and so have to get it from the DJI that we'll have. If
// we haven't gotten debugger info about a regular function, then
// we'll have to get the info from the EE, which will be valid
// since we're standing in the function at this point, and
Expand Down
16 changes: 3 additions & 13 deletions src/coreclr/debug/ee/debugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2730,16 +2730,8 @@ DebuggerJitInfo *Debugger::GetJitInfoWorker(MethodDesc *fd, const BYTE *pbAddr,
break;
}
}
LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%x (%s::%s), got dmi:0x%x.\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
dmi));




// Log stuff - fd may be null; so we don't want to AV in the log.

LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%x (%s::%s), got dmi:0x%x, dji:0x%x, latest dji:0x%x, latest fd:0x%x, prev dji:0x%x\n",
LOG((LF_CORDB, LL_INFO1000, "D::GJI: for md:0x%p (%s::%s), got dmi:0x%p, dji:0x%p, latest dji:0x%p, latest fd:0x%p, prev dji:0x%p\n",
fd, fd->m_pszDebugClassName, fd->m_pszDebugMethodName,
dmi, dji, (dmi ? dmi->GetLatestJitInfo_NoCreate() : 0),
((dmi && dmi->GetLatestJitInfo_NoCreate()) ? dmi->GetLatestJitInfo_NoCreate()->m_nativeCodeVersion.GetMethodDesc():0),
Expand Down Expand Up @@ -5467,7 +5459,7 @@ void Debugger::ReleaseAllRuntimeThreads(AppDomain *pAppDomain)
//<TODO>@todo APPD if we want true isolation, remove this & finish the work</TODO>
pAppDomain = NULL;

STRESS_LOG1(LF_CORDB, LL_INFO10000, "D::RART: Releasing all Runtime threads"
STRESS_LOG1(LF_CORDB, LL_INFO10000, "D::RART: Releasing all Runtime threads "
"for AppD 0x%x.\n", pAppDomain);

// Mark that we're on our way now...
Expand Down Expand Up @@ -5679,8 +5671,6 @@ void Debugger::TraceCall(const BYTE *code)
* Invoked from a probe in managed code when we enter a user method and
* the flag (set by GetJMCFlagAddr) for that method is != 0.
* pIP - the ip within the method, right after the prolog.
* sp - stack pointer (frame pointer on x86) for the managed method we're entering.
* bsp - backing store pointer for the managed method we're entering
******************************************************************************/
void Debugger::OnMethodEnter(void * pIP)
{
Expand All @@ -5695,7 +5685,7 @@ void Debugger::OnMethodEnter(void * pIP)

if (!CORDebuggerAttached())
{
LOG((LF_CORDB, LL_INFO1000000, "D::OnMethodEnter returning since debugger attached.\n"));
LOG((LF_CORDB, LL_INFO1000000, "D::OnMethodEnter returning since debugger not attached.\n"));
return;
}
FramePointer fp = LEAF_MOST_FRAME;
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/debug/ee/functioninfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2407,7 +2407,7 @@ DebuggerMethodInfo *DebuggerMethodInfoTable::GetMethodInfo(Module *pModule, mdMe
}
else
{
LOG((LF_CORDB, LL_INFO1000, "DMI::GMI: for methodDef 0x%x, got 0x%x prev:0x%x\n",
LOG((LF_CORDB, LL_INFO1000, "DMI::GMI: for methodDef 0x%x, got 0x%p prev:0x%p\n",
token, entry->mi, (entry->mi?entry->mi->m_prevMethodInfo:0)));
return entry->mi;
}
Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/debug/ee/rcthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ static LONG _debugFilter(LPEXCEPTION_POINTERS ep, PVOID pv)
EX_END_CATCH(RethrowTerminalExceptions);

CONSISTENCY_CHECK_MSGF(false,
("Unhandled exception on the helper thread.\nEvent=%s(0x%x)\nCode=0x%0x, Ip=0x%p, .cxr=%p, .exr=%p.\n pid=0x%x (%d), tid=0x%x (%d).\n-----\nStack of exception:\n%s\n----\n",
("Unhandled exception on the helper thread.\nEvent=%s(0x%p)\nCode=0x%0x, Ip=0x%p, .cxr=%p, .exr=%p.\n pid=0x%x (%d), tid=0x%x (%d).\n-----\nStack of exception:\n%s\n----\n",
IPCENames::GetName(type), type,
ep->ExceptionRecord->ExceptionCode, GetIP(ep->ContextRecord), ep->ContextRecord, ep->ExceptionRecord,
pid, pid, tid, tid,
Expand Down Expand Up @@ -1573,7 +1573,7 @@ HRESULT DebuggerRCThread::SendIPCEvent()

DebuggerIPCEvent* pManagedEvent = GetIPCEventSendBuffer();

STRESS_LOG2(LF_CORDB, LL_INFO1000, "D::SendIPCEvent %s to outofproc appD 0x%x,\n",
STRESS_LOG2(LF_CORDB, LL_INFO1000, "D::SendIPCEvent %s to outofproc appD 0x%p,\n",
IPCENames::GetName(pManagedEvent->type),
VmPtrToCookie(pManagedEvent->vmAppDomain));

Expand Down Expand Up @@ -1611,7 +1611,7 @@ bool DebuggerRCThread::IsRCThreadReady()
// leaving the threadid still non-0. So check the actual thread object
// and make sure it's still around.
int ret = WaitForSingleObject(m_thread, 0);
LOG((LF_CORDB, LL_EVERYTHING, "DRCT::IsReady - wait(0x%x)=%d, GetLastError() = %d\n", m_thread, ret, GetLastError()));
LOG((LF_CORDB, LL_EVERYTHING, "DRCT::IsReady - wait(0x%p)=%d, GetLastError() = %d\n", m_thread, ret, GetLastError()));

if (ret != WAIT_TIMEOUT)
{
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/vm/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ typedef VPTR(struct IUnknown) PTR_IUnknown;
typedef DPTR(class InstMethodHashTable) PTR_InstMethodHashTable;
typedef DPTR(class MetaSig) PTR_MetaSig;
typedef DPTR(class MethodDesc) PTR_MethodDesc;
typedef DPTR(PTR_MethodDesc) PTR_PTR_MethodDesc;
typedef DPTR(class MethodDescChunk) PTR_MethodDescChunk;
typedef DPTR(class MethodImpl) PTR_MethodImpl;
typedef DPTR(class MethodTable) PTR_MethodTable;
Expand Down
4 changes: 3 additions & 1 deletion src/coreclr/vm/ilstubcache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ MethodDesc* ILStubCache::CreateNewMethodDesc(LoaderHeap* pCreationHeap, MethodTa
#ifdef FEATURE_ARRAYSTUB_AS_IL
if (SF_IsArrayOpStub(dwStubFlags))
{
pMD->m_dwExtendedFlags |= DynamicMethodDesc::nomdStepThroughStub;
AaronRobinsonMSFT marked this conversation as resolved.
Show resolved Hide resolved
pMD->GetILStubResolver()->SetStubType(ILStubResolver::ArrayOpStub);
}
else
Expand All @@ -223,12 +224,13 @@ MethodDesc* ILStubCache::CreateNewMethodDesc(LoaderHeap* pCreationHeap, MethodTa
#ifdef FEATURE_INSTANTIATINGSTUB_AS_IL
if (SF_IsUnboxingILStub(dwStubFlags))
{
pMD->m_dwExtendedFlags |= DynamicMethodDesc::nomdUnboxingILStub;
pMD->m_dwExtendedFlags |= (DynamicMethodDesc::nomdUnboxingILStub | DynamicMethodDesc::nomdStepThroughStub);
pMD->GetILStubResolver()->SetStubType(ILStubResolver::UnboxingILStub);
}
else
if (SF_IsInstantiatingStub(dwStubFlags))
{
pMD->m_dwExtendedFlags |= DynamicMethodDesc::nomdStepThroughStub;
pMD->GetILStubResolver()->SetStubType(ILStubResolver::InstantiatingStub);
}
else
Expand Down
Loading