| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 0bcaa9ec8ba5aa9ea8d11e8f03889e5a40688c62..1363214ee7fd611034b66a389dfc533c17197c2f 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -8305,6 +8305,25 @@ const char* Script::ToCString() const {
|
| }
|
|
|
|
|
| +RawLibrary* Script::FindLibrary() const {
|
| + Isolate* isolate = Isolate::Current();
|
| + const GrowableObjectArray& libs = GrowableObjectArray::Handle(
|
| + isolate, isolate->object_store()->libraries());
|
| + Library& lib = Library::Handle();
|
| + Array& scripts = Array::Handle();
|
| + for (intptr_t i = 0; i < libs.Length(); i++) {
|
| + lib ^= libs.At(i);
|
| + scripts = lib.LoadedScripts();
|
| + for (intptr_t j = 0; j < scripts.Length(); j++) {
|
| + if (scripts.At(j) == raw()) {
|
| + return lib.raw();
|
| + }
|
| + }
|
| + }
|
| + return Library::null();
|
| +}
|
| +
|
| +
|
| // See also Dart_ScriptGetTokenInfo.
|
| void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
|
| JSONObject jsobj(stream);
|
| @@ -8313,13 +8332,17 @@ void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
|
| ASSERT(!name.IsNull());
|
| const String& encoded_url = String::Handle(String::EncodeURI(name));
|
| ASSERT(!encoded_url.IsNull());
|
| - jsobj.AddPropertyF("id", "scripts/%s", encoded_url.ToCString());
|
| + const Library& lib = Library::Handle(FindLibrary());
|
| + intptr_t lib_index = (lib.IsNull()) ? -1 : lib.index();
|
| + jsobj.AddPropertyF("id", "libraries/%" Pd "/scripts/%s",
|
| + lib_index, encoded_url.ToCString());
|
| jsobj.AddProperty("name", name.ToCString());
|
| jsobj.AddProperty("user_name", name.ToCString());
|
| jsobj.AddProperty("kind", GetKindAsCString());
|
| if (ref) {
|
| return;
|
| }
|
| + jsobj.AddProperty("owning_library", lib);
|
| const String& source = String::Handle(Source());
|
| jsobj.AddProperty("source", source.ToCString());
|
|
|
| @@ -8903,6 +8926,25 @@ RawArray* Library::LoadedScripts() const {
|
| AddScriptIfUnique(scripts, owner_script);
|
| }
|
|
|
| + // Special case: Scripts that only contain external top-level functions are
|
| + // not included above, but can be referenced through a library's anonymous
|
| + // classes. Example: dart-core:identical.dart.
|
| + Array& anon_classes = Array::Handle(anonymous_classes());
|
| + Function& func = Function::Handle();
|
| + Array& functions = Array::Handle();
|
| + for (intptr_t i = 0; i < anon_classes.Length(); i++) {
|
| + cls ^= anon_classes.At(i);
|
| + if (cls.IsNull()) continue;
|
| + owner_script = cls.script();
|
| + AddScriptIfUnique(scripts, owner_script);
|
| + functions = cls.functions();
|
| + for (intptr_t j = 0; j < functions.Length(); j++) {
|
| + func ^= functions.At(j);
|
| + owner_script = func.script();
|
| + AddScriptIfUnique(scripts, owner_script);
|
| + }
|
| + }
|
| +
|
| // Create the array of scripts and cache it in loaded_scripts_.
|
| const Array& scripts_array = Array::Handle(Array::MakeArray(scripts));
|
| StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw());
|
|
|