Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 26445) |
+++ runtime/vm/object.cc (working copy) |
@@ -7690,58 +7690,86 @@ |
}; |
+ |
+// Return Function::null() if function does not exist in lib. |
+static RawFunction* GetFunction(const GrowableArray<Library*>& libs, |
+ const char* class_name, |
+ const char* function_name) { |
+ Function& func = Function::Handle(); |
+ String& class_str = String::Handle(); |
+ String& func_str = String::Handle(); |
+ Class& cls = Class::Handle(); |
+ for (intptr_t l = 0; l < libs.length(); l++) { |
+ const Library& lib = *libs[l]; |
+ if (strcmp(class_name, "::") == 0) { |
+ func_str = Symbols::New(function_name); |
+ func = lib.LookupFunctionAllowPrivate(func_str, NULL); |
+ } else { |
+ class_str = String::New(class_name); |
+ cls = lib.LookupClassAllowPrivate(class_str, NULL); |
+ if (!cls.IsNull()) { |
+ func_str = String::New(function_name); |
+ if (function_name[0] == '.') { |
+ func_str = String::Concat(class_str, func_str); |
+ } |
+ func = cls.LookupFunctionAllowPrivate(func_str); |
+ } |
+ } |
+ if (!func.IsNull()) { |
+ return func.raw(); |
+ } |
+ } |
+ return Function::null(); |
+} |
+ |
+ |
void Library::CheckFunctionFingerprints() { |
GrowableArray<FpDiff> collected_fp_diffs; |
- Library& lib = Library::Handle(); |
- Class& cls = Class::Handle(); |
+ GrowableArray<Library*> all_libs; |
Function& func = Function::Handle(); |
- String& str = String::Handle(); |
bool has_errors = false; |
#define CHECK_FINGERPRINTS(class_name, function_name, dest, fp) \ |
- func = Function::null(); \ |
- if (strcmp(#class_name, "::") == 0) { \ |
- str = Symbols::New(#function_name); \ |
- func = lib.LookupFunctionAllowPrivate(str, NULL); \ |
- } else { \ |
- str = String::New(#class_name); \ |
- cls = lib.LookupClassAllowPrivate(str, NULL); \ |
- if (!cls.IsNull()) { \ |
- if (#function_name[0] == '.') { \ |
- str = String::New(#class_name#function_name); \ |
- } else { \ |
- str = String::New(#function_name); \ |
- } \ |
- func = cls.LookupFunctionAllowPrivate(str); \ |
- } \ |
- } \ |
- if (!func.IsNull() && (func.SourceFingerprint() != fp)) { \ |
+ func = GetFunction(all_libs, #class_name, #function_name); \ |
+ if (func.IsNull()) { \ |
has_errors = true; \ |
+ OS::Print("Function not found %s.%s\n", #class_name, #function_name); \ |
+ } else if (func.SourceFingerprint() != fp) { \ |
+ has_errors = true; \ |
OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n", \ |
func.ToFullyQualifiedCString(), fp, func.SourceFingerprint()); \ |
collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint())); \ |
} \ |
- lib = Library::CoreLibrary(); |
+ all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary())); |
CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); |
CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); |
+ all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); |
+ all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary())); |
RECOGNIZED_LIST(CHECK_FINGERPRINTS); |
- lib = Library::MathLibrary(); |
+ all_libs.Clear(); |
+ all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); |
MATH_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); |
- lib = Library::TypedDataLibrary(); |
+ all_libs.Clear(); |
+ all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary())); |
TYPED_DATA_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); |
#undef CHECK_FINGERPRINTS |
+Class& cls = Class::Handle(); |
+ |
#define CHECK_FACTORY_FINGERPRINTS(factory_symbol, cid, fp) \ |
cls = Isolate::Current()->class_table()->At(cid); \ |
func = cls.LookupFunctionAllowPrivate(Symbols::factory_symbol()); \ |
- ASSERT(!func.IsNull()); \ |
- if (func.SourceFingerprint() != fp) { \ |
+ if (func.IsNull()) { \ |
has_errors = true; \ |
+ OS::Print("Function not found %s.%s\n", cls.ToCString(), \ |
+ Symbols::factory_symbol().ToCString()); \ |
+ } else if (func.SourceFingerprint() != fp) { \ |
+ has_errors = true; \ |
OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n", \ |
func.ToFullyQualifiedCString(), fp, func.SourceFingerprint()); \ |
collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint())); \ |
@@ -7750,6 +7778,7 @@ |
RECOGNIZED_LIST_FACTORY_LIST(CHECK_FACTORY_FINGERPRINTS); |
#undef CHECK_FACTORY_FINGERPRINTS |
+ |
if (has_errors) { |
for (intptr_t i = 0; i < collected_fp_diffs.length(); i++) { |
OS::Print("s/%d/%d/\n", |