@@ -264,7 +264,7 @@ public void MethodTableEEClassInvalidThrows(MockTarget.Architecture arch)
264
264
265
265
[ Theory ]
266
266
[ ClassData ( typeof ( MockTarget . StdArch ) ) ]
267
- public void MethodTableGenericInstValid ( MockTarget . Architecture arch )
267
+ public void ValidateGenericInstMethodTable ( MockTarget . Architecture arch )
268
268
{
269
269
TargetTestHelpers targetTestHelpers = new ( arch ) ;
270
270
const ulong SystemObjectMethodTableAddress = 0x00000000_7c000010 ;
@@ -315,4 +315,62 @@ public void MethodTableGenericInstValid(MockTarget.Architecture arch)
315
315
Assert . Equal ( numMethods , metadataContract . GetNumMethods ( genericInstanceMethodTableHandle ) ) ;
316
316
} ) ;
317
317
}
318
+
319
+ [ Theory ]
320
+ [ ClassData ( typeof ( MockTarget . StdArch ) ) ]
321
+ public void ValidateArrayInstMethodTable ( MockTarget . Architecture arch )
322
+ {
323
+ TargetTestHelpers targetTestHelpers = new ( arch ) ;
324
+ const ulong SystemObjectMethodTableAddress = 0x00000000_7c000010 ;
325
+ const ulong SystemObjectEEClassAddress = 0x00000000_7c0000d0 ;
326
+ TargetPointer systemObjectMethodTablePtr = new TargetPointer ( SystemObjectMethodTableAddress ) ;
327
+ TargetPointer systemObjectEEClassPtr = new TargetPointer ( SystemObjectEEClassAddress ) ;
328
+
329
+ const ulong SystemArrayMethodTableAddress = 0x00000000_7c00a010 ;
330
+ const ulong SystemArrayEEClassAddress = 0x00000000_7c00a0d0 ;
331
+ TargetPointer systemArrayMethodTablePtr = new TargetPointer ( SystemArrayMethodTableAddress ) ;
332
+ TargetPointer systemArrayEEClassPtr = new TargetPointer ( SystemArrayEEClassAddress ) ;
333
+
334
+ const ulong arrayInstanceMethodTableAddress = 0x00000000_330000a0 ;
335
+ const ulong arrayInstanceEEClassAddress = 0x00000000_330001d0 ;
336
+ TargetPointer arrayInstanceMethodTablePtr = new TargetPointer ( arrayInstanceMethodTableAddress ) ;
337
+ TargetPointer arrayInstanceEEClassPtr = new TargetPointer ( arrayInstanceEEClassAddress ) ;
338
+
339
+ const uint arrayInstanceComponentSize = 392 ;
340
+
341
+ RTSContractHelper ( arch ,
342
+ ( builder ) =>
343
+ {
344
+ builder = AddSystemObject ( targetTestHelpers , builder , systemObjectMethodTablePtr , systemObjectEEClassPtr ) ;
345
+ const ushort systemArrayNumInterfaces = 4 ;
346
+ const ushort systemArrayNumMethods = 37 ; // Arbitrary. Not trying to exactly match the real System.Array
347
+ const uint systemArrayCorTypeAttr = ( uint ) ( System . Reflection . TypeAttributes . Public | System . Reflection . TypeAttributes . Class ) ;
348
+
349
+ builder = AddEEClass ( targetTestHelpers , builder , systemArrayEEClassPtr , "EEClass System.Array" , systemArrayMethodTablePtr , attr : systemArrayCorTypeAttr , numMethods : systemArrayNumMethods ) ;
350
+ builder = AddMethodTable ( targetTestHelpers , builder , systemArrayMethodTablePtr , "MethodTable System.Array" , systemArrayEEClassPtr ,
351
+ mtflags : default , mtflags2 : default , baseSize : targetTestHelpers . ObjectBaseSize ,
352
+ module : TargetPointer . Null , parentMethodTable : systemObjectMethodTablePtr , numInterfaces : systemArrayNumInterfaces , numVirtuals : 3 ) ;
353
+
354
+ const uint arrayInst_mtflags = ( uint ) ( RuntimeTypeSystem_1 . WFLAGS_HIGH . HasComponentSize | RuntimeTypeSystem_1 . WFLAGS_HIGH . Category_Array ) | arrayInstanceComponentSize ;
355
+ const uint arrayInstCorTypeAttr = ( uint ) ( System . Reflection . TypeAttributes . Public | System . Reflection . TypeAttributes . Class | System . Reflection . TypeAttributes . Sealed ) ;
356
+
357
+ builder = AddEEClass ( targetTestHelpers , builder , arrayInstanceEEClassPtr , "EEClass ArrayInstance" , arrayInstanceMethodTablePtr , attr : arrayInstCorTypeAttr , numMethods : systemArrayNumMethods ) ;
358
+ builder = AddMethodTable ( targetTestHelpers , builder , arrayInstanceMethodTablePtr , "MethodTable ArrayInstance" , arrayInstanceEEClassPtr ,
359
+ mtflags : arrayInst_mtflags , mtflags2 : default , baseSize : targetTestHelpers . ObjectBaseSize ,
360
+ module : TargetPointer . Null , parentMethodTable : systemArrayMethodTablePtr , numInterfaces : systemArrayNumInterfaces , numVirtuals : 3 ) ;
361
+
362
+ return builder ;
363
+ } ,
364
+ ( target ) =>
365
+ {
366
+ Contracts . IRuntimeTypeSystem metadataContract = target . Contracts . RuntimeTypeSystem ;
367
+ Assert . NotNull ( metadataContract ) ;
368
+ Contracts . MethodTableHandle arrayInstanceMethodTableHandle = metadataContract . GetMethodTableHandle ( arrayInstanceMethodTablePtr ) ;
369
+ Assert . Equal ( arrayInstanceMethodTablePtr . Value , arrayInstanceMethodTableHandle . Address . Value ) ;
370
+ Assert . False ( metadataContract . IsFreeObjectMethodTable ( arrayInstanceMethodTableHandle ) ) ;
371
+ Assert . False ( metadataContract . IsString ( arrayInstanceMethodTableHandle ) ) ;
372
+ Assert . Equal ( arrayInstanceComponentSize , metadataContract . GetComponentSize ( arrayInstanceMethodTableHandle ) ) ;
373
+ } ) ;
374
+
375
+ }
318
376
}
0 commit comments