@@ -1053,13 +1053,15 @@ private void ExpandType(TypeX tyX)
10531053
10541054 private void TryAddGetHashCode ( TypeX tyX )
10551055 {
1056+ const string kGetHashCode = "GetHashCode" ;
1057+
10561058 // 值类型补齐 GetHashCode
10571059 if ( ! tyX . IsValueType ||
1058- tyX . Def . FindMethod ( "GetHashCode" ) != null &&
1059- tyX . Def . FindMethod ( "GetHashCode" , MethodSig . CreateInstance ( CorLibTypes . Int32 ) ) != null )
1060+ tyX . Def . FindMethod ( kGetHashCode ) != null &&
1061+ tyX . Def . FindMethod ( kGetHashCode , MethodSig . CreateInstance ( CorLibTypes . Int32 ) ) != null )
10601062 return ;
10611063
1062- var objMet = CorLibTypes . Object . TypeRef . ResolveTypeDef ( ) . FindMethod ( "GetHashCode" ) ;
1064+ var objMet = CorLibTypes . Object . TypeRef . ResolveTypeDef ( ) . FindMethod ( kGetHashCode ) ;
10631065 MethodDefUser metDef = new MethodDefUser ( objMet . Name , objMet . MethodSig , objMet . Attributes ) ;
10641066 metDef . IsReuseSlot = true ;
10651067 tyX . Def . Methods . Add ( metDef ) ;
@@ -1082,6 +1084,7 @@ private void TryAddGetHashCode(TypeX tyX)
10821084 insts . Add ( OpCodes . Ldc_I4 . ToInstruction ( 0x14AE055C ^ tyX . GetNameKey ( ) . GetHashCode ( ) ) ) ;
10831085
10841086 bool last = false ;
1087+ TypeSig tyGenInstSig = tyX . GetGenericInstSig ( ) ;
10851088 foreach ( var fldDef in fldList )
10861089 {
10871090 if ( ! Helper . IsInstanceField ( fldDef ) )
@@ -1099,11 +1102,8 @@ private void TryAddGetHashCode(TypeX tyX)
10991102 insts . Add ( OpCodes . Ldarg_0 . ToInstruction ( ) ) ;
11001103
11011104 MemberRef fldRef = null ;
1102- TypeSig tyGenInstSig = tyX . GetGenericInstSig ( ) ;
11031105 if ( tyGenInstSig != null )
1104- {
11051106 fldRef = new MemberRefUser ( fldDef . Module , fldDef . Name , fldDef . FieldSig , new TypeSpecUser ( tyGenInstSig ) ) ;
1106- }
11071107
11081108 if ( fldDef . FieldType . IsValueType ||
11091109 fldDef . FieldType . ElementType == ElementType . Var )
@@ -1121,6 +1121,7 @@ private void TryAddGetHashCode(TypeX tyX)
11211121 else
11221122 insts . Add ( OpCodes . Ldfld . ToInstruction ( fldDef ) ) ;
11231123 }
1124+
11241125 insts . Add ( OpCodes . Callvirt . ToInstruction ( objMet ) ) ;
11251126 insts . Add ( OpCodes . Xor . ToInstruction ( ) ) ;
11261127 }
@@ -1131,23 +1132,25 @@ private void TryAddGetHashCode(TypeX tyX)
11311132
11321133 private void TryAddEquals ( TypeX tyX )
11331134 {
1135+ const string kEquals = "Equals" ;
1136+
11341137 // 值类型补齐 Equals
11351138 if ( ! tyX . IsValueType ||
1136- tyX . Def . FindMethod ( "Equals" ) != null &&
1137- tyX . Def . FindMethod ( "Equals" , MethodSig . CreateInstance ( CorLibTypes . Boolean , CorLibTypes . Object ) ) != null )
1139+ tyX . Def . FindMethod ( kEquals ) != null &&
1140+ tyX . Def . FindMethod ( kEquals , MethodSig . CreateInstance ( CorLibTypes . Boolean , CorLibTypes . Object ) ) != null )
11381141 return ;
11391142
11401143 var objTyDef = CorLibTypes . Object . TypeRef . ResolveTypeDef ( ) ;
1141- var objMet = objTyDef . FindMethod ( "Equals" ) ;
1144+ var objMet = objTyDef . FindMethod ( kEquals ) ;
11421145 MethodDefUser metDef = new MethodDefUser ( objMet . Name , objMet . MethodSig , objMet . Attributes ) ;
11431146 metDef . IsReuseSlot = true ;
11441147 tyX . Def . Methods . Add ( metDef ) ;
11451148
11461149 var body = metDef . Body = new CilBody ( ) ;
11471150 var insts = body . Instructions ;
11481151
1149- var metIntTyID = objTyDef . FindMethod ( "GetInternalTypeID" ) ;
1150- Debug . Assert ( metIntTyID != null ) ;
1152+ var metGetTyID = objTyDef . FindMethod ( "GetInternalTypeID" ) ;
1153+ Debug . Assert ( metGetTyID != null ) ;
11511154 var metCanCmpBits = objTyDef . FindMethod ( "CanCompareBits" ) ;
11521155 Debug . Assert ( metCanCmpBits != null ) ;
11531156 var metFastEqChk = objTyDef . FindMethod ( "FastEqualsCheck" ) ;
@@ -1157,9 +1160,9 @@ private void TryAddEquals(TypeX tyX)
11571160 insts . Add ( OpCodes . Brfalse . ToInstruction ( /**/ ) ) ;
11581161
11591162 insts . Add ( OpCodes . Ldarg_0 . ToInstruction ( ) ) ;
1160- insts . Add ( OpCodes . Call . ToInstruction ( metIntTyID ) ) ;
1163+ insts . Add ( OpCodes . Call . ToInstruction ( metGetTyID ) ) ;
11611164 insts . Add ( OpCodes . Ldarg_1 . ToInstruction ( ) ) ;
1162- insts . Add ( OpCodes . Call . ToInstruction ( metIntTyID ) ) ;
1165+ insts . Add ( OpCodes . Call . ToInstruction ( metGetTyID ) ) ;
11631166 insts . Add ( OpCodes . Bne_Un . ToInstruction ( /**/ ) ) ;
11641167
11651168 insts . Add ( OpCodes . Ldarg_0 . ToInstruction ( ) ) ;
0 commit comments