66using System . Diagnostics ;
77using System . Diagnostics . CodeAnalysis ;
88using System . Globalization ;
9+ using System . IO ;
910using System . Reflection ;
11+ using System . Reflection . Metadata ;
1012using System . Runtime . CompilerServices ;
1113using System . Runtime . InteropServices ;
1214using System . Text ;
@@ -605,6 +607,13 @@ private unsafe RuntimeMethodInfo[] PopulateMethods(Filter filter)
605607 continue ;
606608 #endregion
607609
610+ if ( MetadataUpdater . IsSupported &&
611+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
612+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringType . GetRuntimeModule ( ) , RuntimeMethodHandle . GetMethodDef ( methodHandle ) ) )
613+ {
614+ continue ;
615+ }
616+
608617 #region Calculate Binding Flags
609618 bool isPublic = ( methodAttributes & MethodAttributes . MemberAccessMask ) == MethodAttributes . Public ;
610619 bool isStatic = ( methodAttributes & MethodAttributes . Static ) != 0 ;
@@ -615,7 +624,7 @@ private unsafe RuntimeMethodInfo[] PopulateMethods(Filter filter)
615624 RuntimeMethodHandleInternal instantiatedHandle = RuntimeMethodHandle . GetStubIfNeeded ( methodHandle , declaringType , null ) ;
616625
617626 RuntimeMethodInfo runtimeMethodInfo = new RuntimeMethodInfo (
618- instantiatedHandle , declaringType , m_runtimeTypeCache , methodAttributes , bindingFlags , null ) ;
627+ instantiatedHandle , declaringType , m_runtimeTypeCache , methodAttributes , bindingFlags , null ) ;
619628
620629 list . Add ( runtimeMethodInfo ) ;
621630 #endregion
@@ -685,6 +694,14 @@ private unsafe RuntimeMethodInfo[] PopulateMethods(Filter filter)
685694
686695 #endregion
687696
697+ // Filter out deleted method before setting override state, so that a deleted override in a subclass does not hide override in an ancestor.
698+ if ( MetadataUpdater . IsSupported &&
699+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
700+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringType . GetRuntimeModule ( ) , RuntimeMethodHandle . GetMethodDef ( methodHandle ) ) )
701+ {
702+ continue ;
703+ }
704+
688705 #region Continue if this is a virtual and is already overridden
689706 if ( isVirtual )
690707 {
@@ -719,7 +736,7 @@ private unsafe RuntimeMethodInfo[] PopulateMethods(Filter filter)
719736 RuntimeMethodHandleInternal instantiatedHandle = RuntimeMethodHandle . GetStubIfNeeded ( methodHandle , declaringType , null ) ;
720737
721738 RuntimeMethodInfo runtimeMethodInfo = new RuntimeMethodInfo (
722- instantiatedHandle , declaringType , m_runtimeTypeCache , methodAttributes , bindingFlags , null ) ;
739+ instantiatedHandle , declaringType , m_runtimeTypeCache , methodAttributes , bindingFlags , null ) ;
723740
724741 list . Add ( runtimeMethodInfo ) ;
725742 #endregion
@@ -764,6 +781,13 @@ private RuntimeConstructorInfo[] PopulateConstructors(Filter filter)
764781 ( methodAttributes & MethodAttributes . Abstract ) == 0 &&
765782 ( methodAttributes & MethodAttributes . Virtual ) == 0 ) ;
766783
784+ if ( MetadataUpdater . IsSupported &&
785+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
786+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringType . GetRuntimeModule ( ) , RuntimeMethodHandle . GetMethodDef ( methodHandle ) ) )
787+ {
788+ continue ;
789+ }
790+
767791 #region Calculate Binding Flags
768792 bool isPublic = ( methodAttributes & MethodAttributes . MemberAccessMask ) == MethodAttributes . Public ;
769793 bool isStatic = ( methodAttributes & MethodAttributes . Static ) != 0 ;
@@ -875,6 +899,13 @@ private void PopulateRtFields(Filter filter,
875899 continue ;
876900 }
877901
902+ if ( MetadataUpdater . IsSupported &&
903+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
904+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringType . GetRuntimeModule ( ) , RuntimeFieldHandle . GetToken ( handle ) ) )
905+ {
906+ continue ;
907+ }
908+
878909 #region Calculate Binding Flags
879910 bool isPublic = fieldAccess == FieldAttributes . Public ;
880911 bool isStatic = ( fieldAttributes & FieldAttributes . Static ) != 0 ;
@@ -885,8 +916,7 @@ private void PopulateRtFields(Filter filter,
885916 if ( needsStaticFieldForGeneric && isStatic )
886917 runtimeFieldHandle = RuntimeFieldHandle . GetStaticFieldForGenericType ( runtimeFieldHandle , declaringType ) ;
887918
888- RuntimeFieldInfo runtimeFieldInfo =
889- new RtFieldInfo ( runtimeFieldHandle , declaringType , m_runtimeTypeCache , bindingFlags ) ;
919+ var runtimeFieldInfo = new RtFieldInfo ( runtimeFieldHandle , declaringType , m_runtimeTypeCache , bindingFlags ) ;
890920
891921 list . Add ( runtimeFieldInfo ) ;
892922 }
@@ -903,8 +933,8 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref
903933 if ( MdToken . IsNullToken ( tkDeclaringType ) )
904934 return ;
905935
906- RuntimeModule module = declaringType . GetRuntimeModule ( ) ;
907- MetadataImport scope = module . MetadataImport ;
936+ RuntimeModule declaringModule = declaringType . GetRuntimeModule ( ) ;
937+ MetadataImport scope = declaringModule . MetadataImport ;
908938
909939 scope . EnumFields ( tkDeclaringType , out MetadataEnumResult tkFields ) ;
910940
@@ -936,6 +966,13 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref
936966 continue ;
937967 }
938968
969+ if ( MetadataUpdater . IsSupported &&
970+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
971+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringModule , tkField ) )
972+ {
973+ continue ;
974+ }
975+
939976 #region Calculate Binding Flags
940977 bool isPublic = fieldAccess == FieldAttributes . Public ;
941978 bool isStatic = ( fieldAttributes & FieldAttributes . Static ) != 0 ;
@@ -948,7 +985,7 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref
948985 list . Add ( runtimeFieldInfo ) ;
949986 }
950987 }
951- GC . KeepAlive ( module ) ;
988+ GC . KeepAlive ( declaringModule ) ;
952989 }
953990
954991 private void AddSpecialInterface (
@@ -1144,8 +1181,8 @@ private void PopulateEvents(
11441181 if ( MdToken . IsNullToken ( tkDeclaringType ) )
11451182 return ;
11461183
1147- RuntimeModule module = declaringType . GetRuntimeModule ( ) ;
1148- MetadataImport scope = module . MetadataImport ;
1184+ RuntimeModule declaringModule = declaringType . GetRuntimeModule ( ) ;
1185+ MetadataImport scope = declaringModule . MetadataImport ;
11491186
11501187 scope . EnumEvents ( tkDeclaringType , out MetadataEnumResult tkEvents ) ;
11511188
@@ -1164,6 +1201,13 @@ private void PopulateEvents(
11641201 continue ;
11651202 }
11661203
1204+ if ( MetadataUpdater . IsSupported &&
1205+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
1206+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringModule , tkEvent ) )
1207+ {
1208+ continue ;
1209+ }
1210+
11671211 RuntimeEventInfo eventInfo = new RuntimeEventInfo (
11681212 tkEvent , declaringType , m_runtimeTypeCache , out bool isPrivate ) ;
11691213
@@ -1191,7 +1235,7 @@ private void PopulateEvents(
11911235
11921236 list . Add ( eventInfo ) ;
11931237 }
1194- GC . KeepAlive ( module ) ;
1238+ GC . KeepAlive ( declaringModule ) ;
11951239 }
11961240
11971241 private RuntimePropertyInfo [ ] PopulateProperties ( Filter filter )
@@ -1251,8 +1295,8 @@ private void PopulateProperties(
12511295 if ( MdToken . IsNullToken ( tkDeclaringType ) )
12521296 return ;
12531297
1254- RuntimeModule module = declaringType . GetRuntimeModule ( ) ;
1255- MetadataImport scope = module . MetadataImport ;
1298+ RuntimeModule declaringModule = declaringType . GetRuntimeModule ( ) ;
1299+ MetadataImport scope = declaringModule . MetadataImport ;
12561300
12571301 scope . EnumProperties ( tkDeclaringType , out MetadataEnumResult tkProperties ) ;
12581302
@@ -1276,6 +1320,14 @@ private void PopulateProperties(
12761320 continue ;
12771321 }
12781322
1323+ // Filter out deleted property before updating usedSlots, so that a deleted override in a subclass does not hide override in an ancestor.
1324+ if ( MetadataUpdater . IsSupported &&
1325+ RuntimeTypeMetadataUpdateHandler . FilterDeletedMembers &&
1326+ RuntimeTypeMetadataUpdateHandler . IsMetadataUpdateDeleted ( declaringModule , tkProperty ) )
1327+ {
1328+ continue ;
1329+ }
1330+
12791331 RuntimePropertyInfo propertyInfo =
12801332 new RuntimePropertyInfo (
12811333 tkProperty , declaringType , m_runtimeTypeCache , out bool isPrivate ) ;
@@ -1365,7 +1417,7 @@ private void PopulateProperties(
13651417
13661418 list . Add ( propertyInfo ) ;
13671419 }
1368- GC . KeepAlive ( module ) ;
1420+ GC . KeepAlive ( declaringModule ) ;
13691421 }
13701422 #endregion
13711423
@@ -1458,6 +1510,7 @@ private MemberInfoCache<T> GetMemberCache<T>(ref MemberInfoCache<T>? m_cache)
14581510
14591511 return existingCache ;
14601512 }
1513+
14611514 #endregion
14621515
14631516 #region Internal Members
0 commit comments