Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -963,18 +963,60 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb

foreach (var method in type.Methods)
{
// to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution

if (!method.IsStatic)
{
continue;
}

if (method.Name is not (k_WriteValueMethodName or k_ReadValueMethodName))
{
continue;
}

var mayHaveExtensionAttr = false;

foreach (var attr in method.CustomAttributes)
{
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName)
{
mayHaveExtensionAttr = true;
break;
}
}

if (!mayHaveExtensionAttr)
{
continue;
}

var parameters = method.Parameters;

if (parameters.Count != 2)
{
continue;
}

var firstParameterType = parameters[0].ParameterType;

// ReadValueSafe() and WriteValueSafe() can use both by-ref and non-by-ref type for the first parameter type
var firstParameterElementType = firstParameterType is ByReferenceType byRefType ? byRefType.ElementType : firstParameterType;

if (firstParameterElementType.FullName != m_FastBufferWriter_TypeRef.FullName && firstParameterElementType.FullName != m_FastBufferReader_TypeRef.FullName)
{
continue;
}

var isExtension = false;

foreach (var attr in method.CustomAttributes)
{
if (attr.Constructor.Resolve() == extensionConstructor.Resolve())
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName &&
attr.Constructor.Resolve() == extensionConstructor.Resolve())
{
isExtension = true;
break;
}
}

Expand All @@ -983,13 +1025,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
continue;
}

var parameters = method.Parameters;

if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
if (method.Name == k_WriteValueMethodName && firstParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
{
m_FastBufferWriter_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
}
else if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
else if (method.Name == k_ReadValueMethodName && firstParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
{
m_FastBufferReader_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
}
Expand Down Expand Up @@ -1789,27 +1829,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer
{
var parameters = method.Resolve().Parameters;

if (method.Name == k_WriteValueMethodName)
if (parameters[1].IsIn)
{
if (parameters[1].IsIn)
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
else
}
else
{
if (parameters[1].ParameterType.FullName == paramType.FullName &&
parameters[1].ParameterType.IsArray == paramType.IsArray)
{
if (parameters[1].ParameterType.FullName == paramType.FullName &&
parameters[1].ParameterType.IsArray == paramType.IsArray)
{
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
}
}
Expand Down Expand Up @@ -2025,8 +2062,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
foreach (var method in m_FastBufferReader_ExtensionMethodRefs)
{
var parameters = method.Resolve().Parameters;
if (method.Name == k_ReadValueMethodName &&
parameters[1].IsOut &&
if (parameters[1].IsOut &&
((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
Expand Down