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; }
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()
// Do an in-memory application of relocs void CCeeGen::applyRelocs() { m_peSectionMan->applyRelocs(getTokenMapper()); }
// Do an in-memory application of relocs HRESULT CCeeGen::applyRelocs() { return m_peSectionMan->applyRelocs(getTokenMapper()); }