diff options
author | Atsushi Kanamori <AtsushiKan@users.noreply.github.com> | 2017-07-26 06:28:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-26 06:28:15 -0700 |
commit | 6636cf82ba78f77c4beec4f27769725b675e6858 (patch) | |
tree | d8e585efa100c9b3ff161b762e7e87269d1b5e04 /src/vm | |
parent | 644d7c5535380ef465f64f99f14cb4e2dd9873d6 (diff) | |
download | coreclr-6636cf82ba78f77c4beec4f27769725b675e6858.tar.gz coreclr-6636cf82ba78f77c4beec4f27769725b675e6858.tar.bz2 coreclr-6636cf82ba78f77c4beec4f27769725b675e6858.zip |
Implement Assembly.GetForwardedTypes() on CoreCLR (#13001)
Fixes https://github.com/dotnet/coreclr/issues/12391
Original approval and specs at
https://github.com/dotnet/corefx/issues/19789
Diffstat (limited to 'src/vm')
-rw-r--r-- | src/vm/assemblynative.cpp | 34 | ||||
-rw-r--r-- | src/vm/assemblynative.hpp | 5 | ||||
-rw-r--r-- | src/vm/ecalllist.h | 1 |
3 files changed, 39 insertions, 1 deletions
diff --git a/src/vm/assemblynative.cpp b/src/vm/assemblynative.cpp index e4f148a712..d1ae07dc64 100644 --- a/src/vm/assemblynative.cpp +++ b/src/vm/assemblynative.cpp @@ -430,6 +430,40 @@ void QCALLTYPE AssemblyNative::GetType(QCall::AssemblyHandle pAssembly, LPCWSTR return; } +void QCALLTYPE AssemblyNative::GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType) +{ + CONTRACTL + { + QCALL_CHECK; + } + CONTRACTL_END; + + BEGIN_QCALL; + + HRESULT hr; + LPCSTR pszNameSpace; + LPCSTR pszClassName; + mdToken mdImpl; + + Assembly * pAsm = pAssembly->GetAssembly(); + Module *pManifestModule = pAsm->GetManifestModule(); + IfFailThrow(pManifestModule->GetMDImport()->GetExportedTypeProps(mdtExternalType, &pszNameSpace, &pszClassName, &mdImpl, NULL, NULL)); + if (TypeFromToken(mdImpl) == mdtAssemblyRef) + { + NameHandle typeName(pszNameSpace, pszClassName); + typeName.SetTypeToken(pManifestModule, mdtExternalType); + TypeHandle typeHnd = pAsm->GetLoader()->LoadTypeHandleThrowIfFailed(&typeName); + { + GCX_COOP(); + retType.Set(typeHnd.GetManagedClassObject()); + } + } + + END_QCALL; + + return; +} + FCIMPL1(FC_BOOL_RET, AssemblyNative::IsDynamic, AssemblyBaseObject* pAssemblyUNSAFE) { FCALL_CONTRACT; diff --git a/src/vm/assemblynative.hpp b/src/vm/assemblynative.hpp index 267231bd99..937dbac550 100644 --- a/src/vm/assemblynative.hpp +++ b/src/vm/assemblynative.hpp @@ -90,7 +90,10 @@ public: static void QCALLTYPE GetType(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, BOOL bThrowOnError, BOOL bIgnoreCase, QCall::ObjectHandleOnStack retType, QCall::ObjectHandleOnStack keepAlive); - + + static + void QCALLTYPE AssemblyNative::GetForwardedType(QCall::AssemblyHandle pAssembly, mdToken mdtExternalType, QCall::ObjectHandleOnStack retType); + static INT32 QCALLTYPE GetManifestResourceInfo(QCall::AssemblyHandle pAssembly, LPCWSTR wszName, QCall::ObjectHandleOnStack retAssembly, QCall::StringHandleOnStack retFileName, QCall::StackCrawlMarkHandle stackMark); diff --git a/src/vm/ecalllist.h b/src/vm/ecalllist.h index 39ba874b5a..13cd6d58df 100644 --- a/src/vm/ecalllist.h +++ b/src/vm/ecalllist.h @@ -572,6 +572,7 @@ FCFuncStart(gAssemblyFuncs) FCFuncElement("FCallIsDynamic", AssemblyNative::IsDynamic) FCFuncElement("nLoad", AssemblyNative::Load) QCFuncElement("GetType", AssemblyNative::GetType) + QCFuncElement("GetForwardedType", AssemblyNative::GetForwardedType) QCFuncElement("GetManifestResourceInfo", AssemblyNative::GetManifestResourceInfo) QCFuncElement("GetModules", AssemblyNative::GetModules) QCFuncElement("GetModule", AssemblyNative::GetModule) |