bool CompareIL (MethodBase mi, PositiveTestCase test, PositiveChecker checker)
{
string m_name = mi.ToString ();
string decl_type = mi.DeclaringType.ToString ();
PositiveTestCase.VerificationData data_provider = test.VerificationProvider;
PositiveTestCase.VerificationData.MethodData md = data_provider.FindMethodData (m_name, decl_type);
if (md == null) {
data_provider.AddNewMethod (mi, GetILSize (mi));
if (!data_provider.IsNewSet) {
checker.HandleFailure (test.FileName, PositiveChecker.TestResult.ILError, decl_type + ": " + m_name + " (new method?)");
return false;
}
return true;
}
if (md.Checked) {
checker.HandleFailure (test.FileName, PositiveChecker.TestResult.ILError, decl_type + ": " + m_name + " has a duplicate");
return false;
}
md.Checked = true;
if (md.MethodAttributes != (int) mi.Attributes) {
checker.HandleFailure (test.FileName, PositiveChecker.TestResult.MethodAttributesError,
string.Format ("{0} ({1} -> {2})", decl_type + ": " + m_name, md.MethodAttributes, mi.Attributes));
}
md.MethodAttributes = (int) mi.Attributes;
int il_size = GetILSize (mi);
if (md.ILSize == il_size)
return true;
if (md.ILSize > il_size) {
checker.LogFileLine (test.FileName, "{0} (code size reduction {1} -> {2})", decl_type + ": " + m_name, md.ILSize, il_size);
md.ILSize = il_size;
return true;
}
checker.HandleFailure (test.FileName, PositiveChecker.TestResult.ILError,
string.Format ("{0} (code size {1} -> {2})", decl_type + ": " + m_name, md.ILSize, il_size));
md.ILSize = il_size;
return false;
}