summaryrefslogtreecommitdiff
path: root/src/vm
diff options
context:
space:
mode:
authorAtsushi Kanamori <AtsushiKan@users.noreply.github.com>2017-07-26 06:28:15 -0700
committerGitHub <noreply@github.com>2017-07-26 06:28:15 -0700
commit6636cf82ba78f77c4beec4f27769725b675e6858 (patch)
treed8e585efa100c9b3ff161b762e7e87269d1b5e04 /src/vm
parent644d7c5535380ef465f64f99f14cb4e2dd9873d6 (diff)
downloadcoreclr-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.cpp34
-rw-r--r--src/vm/assemblynative.hpp5
-rw-r--r--src/vm/ecalllist.h1
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)