Remove Reflection.Emit APIs (#56153)
authorBar Arnon <i3arnon@gmail.com>
Thu, 29 Jul 2021 08:22:03 +0000 (11:22 +0300)
committerGitHub <noreply@github.com>
Thu, 29 Jul 2021 08:22:03 +0000 (10:22 +0200)
* Remove Reflection.Emit APIs

Removes all unused leftover APIs

Fix #49452

* Fix the api-compat baseline

* Remove the baseline altogether

* Remove fIsTransient refs from .cpp (as well as .h)

* Remove nIsTransientInternal

* Remove DefineDynamicModule & DefineDocument

* Revert "Remove the baseline altogether"

This reverts commit ddb0303af94e6126848ef18cd09a70b55775a43b.

* API compat baseline for GetModuleHandleImpl

* Fix Mono

* Match changes in Mono runtime

15 files changed:
src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs
src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs
src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs
src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs
src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs
src/coreclr/vm/assembly.cpp
src/coreclr/vm/ceeload.cpp
src/coreclr/vm/ceeload.h
src/coreclr/vm/commodule.cpp
src/coreclr/vm/ecalllist.h
src/libraries/System.Reflection.Emit/src/MatchingRefApiCompatBaseline.txt
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.Mono.cs
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.Mono.cs
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.Mono.cs

index 5eea3c9dae6dac04451701e8ff67744b205d9534..6f34f7dcef5f42537edcd1b897f383806156e4d4 100644 (file)
@@ -305,10 +305,6 @@ namespace System.Reflection.Emit
         public ModuleBuilder DefineDynamicModule(string name) =>
             DefineDynamicModuleInternal(name, emitSymbolInfo: false);
 
-        [DynamicSecurityMethod] // Methods containing StackCrawlMark local var has to be marked DynamicSecurityMethod.
-        public ModuleBuilder DefineDynamicModule(string name, bool emitSymbolInfo) =>
-            DefineDynamicModuleInternal(name, emitSymbolInfo);
-
         private ModuleBuilder DefineDynamicModuleInternal(string name, bool emitSymbolInfo)
         {
             lock (SyncRoot)
index 0e608f73bdf9be9c40e947fa5f15c84d3dbbf9d2..a9875ebdaf4f247f62afddc316566e40fd97901f 100644 (file)
@@ -160,18 +160,11 @@ namespace System.Reflection.Emit
             }
         }
 
-        public Module GetModule()
-        {
-            return m_methodBuilder.GetModule();
-        }
-
         internal override Type GetReturnType()
         {
             return m_methodBuilder.ReturnType;
         }
 
-        public string Signature => m_methodBuilder.Signature;
-
         public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
         {
             m_methodBuilder.SetCustomAttribute(con, binaryAttribute);
index 6811eb598bf8c0112e65170350058d70bbd3efd8..e2df0f5313ece6ee4b3b2e0e7ed258b2a01ab261 100644 (file)
@@ -758,13 +758,11 @@ namespace System.Reflection.Emit
             set { ThrowIfGeneric(); m_fInitLocals = value; }
         }
 
-        public Module GetModule()
+        internal Module GetModule()
         {
             return GetModuleBuilder();
         }
 
