mirror of
https://github.com/dart-lang/sdk
synced 2024-10-05 20:05:01 +00:00
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:
parent
5fe23d1497
commit
6ddf54511d
|
@ -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());
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()),
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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_.
|
||||
|
|
Loading…
Reference in a new issue