Exemplo n.º 1
0
HRESULT CCeeGen::getMapTokenIface(IUnknown **pIMapToken, IMetaDataEmit *emitter) 
{
	if (! pIMapToken)
		return E_POINTER;
	if (! m_pTokenMap) {
		// Allocate the token mapper. As code is generated, each moved token will be added to
		// the mapper and the client will also add a TokenMap reloc for it so we can update later
		CeeGenTokenMapper *pMapper = new CeeGenTokenMapper;
		TESTANDRETURN(pMapper != NULL, E_OUTOFMEMORY);
		if (emitter) {
#ifdef _DEBUG
            HRESULT hr =
#endif
            emitter->QueryInterface(IID_IMetaDataImport, (PVOID *) &pMapper->m_pIImport);
		    _ASSERTE(SUCCEEDED(hr));
		}
		m_pTokenMap = pMapper;
		m_fTokenMapSupported = (emitter == 0);

        // If we've been holding onto a token remap handler waiting
        // for the token mapper to get created, add it to the token
        // mapper now and release our hold on it.
        if (m_pRemapHandler && m_pTokenMap)
        {
            m_pTokenMap->AddTokenMapper(m_pRemapHandler);
            m_pRemapHandler->Release();
            m_pRemapHandler = NULL;
        }
	}
	*pIMapToken = getTokenMapper()->GetMapTokenIface();
	return S_OK;
}
Exemplo n.º 2
0
HRESULT CeeFileGenWriter::fixup()
{
    HRESULT hr;

    m_fixed = true;

    if (!m_linked)
        IfFailRet(link());

    CeeGenTokenMapper *pMapper = getTokenMapper();

    // Apply token remaps if there are any.
    if (! m_fTokenMapSupported && pMapper != NULL) {
        IMetaDataImport *pImport;
        hr = pMapper->GetMetaData(&pImport);
        _ASSERTE(SUCCEEDED(hr));
        hr = MapTokens(pMapper, pImport);
        pImport->Release();

    }

    // remap the entry point if entry point token has been moved
    if (pMapper != NULL && !m_objSwitch) 
    {
        mdToken tk = m_entryPoint;
        pMapper->HasTokenMoved(tk, tk);
        m_corHeader->EntryPointToken = VAL32(tk);
    }

    IfFailRet(getPEWriter().fixup(pMapper)); 

    return S_OK;
} // HRESULT CeeFileGenWriter::fixup()
Exemplo n.º 3
0
// Do an in-memory application of relocs
void CCeeGen::applyRelocs()
{
    m_peSectionMan->applyRelocs(getTokenMapper());
}
Exemplo n.º 4
0
// Do an in-memory application of relocs
HRESULT CCeeGen::applyRelocs()
{
    return m_peSectionMan->applyRelocs(getTokenMapper());
}