diff options
author | Aaron Robinson <arobins@microsoft.com> | 2018-12-07 14:31:24 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-07 14:31:24 -0800 |
commit | 139bdfd2b9378a7370e8d771811c330488d29ea2 (patch) | |
tree | e145b95746dbdb28a9d44b2384a0bbd58c745adf /src/vm/assembly.cpp | |
parent | d52df656f0a4c3dc6591698575cd598ea6d5272a (diff) | |
download | coreclr-139bdfd2b9378a7370e8d771811c330488d29ea2.tar.gz coreclr-139bdfd2b9378a7370e8d771811c330488d29ea2.tar.bz2 coreclr-139bdfd2b9378a7370e8d771811c330488d29ea2.zip |
Add support for loading registered TLBs (#21430)
* Add support for loading registered TLBs
Diffstat (limited to 'src/vm/assembly.cpp')
-rw-r--r-- | src/vm/assembly.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/vm/assembly.cpp b/src/vm/assembly.cpp index 2f82a97c2e..5724c6643d 100644 --- a/src/vm/assembly.cpp +++ b/src/vm/assembly.cpp @@ -118,6 +118,7 @@ Assembly::Assembly(BaseDomain *pDomain, PEAssembly* pFile, DebuggerAssemblyContr m_pLoaderAllocator(NULL), m_isDisabledPrivateReflection(0), #ifdef FEATURE_COMINTEROP + m_pITypeLib(NULL), m_winMDStatus(WinMDStatus_Unknown), m_pManifestWinMDImport(NULL), #endif // FEATURE_COMINTEROP @@ -275,6 +276,11 @@ Assembly::~Assembly() { m_pManifestWinMDImport->Release(); } + + if (m_pITypeLib != nullptr && m_pITypeLib != Assembly::InvalidTypeLib) + { + m_pITypeLib->Release(); + } #endif // FEATURE_COMINTEROP } @@ -1983,6 +1989,51 @@ BOOL Assembly::IsInstrumentedHelper() } #endif // FEATURE_PREJIT + +#ifdef FEATURE_COMINTEROP + +ITypeLib * const Assembly::InvalidTypeLib = (ITypeLib *)-1; + +ITypeLib* Assembly::GetTypeLib() +{ + CONTRACTL + { + NOTHROW; + GC_TRIGGERS; + FORBID_FAULT; + } + CONTRACTL_END + + ITypeLib *pTlb = m_pITypeLib; + if (pTlb != nullptr && pTlb != Assembly::InvalidTypeLib) + pTlb->AddRef(); + + return pTlb; +} // ITypeLib* Assembly::GetTypeLib() + +bool Assembly::TrySetTypeLib(_In_ ITypeLib *pNew) +{ + CONTRACTL + { + NOTHROW; + GC_TRIGGERS; + FORBID_FAULT; + PRECONDITION(CheckPointer(pNew)); + } + CONTRACTL_END + + ITypeLib *pOld = InterlockedCompareExchangeT(&m_pITypeLib, pNew, nullptr); + if (pOld != nullptr) + return false; + + if (pNew != Assembly::InvalidTypeLib) + pNew->AddRef(); + + return true; +} // void Assembly::SetTypeLib() + +#endif // FEATURE_COMINTEROP + //*********************************************************** // Add an assembly to the assemblyref list. pAssemEmitter specifies where // the AssemblyRef is emitted to. |