[vm] Provide more detailed errors when message deserialization cannot find a program element serialized by name.
TEST=local
Bug: https://github.com/flutter/flutter/issues/109248
Change-Id: Ifda7c08cf88c37a9895839858a18badf994bf72c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255220
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index e9a92a7..2c2621a 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -562,8 +562,9 @@
void ReadNodes(MessageDeserializer* d) {
auto* class_table = d->isolate_group()->class_table();
- String& str = String::Handle(d->zone());
+ String& uri = String::Handle(d->zone());
Library& lib = Library::Handle(d->zone());
+ String& name = String::Handle(d->zone());
Class& cls = Class::Handle(d->zone());
intptr_t count = d->ReadUnsigned();
for (intptr_t i = 0; i < count; i++) {
@@ -571,16 +572,20 @@
if (cid != 0) {
cls = class_table->At(cid);
} else {
- str = String::New(d->ReadAscii()); // Library URI.
- lib = Library::LookupLibrary(d->thread(), str);
- RELEASE_ASSERT(!lib.IsNull());
- str = String::New(d->ReadAscii()); // Class name.
- if (str.Equals(Symbols::TopLevel())) {
+ uri = String::New(d->ReadAscii()); // Library URI.
+ name = String::New(d->ReadAscii()); // Class name.
+ lib = Library::LookupLibrary(d->thread(), uri);
+ if (UNLIKELY(lib.IsNull())) {
+ FATAL("Not found: %s %s\n", uri.ToCString(), name.ToCString());
+ }
+ if (name.Equals(Symbols::TopLevel())) {
cls = lib.toplevel_class();
} else {
- cls = lib.LookupClass(str);
+ cls = lib.LookupClass(name);
}
- RELEASE_ASSERT(!cls.IsNull());
+ if (UNLIKELY(cls.IsNull())) {
+ FATAL("Not found: %s %s\n", uri.ToCString(), name.ToCString());
+ }
cls.EnsureIsFinalized(d->thread());
}
d->AssignRef(cls.ptr());
@@ -762,25 +767,36 @@
void ReadNodes(MessageDeserializer* d) {
const intptr_t count = d->ReadUnsigned();
- String& str = String::Handle(d->zone());
+ String& uri = String::Handle(d->zone());
Library& lib = Library::Handle(d->zone());
+ String& cname = String::Handle(d->zone());
Class& cls = Class::Handle(d->zone());
+ String& fname = String::Handle(d->zone());
Function& func = Function::Handle(d->zone());
for (intptr_t i = 0; i < count; i++) {
- str = String::New(d->ReadAscii()); // Library URI.
- lib = Library::LookupLibrary(d->thread(), str);
- RELEASE_ASSERT(!lib.IsNull());
- str = String::New(d->ReadAscii()); // Class name.
- if (str.Equals(Symbols::TopLevel())) {
+ uri = String::New(d->ReadAscii()); // Library URI.
+ cname = String::New(d->ReadAscii()); // Class name.
+ fname = String::New(d->ReadAscii()); // Function name.
+ lib = Library::LookupLibrary(d->thread(), uri);
+ if (UNLIKELY(lib.IsNull())) {
+ FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+ fname.ToCString());
+ }
+ if (cname.Equals(Symbols::TopLevel())) {
cls = lib.toplevel_class();
} else {
- cls = lib.LookupClass(str);
+ cls = lib.LookupClass(cname);
}
- RELEASE_ASSERT(!cls.IsNull());
+ if (UNLIKELY(cls.IsNull())) {
+ FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+ fname.ToCString());
+ }
cls.EnsureIsFinalized(d->thread());
- str = String::New(d->ReadAscii()); // Function name.
- func = cls.LookupStaticFunction(str);
- RELEASE_ASSERT(!func.IsNull());
+ func = cls.LookupStaticFunction(fname);
+ if (UNLIKELY(func.IsNull())) {
+ FATAL("Not found: %s %s %s", uri.ToCString(), cname.ToCString(),
+ fname.ToCString());
+ }
d->AssignRef(func.ptr());
}
}