-        public string Signature => GetMethodSignature().ToString();
-
         public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
         {
             if (con is null)
index 7989225a585018fd100d1a1145c0b547923899f6..c1c243b8d023064a1aa0a314612d2192516e8780 100644 (file)
@@ -1598,20 +1598,6 @@ namespace System.Reflection.Emit
         // Regardless, this is a reliability bug.
         internal ISymbolWriter? GetSymWriter() => _iSymWriter;
 
-        public ISymbolDocumentWriter? DefineDocument(string url, Guid language, Guid languageVendor, Guid documentType)
-        {
-            // url cannot be null but can be an empty string
-            if (url == null)
-            {
-                throw new ArgumentNullException(nameof(url));
-            }
-
-            lock (SyncRoot)
-            {
-                return DefineDocumentNoLock(url, language, languageVendor, documentType);
-            }
-        }
-
         private ISymbolDocumentWriter? DefineDocumentNoLock(string url, Guid language, Guid languageVendor, Guid documentType)
         {
             if (_iSymWriter == null)
@@ -1623,8 +1609,6 @@ namespace System.Reflection.Emit
             return _iSymWriter.DefineDocument(url, language, languageVendor, documentType);
         }
 
-        public bool IsTransient() => InternalModule.IsTransientInternal();
-
         #endregion
 
         #endregion
index 8f65ca6a66c9619a52463ca9e1936a6890221737..a85a2226265b8831de17d9678e88a03d2fcb4f1b 100644 (file)
@@ -17,9 +17,6 @@ namespace System.Reflection
         [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
         private static extern void GetType(QCallModule module, string className, bool throwOnError, bool ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive);
 
-        [DllImport(RuntimeHelpers.QCall)]
-        private static extern bool nIsTransientInternal(QCallModule module);
-
         [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
         private static extern void GetScopeName(QCallModule module, StringHandleOnStack retString);
 
@@ -382,12 +379,6 @@ namespace System.Reflection
         #region Internal Members
         internal RuntimeType RuntimeType => m_runtimeType ??= ModuleHandle.GetModuleType(this);
 
-        internal bool IsTransientInternal()
-        {
-            RuntimeModule thisAsLocal = this;
-            return RuntimeModule.nIsTransientInternal(new QCallModule(ref thisAsLocal));
-        }
-
         internal MetadataImport MetadataImport => ModuleHandle.GetMetadataImport(this);
         #endregion
 
index 9d4cd4ab7ce4572c408de04dd4a43171ad08b649..9ef8f08ff9656173ce4bb01be5f418525a3ba372 100644 (file)
@@ -176,7 +176,7 @@ void Assembly::Init(AllocMemTracker *pamTracker, LoaderAllocator *pLoaderAllocat
 #ifndef CROSSGEN_COMPILE
     if (GetManifestFile()->IsDynamic())
         // manifest modules of dynamic assemblies are always transient
-        m_pManifest = ReflectionModule::Create(this, GetManifestFile(), pamTracker, REFEMIT_MANIFEST_MODULE_NAME, TRUE);
+        m_pManifest = ReflectionModule::Create(this, GetManifestFile(), pamTracker, REFEMIT_MANIFEST_MODULE_NAME);
     else
 #endif
         m_pManifest = Module::Create(this, mdFileNil, GetManifestFile(), pamTracker);
index a41ed4c81a5937c58ad1267f98fa84740b3b3292..c5a9d98ac6e4e2c76a99a23514b865ef04e28095 100644 (file)
@@ -12442,7 +12442,7 @@ idMethodSpec Module::LogInstantiatedMethod(const MethodDesc * md, ULONG flagNum)
 // ===========================================================================
 
 /* static */
-ReflectionModule *ReflectionModule::Create(Assembly *pAssembly, PEFile *pFile, AllocMemTracker *pamTracker, LPCWSTR szName, BOOL fIsTransient)
+ReflectionModule *ReflectionModule::Create(Assembly *pAssembly, PEFile *pFile, AllocMemTracker *pamTracker, LPCWSTR szName)
 {
     CONTRACT(ReflectionModule *)
     {
@@ -12468,9 +12468,6 @@ ReflectionModule *ReflectionModule::Create(Assembly *pAssembly, PEFile *pFile, A
 
     pModule->DoInit(pamTracker, szName);
 
-    // Set this at module creation time. The m_fIsTransient field should never change during the lifetime of this ReflectionModule.
-    pModule->SetIsTransient(fIsTransient ? true : false);
-
     RETURN pModule.Extract();
 }
 
@@ -12498,7 +12495,6 @@ ReflectionModule::ReflectionModule(Assembly *pAssembly, mdFile token, PEFile *pF
     m_pCeeFileGen = NULL;
     m_pDynamicMetadata = NULL;
     m_fSuppressMetadataCapture = false;
-    m_fIsTransient = false;
 }
 
 HRESULT STDMETHODCALLTYPE CreateICeeGen(REFIID riid, void **pCeeGen);
index 13a78ec96f4ef90a5750d30e419a1f578c462da3..81116102682c6202859e024712e962a8054800e7 100644 (file)
@@ -3210,9 +3210,6 @@ private:
     // This is used to allow bulk emitting types without re-emitting the metadata between each type.
     bool m_fSuppressMetadataCapture;
 
-    // If true, then only other transient modules can depend on this module.
-    bool m_fIsTransient;
-
 #if !defined DACCESS_COMPILE && !defined CROSSGEN_COMPILE
     // Returns true iff metadata capturing is suppressed
     bool IsMetadataCaptureSuppressed();
@@ -3244,7 +3241,7 @@ public:
 #endif
 
 #if !defined DACCESS_COMPILE && !defined CROSSGEN_COMPILE
-    static ReflectionModule *Create(Assembly *pAssembly, PEFile *pFile, AllocMemTracker *pamTracker, LPCWSTR szName, BOOL fIsTransient);
+    static ReflectionModule *Create(Assembly *pAssembly, PEFile *pFile, AllocMemTracker *pamTracker, LPCWSTR szName);
     void Initialize(AllocMemTracker *pamTracker, LPCWSTR szName);
     void Destruct();
 #endif // !DACCESS_COMPILE && !CROSSGEN_COMPILE
@@ -3296,20 +3293,6 @@ public:
         return &m_pISymUnmanagedWriter;
     }
 
-    bool IsTransient()
-    {
-        LIMITED_METHOD_CONTRACT;
-
-        return m_fIsTransient;
-    }
-
-    void SetIsTransient(bool fIsTransient)
-    {
-        LIMITED_METHOD_CONTRACT;
-
-        m_fIsTransient = fIsTransient;
-    }
-
 #ifndef DACCESS_COMPILE
 #ifndef CROSSGEN_COMPILE
 
index 2ac2b03392e9a6d32cf9c8c3c2ecd7e5aae4e6fa..f1ac719c5046acafaf1991f73bcaf883c90d64f2 100644 (file)
@@ -704,28 +704,6 @@ void QCALLTYPE COMModule::SetModuleName(QCall::ModuleHandle pModule, LPCWSTR wsz
     END_QCALL;
 }
 
-//******************************************************************************
-//
-// Return a type spec token given a byte array
-//
-//******************************************************************************
-BOOL QCALLTYPE COMModule::IsTransient(QCall::ModuleHandle pModule)
-{
-    QCALL_CONTRACT;
-
-    BOOL fIsTransient = FALSE;
-
-    BEGIN_QCALL;
-
-    /* Only reflection modules can be transient */
-    if (pModule->IsReflection())
-        fIsTransient = pModule->GetReflectionModule()->IsTransient();
-
-    END_QCALL;
-
-    return fIsTransient;
-}
-
 //******************************************************************************
 //
 // Return a type spec token given a byte array
index 738ac9a3399771d0f9b18f7b5d4704e00d0bee71..3ca90d4bbc400194bd348a8acab51ad28faa367b 100644 (file)
@@ -324,7 +324,6 @@ FCFuncStart(gCOMModuleFuncs)
     QCFuncElement("GetScopeName", COMModule::GetScopeName)
     FCFuncElement("GetTypes", COMModule::GetTypes)
     QCFuncElement("GetFullyQualifiedName", COMModule::GetFullyQualifiedName)
-    QCFuncElement("nIsTransientInternal", COMModule::IsTransient)
     FCFuncElement("IsResource", COMModule::IsResource)
 FCFuncEnd()
 
index 65344a30607c465c3d8fbd0d43aa4e0c8033d294..5bee5254aabcc3c9f6bda2aa6543a3933faf2a56 100644 (file)
@@ -1,10 +1,3 @@
 Compat issues with assembly System.Reflection.Emit:
-MembersMustExist : Member 'public System.Reflection.Emit.ModuleBuilder System.Reflection.Emit.AssemblyBuilder.DefineDynamicModule(System.String, System.Boolean)' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.Reflection.Module System.Reflection.Emit.ConstructorBuilder.GetModule()' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.String System.Reflection.Emit.ConstructorBuilder.Signature.get()' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.Reflection.Module System.Reflection.Emit.MethodBuilder.GetModule()' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.String System.Reflection.Emit.MethodBuilder.Signature.get()' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.Diagnostics.SymbolStore.ISymbolDocumentWriter System.Reflection.Emit.ModuleBuilder.DefineDocument(System.String, System.Guid, System.Guid, System.Guid)' does not exist in the reference but it does exist in the implementation.
 MembersMustExist : Member 'protected System.ModuleHandle System.Reflection.Emit.ModuleBuilder.GetModuleHandleImpl()' does not exist in the reference but it does exist in the implementation.
-MembersMustExist : Member 'public System.Boolean System.Reflection.Emit.ModuleBuilder.IsTransient()' does not exist in the reference but it does exist in the implementation.
-Total Issues: 8
+Total Issues: 1
index 502d09d152da448577cbb6480f2fbcf9b7a34e50..0c1d75229cf95f67c970cb345f35b84b01a764bb 100644 (file)
@@ -254,9 +254,7 @@ namespace System.Reflection.Emit
             return ab;
         }
 
-        public ModuleBuilder DefineDynamicModule(string name) => DefineDynamicModule(name, false);
-
-        public ModuleBuilder DefineDynamicModule(string name, bool emitSymbolInfo)
+        public ModuleBuilder DefineDynamicModule(string name)
         {
             if (name == null)
                 throw new ArgumentNullException(nameof(name));
index 0afee6f41f3185ca990cd22f5ffd35af938cac18..9ef7217e81f1c6fa13c9fbeffcfcafc9dcd472f5 100644 (file)
@@ -209,14 +209,6 @@ namespace System.Reflection.Emit
             }
         }
 
-        public string Signature
-        {
-            get
-            {
-                return "constructor signature";
-            }
-        }
-
         public ParameterBuilder DefineParameter(int iSequence, ParameterAttributes attributes, string? strParamName)
         {
             // The 0th ParameterBuilder does not correspond to an
@@ -313,16 +305,11 @@ namespace System.Reflection.Emit
             iattrs = attributes;
         }
 
-        public Module GetModule()
-        {
-            return type.Module;
-        }
-
         public override Module Module
         {
             get
             {
-                return GetModule();
+                return type.Module;
             }
         }
 
index be43137a10153f9edfc2d86013061614c4d93e2b..18c4a47f7225b9b09fe4f000080c1868ec211523 100644 (file)
@@ -184,15 +184,6 @@ namespace System.Reflection.Emit
             get { return call_conv; }
         }
 
-        // FIXME: "Not implemented"
-        public string Signature
-        {
-            get
-            {
-                throw new NotImplementedException();
-            }
-        }
-
         /* Used by mcs */
         internal bool BestFitMapping
         {
@@ -278,7 +269,7 @@ namespace System.Reflection.Emit
             return type.RuntimeResolve().GetMethod(this);
         }
 
-        public Module GetModule()
+        internal Module GetModule()
         {
             return type.Module;
         }
index bc0b59413b81282e33b215c7f02615d55e19cb47..86ba437fa10287dd7548c4c94e5fa0358b039d48 100644 (file)
@@ -118,11 +118,6 @@ namespace System.Reflection.Emit
             }
         }
 
-        public bool IsTransient()
-        {
-            return true;
-        }
-
         public void CreateGlobalFunctions()
         {
             if (global_type_created != null)
@@ -596,8 +591,6 @@ namespace System.Reflection.Emit
                 throw new ArgumentNullException(nameof(type));
             if (type.IsByRef)
                 throw new ArgumentException("type can't be a byref type", nameof(type));
-            if (!IsTransient() && (type.Module is ModuleBuilder) && ((ModuleBuilder)type.Module).IsTransient())
-                throw new InvalidOperationException("a non-transient module can't reference a transient module");
             return type.MetadataToken;
         }