HRESULT ImportEH()

in ProfilingAPI/ReJITEnterLeaveHooks/ILRewriter.cpp [368:401]


    HRESULT ImportEH(const COR_ILMETHOD_SECT_EH* pILEH, unsigned nEH)
    {
        assert(m_pEH == NULL);

        m_nEH = nEH;

        if (nEH == 0)
            return S_OK;

        IfNullRet(m_pEH = new EHClause[m_nEH]);
        for (unsigned iEH = 0; iEH < m_nEH; iEH++)
        {
            // If the EH clause is in tiny form, the call to pILEH->EHClause() below will
            // use this as a scratch buffer to expand the EH clause into its fat form.
            COR_ILMETHOD_SECT_EH_CLAUSE_FAT scratch;

            const COR_ILMETHOD_SECT_EH_CLAUSE_FAT* ehInfo;
            ehInfo = (COR_ILMETHOD_SECT_EH_CLAUSE_FAT*)pILEH->EHClause(iEH, &scratch);

            EHClause* clause = &(m_pEH[iEH]);
            clause->m_Flags = ehInfo->GetFlags();

            clause->m_pTryBegin = GetInstrFromOffset(ehInfo->GetTryOffset());
            clause->m_pTryEnd = GetInstrFromOffset(ehInfo->GetTryOffset() + ehInfo->GetTryLength());
            clause->m_pHandlerBegin = GetInstrFromOffset(ehInfo->GetHandlerOffset());
            clause->m_pHandlerEnd = GetInstrFromOffset(ehInfo->GetHandlerOffset() + ehInfo->GetHandlerLength())->m_pPrev;
            if ((clause->m_Flags & COR_ILEXCEPTION_CLAUSE_FILTER) == 0)
                clause->m_ClassToken = ehInfo->GetClassToken();
            else
                clause->m_pFilter = GetInstrFromOffset(ehInfo->GetFilterOffset());
        }

        return S_OK;
    }