@@ -985,18 +985,60 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
985985
986986 foreach ( var method in type . Methods )
987987 {
988+ // to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution
989+
988990 if ( ! method . IsStatic )
989991 {
990992 continue ;
991993 }
992994
995+ if ( method . Name is not ( k_WriteValueMethodName or k_ReadValueMethodName ) )
996+ {
997+ continue ;
998+ }
999+
1000+ var mayHaveExtensionAttr = false ;
1001+
1002+ foreach ( var attr in method . CustomAttributes )
1003+ {
1004+ if ( attr . Constructor . DeclaringType . FullName == extensionConstructor . DeclaringType . FullName )
1005+ {
1006+ mayHaveExtensionAttr = true ;
1007+ break ;
1008+ }
1009+ }
1010+
1011+ if ( ! mayHaveExtensionAttr )
1012+ {
1013+ continue ;
1014+ }
1015+
1016+ var parameters = method . Parameters ;
1017+
1018+ if ( parameters . Count != 2 )
1019+ {
1020+ continue ;
1021+ }
1022+
1023+ var firstParameterType = parameters [ 0 ] . ParameterType ;
1024+
1025+ // ReadValueSafe() and WriteValueSafe() can use both by-ref and non-by-ref type for the first parameter type
1026+ var firstParameterElementType = firstParameterType is ByReferenceType byRefType ? byRefType . ElementType : firstParameterType ;
1027+
1028+ if ( firstParameterElementType . FullName != m_FastBufferWriter_TypeRef . FullName && firstParameterElementType . FullName != m_FastBufferReader_TypeRef . FullName )
1029+ {
1030+ continue ;
1031+ }
1032+
9931033 var isExtension = false ;
9941034
9951035 foreach ( var attr in method . CustomAttributes )
9961036 {
997- if ( attr . Constructor . Resolve ( ) == extensionConstructor . Resolve ( ) )
1037+ if ( attr . Constructor . DeclaringType . FullName == extensionConstructor . DeclaringType . FullName &&
1038+ attr . Constructor . Resolve ( ) == extensionConstructor . Resolve ( ) )
9981039 {
9991040 isExtension = true ;
1041+ break ;
10001042 }
10011043 }
10021044
@@ -1005,13 +1047,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
10051047 continue ;
10061048 }
10071049
1008- var parameters = method . Parameters ;
1009-
1010- if ( parameters . Count == 2 && parameters [ 0 ] . ParameterType . Resolve ( ) == m_FastBufferWriter_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
1050+ if ( method . Name == k_WriteValueMethodName && firstParameterType . Resolve ( ) == m_FastBufferWriter_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
10111051 {
10121052 m_FastBufferWriter_ExtensionMethodRefs . Add ( m_MainModule . ImportReference ( method ) ) ;
10131053 }
1014- else if ( parameters . Count == 2 && parameters [ 0 ] . ParameterType . Resolve ( ) == m_FastBufferReader_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
1054+ else if ( method . Name == k_ReadValueMethodName && firstParameterType . Resolve ( ) == m_FastBufferReader_TypeRef . MakeByReferenceType ( ) . Resolve ( ) )
10151055 {
10161056 m_FastBufferReader_ExtensionMethodRefs . Add ( m_MainModule . ImportReference ( method ) ) ;
10171057 }
@@ -1861,27 +1901,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer
18611901 {
18621902 var parameters = method. Resolve( ) . Parameters;
18631903
1864- if ( method . Name = = k_WriteValueMethodName )
1904+ if ( parameters [ 1 ] . IsIn )
18651905 {
1866- if ( parameters [ 1 ] . IsIn )
1906+ if ( ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
1907+ ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
18671908 {
1868- if ( ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
1869- ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
1870- {
1871- methodRef = method ;
1872- m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1873- return true;
1874- }
1909+ methodRef = method ;
1910+ m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1911+ return true;
18751912 }
1876- else
1913+ }
1914+ else
1915+ {
1916+ if ( parameters [ 1 ] . ParameterType . FullName == paramType . FullName &&
1917+ parameters [ 1 ] . ParameterType . IsArray == paramType . IsArray )
18771918 {
1878- if ( parameters [ 1 ] . ParameterType . FullName == paramType . FullName &&
1879- parameters [ 1 ] . ParameterType . IsArray == paramType . IsArray )
1880- {
1881- methodRef = method ;
1882- m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1883- return true;
1884- }
1919+ methodRef = method ;
1920+ m_FastBufferWriter_WriteValue_MethodRefs[ assemblyQualifiedName ] = methodRef ;
1921+ return true;
18851922 }
18861923 }
18871924 }
@@ -2097,8 +2134,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
20972134 foreach ( var method in m_FastBufferReader_ExtensionMethodRefs )
20982135 {
20992136 var parameters = method. Resolve( ) . Parameters;
2100- if ( method. Name = = k_ReadValueMethodName &&
2101- parameters [ 1 ] . IsOut &&
2137+ if ( parameters [ 1 ] . IsOut &&
21022138 ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . FullName == paramType . FullName &&
21032139 ( ( ByReferenceType ) parameters [ 1 ] . ParameterType ) . ElementType . IsArray == paramType . IsArray )
21042140 {
0 commit comments