Skip to content

Commit 6000a84

Browse files
authored
Remove redundant checks in IntrinsicId switch statements (#3060)
Remove redundant checks on intrinsicIds Rename Get<Member>s(BindingFlags) enum variants Make intrinsicId a required param Add doc comments for a few intrinsicIds
1 parent 5c90985 commit 6000a84

File tree

6 files changed

+123
-90
lines changed

6 files changed

+123
-90
lines changed

src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisMethodCallPattern.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ public IEnumerable<Diagnostic> CollectDiagnostics ()
6666
{
6767
DiagnosticContext diagnosticContext = new (Operation.Syntax.GetLocation ());
6868
HandleCallAction handleCallAction = new (diagnosticContext, OwningSymbol, Operation);
69-
if (!handleCallAction.Invoke (new MethodProxy (CalledMethod), Instance, Arguments, out _, out _)) {
69+
MethodProxy method = new (CalledMethod);
70+
IntrinsicId intrinsicId = Intrinsics.GetIntrinsicIdForMethod (method);
71+
if (!handleCallAction.Invoke (method, Instance, Arguments, intrinsicId, out _)) {
7072
// If this returns false it means the intrinsic needs special handling:
7173
// case IntrinsicId.TypeDelegator_Ctor:
7274
// No diagnostics to report - this is an "identity" operation for data flow, can't produce diagnostics on its own

src/ILLink.RoslynAnalyzer/TrimAnalysis/TrimAnalysisVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,10 @@ public override MultiValue HandleMethodCall (IMethodSymbol calledMethod, MultiVa
252252

253253
var diagnosticContext = DiagnosticContext.CreateDisabled ();
254254
var handleCallAction = new HandleCallAction (diagnosticContext, Method, operation);
255+
MethodProxy method = new (calledMethod);
256+
var intrinsicId = Intrinsics.GetIntrinsicIdForMethod (method);
255257

256-
if (!handleCallAction.Invoke (new MethodProxy (calledMethod), instance, arguments, out MultiValue methodReturnValue, out var intrinsicId)) {
258+
if (!handleCallAction.Invoke (method, instance, arguments, intrinsicId, out MultiValue methodReturnValue)) {
257259
switch (intrinsicId) {
258260
case IntrinsicId.Array_Empty:
259261
methodReturnValue = ArrayValue.Create (0);

src/ILLink.Shared/TrimAnalysis/HandleCallAction.cs

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ partial struct HandleCallAction
2727
readonly FlowAnnotations _annotations;
2828
readonly RequireDynamicallyAccessedMembersAction _requireDynamicallyAccessedMembersAction;
2929

30-
public bool Invoke (MethodProxy calledMethod, MultiValue instanceValue, IReadOnlyList<MultiValue> argumentValues, out MultiValue methodReturnValue, out IntrinsicId intrinsicId)
30+
public bool Invoke (MethodProxy calledMethod, MultiValue instanceValue, IReadOnlyList<MultiValue> argumentValues, IntrinsicId intrinsicId, out MultiValue methodReturnValue)
3131
{
3232
MultiValue? returnValue = null;
3333

3434
bool requiresDataFlowAnalysis = _annotations.MethodRequiresDataFlowAnalysis (calledMethod);
3535
var annotatedMethodReturnValue = _annotations.GetMethodReturnValue (calledMethod);
3636
Debug.Assert (requiresDataFlowAnalysis || annotatedMethodReturnValue.DynamicallyAccessedMemberTypes == DynamicallyAccessedMemberTypes.None);
3737

38-
intrinsicId = Intrinsics.GetIntrinsicIdForMethod (calledMethod);
3938
switch (intrinsicId) {
4039
case IntrinsicId.IntrospectionExtensions_GetTypeInfo:
4140
Debug.Assert (instanceValue.IsEmpty ());
@@ -251,24 +250,25 @@ GenericParameterValue genericParam
251250
// GetNestedTypes (BindingFlags)
252251
// GetMembers (BindingFlags)
253252
//
254-
case var callType when (callType == IntrinsicId.Type_GetConstructors || callType == IntrinsicId.Type_GetMethods || callType == IntrinsicId.Type_GetFields ||
255-
callType == IntrinsicId.Type_GetProperties || callType == IntrinsicId.Type_GetEvents || callType == IntrinsicId.Type_GetNestedTypes || callType == IntrinsicId.Type_GetMembers)
256-
&& calledMethod.IsDeclaredOnType ("System.Type")
257-
&& calledMethod.HasParameterOfType (0, "System.Reflection.BindingFlags")
258-
&& !calledMethod.IsStatic (): {
259-
253+
case IntrinsicId.Type_GetConstructors__BindingFlags:
254+
case IntrinsicId.Type_GetMethods__BindingFlags:
255+
case IntrinsicId.Type_GetFields__BindingFlags:
256+
case IntrinsicId.Type_GetProperties__BindingFlags:
257+
case IntrinsicId.Type_GetEvents__BindingFlags:
258+
case IntrinsicId.Type_GetNestedTypes__BindingFlags:
259+
case IntrinsicId.Type_GetMembers__BindingFlags: {
260260
BindingFlags? bindingFlags;
261261
bindingFlags = GetBindingFlagsFromValue (argumentValues[0]);
262262
DynamicallyAccessedMemberTypes memberTypes;
263263
if (BindingFlagsAreUnsupported (bindingFlags)) {
264-
memberTypes = callType switch {
265-
IntrinsicId.Type_GetConstructors => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors,
266-
IntrinsicId.Type_GetMethods => DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods,
267-
IntrinsicId.Type_GetEvents => DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents,
268-
IntrinsicId.Type_GetFields => DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields,
269-
IntrinsicId.Type_GetProperties => DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties,
270-
IntrinsicId.Type_GetNestedTypes => DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes,
271-
IntrinsicId.Type_GetMembers => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors |
264+
memberTypes = intrinsicId switch {
265+
IntrinsicId.Type_GetConstructors__BindingFlags => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors,
266+
IntrinsicId.Type_GetMethods__BindingFlags => DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods,
267+
IntrinsicId.Type_GetEvents__BindingFlags => DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents,
268+
IntrinsicId.Type_GetFields__BindingFlags => DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields,
269+
IntrinsicId.Type_GetProperties__BindingFlags => DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties,
270+
IntrinsicId.Type_GetNestedTypes__BindingFlags => DynamicallyAccessedMemberTypes.PublicNestedTypes | DynamicallyAccessedMemberTypes.NonPublicNestedTypes,
271+
IntrinsicId.Type_GetMembers__BindingFlags => DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors |
272272
DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents |
273273
DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields |
274274
DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods |
@@ -277,14 +277,14 @@ GenericParameterValue genericParam
277277
_ => throw new ArgumentException ($"Reflection call '{calledMethod.GetDisplayName ()}' inside '{GetContainingSymbolDisplayName ()}' is of unexpected member type."),
278278
};
279279
} else {
280-
memberTypes = callType switch {
281-
IntrinsicId.Type_GetConstructors => GetDynamicallyAccessedMemberTypesFromBindingFlagsForConstructors (bindingFlags),
282-
IntrinsicId.Type_GetMethods => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMethods (bindingFlags),
283-
IntrinsicId.Type_GetEvents => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
284-
IntrinsicId.Type_GetFields => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
285-
IntrinsicId.Type_GetProperties => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
286-
IntrinsicId.Type_GetNestedTypes => GetDynamicallyAccessedMemberTypesFromBindingFlagsForNestedTypes (bindingFlags),
287-
IntrinsicId.Type_GetMembers => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMembers (bindingFlags),
280+
memberTypes = intrinsicId switch {
281+
IntrinsicId.Type_GetConstructors__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForConstructors (bindingFlags),
282+
IntrinsicId.Type_GetMethods__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMethods (bindingFlags),
283+
IntrinsicId.Type_GetEvents__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
284+
IntrinsicId.Type_GetFields__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
285+
IntrinsicId.Type_GetProperties__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
286+
IntrinsicId.Type_GetNestedTypes__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForNestedTypes (bindingFlags),
287+
IntrinsicId.Type_GetMembers__BindingFlags => GetDynamicallyAccessedMemberTypesFromBindingFlagsForMembers (bindingFlags),
288288
_ => throw new ArgumentException ($"Reflection call '{calledMethod.GetDisplayName ()}' inside '{GetContainingSymbolDisplayName ()}' is of unexpected member type."),
289289
};
290290
}
@@ -307,11 +307,9 @@ GenericParameterValue genericParam
307307
// GetProperty (string, Type, Type[], ParameterModifier[])
308308
// GetProperty (string, BindingFlags, Binder, Type, Type[], ParameterModifier[])
309309
//
310-
case var fieldPropertyOrEvent when (fieldPropertyOrEvent == IntrinsicId.Type_GetField || fieldPropertyOrEvent == IntrinsicId.Type_GetProperty || fieldPropertyOrEvent == IntrinsicId.Type_GetEvent)
311-
&& calledMethod.IsDeclaredOnType ("System.Type")
312-
&& calledMethod.HasParameterOfType (0, "System.String")
313-
&& !calledMethod.IsStatic (): {
314-
310+
case IntrinsicId.Type_GetField:
311+
case IntrinsicId.Type_GetProperty:
312+
case IntrinsicId.Type_GetEvent: {
315313
if (instanceValue.IsEmpty () || argumentValues[0].IsEmpty ()) {
316314
returnValue = MultiValueLattice.Top;
317315
break;
@@ -324,7 +322,7 @@ GenericParameterValue genericParam
324322
// Assume a default value for BindingFlags for methods that don't use BindingFlags as a parameter
325323
bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
326324

327-
DynamicallyAccessedMemberTypes memberTypes = fieldPropertyOrEvent switch {
325+
DynamicallyAccessedMemberTypes memberTypes = intrinsicId switch {
328326
IntrinsicId.Type_GetEvent => GetDynamicallyAccessedMemberTypesFromBindingFlagsForEvents (bindingFlags),
329327
IntrinsicId.Type_GetField => GetDynamicallyAccessedMemberTypesFromBindingFlagsForFields (bindingFlags),
330328
IntrinsicId.Type_GetProperty => GetDynamicallyAccessedMemberTypesFromBindingFlagsForProperties (bindingFlags),
@@ -336,7 +334,7 @@ GenericParameterValue genericParam
336334
if (value is SystemTypeValue systemTypeValue) {
337335
foreach (var stringParam in argumentValues[0]) {
338336
if (stringParam is KnownStringValue stringValue && !BindingFlagsAreUnsupported (bindingFlags)) {
339-
switch (fieldPropertyOrEvent) {
337+
switch (intrinsicId) {
340338
case IntrinsicId.Type_GetEvent:
341339
MarkEventsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
342340
break;
@@ -527,18 +525,18 @@ GenericParameterValue genericParam
527525
// static GetRuntimeMethod (this Type type, string name, Type[] parameters)
528526
// static GetRuntimeProperty (this Type type, string name)
529527
//
530-
case var getRuntimeMember when getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent
531-
|| getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField
532-
|| getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod
533-
|| getRuntimeMember == IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty: {
528+
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent:
529+
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField:
530+
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod:
531+
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeProperty: {
534532

535533
if (argumentValues[0].IsEmpty () || argumentValues[1].IsEmpty ()) {
536534
returnValue = MultiValueLattice.Top;
537535
break;
538536
}
539537

540538
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
541-
DynamicallyAccessedMemberTypes requiredMemberTypes = getRuntimeMember switch {
539+
DynamicallyAccessedMemberTypes requiredMemberTypes = intrinsicId switch {
542540
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent => DynamicallyAccessedMemberTypes.PublicEvents,
543541
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeField => DynamicallyAccessedMemberTypes.PublicFields,
544542
IntrinsicId.RuntimeReflectionExtensions_GetRuntimeMethod => DynamicallyAccessedMemberTypes.PublicMethods,
@@ -552,7 +550,7 @@ GenericParameterValue genericParam
552550
if (value is SystemTypeValue systemTypeValue) {
553551
foreach (var stringParam in argumentValues[1]) {
554552
if (stringParam is KnownStringValue stringValue) {
555-
switch (getRuntimeMember) {
553+
switch (intrinsicId) {
556554
case IntrinsicId.RuntimeReflectionExtensions_GetRuntimeEvent:
557555
MarkEventsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
558556
break;
@@ -642,8 +640,9 @@ GenericParameterValue genericParam
642640
// static Field (Expression, Type, String)
643641
// static Property (Expression, Type, String)
644642
//
645-
case var fieldOrPropertyInstrinsic when fieldOrPropertyInstrinsic == IntrinsicId.Expression_Field || fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property: {
646-
DynamicallyAccessedMemberTypes memberTypes = fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property
643+
case IntrinsicId.Expression_Field:
644+
case IntrinsicId.Expression_Property: {
645+
DynamicallyAccessedMemberTypes memberTypes = intrinsicId == IntrinsicId.Expression_Property
647646
? DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties
648647
: DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields;
649648

@@ -658,7 +657,7 @@ GenericParameterValue genericParam
658657
foreach (var stringParam in argumentValues[2]) {
659658
if (stringParam is KnownStringValue stringValue) {
660659
BindingFlags bindingFlags = argumentValues[0].AsSingleValue () is NullValue ? BindingFlags.Static : BindingFlags.Default;
661-
if (fieldOrPropertyInstrinsic == IntrinsicId.Expression_Property) {
660+
if (intrinsicId == IntrinsicId.Expression_Property) {
662661
MarkPropertiesOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
663662
} else {
664663
MarkFieldsOnTypeHierarchy (systemTypeValue.RepresentedType, stringValue.Contents, bindingFlags);
@@ -1015,7 +1014,7 @@ GenericParameterValue genericParam
10151014
// static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture)
10161015
// static CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes) { throw null; }
10171016
//
1018-
case IntrinsicId.Activator_CreateInstance_Type: {
1017+
case IntrinsicId.Activator_CreateInstance__Type: {
10191018
int? ctorParameterCount = null;
10201019
BindingFlags bindingFlags = BindingFlags.Instance;
10211020
if (calledMethod.GetParametersCount () > 1) {
@@ -1085,7 +1084,7 @@ GenericParameterValue genericParam
10851084
// static CreateInstance (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes)
10861085
// static CreateInstance (string assemblyName, string typeName, object?[]? activationAttributes)
10871086
//
1088-
case IntrinsicId.Activator_CreateInstance_AssemblyName_TypeName:
1087+
case IntrinsicId.Activator_CreateInstance__AssemblyName_TypeName:
10891088
ProcessCreateInstanceByName (calledMethod, argumentValues);
10901089
break;
10911090

@@ -1119,10 +1118,10 @@ GenericParameterValue genericParam
11191118
// CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object? []? args, System.Globalization.CultureInfo? culture, object? []? activationAttributes)
11201119
// CreateInstanceFromAndUnwrap (string assemblyFile, string typeName, object? []? activationAttributes)
11211120
//
1122-
case var appDomainCreateInstance when appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstance
1123-
|| appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceAndUnwrap
1124-
|| appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFrom
1125-
|| appDomainCreateInstance == IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
1121+
case IntrinsicId.AppDomain_CreateInstance:
1122+
case IntrinsicId.AppDomain_CreateInstanceAndUnwrap:
1123+
case IntrinsicId.AppDomain_CreateInstanceFrom:
1124+
case IntrinsicId.AppDomain_CreateInstanceFromAndUnwrap:
11261125
ProcessCreateInstanceByName (calledMethod, argumentValues);
11271126
break;
11281127

src/ILLink.Shared/TrimAnalysis/IntrinsicId.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,42 @@ namespace ILLink.Shared.TrimAnalysis
1010
enum IntrinsicId
1111
{
1212
None = 0,
13+
/// <summary>
14+
/// <see cref="System.Reflection.IntrospectionExtensions.GetTypeInfo(System.Type)"/>
15+
/// </summary>
1316
IntrospectionExtensions_GetTypeInfo,
17+
/// <summary>
18+
/// <see cref="System.Type.GetTypeFromHandle(System.RuntimeTypeHandle)"/>
19+
/// </summary>
1420
Type_GetTypeFromHandle,
21+
/// <summary>
22+
/// <see cref="System.Type.TypeHandle"/>
23+
/// </summary>
1524
Type_get_TypeHandle,
25+
/// <summary>
26+
/// <see cref="System.Object.GetType()"/>
27+
/// </summary>
1628
Object_GetType,
29+
/// <summary>
30+
/// <see cref="System.Reflection.TypeDelegator()"/>
31+
/// </summary>
1732
TypeDelegator_Ctor,
33+
/// <summary>
34+
/// <see cref="System.Array.Empty{T}"/>
35+
/// </summary>
1836
Array_Empty,
37+
/// <summary>
38+
/// <see cref="System.Reflection.TypeInfo.AsType()"/>
39+
/// </summary>
1940
TypeInfo_AsType,
41+
/// <summary>
42+
/// <see cref="System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle)"/> or
43+
/// <see cref="System.Reflection.MethodBase.GetMethodFromHandle(System.RuntimeMethodHandle, System.RuntimeTypeHandle)"/>
44+
/// </summary>
2045
MethodBase_GetMethodFromHandle,
46+
/// <summary>
47+
/// <see cref="System.Reflection.MethodBase.MethodHandle"/>
48+
/// </summary>
2149
MethodBase_get_MethodHandle,
2250

2351
// Anything above this marker will require the method to be run through
@@ -26,19 +54,19 @@ enum IntrinsicId
2654
Type_MakeGenericType,
2755
Type_GetType,
2856
Type_GetConstructor,
29-
Type_GetConstructors,
57+
Type_GetConstructors__BindingFlags,
3058
Type_GetMethod,
31-
Type_GetMethods,
59+
Type_GetMethods__BindingFlags,
3260
Type_GetField,
33-
Type_GetFields,
61+
Type_GetFields__BindingFlags,
3462
Type_GetProperty,
35-
Type_GetProperties,
63+
Type_GetProperties__BindingFlags,
3664
Type_GetEvent,
37-
Type_GetEvents,
65+
Type_GetEvents__BindingFlags,
3866
Type_GetNestedType,
39-
Type_GetNestedTypes,
67+
Type_GetNestedTypes__BindingFlags,
4068
Type_GetMember,
41-
Type_GetMembers,
69+
Type_GetMembers__BindingFlags,
4270
Type_GetInterface,
4371
Type_get_AssemblyQualifiedName,
4472
Type_get_UnderlyingSystemType,
@@ -53,8 +81,8 @@ enum IntrinsicId
5381
Marshal_PtrToStructure,
5482
Marshal_DestroyStructure,
5583
Marshal_GetDelegateForFunctionPointer,
56-
Activator_CreateInstance_Type,
57-
Activator_CreateInstance_AssemblyName_TypeName,
84+
Activator_CreateInstance__Type,
85+
Activator_CreateInstance__AssemblyName_TypeName,
5886
Activator_CreateInstanceFrom,
5987
AppDomain_CreateInstance,
6088
AppDomain_CreateInstanceAndUnwrap,

0 commit comments

Comments
 (0)