Skip to content

Commit 1ab4f08

Browse files
committed
Add a generic instance test
1 parent 815ff0d commit 1ab4f08

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

src/native/managed/cdacreader/tests/MethodTableTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)