@@ -282,74 +282,101 @@ void ILStubResolver::GetEHInfo(unsigned EHnumber, CORINFO_EH_CLAUSE* clause)
282282 clause->FilterOffset = ehInfo->GetFilterOffset ();
283283}
284284
285- void ILStubResolver::SetStubMethodDesc (MethodDesc* pStubMD)
285+ // ---------------------------------------------------------------------------------------
286+ //
287+ ILStubResolver::ILStubResolver () :
288+ m_pCompileTimeState(dac_cast<PTR_CompileTimeState>(ILNotYetGenerated)),
289+ m_pStubMD(dac_cast<PTR_MethodDesc>(nullptr )),
290+ m_pStubTargetMD(dac_cast<PTR_MethodDesc>(nullptr )),
291+ m_jitFlags(),
292+ m_loaderHeap(dac_cast<PTR_LoaderHeap>(nullptr ))
286293{
287294 LIMITED_METHOD_CONTRACT;
288- m_pStubMD = PTR_MethodDesc (pStubMD);
289295}
290296
291- void ILStubResolver::SetStubTargetMethodDesc (MethodDesc* pStubTargetMD )
297+ bool ILStubResolver::IsCompiled ( )
292298{
293299 LIMITED_METHOD_CONTRACT;
294- m_pStubTargetMD = PTR_MethodDesc (pStubTargetMD );
300+ return (dac_cast<TADDR>(m_pCompileTimeState) == ILGeneratedAndFreed );
295301}
296302
297-
298- // ---------------------------------------------------------------------------------------
299- //
300- void
301- ILStubResolver::SetStubTargetMethodSig (
302- PCCOR_SIGNATURE pStubTargetMethodSig,
303- DWORD cbStubTargetSigLength)
303+ bool ILStubResolver::IsILGenerated ()
304304{
305- CONTRACTL
306- {
307- STANDARD_VM_CHECK;
308- PRECONDITION (CheckPointer (m_pCompileTimeState));
309- }
310- CONTRACTL_END;
305+ LIMITED_METHOD_CONTRACT;
306+ return (dac_cast<TADDR>(m_pCompileTimeState) != ILNotYetGenerated);
307+ }
311308
312- NewArrayHolder<BYTE> pNewSig = new BYTE[cbStubTargetSigLength];
309+ MethodDesc* ILStubResolver::GetStubMethodDesc ()
310+ {
311+ LIMITED_METHOD_CONTRACT;
312+ return m_pStubMD;
313+ }
313314
314- memcpyNoGCRefs ((void *)pNewSig, pStubTargetMethodSig, cbStubTargetSigLength);
315+ MethodDesc* ILStubResolver::GetStubTargetMethodDesc ()
316+ {
317+ LIMITED_METHOD_CONTRACT;
318+ return m_pStubTargetMD;
319+ }
315320
316- m_pCompileTimeState->m_StubTargetMethodSig = SigPointer (pNewSig, cbStubTargetSigLength);
317- pNewSig.SuppressRelease ();
321+ COR_ILMETHOD_DECODER* ILStubResolver::GetILHeader ()
322+ {
323+ LIMITED_METHOD_CONTRACT;
324+ _ASSERTE (m_pCompileTimeState != NULL );
325+ return &m_pCompileTimeState->m_ILHeader ;
318326}
319327
320- // ---------------------------------------------------------------------------------------
321- //
322- MethodDesc *
323- ILStubResolver::GetStubTargetMethodDesc ()
328+ #ifndef DACCESS_COMPILE
329+ void ILStubResolver::SetLoaderHeap (PTR_LoaderHeap pLoaderHeap)
324330{
325331 LIMITED_METHOD_CONTRACT;
326- return m_pStubTargetMD ;
332+ m_loaderHeap = pLoaderHeap ;
327333}
328334
329- MethodDesc* ILStubResolver::GetStubMethodDesc ()
335+ void ILStubResolver::SetTokenLookupMap (TokenLookupMap* pMap)
336+ {
337+ STANDARD_VM_CONTRACT;
338+ _ASSERTE (m_pCompileTimeState != NULL );
339+
340+ // run copy ctor
341+ new (&m_pCompileTimeState->m_tokenLookupMap ) TokenLookupMap (pMap);
342+ }
343+
344+ void ILStubResolver::SetJitFlags (CORJIT_FLAGS jitFlags)
330345{
331346 LIMITED_METHOD_CONTRACT;
332- return m_pStubMD ;
347+ m_jitFlags = jitFlags ;
333348}
334349
335- ILStubResolver::ILStubResolver () :
336- m_pCompileTimeState(dac_cast<PTR_CompileTimeState>(ILNotYetGenerated)),
337- m_pStubMD(dac_cast<PTR_MethodDesc>(nullptr )),
338- m_pStubTargetMD(dac_cast<PTR_MethodDesc>(nullptr )),
339- m_jitFlags(),
340- m_loaderHeap(dac_cast<PTR_LoaderHeap>(nullptr ))
350+ void ILStubResolver::SetStubMethodDesc (MethodDesc* pStubMD)
341351{
342352 LIMITED_METHOD_CONTRACT;
353+ m_pStubMD = PTR_MethodDesc (pStubMD);
354+ }
343355
356+ void ILStubResolver::SetStubTargetMethodDesc (MethodDesc* pStubTargetMD)
357+ {
358+ LIMITED_METHOD_CONTRACT;
359+ m_pStubTargetMD = PTR_MethodDesc (pStubTargetMD);
344360}
345361
346- void ILStubResolver::SetLoaderHeap (PTR_LoaderHeap pLoaderHeap)
362+ void ILStubResolver::SetStubTargetMethodSig (
363+ PCCOR_SIGNATURE pStubTargetMethodSig,
364+ DWORD cbStubTargetSigLength)
347365{
348- m_loaderHeap = pLoaderHeap;
366+ STANDARD_VM_CONTRACT;
367+ _ASSERTE (m_pCompileTimeState != NULL );
368+
369+ NewArrayHolder<BYTE> pNewSig = new BYTE[cbStubTargetSigLength];
370+
371+ memcpyNoGCRefs ((void *)pNewSig, pStubTargetMethodSig, cbStubTargetSigLength);
372+
373+ m_pCompileTimeState->m_StubTargetMethodSig = SigPointer (pNewSig, cbStubTargetSigLength);
374+ pNewSig.SuppressRelease ();
349375}
350376
351377static COR_ILMETHOD_DECODER CreateILHeader (size_t cbCode, UINT maxStack, BYTE* pNewILCodeBuffer, BYTE* pNewLocalSig, DWORD cbLocalSig)
352378{
379+ LIMITED_METHOD_CONTRACT;
353380 COR_ILMETHOD_DECODER ilHeader{};
354381 ilHeader.CodeSize = (DWORD)cbCode;
355382 ilHeader.MaxStack = maxStack;
@@ -359,17 +386,13 @@ static COR_ILMETHOD_DECODER CreateILHeader(size_t cbCode, UINT maxStack, BYTE* p
359386 return ilHeader;
360387}
361388
362- // ---------------------------------------------------------------------------------------
363- //
364- COR_ILMETHOD_DECODER *
365- ILStubResolver::AllocGeneratedIL (
389+ COR_ILMETHOD_DECODER* ILStubResolver::AllocGeneratedIL (
366390 size_t cbCode,
367391 DWORD cbLocalSig,
368392 UINT maxStack)
369393{
370394 STANDARD_VM_CONTRACT;
371395
372- #if !defined(DACCESS_COMPILE)
373396 _ASSERTE (0 != cbCode);
374397
375398 // Perform a single allocation for all needed memory
@@ -410,27 +433,37 @@ ILStubResolver::AllocGeneratedIL(
410433 newMemory.SuppressRelease ();
411434 return pILHeader;
412435
413- #else // DACCESS_COMPILE
414- DacNotImpl ();
415- return NULL ;
416-
417- #endif // DACCESS_COMPILE
418436} // ILStubResolver::AllocGeneratedIL
419437
420- // ---------------------------------------------------------------------------------------
421- //
422- COR_ILMETHOD_DECODER* ILStubResolver::GetILHeader ()
438+ COR_ILMETHOD_DECODER* ILStubResolver::FinalizeILStub (ILStubLinker* sl)
423439{
424- CONTRACTL
440+ STANDARD_VM_CONTRACT;
441+ _ASSERTE (!IsILGenerated ());
442+ _ASSERTE (sl != NULL );
443+
444+ UINT maxStack;
445+ size_t cbCode = sl->Link (&maxStack);
446+ DWORD cbSig = sl->GetLocalSigSize ();
447+
448+ COR_ILMETHOD_DECODER* pILHeader = AllocGeneratedIL (cbCode, cbSig, maxStack);
449+ BYTE* pbBuffer = (BYTE*)pILHeader->Code ;
450+ BYTE* pbLocalSig = (BYTE*)pILHeader->LocalVarSig ;
451+ _ASSERTE (cbSig == pILHeader->cbLocalVarSig );
452+
453+ size_t numEH = sl->GetNumEHClauses ();
454+ if (numEH > 0 )
425455 {
426- MODE_ANY;
427- THROWS;
428- GC_NOTRIGGER;
429- PRECONDITION (CheckPointer (m_pCompileTimeState));
456+ sl->WriteEHClauses (AllocEHSect (numEH));
430457 }
431- CONTRACTL_END;
432458
433- return &m_pCompileTimeState->m_ILHeader ;
459+ sl->GenerateCode (pbBuffer, cbCode);
460+ sl->GetLocalSig (pbLocalSig, cbSig);
461+
462+ // Store the token lookup map
463+ SetTokenLookupMap (sl->GetTokenLookupMap ());
464+ SetJitFlags (CORJIT_FLAGS (CORJIT_FLAGS::CORJIT_FLAG_IL_STUB));
465+
466+ return pILHeader;
434467}
435468
436469COR_ILMETHOD_SECT_EH* ILStubResolver::AllocEHSect (size_t nClauses)
@@ -448,6 +481,7 @@ COR_ILMETHOD_SECT_EH* ILStubResolver::AllocEHSect(size_t nClauses)
448481 m_pCompileTimeState->m_ILHeader .EH = m_pCompileTimeState->m_pEHSect ;
449482 return m_pCompileTimeState->m_pEHSect ;
450483}
484+ #endif // !DACCESS_COMPILE
451485
452486bool ILStubResolver::UseLoaderHeap ()
453487{
@@ -506,40 +540,6 @@ ILStubResolver::ClearCompileTimeState(CompileTimeStatePtrSpecialValues newState)
506540 InterlockedExchangeT (&m_pCompileTimeState, dac_cast<PTR_CompileTimeState>((TADDR)newState));
507541} // ILStubResolver::ClearCompileTimeState
508542
509- // ---------------------------------------------------------------------------------------
510- //
511- void
512- ILStubResolver::SetTokenLookupMap (
513- TokenLookupMap * pMap)
514- {
515- CONTRACTL
516- {
517- STANDARD_VM_CHECK;
518- PRECONDITION (CheckPointer (m_pCompileTimeState));
519- }
520- CONTRACTL_END;
521-
522- // run copy ctor
523- new (&m_pCompileTimeState->m_tokenLookupMap ) TokenLookupMap (pMap);
524- }
525-
526- bool ILStubResolver::IsCompiled ()
527- {
528- LIMITED_METHOD_CONTRACT;
529- return (dac_cast<TADDR>(m_pCompileTimeState) == ILGeneratedAndFreed);
530- }
531-
532- bool ILStubResolver::IsILGenerated ()
533- {
534- return (dac_cast<TADDR>(m_pCompileTimeState) != ILNotYetGenerated);
535- }
536-
537- void ILStubResolver::SetJitFlags (CORJIT_FLAGS jitFlags)
538- {
539- LIMITED_METHOD_CONTRACT;
540- m_jitFlags = jitFlags;
541- }
542-
543543// static
544544void ILStubResolver::StubGenFailed (ILStubResolver* pResolver)
545545{
@@ -558,4 +558,4 @@ void ILStubResolver::StubGenFailed(ILStubResolver* pResolver)
558558 }
559559
560560 pResolver->ClearCompileTimeState (ILNotYetGenerated);
561- }
561+ }
0 commit comments