Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: runtime/vm/object.cc

Issue 10414084: Replace linked list of loaded libraries (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 object_store->set_symbol_table(array); 490 object_store->set_symbol_table(array);
491 491
492 // canonical_type_arguments_ are NULL terminated. 492 // canonical_type_arguments_ are NULL terminated.
493 array = Array::New(4); 493 array = Array::New(4);
494 object_store->set_canonical_type_arguments(array); 494 object_store->set_canonical_type_arguments(array);
495 495
496 // Pre-allocate the OneByteString class needed by the symbol table. 496 // Pre-allocate the OneByteString class needed by the symbol table.
497 cls = Class::New<OneByteString>(); 497 cls = Class::New<OneByteString>();
498 object_store->set_one_byte_string_class(cls); 498 object_store->set_one_byte_string_class(cls);
499 499
500 // Set up the libraries array before initializing the core library.
501 const GrowableObjectArray& libraries =
502 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
503 object_store->set_libraries(libraries);
504
500 // Basic infrastructure has been setup, initialize the class dictionary. 505 // Basic infrastructure has been setup, initialize the class dictionary.
501 Library::InitCoreLibrary(isolate); 506 Library::InitCoreLibrary(isolate);
502 Library& core_lib = Library::Handle(Library::CoreLibrary()); 507 Library& core_lib = Library::Handle(Library::CoreLibrary());
503 ASSERT(!core_lib.IsNull()); 508 ASSERT(!core_lib.IsNull());
504 Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary()); 509 Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
505 ASSERT(!core_impl_lib.IsNull()); 510 ASSERT(!core_impl_lib.IsNull());
506 511
507 const GrowableObjectArray& pending_classes = 512 const GrowableObjectArray& pending_classes =
508 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); 513 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
509 object_store->set_pending_classes(pending_classes); 514 object_store->set_pending_classes(pending_classes);
(...skipping 4812 matching lines...) Expand 10 before | Expand all | Expand 10 after
5322 bool import_core_lib) { 5327 bool import_core_lib) {
5323 const Library& result = Library::Handle(Library::New()); 5328 const Library& result = Library::Handle(Library::New());
5324 result.raw_ptr()->name_ = url.raw(); 5329 result.raw_ptr()->name_ = url.raw();
5325 result.raw_ptr()->url_ = url.raw(); 5330 result.raw_ptr()->url_ = url.raw();
5326 result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result); 5331 result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result);
5327 result.raw_ptr()->dictionary_ = Array::Empty(); 5332 result.raw_ptr()->dictionary_ = Array::Empty();
5328 result.raw_ptr()->anonymous_classes_ = Array::Empty(); 5333 result.raw_ptr()->anonymous_classes_ = Array::Empty();
5329 result.raw_ptr()->num_anonymous_ = 0; 5334 result.raw_ptr()->num_anonymous_ = 0;
5330 result.raw_ptr()->import_map_ = Array::Empty(); 5335 result.raw_ptr()->import_map_ = Array::Empty();
5331 result.raw_ptr()->imports_ = Array::Empty(); 5336 result.raw_ptr()->imports_ = Array::Empty();
5332 result.raw_ptr()->next_registered_ = Library::null();
5333 result.raw_ptr()->loaded_scripts_ = Array::null(); 5337 result.raw_ptr()->loaded_scripts_ = Array::null();
5334 result.set_native_entry_resolver(NULL); 5338 result.set_native_entry_resolver(NULL);
5335 result.raw_ptr()->corelib_imported_ = true; 5339 result.raw_ptr()->corelib_imported_ = true;
5336 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; 5340 result.raw_ptr()->load_state_ = RawLibrary::kAllocated;
5337 result.InitClassDictionary(); 5341 result.InitClassDictionary();
5338 result.InitImportList(); 5342 result.InitImportList();
5339 result.InitImportedIntoList(); 5343 result.InitImportedIntoList();
5340 if (import_core_lib) { 5344 if (import_core_lib) {
5341 Library& core_lib = Library::Handle(Library::CoreLibrary()); 5345 Library& core_lib = Library::Handle(Library::CoreLibrary());
5342 ASSERT(!core_lib.IsNull()); 5346 ASSERT(!core_lib.IsNull());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
5420 cls_name = String::NewSymbol(name_buffer); 5424 cls_name = String::NewSymbol(name_buffer);
5421 Class::NewNativeWrapper(&native_flds_lib, cls_name, fld_cnt); 5425 Class::NewNativeWrapper(&native_flds_lib, cls_name, fld_cnt);
5422 } 5426 }
5423 } 5427 }
5424 5428
5425 5429
5426 RawLibrary* Library::LookupLibrary(const String &url) { 5430 RawLibrary* Library::LookupLibrary(const String &url) {
5427 Isolate* isolate = Isolate::Current(); 5431 Isolate* isolate = Isolate::Current();
5428 Library& lib = Library::Handle(isolate, Library::null()); 5432 Library& lib = Library::Handle(isolate, Library::null());
5429 String& lib_url = String::Handle(isolate, String::null()); 5433 String& lib_url = String::Handle(isolate, String::null());
5430 lib = isolate->object_store()->registered_libraries(); 5434 GrowableObjectArray& libs = GrowableObjectArray::Handle(
5431 while (!lib.IsNull()) { 5435 isolate, isolate->object_store()->libraries());
5436 for (int i = 0; i < libs.Length(); i++) {
5437 lib ^= libs.At(i);
5432 lib_url = lib.url(); 5438 lib_url = lib.url();
5433 if (lib_url.Equals(url)) { 5439 if (lib_url.Equals(url)) {
5434 return lib.raw(); 5440 return lib.raw();
5435 } 5441 }
5436 lib = lib.next_registered();
5437 } 5442 }
5438 return Library::null(); 5443 return Library::null();
5439 } 5444 }
5440 5445
5441 5446
5442 RawString* Library::CheckForDuplicateDefinition() { 5447 RawString* Library::CheckForDuplicateDefinition() {
5443 Library& lib = Library::Handle();
5444 Isolate* isolate = Isolate::Current(); 5448 Isolate* isolate = Isolate::Current();
5445 ASSERT(isolate != NULL); 5449 ASSERT(isolate != NULL);
5446 ObjectStore* object_store = isolate->object_store(); 5450 ObjectStore* object_store = isolate->object_store();
5447 ASSERT(object_store != NULL); 5451 ASSERT(object_store != NULL);
5448 lib ^= object_store->registered_libraries(); 5452 const GrowableObjectArray& libs =
5453 GrowableObjectArray::Handle(object_store->libraries());
5454 Library& lib = Library::Handle();
5449 String& error_message = String::Handle(); 5455 String& error_message = String::Handle();
5450 while (!lib.IsNull()) { 5456 for (int i = 0; i < libs.Length(); i++) {
5457 lib ^= libs.At(i);
5451 error_message = lib.FindDuplicateDefinition(); 5458 error_message = lib.FindDuplicateDefinition();
5452 if (!error_message.IsNull()) { 5459 if (!error_message.IsNull()) {
5453 return error_message.raw(); 5460 return error_message.raw();
5454 } 5461 }
5455 lib ^= lib.next_registered();
5456 } 5462 }
5457 return String::null(); 5463 return String::null();
5458 } 5464 }
5459 5465
5460 5466
5461 bool Library::IsKeyUsed(intptr_t key) { 5467 bool Library::IsKeyUsed(intptr_t key) {
5462 intptr_t lib_key; 5468 intptr_t lib_key;
5469 const GrowableObjectArray& libs = GrowableObjectArray::Handle(
5470 Isolate::Current()->object_store()->libraries());
5463 Library& lib = Library::Handle(); 5471 Library& lib = Library::Handle();
5464 lib = Isolate::Current()->object_store()->registered_libraries();
5465 String& lib_url = String::Handle(); 5472 String& lib_url = String::Handle();
5466 while (!lib.IsNull()) { 5473 for (int i = 0; i < libs.Length(); i++) {
5474 lib ^= libs.At(i);
5467 lib_url ^= lib.url(); 5475 lib_url ^= lib.url();
5468 lib_key = lib_url.Hash(); 5476 lib_key = lib_url.Hash();
5469 if (lib_key == key) { 5477 if (lib_key == key) {
5470 return true; 5478 return true;
5471 } 5479 }
5472 lib = lib.next_registered();
5473 } 5480 }
5474 return false; 5481 return false;
5475 } 5482 }
5476 5483
5477 5484
5478 RawString* Library::PrivateName(const String& name) const { 5485 RawString* Library::PrivateName(const String& name) const {
5479 ASSERT(ShouldBePrivate(name)); 5486 ASSERT(ShouldBePrivate(name));
5480 // ASSERT(strchr(name, '@') == NULL); 5487 // ASSERT(strchr(name, '@') == NULL);
5481 String& str = String::Handle(); 5488 String& str = String::Handle();
5482 str ^= name.raw(); 5489 str ^= name.raw();
5483 str = String::Concat(str, String::Handle(this->private_key())); 5490 str = String::Concat(str, String::Handle(this->private_key()));
5484 str = String::NewSymbol(str); 5491 str = String::NewSymbol(str);
5485 return str.raw(); 5492 return str.raw();
5486 } 5493 }
5487 5494
5488 5495
5496 RawLibrary* Library::GetLibrary(intptr_t index) {
5497 Isolate* isolate = Isolate::Current();
5498 const GrowableObjectArray& libs =
5499 GrowableObjectArray::Handle(isolate->object_store()->libraries());
5500 ASSERT(!libs.IsNull());
5501 if ((0 <= index) && (index < libs.Length())) {
5502 const Library& lib = Library::CheckedHandle(libs.At(index));
srdjan 2012/05/23 17:35:18 Should be ^=
hausner 2012/05/23 20:27:14 Done.
5503 return lib.raw();
5504 }
5505 return Library::null();
5506 }
5507
5508
5489 void Library::Register() const { 5509 void Library::Register() const {
5490 ASSERT(Library::LookupLibrary(String::Handle(url())) == Library::null()); 5510 ASSERT(Library::LookupLibrary(String::Handle(url())) == Library::null());
5491 raw_ptr()->next_registered_ = 5511 ObjectStore* object_store = Isolate::Current()->object_store();
5492 Isolate::Current()->object_store()->registered_libraries(); 5512 GrowableObjectArray& libs =
5493 Isolate::Current()->object_store()->set_registered_libraries(*this); 5513 GrowableObjectArray::Handle(object_store->libraries());
5514 ASSERT(!libs.IsNull());
5515 libs.Add(*this);
5494 } 5516 }
5495 5517
5496 5518
5497 RawLibrary* Library::CoreLibrary() { 5519 RawLibrary* Library::CoreLibrary() {
5498 return Isolate::Current()->object_store()->core_library(); 5520 return Isolate::Current()->object_store()->core_library();
5499 } 5521 }
5500 5522
5501 5523
5502 RawLibrary* Library::CoreImplLibrary() { 5524 RawLibrary* Library::CoreImplLibrary() {
5503 return Isolate::Current()->object_store()->core_impl_library(); 5525 return Isolate::Current()->object_store()->core_impl_library();
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
5683 } 5705 }
5684 5706
5685 5707
5686 void LibraryPrefix::set_num_libs(intptr_t value) const { 5708 void LibraryPrefix::set_num_libs(intptr_t value) const {
5687 raw_ptr()->num_libs_ = value; 5709 raw_ptr()->num_libs_ = value;
5688 } 5710 }
5689 5711
5690 5712
5691 RawError* Library::CompileAll() { 5713 RawError* Library::CompileAll() {
5692 Error& error = Error::Handle(); 5714 Error& error = Error::Handle();
5693 Library& lib = Library::Handle( 5715 const GrowableObjectArray& libs = GrowableObjectArray::Handle(
5694 Isolate::Current()->object_store()->registered_libraries()); 5716 Isolate::Current()->object_store()->libraries());
5717 Library& lib = Library::Handle();
5695 Class& cls = Class::Handle(); 5718 Class& cls = Class::Handle();
5696 while (!lib.IsNull()) { 5719 for (int i = 0; i < libs.Length(); i++) {
5720 lib ^= libs.At(i);
5697 ClassDictionaryIterator it(lib); 5721 ClassDictionaryIterator it(lib);
5698 while (it.HasNext()) { 5722 while (it.HasNext()) {
5699 cls ^= it.GetNextClass(); 5723 cls ^= it.GetNextClass();
5700 if (!cls.is_interface()) { 5724 if (!cls.is_interface()) {
5701 error = Compiler::CompileAllFunctions(cls); 5725 error = Compiler::CompileAllFunctions(cls);
5702 if (!error.IsNull()) { 5726 if (!error.IsNull()) {
5703 return error.raw(); 5727 return error.raw();
5704 } 5728 }
5705 } 5729 }
5706 } 5730 }
5707 Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_); 5731 Array& anon_classes = Array::Handle(lib.raw_ptr()->anonymous_classes_);
5708 for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) { 5732 for (int i = 0; i < lib.raw_ptr()->num_anonymous_; i++) {
5709 cls ^= anon_classes.At(i); 5733 cls ^= anon_classes.At(i);
5710 ASSERT(!cls.is_interface()); 5734 ASSERT(!cls.is_interface());
5711 error = Compiler::CompileAllFunctions(cls); 5735 error = Compiler::CompileAllFunctions(cls);
5712 if (!error.IsNull()) { 5736 if (!error.IsNull()) {
5713 return error.raw(); 5737 return error.raw();
5714 } 5738 }
5715 } 5739 }
5716 lib = lib.next_registered();
5717 } 5740 }
5718 return error.raw(); 5741 return error.raw();
5719 } 5742 }
5720 5743
5721 5744
5722 RawInstructions* Instructions::New(intptr_t size) { 5745 RawInstructions* Instructions::New(intptr_t size) {
5723 const Class& instructions_class = Class::Handle(Object::instructions_class()); 5746 const Class& instructions_class = Class::Handle(Object::instructions_class());
5724 Instructions& result = Instructions::Handle(); 5747 Instructions& result = Instructions::Handle();
5725 { 5748 {
5726 uword aligned_size = Instructions::InstanceSize(size); 5749 uword aligned_size = Instructions::InstanceSize(size);
(...skipping 4315 matching lines...) Expand 10 before | Expand all | Expand 10 after
10042 const String& str = String::Handle(pattern()); 10065 const String& str = String::Handle(pattern());
10043 const char* format = "JSRegExp: pattern=%s flags=%s"; 10066 const char* format = "JSRegExp: pattern=%s flags=%s";
10044 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 10067 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
10045 char* chars = reinterpret_cast<char*>( 10068 char* chars = reinterpret_cast<char*>(
10046 Isolate::Current()->current_zone()->Allocate(len + 1)); 10069 Isolate::Current()->current_zone()->Allocate(len + 1));
10047 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 10070 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
10048 return chars; 10071 return chars;
10049 } 10072 }
10050 10073
10051 } // namespace dart 10074 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698