@@ -963,37 +963,42 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
963963
964964 foreach ( var method in type . Methods )
965965 {
966+ // to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution
967+
966968 if ( ! method . IsStatic )
967969 {
968970 continue ;
969971 }
970972
971- // to reduce unnecessary type resolution, we first check if it can be an extension without type resolution
973+ if ( method . Name is not ( k_WriteValueMethodName or k_ReadValueMethodName ) )
974+ {
975+ continue ;
976+ }
972977
973- var mayHaveExtension = false ;
978+ var mayHaveExtensionAttr = false ;
974979
975980 foreach ( var attr in method . CustomAttributes )
976981 {
977982 if ( attr . Constructor . DeclaringType . FullName == extensionConstructor . DeclaringType . FullName )
978983 {
979- mayHaveExtension = true ;
984+ mayHaveExtensionAttr = true ;
980985 break ;
981986 }
982987 }
983988
984- if ( ! mayHaveExtension )
989+ if ( ! mayHaveExtensionAttr )
985990 {
986991 continue ;
987992 }
988993
989994 var parameters = method . Parameters ;
990995
991- if ( parameters . Count != 2 || parameters [ 0 ] . ParameterType is not ByReferenceType byRefType )
996+ if ( parameters . Count != 2 || parameters [ 0 ] . ParameterType is not ByReferenceType firstParameterType )
992997 {
993998 continue ;
994999 }
9951000
996- if ( byRefType . ElementType . FullName != m_FastBufferWriter_TypeRef . FullName && byRefType . ElementType . FullName != m_FastBufferReader_TypeRef . FullName )
1001+ if ( firstParameterType . ElementType . FullName != m_FastBufferWriter_TypeRef . FullName && firstParameterType . ElementType . FullName != m_FastBufferReader_TypeRef . FullName )
9971002 {
9981003 continue ;
9991004 }
@@ -1014,11 +1019,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
10141019 continue ;
10151020 }
10161021
1017- if ( parameters [ 0 ] . ParameterType . Resolve ( ) == m_FastBufferWriter_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
1022+ if ( method . Name == k_WriteValueMethodName && firstParameterType . Resolve ( ) == m_FastBufferWriter_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
10181023 {
10191024 m_FastBufferWriter_ExtensionMethodRefs . Add ( m_MainModule . ImportReference ( method ) ) ;
10201025 }
1021- else if ( parameters [ 0 ] . ParameterType . Resolve ( ) == m_FastBufferReader_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
1026+ else if ( method . Name == k_ReadValueMethodName && firstParameterType . Resolve ( ) == m_FastBufferReader_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
10221027 {
10231028 m_FastBufferReader_ExtensionMethodRefs . Add ( m_MainModule . ImportReference ( method ) ) ;
10241029 }
@@ -1818,27 +1823,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer
18181823 {
18191824 var parameters = method. Resolve( ) . Parameters;
18201825
1821- if ( method . Name = = k_WriteValueMethodName )
1826+ if ( parameters [ 1 ] . IsIn )
18221827 {
1823- if ( parameters [ 1 ] . IsIn )
1828+ if ( ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
1829+ ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
18241830 {
1825- if ( ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
1826- ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
1827- {
1828- methodRef = method ;
1829- m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1830- return true;
1831- }
1831+ methodRef = method ;
1832+ m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1833+ return true;
18321834 }
1833- else
1835+ }
1836+ else
1837+ {
1838+ if ( parameters [ 1 ] . ParameterType . FullName == paramType . FullName &&
1839+ parameters [ 1 ] . ParameterType . IsArray == paramType . IsArray )
18341840 {
1835- if ( parameters [ 1 ] . ParameterType . FullName == paramType . FullName &&
1836- parameters [ 1 ] . ParameterType . IsArray == paramType . IsArray )
1837- {
1838- methodRef = method ;
1839- m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1840- return true;
1841- }
1841+ methodRef = method ;
1842+ m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1843+ return true;
18421844 }
18431845 }
18441846 }
@@ -2054,8 +2056,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
20542056 foreach ( var method in m_FastBufferReader_ExtensionMethodRefs )
20552057 {
20562058 var parameters = method. Resolve( ) . Parameters;
2057- if ( method. Name = = k_ReadValueMethodName &&
2058- parameters [ 1 ] . IsOut &&
2059+ if ( parameters [ 1 ] . IsOut &&
20592060 ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
20602061 ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
20612062 {
0 commit comments