summaryrefslogtreecommitdiff
path: root/src/vm/assembly.cpp
diff options
context:
space:
mode:
authorAaron Robinson <arobins@microsoft.com>2018-12-07 14:31:24 -0800
committerGitHub <noreply@github.com>2018-12-07 14:31:24 -0800
commit139bdfd2b9378a7370e8d771811c330488d29ea2 (patch)
treee145b95746dbdb28a9d44b2384a0bbd58c745adf /src/vm/assembly.cpp
parentd52df656f0a4c3dc6591698575cd598ea6d5272a (diff)
downloadcoreclr-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.cpp51
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.