diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc index a610f86c05f..699a746ebf2 100644 --- a/runtime/vm/code_generator_test.cc +++ b/runtime/vm/code_generator_test.cc @@ -488,8 +488,14 @@ CODEGEN_TEST_RAW_RUN(AllocateNewObjectCodegen, function) { Object& result = Object::Handle(); result = DartEntry::InvokeStatic(function, arguments, kNoArgumentNames); EXPECT(!result.IsError()); - const Library& app_lib = Library::Handle( - Isolate::Current()->object_store()->registered_libraries()); + const GrowableObjectArray& libs = GrowableObjectArray::Handle( + Isolate::Current()->object_store()->libraries()); + ASSERT(!libs.IsNull()); + // App lib is the last one that was loaded. + intptr_t num_libs = libs.Length(); + Library& app_lib = Library::Handle(); + app_lib ^= libs.At(num_libs - 1); + ASSERT(!app_lib.IsNull()); const Class& cls = Class::Handle( app_lib.LookupClass(String::Handle(String::NewSymbol("A")))); EXPECT_EQ(cls.raw(), result.clazz()); diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc index 70b84e6a398..0170bfd90e0 100644 --- a/runtime/vm/dart_api_impl_test.cc +++ b/runtime/vm/dart_api_impl_test.cc @@ -4240,7 +4240,7 @@ TEST_CASE(ImportLibrary3) { result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL); EXPECT(Dart_IsError(result)); EXPECT_STREQ("Duplicate definition : 'foo' is defined in" - " 'library1.dart' and 'library2.dart'\n", + " 'library2.dart' and 'library1.dart'\n", Dart_GetError(result)); } @@ -4312,7 +4312,7 @@ TEST_CASE(ImportLibrary4) { result = Dart_Invoke(result, Dart_NewString("main"), 0, NULL); EXPECT(Dart_IsError(result)); EXPECT_STREQ("Duplicate definition : 'fooC' is defined in" - " 'libraryF.dart' and 'libraryC.dart'\n", + " 'libraryC.dart' and 'libraryF.dart'\n", Dart_GetError(result)); } diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc index dcfcb402bfd..11daaa7aaeb 100644 --- a/runtime/vm/debugger.cc +++ b/runtime/vm/debugger.cc @@ -725,13 +725,14 @@ SourceBreakpoint* Debugger::SetBreakpointAtLine(const String& script_url, intptr_t line_number) { Library& lib = Library::Handle(); Script& script = Script::Handle(); - lib = isolate_->object_store()->registered_libraries(); - while (!lib.IsNull()) { + const GrowableObjectArray& libs = + GrowableObjectArray::Handle(isolate_->object_store()->libraries()); + for (int i = 0; i < libs.Length(); i++) { + lib ^= libs.At(i); script = lib.LookupScript(script_url); if (!script.IsNull()) { break; } - lib = lib.next_registered(); } if (script.IsNull()) { if (verbose) { diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc index 70ae2517c57..b6da4315f8a 100644 --- a/runtime/vm/debugger_api_impl.cc +++ b/runtime/vm/debugger_api_impl.cc @@ -498,26 +498,21 @@ DART_EXPORT Dart_Handle Dart_GetLibraryURLs() { ASSERT(isolate != NULL); DARTSCOPE(isolate); - // Find out how many libraries are loaded in this isolate. - int num_libs = 0; - Library &lib = Library::Handle(); - lib = isolate->object_store()->registered_libraries(); - while (!lib.IsNull()) { - num_libs++; - lib = lib.next_registered(); - } + const GrowableObjectArray& libs = + GrowableObjectArray::Handle(isolate->object_store()->libraries()); + int num_libs = libs.Length(); // Create new list and populate with the url of loaded libraries. - const Array& library_list = Array::Handle(Array::New(num_libs)); - lib = isolate->object_store()->registered_libraries(); + Library &lib = Library::Handle(); String& lib_url = String::Handle(); + const Array& library_url_list = Array::Handle(Array::New(num_libs)); for (int i = 0; i < num_libs; i++) { + lib ^= libs.At(i); ASSERT(!lib.IsNull()); lib_url = lib.url(); - library_list.SetAt(i, lib_url); - lib = lib.next_registered(); + library_url_list.SetAt(i, lib_url); } - return Api::NewHandle(isolate, library_list.raw()); + return Api::NewHandle(isolate, library_url_list.raw()); } } // namespace dart diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc index 6b895245f71..ce70a9a5c4f 100644 --- a/runtime/vm/isolate.cc +++ b/runtime/vm/isolate.cc @@ -324,10 +324,12 @@ void Isolate::PrintInvokedFunctions() { ASSERT(this == Isolate::Current()); Zone zone(this); HandleScope handle_scope(this); + const GrowableObjectArray& libraries = + GrowableObjectArray::Handle(object_store()->libraries()); Library& library = Library::Handle(); - library = object_store()->registered_libraries(); GrowableArray invoked_functions; - while (!library.IsNull()) { + for (int i = 0; i < libraries.Length(); i++) { + library ^= libraries.At(i); Class& cls = Class::Handle(); ClassDictionaryIterator iter(library); while (iter.HasNext()) { @@ -339,7 +341,6 @@ void Isolate::PrintInvokedFunctions() { cls ^= anon_classes.At(i); AddFunctionsFromClass(cls, &invoked_functions); } - library = library.next_registered(); } invoked_functions.Sort(MostUsedFunctionFirst); for (int i = 0; i < invoked_functions.length(); i++) { diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index 5c592a684a5..96162fc4e7e 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc @@ -497,6 +497,11 @@ RawError* Object::Init(Isolate* isolate) { cls = Class::New(); object_store->set_one_byte_string_class(cls); + // Set up the libraries array before initializing the core library. + const GrowableObjectArray& libraries = + GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); + object_store->set_libraries(libraries); + // Basic infrastructure has been setup, initialize the class dictionary. Library::InitCoreLibrary(isolate); Library& core_lib = Library::Handle(Library::CoreLibrary()); @@ -5306,7 +5311,6 @@ RawLibrary* Library::NewLibraryHelper(const String& url, result.raw_ptr()->anonymous_classes_ = Array::Empty(); result.raw_ptr()->num_anonymous_ = 0; result.raw_ptr()->imports_ = Array::Empty(); - result.raw_ptr()->next_registered_ = Library::null(); result.raw_ptr()->loaded_scripts_ = Array::null(); result.set_native_entry_resolver(NULL); result.raw_ptr()->corelib_imported_ = true; @@ -5404,32 +5408,34 @@ RawLibrary* Library::LookupLibrary(const String &url) { Isolate* isolate = Isolate::Current(); Library& lib = Library::Handle(isolate, Library::null()); String& lib_url = String::Handle(isolate, String::null()); - lib = isolate->object_store()->registered_libraries(); - while (!lib.IsNull()) { + GrowableObjectArray& libs = GrowableObjectArray::Handle( + isolate, isolate->object_store()->libraries()); + for (int i = 0; i < libs.Length(); i++) { + lib ^= libs.At(i); lib_url = lib.url(); if (lib_url.Equals(url)) { return lib.raw(); } - lib = lib.next_registered(); } return Library::null(); } RawString* Library::CheckForDuplicateDefinition() { - Library& lib = Library::Handle(); Isolate* isolate = Isolate::Current(); ASSERT(isolate != NULL); ObjectStore* object_store = isolate->object_store(); ASSERT(object_store != NULL); - lib ^= object_store->registered_libraries(); + const GrowableObjectArray& libs = + GrowableObjectArray::Handle(object_store->libraries()); + Library& lib = Library::Handle(); String& error_message = String::Handle(); - while (!lib.IsNull()) { + for (int i = 0; i < libs.Length(); i++) { + lib ^= libs.At(i); error_message = lib.FindDuplicateDefinition(); if (!error_message.IsNull()) { return error_message.raw(); } - lib ^= lib.next_registered(); } return String::null(); } @@ -5437,16 +5443,17 @@ RawString* Library::CheckForDuplicateDefinition() { bool Library::IsKeyUsed(intptr_t key) { intptr_t lib_key; + const GrowableObjectArray& libs = GrowableObjectArray::Handle( + Isolate::Current()->object_store()->libraries()); Library& lib = Library::Handle(); - lib = Isolate::Current()->object_store()->registered_libraries(); String& lib_url = String::Handle(); - while (!lib.IsNull()) { + for (int i = 0; i < libs.Length(); i++) { + lib ^= libs.At(i); lib_url ^= lib.url(); lib_key = lib_url.Hash(); if (lib_key == key) { return true; } - lib = lib.next_registered(); } return false; } @@ -5463,11 +5470,27 @@ RawString* Library::PrivateName(const String& name) const { } +RawLibrary* Library::GetLibrary(intptr_t index) { + Isolate* isolate = Isolate::Current(); + const GrowableObjectArray& libs = + GrowableObjectArray::Handle(isolate->object_store()->libraries()); + ASSERT(!libs.IsNull()); + if ((0 <= index) && (index < libs.Length())) { + Library& lib = Library::Handle(); + lib ^= libs.At(index); + return lib.raw(); + } + return Library::null(); +} + + void Library::Register() const { ASSERT(Library::LookupLibrary(String::Handle(url())) == Library::null()); - raw_ptr()->next_registered_ = - Isolate::Current()->object_store()->registered_libraries(); - Isolate::Current()->object_store()->set_registered_libraries(*this); + ObjectStore* object_store = Isolate::Current()->object_store(); + GrowableObjectArray& libs = + GrowableObjectArray::Handle(object_store->libraries()); + ASSERT(!libs.IsNull()); + libs.Add(*this); } @@ -5667,10 +5690,12 @@ void LibraryPrefix::set_num_libs(intptr_t value) const { RawError* Library::CompileAll() { Error& error = Error::Handle(); - Library& lib = Library::Handle( - Isolate::Current()->object_store()->registered_libraries()); + const GrowableObjectArray& libs = GrowableObjectArray::Handle( + Isolate::Current()->object_store()->libraries()); + Library& lib = Library::Handle(); Class& cls = Class::Handle(); - while (!lib.IsNull()) { + for (int i = 0; i < libs.Length(); i++) { + lib ^= libs.At(i); ClassDictionaryIterator it(lib); while (it.HasNext()) { cls ^= it.GetNextClass(); @@ -5690,7 +5715,6 @@ RawError* Library::CompileAll() { return error.raw(); } } - lib = lib.next_registered(); } return error.raw(); } diff --git a/runtime/vm/object.h b/runtime/vm/object.h index 701138d40af..7dba560fe0a 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h @@ -1770,11 +1770,10 @@ class Library : public Object { void Register() const; - RawLibrary* next_registered() const { return raw_ptr()->next_registered_; } - RawString* DuplicateDefineErrorString(const String& entry_name, const Library& conflicting_lib) const; static RawLibrary* LookupLibrary(const String& url); + static RawLibrary* GetLibrary(intptr_t index); static RawString* CheckForDuplicateDefinition(); static bool IsKeyUsed(intptr_t key); diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc index b0b9b283314..e45f92d4539 100644 --- a/runtime/vm/object_store.cc +++ b/runtime/vm/object_store.cc @@ -71,8 +71,8 @@ ObjectStore::ObjectStore() native_wrappers_library_(Library::null()), builtin_library_(Library::null()), root_library_(Library::null()), + libraries_(GrowableObjectArray::null()), import_map_(Array::null()), - registered_libraries_(Library::null()), pending_classes_(GrowableObjectArray::null()), sticky_error_(Error::null()), empty_context_(Context::null()), diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h index 15f1133aa69..8f10ef96d5e 100644 --- a/runtime/vm/object_store.h +++ b/runtime/vm/object_store.h @@ -443,17 +443,16 @@ class ObjectStore { root_library_ = value.raw(); } + RawGrowableObjectArray* libraries() const { return libraries_; } + void set_libraries(const GrowableObjectArray& value) { + libraries_ = value.raw(); + } + RawArray* import_map() const { return import_map_; } void set_import_map(const Array& value) { import_map_ = value.raw(); } - // Returns head of list of registered libraries. - RawLibrary* registered_libraries() const { return registered_libraries_; } - void set_registered_libraries(const Library& value) { - registered_libraries_ = value.raw(); - } - RawGrowableObjectArray* pending_classes() const { return pending_classes_; } void set_pending_classes(const GrowableObjectArray& value) { ASSERT(!value.IsNull()); @@ -578,8 +577,8 @@ class ObjectStore { RawLibrary* native_wrappers_library_; RawLibrary* builtin_library_; RawLibrary* root_library_; + RawGrowableObjectArray* libraries_; RawArray* import_map_; - RawLibrary* registered_libraries_; RawGrowableObjectArray* pending_classes_; RawError* sticky_error_; RawContext* empty_context_; diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h index 47299551cf2..4d67bb099d9 100644 --- a/runtime/vm/raw_object.h +++ b/runtime/vm/raw_object.h @@ -668,10 +668,9 @@ class RawLibrary : public RawObject { RawArray* imports_; // List of libraries imported without prefix. RawArray* imported_into_; // List of libraries where this library // is imported into without a prefix. - RawLibrary* next_registered_; // Linked list of registered libraries. RawArray* loaded_scripts_; // Array of scripts loaded in this library. RawObject** to() { - return reinterpret_cast(&ptr()->next_registered_); + return reinterpret_cast(&ptr()->loaded_scripts_); } intptr_t num_imports_; // Number of entries in imports_.