Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 7922) |
+++ runtime/vm/object.cc (working copy) |
@@ -497,6 +497,11 @@ |
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 @@ |
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 @@ |
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 @@ |
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 @@ |
} |
+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 @@ |
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 @@ |
return error.raw(); |
} |
} |
- lib = lib.next_registered(); |
} |
return error.raw(); |
} |