Skip to content

Commit 5a6560a

Browse files
Ensure Array.CreateInstance for reference types works (#101048)
Follow up to #100626. The original fix only worked for unoptimized builds because the list of templates doesn't survive from scanning phase (when we do dataflow) to codegen phase (when we no longer do dataflow). The test that this was supposed to fix is still failing in #100331.
1 parent 5266d98 commit 5a6560a

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Dataflow/ReflectionMethodBodyScanner.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ public static bool HandleCall(
536536
{
537537
// We could try to analyze if the type is known, but for now making sure this works for canonical arrays is enough.
538538
TypeDesc canonArrayType = reflectionMarker.Factory.TypeSystemContext.CanonType.MakeArrayType();
539-
reflectionMarker.Dependencies.Add(reflectionMarker.Factory.NativeLayout.TemplateTypeLayout(canonArrayType), "Array.CreateInstance was called");
539+
reflectionMarker.MarkType(diagnosticContext.Origin, canonArrayType, "Array.CreateInstance was called");
540540
goto case IntrinsicId.None;
541541
}
542542

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReflectedTypeNode.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,17 @@ public ReflectedTypeNode(TypeDesc type)
3434

3535
public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory factory)
3636
{
37-
return new DependencyListEntry[]
38-
{
39-
new DependencyListEntry(factory.MaximallyConstructableType(_type), "Reflection target"),
40-
};
37+
var result = new DependencyList
38+
{
39+
new DependencyListEntry(factory.MaximallyConstructableType(_type), "Reflection target"),
40+
};
41+
42+
if (_type.IsCanonicalSubtype(CanonicalFormKind.Any))
43+
{
44+
GenericTypesTemplateMap.GetTemplateTypeDependencies(ref result, factory, _type);
45+
}
46+
47+
return result;
4148
}
4249
protected override string GetName(NodeFactory factory)
4350
{

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,12 @@ public bool IsReflectionBlocked(TypeDesc type)
10301030
case TypeFlags.Array:
10311031
case TypeFlags.Pointer:
10321032
case TypeFlags.ByRef:
1033-
return IsReflectionBlocked(((ParameterizedType)type).ParameterType);
1033+
TypeDesc parameterType = ((ParameterizedType)type).ParameterType;
1034+
1035+
if (parameterType.IsCanonicalDefinitionType(CanonicalFormKind.Any))
1036+
return false;
1037+
1038+
return IsReflectionBlocked(parameterType);
10341039

10351040
case TypeFlags.FunctionPointer:
10361041
MethodSignature pointerSignature = ((FunctionPointerType)type).Signature;

0 commit comments

Comments
 (0)