Replace linked list of loaded libraries

Replace the linked list of loaded libraries with a growable array
or libraries in the object store. This array will be used in the
debugger, where we use the index of a library in the array as an
id number, similarly to the class id and the table of loaded classes.
Review URL: https://chromiumcodereview.appspot.com//10414084

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@7923 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
hausner@google.com 2012-05-23 20:28:21 +00:00
parent 5fe23d1497
commit 6ddf54511d
10 changed files with 77 additions and 53 deletions

View file

@ -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());

View file

@ -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));
}

View file

@ -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) {

View file

@ -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

View file

@ -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<const Function*> 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++) {

View file

@ -497,6 +497,11 @@ RawError* Object::Init(Isolate* isolate) {
cls = Class::New<OneByteString>();
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();
}

View file

@ -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);

View file

@ -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()),

View file

@ -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_;

View file

@ -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<RawObject**>(&ptr()->next_registered_);
return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
}
intptr_t num_imports_; // Number of entries in imports_.