Skip to content

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
Expand All @@ -23,12 +24,18 @@ internal static class FastInvokerBuilder
private static readonly MethodInfo s_createSetterInternal = typeof(FastInvokerBuilder).GetMethod(nameof(CreateSetterInternal), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;
private static readonly MethodInfo s_make = typeof(FastInvokerBuilder).GetMethod(nameof(Make), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!;

public static Func<object> GetMakeNewInstanceFunc(Type type)
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
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.")]
public static Func<object> GetMakeNewInstanceFunc(
Comment thread
joperezr marked this conversation as resolved.
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
Type type)
{
Func<object> make = s_make.MakeGenericMethod(type).CreateDelegate<Func<object>>();
return make;
}

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateGetterInternal<T, T1> is not annotated.")]
public static Getter CreateGetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo propInfo)
Expand All @@ -51,6 +58,8 @@ public static Getter CreateGetter(MemberInfo memberInfo)
}
}

[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
Justification = "The call to MakeGenericMethod is safe due to the fact that FastInvokerBuilder.CreateSetterInternal<T, T1> is not annotated.")]
public static Setter CreateSetter(MemberInfo memberInfo)
{
if (memberInfo is PropertyInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,21 @@ internal sealed class ClassDataContract : DataContract

private bool _isScriptObject;

internal const DynamicallyAccessedMemberTypes DataContractPreserveMemberTypes =
DynamicallyAccessedMemberTypes.PublicMethods |
DynamicallyAccessedMemberTypes.NonPublicMethods |
DynamicallyAccessedMemberTypes.PublicConstructors |
DynamicallyAccessedMemberTypes.NonPublicConstructors |
DynamicallyAccessedMemberTypes.PublicFields |
DynamicallyAccessedMemberTypes.PublicProperties;

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContract(Type type) : base(new ClassDataContractCriticalHelper(type))
{
InitClassDataContract();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private ClassDataContract(Type type, XmlDictionaryString ns, string[] memberNames) : base(new ClassDataContractCriticalHelper(type, ns, memberNames))
{
InitClassDataContract();
Expand Down Expand Up @@ -65,6 +75,7 @@ internal List<DataMember>? Members

public XmlDictionaryString?[]? ChildElementNamespaces
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_childElementNamespaces == null)
Expand Down Expand Up @@ -122,6 +133,7 @@ internal MethodInfo? ExtensionDataSetMethod

public override DataContractDictionary? KnownDataContracts
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{ return _helper.KnownDataContracts; }
}
Expand Down Expand Up @@ -228,13 +240,15 @@ internal bool CreateNewInstanceViaDefaultConstructor([NotNullWhen(true)] out obj
return true;
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlFormatClassWriterDelegate CreateXmlFormatWriterDelegate()
{
return new XmlFormatWriterGenerator().GenerateClassWriter(this);
}

internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatWriterDelegate == null)
Expand All @@ -256,13 +270,15 @@ internal XmlFormatClassWriterDelegate XmlFormatWriterDelegate
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlFormatClassReaderDelegate CreateXmlFormatReaderDelegate()
{
return new XmlFormatReaderGenerator().GenerateClassReader(this);
}

internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
{
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_helper.XmlFormatReaderDelegate == null)
Expand All @@ -284,6 +300,7 @@ internal XmlFormatClassReaderDelegate XmlFormatReaderDelegate
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal static ClassDataContract CreateClassDataContractForKeyValue(Type type, XmlDictionaryString ns, string[] memberNames)
{
ClassDataContract? cdc = (ClassDataContract?)DataContract.GetDataContractFromGeneratedAssembly(type);
Expand Down Expand Up @@ -317,6 +334,7 @@ internal static void CheckAndAddMember(List<DataMember> members, DataMember memb
members.Add(memberContract);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal static XmlDictionaryString? GetChildNamespaceToDeclare(DataContract dataContract, Type childType, XmlDictionary dictionary)
{
childType = DataContract.UnwrapNullableType(childType);
Expand All @@ -342,7 +360,9 @@ private static bool IsArraySegment(Type t)
/// is therefore marked SRR
/// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value
/// </SecurityNote>
internal static bool IsNonAttributedTypeValidForSerialization(Type type)
internal static bool IsNonAttributedTypeValidForSerialization(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
if (type.IsArray)
return false;
Expand Down Expand Up @@ -437,6 +457,7 @@ internal static bool IsNonSerializedMember(Type type, string memberName)
&& members.Contains(memberName);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlDictionaryString?[]? CreateChildElementNamespaces()
{
if (Members == null)
Expand Down Expand Up @@ -464,6 +485,7 @@ private void EnsureMethodsImported()
_helper.EnsureMethodsImported();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, XmlObjectSerializerWriteContext? context)
{
Debug.Assert(context != null);
Expand All @@ -475,6 +497,7 @@ public override void WriteXmlValue(XmlWriterDelegator xmlWriter, object obj, Xml
XmlFormatWriterDelegate(xmlWriter, obj, context, this);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
public override object? ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext? context)
{
if (_isScriptObject)
Expand Down Expand Up @@ -711,7 +734,9 @@ private sealed class ClassDataContractCriticalHelper : DataContract.DataContract
public XmlDictionaryString[]? MemberNames;
public XmlDictionaryString[]? MemberNamespaces;

internal ClassDataContractCriticalHelper(Type type) : base(type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper([DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type) : base(type)
{
XmlQualifiedName stableName = GetStableNameAndSetHasDataContract(type);
if (type == Globals.TypeOfDBNull)
Expand Down Expand Up @@ -823,7 +848,10 @@ internal ClassDataContractCriticalHelper(Type type) : base(type)
Globals.TypeOfScriptObject_IsAssignableFrom(this.UnderlyingType);
}

internal ClassDataContractCriticalHelper(Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper(
[DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type, XmlDictionaryString ns, string[] memberNames) : base(type)
{
this.StableName = new XmlQualifiedName(GetStableNameAndSetHasDataContract(type).Name, ns.Value);
ImportDataMembers();
Expand Down Expand Up @@ -896,6 +924,7 @@ private void EnsureIsReferenceImported(Type type)

[MemberNotNull(nameof(_members))]
[MemberNotNull(nameof(Members))]
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private void ImportDataMembers()
{
Type type = this.UnderlyingType;
Expand Down Expand Up @@ -1075,6 +1104,7 @@ private static bool CanSerializeMember(FieldInfo? field)
return field != null && !ClassDataContract.IsNonSerializedMember(field.DeclaringType!, field.Name);
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private bool SetIfGetOnlyCollection(DataMember memberContract)
{
//OK to call IsCollection here since the use of surrogated collection types is not supported in get-only scenarios
Expand Down Expand Up @@ -1148,6 +1178,7 @@ private void SetIfMembersHaveConflict(List<DataMember> members)
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type)
{
return DataContract.GetStableName(type, out _hasDataContract);
Expand All @@ -1160,7 +1191,9 @@ private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type)
/// is dependent on the correct calculation of hasDataContract
/// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value
/// </SecurityNote>
private void SetIsNonAttributedType(Type type)
private void SetIsNonAttributedType(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
_isNonAttributedType = !type.IsSerializable && !_hasDataContract && IsNonAttributedTypeValidForSerialization(type);
}
Expand Down Expand Up @@ -1314,6 +1347,8 @@ internal MethodInfo? ExtensionDataSetMethod

internal override DataContractDictionary? KnownDataContracts
{

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
get
{
if (_knownDataContracts != null)
Expand Down Expand Up @@ -1362,7 +1397,10 @@ internal bool IsNonAttributedType
get { return _isNonAttributedType; }
}

private void SetKeyValuePairAdapterFlags(Type type)
[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
private void SetKeyValuePairAdapterFlags(
[DynamicallyAccessedMembers(DataContractPreserveMemberTypes)]
Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == Globals.TypeOfKeyValuePairAdapter)
{
Expand Down Expand Up @@ -1491,6 +1529,7 @@ public int Compare(Member x, Member y)
internal static DataMemberConflictComparer Singleton = new DataMemberConflictComparer();
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContractCriticalHelper Clone()
{
ClassDataContractCriticalHelper clonedHelper = new ClassDataContractCriticalHelper(this.UnderlyingType);
Expand Down Expand Up @@ -1552,6 +1591,7 @@ internal Type ObjectType
}
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal ClassDataContract Clone()
{
ClassDataContract clonedDc = new ClassDataContract(this.UnderlyingType);
Expand All @@ -1565,6 +1605,7 @@ internal ClassDataContract Clone()
return clonedDc;
}

[RequiresUnreferencedCode(DataContract.SerializerTrimmerWarning)]
internal void UpdateNamespaceAndMembers(Type type, XmlDictionaryString ns, string[] memberNames)
{
this.StableName = new XmlQualifiedName(GetStableName(type).Name, ns.Value);
Expand Down
Loading