Skip to content

Commit e461b77

Browse files
authored
Annotate System.Private.DataContractSerialization (#73977)
Add RDC annotations to System.Private.DataContractSerialization and enable AOT analyzer
1 parent 481c056 commit e461b77

File tree

54 files changed

+767
-4
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+767
-4
lines changed

src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
66
<!-- Too much private reflection. Do not bother with trimming -->
77
<ILLinkTrimAssembly>false</ILLinkTrimAssembly>
8+
<EnableAOTAnalyzer>true</EnableAOTAnalyzer>
89
</PropertyGroup>
910

1011
<PropertyGroup>

src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/AccessorBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal static class FastInvokerBuilder
2626
private static readonly MethodInfo s_createSetterInternal = typeof(FastInvokerBuilder).GetMethod(nameof(CreateSetterInternal), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;
2727
private static readonly MethodInfo s_make = typeof(FastInvokerBuilder).GetMethod(nameof(Make), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;
2828

29+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
2930
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
3031
Justification = "The call to MakeGenericMethod is safe due to the fact that we are preserving the constructors of type which is what Make() is doing.")]
3132
public static Func<object> GetMakeNewInstanceFunc(
@@ -67,7 +68,9 @@ public static Getter CreateGetter(MemberInfo memberInfo)
6768
// Only JIT if dynamic code is supported.
6869
if (RuntimeFeature.IsDynamicCodeSupported || (!declaringType.IsValueType && !propertyType.IsValueType))
6970
{
71+
#pragma warning disable IL3050 // AOT compiling should recognize that this call is gated by RuntimeFeature.IsDynamicCodeSupported.
7072
var createGetterGeneric = s_createGetterInternal.MakeGenericMethod(declaringType, propertyType).CreateDelegate<Func<PropertyInfo, Getter>>();
73+
#pragma warning restore IL3050 // Calling members annotated with 'RequiresDynamicCodeAttribute' may break functionality when AOT compiling.
7174
return createGetterGeneric(propInfo);
7275
}
7376
else
@@ -122,7 +125,9 @@ public static Setter CreateSetter(MemberInfo memberInfo)
122125
// Only JIT if dynamic code is supported.
123126
if (RuntimeFeature.IsDynamicCodeSupported || (!declaringType.IsValueType && !propertyType.IsValueType))
124127
{
128+
#pragma warning disable IL3050 // AOT compiling should recognize that this call is gated by RuntimeFeature.IsDynamicCodeSupported.
125129
var createSetterGeneric = s_createSetterInternal.MakeGenericMethod(propInfo.DeclaringType!, propInfo.PropertyType).CreateDelegate<Func<PropertyInfo, Setter>>();
130+
#pragma warning restore IL3050 // Calling members annotated with 'RequiresDynamicCodeAttribute' may break functionality when AOT compiling.
126131
return createSetterGeneric(propInfo);
127132
}
128133
else

src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ internal sealed class ClassDataContract : DataContract
3131

3232
private ClassDataContractCriticalHelper _helper;
3333

34+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
3435
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
3536
internal ClassDataContract(Type type) : base(new ClassDataContractCriticalHelper(type))
3637
{
3738
InitClassDataContract();
3839
}
3940

41+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
4042
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
4143
private ClassDataContract(Type type, XmlDictionaryString ns, string[] memberNames) : base(new ClassDataContractCriticalHelper(type, ns, memberNames))
4244
{
@@ -54,6 +56,7 @@ private void InitClassDataContract()
5456

5557
public override DataContract? BaseContract
5658
{
59+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
5760
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
5861
get => BaseClassContract;
5962
}
@@ -74,6 +77,7 @@ internal List<DataMember>? Members
7477

7578
internal XmlDictionaryString?[]? ChildElementNamespaces
7679
{
80+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
7781
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
7882
get
7983
{
@@ -109,6 +113,7 @@ internal XmlDictionaryString?[]? ChildElementNamespaces
109113

110114
public override DataContractDictionary? KnownDataContracts
111115
{
116+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
112117
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
113118
get => _helper.KnownDataContracts;
114119
internal set => _helper.KnownDataContracts = value;
@@ -148,8 +153,13 @@ public override bool IsISerializable
148153
}
149154

150155
private Func<object>? _makeNewInstance;
156+
157+
[UnconditionalSuppressMessage("AOT Analysis", "IL3050:RequiresDynamicCodeAttribute",
158+
Justification = "Fields cannot be annotated, annotating the use instead")]
151159
private Func<object> MakeNewInstance => _makeNewInstance ??= FastInvokerBuilder.GetMakeNewInstanceFunc(UnderlyingType);
152160

161+
162+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
153163
internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out object? obj)
154164
{
155165
ConstructorInfo? ci = GetNonAttributedTypeConstructor();
@@ -172,6 +182,7 @@ internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out obj
172182
return true;
173183
}
174184

185+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
175186
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
176187
private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate()
177188
{
@@ -181,6 +192,7 @@ private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate()
181192

182193
internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
183194
{
195+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
184196
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
185197
get
186198
{
@@ -200,6 +212,7 @@ internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
200212
}
201213
}
202214

215+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
203216
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
204217
private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate()
205218
{
@@ -209,6 +222,7 @@ private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate()
209222

210223
internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
211224
{
225+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
212226
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
213227
get
214228
{
@@ -232,6 +246,7 @@ internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
232246
}
233247
}
234248

249+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
235250
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
236251
internal static ClassDataContract CreateClassDataContractForKeyValue(Type type, XmlDictionaryString ns, string[] memberNames)
237252
{
@@ -255,6 +270,7 @@ internal static void CheckAndAddMember(List<DataMember> members, DataMember memb
255270
members.Add(memberContract);
256271
}
257272

273+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
258274
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
259275
internal static XmlDictionaryString? GetChildNamespaceToDeclare(DataContract dataContract, Type childType, XmlDictionary dictionary)
260276
{
@@ -331,6 +347,7 @@ internal static bool IsNonAttributedTypeValidForSerialization(
331347
type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, Type.EmptyTypes) != null);
332348
}
333349

350+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
334351
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
335352
private XmlDictionaryString?[]? CreateChildElementNamespaces()
336353
{
@@ -359,13 +376,15 @@ private void EnsureMethodsImported()
359376
_helper.EnsureMethodsImported();
360377
}
361378

379+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
362380
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
363381
internal override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context)
364382
{
365383
Debug.Assert(context != null);
366384
XmlFormatWriterDelegate(xmlWriter, obj, context, this);
367385
}
368386

387+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
369388
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
370389
internal override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context)
371390
{
@@ -604,6 +623,7 @@ private sealed class ClassDataContractCriticalHelper : DataContract.DataContract
604623
internal XmlDictionaryString[]? MemberNames;
605624
internal XmlDictionaryString[]? MemberNamespaces;
606625

626+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
607627
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
608628
internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
609629
Type type) : base(type)
@@ -707,6 +727,7 @@ internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(DataContrac
707727
EnsureMethodsImported();
708728
}
709729

730+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
710731
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
711732
internal ClassDataContractCriticalHelper(
712733
[DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
@@ -782,6 +803,7 @@ private void EnsureIsReferenceImported(Type type)
782803

783804
[MemberNotNull(nameof(_members))]
784805
[MemberNotNull(nameof(Members))]
806+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
785807
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
786808
private void ImportDataMembers()
787809
{
@@ -942,6 +964,7 @@ private void ImportDataMembers()
942964
Debug.Assert(Members != null);
943965
}
944966

967+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
945968
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
946969
private static bool SetIfGetOnlyCollection(DataMember memberContract, bool skipIfReadOnlyContract)
947970
{
@@ -1016,6 +1039,7 @@ private void SetIfMembersHaveConflict(List<DataMember> members)
10161039
}
10171040
}
10181041

1042+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
10191043
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
10201044
private XmlQualifiedName GetXmlNameAndSetHasDataContract(Type type)
10211045
{
@@ -1186,6 +1210,7 @@ internal MethodInfo? ExtensionDataSetMethod
11861210

11871211
internal override DataContractDictionary? KnownDataContracts
11881212
{
1213+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
11891214
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
11901215
get
11911216
{
@@ -1289,6 +1314,7 @@ public int Compare(Member x, Member y)
12891314
}
12901315
}
12911316

1317+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
12921318
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
12931319
internal override DataContract BindGenericParameters(DataContract[] paramContracts, Dictionary<DataContract, DataContract>? boundContracts = null)
12941320
{
@@ -1357,6 +1383,8 @@ internal override DataContract BindGenericParameters(DataContract[] paramContrac
13571383
}
13581384
}
13591385

1386+
[UnconditionalSuppressMessage("AOT Analysis", "IL3050:RequiresDynamicCode",
1387+
Justification = "All ctor's required to create an instance of this type are marked with RequiresDynamicCode.")]
13601388
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
13611389
Justification = "All ctor's required to create an instance of this type are marked with RequiresUnreferencedCode.")]
13621390
internal override bool Equals(object? other, HashSet<DataContractPairKey>? checkedContracts)

src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/CodeGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ internal void BeginMethod(DynamicMethod dynamicMethod, Type delegateType, string
117117
InitILGeneration(methodName, argTypes);
118118
}
119119

120+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
120121
internal void BeginMethod(string methodName, Type delegateType, bool allowPrivateMemberAccess)
121122
{
122123
MethodInfo signature = GetInvokeMethod(delegateType);
@@ -128,6 +129,7 @@ internal void BeginMethod(string methodName, Type delegateType, bool allowPrivat
128129
_delegateType = delegateType;
129130
}
130131

132+
[RequiresDynamicCode(DataContract.SerializerAOTWarning)]
131133
private void BeginMethod(Type returnType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess)
132134
{
133135
_dynamicMethod = new DynamicMethod(methodName, returnType, argTypes, SerializationModule, allowPrivateMemberAccess);

0 commit comments

Comments
 (0)