@@ -261,4 +261,58 @@ public void MethodTableEEClassInvalidThrows(MockTarget.Architecture arch)
261261 Assert . Throws < InvalidOperationException > ( ( ) => metadataContract . GetMethodTableHandle ( badMethodTablePtr ) ) ;
262262 } ) ;
263263 }
264+
265+ [ Theory ]
266+ [ ClassData ( typeof ( MockTarget . StdArch ) ) ]
267+ public void MethodTableGenericInstValid ( MockTarget . Architecture arch )
268+ {
269+ TargetTestHelpers targetTestHelpers = new ( arch ) ;
270+ const ulong SystemObjectMethodTableAddress = 0x00000000_7c000010 ;
271+ const ulong SystemObjectEEClassAddress = 0x00000000_7c0000d0 ;
272+ TargetPointer systemObjectMethodTablePtr = new TargetPointer ( SystemObjectMethodTableAddress ) ;
273+ TargetPointer systemObjectEEClassPtr = new TargetPointer ( SystemObjectEEClassAddress ) ;
274+
275+ const ulong genericDefinitionMethodTableAddress = 0x00000000_5d004040 ;
276+ const ulong genericDefinitionEEClassAddress = 0x00000000_5d0040c0 ;
277+ TargetPointer genericDefinitionMethodTablePtr = new TargetPointer ( genericDefinitionMethodTableAddress ) ;
278+ TargetPointer genericDefinitionEEClassPtr = new TargetPointer ( genericDefinitionEEClassAddress ) ;
279+
280+ const ulong genericInstanceMethodTableAddress = 0x00000000_330000a0 ;
281+ TargetPointer genericInstanceMethodTablePtr = new TargetPointer ( genericInstanceMethodTableAddress ) ;
282+
283+ const int numMethods = 17 ;
284+
285+ RTSContractHelper ( arch ,
286+ ( builder ) =>
287+ {
288+ builder = AddSystemObject ( targetTestHelpers , builder , systemObjectMethodTablePtr , systemObjectEEClassPtr ) ;
289+
290+ System . Reflection . TypeAttributes typeAttributes = System . Reflection . TypeAttributes . Public | System . Reflection . TypeAttributes . Class ;
291+ const int numInterfaces = 0 ;
292+ const int numVirtuals = 3 ;
293+ const uint gtd_mtflags = 0x00000030 ; // TODO: GenericsMask_TypicalInst
294+ builder = AddEEClass ( targetTestHelpers , builder , genericDefinitionEEClassPtr , "EEClass GenericDefinition" , genericDefinitionMethodTablePtr , attr : ( uint ) typeAttributes , numMethods : numMethods ) ;
295+ builder = AddMethodTable ( targetTestHelpers , builder , genericDefinitionMethodTablePtr , "MethodTable GenericDefinition" , genericDefinitionEEClassPtr ,
296+ mtflags : gtd_mtflags , mtflags2 : default , baseSize : targetTestHelpers . ObjectBaseSize ,
297+ module : TargetPointer . Null , parentMethodTable : systemObjectMethodTablePtr , numInterfaces : numInterfaces , numVirtuals : numVirtuals ) ;
298+
299+ const uint ginst_mtflags = 0x00000010 ; // TODO: GenericsMask_GenericInst
300+ TargetPointer ginstCanonMT = new TargetPointer ( genericDefinitionMethodTablePtr . Value | ( ulong ) 1 ) ;
301+ builder = AddMethodTable ( targetTestHelpers , builder , genericInstanceMethodTablePtr , "MethodTable GenericInstance" , eeClassOrCanonMT : ginstCanonMT ,
302+ mtflags : ginst_mtflags , mtflags2 : default , baseSize : targetTestHelpers . ObjectBaseSize ,
303+ module : TargetPointer . Null , parentMethodTable : genericDefinitionMethodTablePtr , numInterfaces : numInterfaces , numVirtuals : numVirtuals ) ;
304+
305+ return builder ;
306+ } ,
307+ ( target ) =>
308+ {
309+ Contracts . IRuntimeTypeSystem metadataContract = target . Contracts . RuntimeTypeSystem ;
310+ Assert . NotNull ( metadataContract ) ;
311+ Contracts . MethodTableHandle genericInstanceMethodTableHandle = metadataContract . GetMethodTableHandle ( genericInstanceMethodTablePtr ) ;
312+ Assert . Equal ( genericInstanceMethodTablePtr . Value , genericInstanceMethodTableHandle . Address . Value ) ;
313+ Assert . False ( metadataContract . IsFreeObjectMethodTable ( genericInstanceMethodTableHandle ) ) ;
314+ Assert . False ( metadataContract . IsString ( genericInstanceMethodTableHandle ) ) ;
315+ Assert . Equal ( numMethods , metadataContract . GetNumMethods ( genericInstanceMethodTableHandle ) ) ;
316+ } ) ;
317+ }
264318}
0 commit comments