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; }
public bool CheckILSize (PositiveTestCase test, PositiveChecker checker, string file) { Assembly assembly = Assembly.LoadFile (file); bool success = true; Type[] types = assembly.GetTypes (); foreach (Type t in types) { // Skip interfaces if (!t.IsClass && !t.IsValueType) continue; if (test.VerificationProvider == null) { if (!checker.UpdateVerificationDataFile) checker.LogFileLine (test.FileName, "Missing IL verification data"); test.CreateNewTest (); } foreach (MemberInfo m in t.GetMembers (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { MethodBase mi = m as MethodBase; if (mi == null) continue; if ((mi.Attributes & (MethodAttributes.PinvokeImpl)) != 0) continue; success &= CompareIL (mi, test, checker); } } return success; }