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

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

Issue 10967052: Support for show/hide combinators (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 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 "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 reinterpret_cast<RawClass*>(RAW_NULL); 80 reinterpret_cast<RawClass*>(RAW_NULL);
81 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 81 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
82 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 82 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
83 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 83 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
84 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 84 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
85 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 85 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
86 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 86 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
87 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 87 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
88 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 88 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
89 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 89 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
90 RawClass* Object::namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
90 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 91 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
91 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 92 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
92 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 93 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
93 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 94 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
94 RawClass* Object::var_descriptors_class_ = 95 RawClass* Object::var_descriptors_class_ =
95 reinterpret_cast<RawClass*>(RAW_NULL); 96 reinterpret_cast<RawClass*>(RAW_NULL);
96 RawClass* Object::exception_handlers_class_ = 97 RawClass* Object::exception_handlers_class_ =
97 reinterpret_cast<RawClass*>(RAW_NULL); 98 reinterpret_cast<RawClass*>(RAW_NULL);
98 RawClass* Object::deopt_info_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 99 RawClass* Object::deopt_info_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
99 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 100 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 348
348 cls = Class::New<Script>(); 349 cls = Class::New<Script>();
349 script_class_ = cls.raw(); 350 script_class_ = cls.raw();
350 351
351 cls = Class::New<Library>(); 352 cls = Class::New<Library>();
352 library_class_ = cls.raw(); 353 library_class_ = cls.raw();
353 354
354 cls = Class::New<LibraryPrefix>(); 355 cls = Class::New<LibraryPrefix>();
355 library_prefix_class_ = cls.raw(); 356 library_prefix_class_ = cls.raw();
356 357
358 cls = Class::New<Namespace>();
359 namespace_class_ = cls.raw();
360
357 cls = Class::New<Code>(); 361 cls = Class::New<Code>();
358 code_class_ = cls.raw(); 362 code_class_ = cls.raw();
359 363
360 cls = Class::New<Instructions>(); 364 cls = Class::New<Instructions>();
361 instructions_class_ = cls.raw(); 365 instructions_class_ = cls.raw();
362 366
363 cls = Class::New<PcDescriptors>(); 367 cls = Class::New<PcDescriptors>();
364 pc_descriptors_class_ = cls.raw(); 368 pc_descriptors_class_ = cls.raw();
365 369
366 cls = Class::New<Stackmap>(); 370 cls = Class::New<Stackmap>();
(...skipping 5897 matching lines...) Expand 10 before | Expand all | Expand 10 after
6264 Field& field = Field::Handle(LookupLocalField(name)); 6268 Field& field = Field::Handle(LookupLocalField(name));
6265 if (!field.IsNull()) { 6269 if (!field.IsNull()) {
6266 return field.raw(); 6270 return field.raw();
6267 } 6271 }
6268 6272
6269 // Do not look up private names in imported libraries. 6273 // Do not look up private names in imported libraries.
6270 if (ShouldBePrivate(name)) { 6274 if (ShouldBePrivate(name)) {
6271 return Field::null(); 6275 return Field::null();
6272 } 6276 }
6273 6277
6274 // Now check if name is found in the top level scope of any imported 6278 // Now check if name is found in any imported libs.
6275 // libs.
6276 const Array& imports = Array::Handle(this->imports()); 6279 const Array& imports = Array::Handle(this->imports());
6277 Library& import_lib = Library::Handle(); 6280 Namespace& import = Namespace::Handle();
6281 Object& obj = Object::Handle();
6278 for (intptr_t j = 0; j < this->num_imports(); j++) { 6282 for (intptr_t j = 0; j < this->num_imports(); j++) {
6279 import_lib ^= imports.At(j); 6283 import ^= imports.At(j);
6280 6284 obj = import.Lookup(name);
6281 6285 if (!obj.IsNull() && obj.IsField()) {
6282 field = import_lib.LookupLocalField(name); 6286 field ^= obj.raw();
6283 if (!field.IsNull()) {
6284 return field.raw(); 6287 return field.raw();
6285 } 6288 }
6286 } 6289 }
6287 return Field::null(); 6290 return Field::null();
6288 } 6291 }
6289 6292
6290 6293
6291 RawField* Library::LookupLocalField(const String& name) const { 6294 RawField* Library::LookupLocalField(const String& name) const {
6292 Isolate* isolate = Isolate::Current(); 6295 Isolate* isolate = Isolate::Current();
6293 Field& field = Field::Handle(isolate, Field::null()); 6296 Field& field = Field::Handle(isolate, Field::null());
(...skipping 21 matching lines...) Expand all
6315 if (!function.IsNull()) { 6318 if (!function.IsNull()) {
6316 return function.raw(); 6319 return function.raw();
6317 } 6320 }
6318 6321
6319 // Do not look up private names in imported libraries. 6322 // Do not look up private names in imported libraries.
6320 if (ShouldBePrivate(name)) { 6323 if (ShouldBePrivate(name)) {
6321 return Function::null(); 6324 return Function::null();
6322 } 6325 }
6323 6326
6324 // Now check if name is found in the top level scope of any imported 6327 // Now check if name is found in the top level scope of any imported
6325 // libs. 6328 // libs.
siva 2012/09/24 18:28:51 The comment in LookupFieldAllowPrivate has been mo
hausner 2012/09/24 20:25:43 Done.
6326 const Array& imports = Array::Handle(this->imports()); 6329 const Array& imports = Array::Handle(this->imports());
6327 Library& import_lib = Library::Handle(); 6330 Namespace& import = Namespace::Handle();
6331 Object& obj = Object::Handle();
6328 for (intptr_t j = 0; j < this->num_imports(); j++) { 6332 for (intptr_t j = 0; j < this->num_imports(); j++) {
6329 import_lib ^= imports.At(j); 6333 import ^= imports.At(j);
6330 6334 obj = import.Lookup(name);
6331 6335 if (!obj.IsNull() && obj.IsFunction()) {
6332 function = import_lib.LookupLocalFunction(name); 6336 function ^= obj.raw();
6333 if (!function.IsNull()) {
6334 return function.raw(); 6337 return function.raw();
6335 } 6338 }
6336 } 6339 }
6337 return Function::null(); 6340 return Function::null();
6338 } 6341 }
6339 6342
6340 6343
6341 RawFunction* Library::LookupLocalFunction(const String& name) const { 6344 RawFunction* Library::LookupLocalFunction(const String& name) const {
6342 Isolate* isolate = Isolate::Current(); 6345 Isolate* isolate = Isolate::Current();
6343 Object& obj = Object::Handle(isolate, Object::null()); 6346 Object& obj = Object::Handle(isolate, Object::null());
(...skipping 10 matching lines...) Expand all
6354 return Function::null(); 6357 return Function::null();
6355 } 6358 }
6356 6359
6357 6360
6358 RawObject* Library::LookupObject(const String& name) const { 6361 RawObject* Library::LookupObject(const String& name) const {
6359 // First check if name is found in the local scope of the library. 6362 // First check if name is found in the local scope of the library.
6360 Object& obj = Object::Handle(LookupLocalObject(name)); 6363 Object& obj = Object::Handle(LookupLocalObject(name));
6361 if (!obj.IsNull()) { 6364 if (!obj.IsNull()) {
6362 return obj.raw(); 6365 return obj.raw();
6363 } 6366 }
6364 // Now check if name is found in the top level scope of any imported libs. 6367 // Now check if name is found in the top level scope of any imported libs.
siva 2012/09/24 18:28:51 ditto comment regarding comment.
hausner 2012/09/24 20:25:43 Done.
6365 const Array& imports = Array::Handle(this->imports()); 6368 const Array& imports = Array::Handle(this->imports());
6366 Library& import_lib = Library::Handle(); 6369 Namespace& import = Namespace::Handle();
6367 for (intptr_t j = 0; j < this->num_imports(); j++) { 6370 for (intptr_t j = 0; j < this->num_imports(); j++) {
6368 import_lib ^= imports.At(j); 6371 import ^= imports.At(j);
6369 obj = import_lib.LookupLocalObject(name); 6372 obj = import.Lookup(name);
6370 if (!obj.IsNull()) { 6373 if (!obj.IsNull()) {
6371 return obj.raw(); 6374 return obj.raw();
6372 } 6375 }
6373 } 6376 }
6374 return Object::null(); 6377 return Object::null();
6375 } 6378 }
6376 6379
6377 6380
6378 RawClass* Library::LookupClass(const String& name) const { 6381 RawClass* Library::LookupClass(const String& name) const {
6379 Object& obj = Object::Handle(LookupObject(name)); 6382 Object& obj = Object::Handle(LookupObject(name));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
6436 anon_array.SetAt(num_anonymous, cls); 6439 anon_array.SetAt(num_anonymous, cls);
6437 num_anonymous++; 6440 num_anonymous++;
6438 raw_ptr()->num_anonymous_ = num_anonymous; 6441 raw_ptr()->num_anonymous_ = num_anonymous;
6439 } 6442 }
6440 6443
6441 6444
6442 RawLibrary* Library::LookupImport(const String& url) const { 6445 RawLibrary* Library::LookupImport(const String& url) const {
6443 Isolate* isolate = Isolate::Current(); 6446 Isolate* isolate = Isolate::Current();
6444 const Array& imports = Array::Handle(isolate, this->imports()); 6447 const Array& imports = Array::Handle(isolate, this->imports());
6445 intptr_t num_imports = this->num_imports(); 6448 intptr_t num_imports = this->num_imports();
6449 Namespace& import = Namespace::Handle(isolate, Namespace::null());
6446 Library& lib = Library::Handle(isolate, Library::null()); 6450 Library& lib = Library::Handle(isolate, Library::null());
6447 String& import_url = String::Handle(isolate, String::null()); 6451 String& import_url = String::Handle(isolate, String::null());
6448 for (int i = 0; i < num_imports; i++) { 6452 for (int i = 0; i < num_imports; i++) {
6449 lib ^= imports.At(i); 6453 import ^= imports.At(i);
6454 lib = import.library();
6450 import_url = lib.url(); 6455 import_url = lib.url();
6451 if (url.Equals(import_url)) { 6456 if (url.Equals(import_url)) {
6452 return lib.raw(); 6457 return lib.raw();
6453 } 6458 }
6454 } 6459 }
6455 return Library::null(); 6460 return Library::null();
6456 } 6461 }
6457 6462
6458 6463
6459 RawLibrary* Library::ImportAt(intptr_t index) const { 6464 RawLibrary* Library::ImportLibraryAt(intptr_t index) const {
6460 if ((index < 0) || index >= num_imports()) { 6465 Namespace& import = Namespace::Handle(ImportAt(index));
6466 if (import.IsNull()) {
6461 return Library::null(); 6467 return Library::null();
6462 } 6468 }
6463 const Array& import_list = Array::Handle(imports()); 6469 return import.library();
6464 Library& lib = Library::Handle();
6465 lib ^= import_list.At(index);
6466 return lib.raw();
6467 } 6470 }
6468 6471
6469 6472
6470 RawLibraryPrefix* Library::ImportPrefixAt(intptr_t index) const { 6473 RawNamespace* Library::ImportAt(intptr_t index) const {
6471 const Library& imported = Library::Handle(ImportAt(index)); 6474 if ((index < 0) || index >= num_imports()) {
6472 if (imported.IsNull()) { 6475 return Namespace::null();
6473 return LibraryPrefix::null();
6474 } 6476 }
6475 DictionaryIterator it(*this); 6477 const Array& import_list = Array::Handle(imports());
6476 Object& obj = Object::Handle(); 6478 Namespace& import = Namespace::Handle();
6477 while (it.HasNext()) { 6479 import ^= import_list.At(index);
6478 obj = it.GetNext(); 6480 return import.raw();
6479 if (obj.IsLibraryPrefix()) {
6480 const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(obj);
6481 if (lib_prefix.ContainsLibrary(imported)) {
6482 return lib_prefix.raw();
6483 }
6484 }
6485 }
6486 return LibraryPrefix::null();
6487 } 6481 }
6488 6482
6489 6483
6490 bool Library::ImportsCorelib() const { 6484 bool Library::ImportsCorelib() const {
6491 Isolate* isolate = Isolate::Current(); 6485 Isolate* isolate = Isolate::Current();
6492 Library& imported = Library::Handle(isolate); 6486 Library& imported = Library::Handle(isolate);
6493 intptr_t count = num_imports(); 6487 intptr_t count = num_imports();
6494 for (int i = 0; i < count; i++) { 6488 for (int i = 0; i < count; i++) {
6495 imported = ImportAt(i); 6489 imported = ImportLibraryAt(i);
6496 if (imported.IsCoreLibrary()) { 6490 if (imported.IsCoreLibrary()) {
6497 return true; 6491 return true;
6498 } 6492 }
6499 } 6493 }
6500 LibraryPrefix& prefix = LibraryPrefix::Handle(isolate); 6494 LibraryPrefix& prefix = LibraryPrefix::Handle(isolate);
6501 LibraryPrefixIterator it(*this); 6495 LibraryPrefixIterator it(*this);
6502 while (it.HasNext()) { 6496 while (it.HasNext()) {
6503 prefix = it.GetNext(); 6497 prefix = it.GetNext();
6504 count = prefix.num_libs(); 6498 count = prefix.num_imports();
6505 for (int i = 0; i < count; i++) { 6499 for (int i = 0; i < count; i++) {
6506 imported = prefix.GetLibrary(i); 6500 imported = prefix.GetLibrary(i);
6507 if (imported.IsCoreLibrary()) { 6501 if (imported.IsCoreLibrary()) {
6508 return true; 6502 return true;
6509 } 6503 }
6510 } 6504 }
6511 } 6505 }
6512 return false; 6506 return false;
6513 } 6507 }
6514 6508
6515 6509
6516 void Library::AddImport(const Library& library) const { 6510 void Library::AddImport(const Namespace& ns) const {
6517 Array& imports = Array::Handle(this->imports()); 6511 Array& imports = Array::Handle(this->imports());
6518 intptr_t capacity = imports.Length(); 6512 intptr_t capacity = imports.Length();
6519 if (num_imports() == capacity) { 6513 if (num_imports() == capacity) {
6520 capacity = capacity + kImportsCapacityIncrement; 6514 capacity = capacity + kImportsCapacityIncrement;
6521 imports = Array::Grow(imports, capacity); 6515 imports = Array::Grow(imports, capacity);
6522 StorePointer(&raw_ptr()->imports_, imports.raw()); 6516 StorePointer(&raw_ptr()->imports_, imports.raw());
6523 } 6517 }
6524 intptr_t index = num_imports(); 6518 intptr_t index = num_imports();
6525 imports.SetAt(index, library); 6519 imports.SetAt(index, ns);
6526 set_num_imports(index + 1); 6520 set_num_imports(index + 1);
6527 } 6521 }
6528 6522
6529 6523
6524 void Library::AddImportAll(const Library& lib) const {
6525 const Namespace& ns = Namespace::Handle(
6526 Namespace::New(lib, Array::Handle(), Array::Handle()));
6527 AddImport(ns);
siva 2012/09/24 18:28:51 I would prefer if we did not have his convenience
hausner 2012/09/24 20:25:43 Done. (Although I think the convenience function w
6528 }
6529
6530
6530 void Library::InitClassDictionary() const { 6531 void Library::InitClassDictionary() const {
6531 // The last element of the dictionary specifies the number of in use slots. 6532 // The last element of the dictionary specifies the number of in use slots.
6532 // TODO(iposva): Find reasonable initial size. 6533 // TODO(iposva): Find reasonable initial size.
6533 const int kInitialElementCount = 16; 6534 const int kInitialElementCount = 16;
6534 6535
6535 const Array& dictionary = 6536 const Array& dictionary =
6536 Array::Handle(Array::New(kInitialElementCount + 1, Heap::kOld)); 6537 Array::Handle(Array::New(kInitialElementCount + 1, Heap::kOld));
6537 dictionary.SetAt(kInitialElementCount, Smi::Handle(Smi::New(0))); 6538 dictionary.SetAt(kInitialElementCount, Smi::Handle(Smi::New(0)));
6538 StorePointer(&raw_ptr()->dictionary_, dictionary.raw()); 6539 StorePointer(&raw_ptr()->dictionary_, dictionary.raw());
6539 } 6540 }
(...skipping 30 matching lines...) Expand all
6570 result.set_native_entry_resolver(NULL); 6571 result.set_native_entry_resolver(NULL);
6571 result.raw_ptr()->corelib_imported_ = true; 6572 result.raw_ptr()->corelib_imported_ = true;
6572 result.set_debuggable(false); 6573 result.set_debuggable(false);
6573 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; 6574 result.raw_ptr()->load_state_ = RawLibrary::kAllocated;
6574 result.raw_ptr()->index_ = -1; 6575 result.raw_ptr()->index_ = -1;
6575 result.InitClassDictionary(); 6576 result.InitClassDictionary();
6576 result.InitImportList(); 6577 result.InitImportList();
6577 if (import_core_lib) { 6578 if (import_core_lib) {
6578 Library& core_lib = Library::Handle(Library::CoreLibrary()); 6579 Library& core_lib = Library::Handle(Library::CoreLibrary());
6579 ASSERT(!core_lib.IsNull()); 6580 ASSERT(!core_lib.IsNull());
6580 result.AddImport(core_lib); 6581 result.AddImportAll(core_lib);
6581 } 6582 }
6582 return result.raw(); 6583 return result.raw();
6583 } 6584 }
6584 6585
6585 6586
6586 RawLibrary* Library::New(const String& url) { 6587 RawLibrary* Library::New(const String& url) {
6587 return NewLibraryHelper(url, false); 6588 return NewLibraryHelper(url, false);
6588 } 6589 }
6589 6590
6590 6591
6591 void Library::InitCoreLibrary(Isolate* isolate) { 6592 void Library::InitCoreLibrary(Isolate* isolate) {
6592 const String& core_lib_url = String::Handle(Symbols::New("dart:core")); 6593 const String& core_lib_url = String::Handle(Symbols::New("dart:core"));
6593 const Library& core_lib = 6594 const Library& core_lib =
6594 Library::Handle(Library::NewLibraryHelper(core_lib_url, false)); 6595 Library::Handle(Library::NewLibraryHelper(core_lib_url, false));
6595 core_lib.Register(); 6596 core_lib.Register();
6596 isolate->object_store()->set_core_library(core_lib); 6597 isolate->object_store()->set_core_library(core_lib);
6597 const String& core_impl_lib_url = 6598 const String& core_impl_lib_url =
6598 String::Handle(Symbols::New("dart:coreimpl")); 6599 String::Handle(Symbols::New("dart:coreimpl"));
6599 const Library& core_impl_lib = 6600 const Library& core_impl_lib =
6600 Library::Handle(Library::NewLibraryHelper(core_impl_lib_url, false)); 6601 Library::Handle(Library::NewLibraryHelper(core_impl_lib_url, false));
6601 isolate->object_store()->set_core_impl_library(core_impl_lib); 6602 isolate->object_store()->set_core_impl_library(core_impl_lib);
6602 core_impl_lib.Register(); 6603 core_impl_lib.Register();
6603 core_lib.AddImport(core_impl_lib); 6604 core_lib.AddImportAll(core_impl_lib);
6604 core_impl_lib.AddImport(core_lib); 6605 core_impl_lib.AddImportAll(core_lib);
6605 Library::InitMathLibrary(isolate); 6606 Library::InitMathLibrary(isolate);
6606 const Library& math_lib = Library::Handle(Library::MathLibrary()); 6607 const Library& math_lib = Library::Handle(Library::MathLibrary());
6607 core_lib.AddImport(math_lib); 6608 core_lib.AddImportAll(math_lib);
6608 core_impl_lib.AddImport(math_lib); 6609 core_impl_lib.AddImportAll(math_lib);
6609 isolate->object_store()->set_root_library(Library::Handle()); 6610 isolate->object_store()->set_root_library(Library::Handle());
6610 6611
6611 // Hook up predefined classes without setting their library pointers. These 6612 // Hook up predefined classes without setting their library pointers. These
6612 // classes are coming from the VM isolate, and are shared between multiple 6613 // classes are coming from the VM isolate, and are shared between multiple
6613 // isolates so setting their library pointers would be wrong. 6614 // isolates so setting their library pointers would be wrong.
6614 const Class& cls = Class::Handle(Object::dynamic_class()); 6615 const Class& cls = Class::Handle(Object::dynamic_class());
6615 core_lib.AddObject(cls, String::Handle(cls.Name())); 6616 core_lib.AddObject(cls, String::Handle(cls.Name()));
6616 } 6617 }
6617 6618
6618 6619
6619 void Library::InitMathLibrary(Isolate* isolate) { 6620 void Library::InitMathLibrary(Isolate* isolate) {
6620 const String& url = String::Handle(Symbols::New("dart:math")); 6621 const String& url = String::Handle(Symbols::New("dart:math"));
6621 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); 6622 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
6622 lib.Register(); 6623 lib.Register();
6623 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary()); 6624 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
6624 lib.AddImport(core_impl_lib); 6625 lib.AddImportAll(core_impl_lib);
6625 isolate->object_store()->set_math_library(lib); 6626 isolate->object_store()->set_math_library(lib);
6626 } 6627 }
6627 6628
6628 6629
6629 void Library::InitIsolateLibrary(Isolate* isolate) { 6630 void Library::InitIsolateLibrary(Isolate* isolate) {
6630 const String& url = String::Handle(Symbols::New("dart:isolate")); 6631 const String& url = String::Handle(Symbols::New("dart:isolate"));
6631 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); 6632 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
6632 lib.Register(); 6633 lib.Register();
6633 isolate->object_store()->set_isolate_library(lib); 6634 isolate->object_store()->set_isolate_library(lib);
6634 } 6635 }
6635 6636
6636 6637
6637 void Library::InitMirrorsLibrary(Isolate* isolate) { 6638 void Library::InitMirrorsLibrary(Isolate* isolate) {
6638 const String& url = String::Handle(Symbols::New("dart:mirrors")); 6639 const String& url = String::Handle(Symbols::New("dart:mirrors"));
6639 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); 6640 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
6640 lib.Register(); 6641 lib.Register();
6641 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); 6642 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
6642 lib.AddImport(isolate_lib); 6643 lib.AddImportAll(isolate_lib);
6643 const Library& wrappers_lib = 6644 const Library& wrappers_lib =
6644 Library::Handle(Library::NativeWrappersLibrary()); 6645 Library::Handle(Library::NativeWrappersLibrary());
6645 lib.AddImport(wrappers_lib); 6646 lib.AddImportAll(wrappers_lib);
6646 isolate->object_store()->set_mirrors_library(lib); 6647 isolate->object_store()->set_mirrors_library(lib);
6647 } 6648 }
6648 6649
6649 6650
6650 void Library::InitScalarlistLibrary(Isolate* isolate) { 6651 void Library::InitScalarlistLibrary(Isolate* isolate) {
6651 const String& url = String::Handle(Symbols::New("dart:scalarlist")); 6652 const String& url = String::Handle(Symbols::New("dart:scalarlist"));
6652 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); 6653 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true));
6653 lib.Register(); 6654 lib.Register();
6654 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary()); 6655 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary());
6655 lib.AddImport(core_impl_lib); 6656 lib.AddImportAll(core_impl_lib);
6656 isolate->object_store()->set_scalarlist_library(lib); 6657 isolate->object_store()->set_scalarlist_library(lib);
6657 } 6658 }
6658 6659
6659 6660
6660 void Library::InitNativeWrappersLibrary(Isolate* isolate) { 6661 void Library::InitNativeWrappersLibrary(Isolate* isolate) {
6661 static const int kNumNativeWrappersClasses = 4; 6662 static const int kNumNativeWrappersClasses = 4;
6662 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); 6663 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
6663 const String& native_flds_lib_url = String::Handle( 6664 const String& native_flds_lib_url = String::Handle(
6664 Symbols::New("dart:nativewrappers")); 6665 Symbols::New("dart:nativewrappers"));
6665 const Library& native_flds_lib = Library::Handle( 6666 const Library& native_flds_lib = Library::Handle(
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
6799 const char* kFormat = "Library:'%s'"; 6800 const char* kFormat = "Library:'%s'";
6800 const String& name = String::Handle(url()); 6801 const String& name = String::Handle(url());
6801 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString()) + 1; 6802 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString()) + 1;
6802 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 6803 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
6803 OS::SNPrint(chars, len, kFormat, name.ToCString()); 6804 OS::SNPrint(chars, len, kFormat, name.ToCString());
6804 return chars; 6805 return chars;
6805 } 6806 }
6806 6807
6807 6808
6808 RawLibrary* LibraryPrefix::GetLibrary(int index) const { 6809 RawLibrary* LibraryPrefix::GetLibrary(int index) const {
6809 Library& lib = Library::Handle(); 6810 if ((index >= 0) || (index < num_imports())) {
6810 if ((index >= 0) || (index < num_libs())) { 6811 const Array& imports = Array::Handle(this->imports());
6811 Array& libs = Array::Handle(libraries()); 6812 const Namespace& import = Namespace::CheckedHandle(imports.At(index));
6812 lib ^= libs.At(index); 6813 return import.library();
6813 } 6814 }
6814 return lib.raw(); 6815 return Library::null();
6815 } 6816 }
6816 6817
6817 6818
6818 bool LibraryPrefix::ContainsLibrary(const Library& library) const { 6819 bool LibraryPrefix::ContainsLibrary(const Library& library) const {
6819 intptr_t num_current_libs = num_libs(); 6820 intptr_t num_current_imports = num_imports();
6820 if (num_current_libs > 0) { 6821 if (num_current_imports > 0) {
6821 Library& lib = Library::Handle(); 6822 Library& lib = Library::Handle();
6822 const String& url = String::Handle(library.url()); 6823 const String& url = String::Handle(library.url());
6823 String& lib_url = String::Handle(); 6824 String& lib_url = String::Handle();
6824 for (intptr_t i = 0; i < num_current_libs; i++) { 6825 for (intptr_t i = 0; i < num_current_imports; i++) {
6825 lib = GetLibrary(i); 6826 lib = GetLibrary(i);
6826 ASSERT(!lib.IsNull()); 6827 ASSERT(!lib.IsNull());
6827 lib_url = lib.url(); 6828 lib_url = lib.url();
6828 if (url.Equals(lib_url)) { 6829 if (url.Equals(lib_url)) {
6829 return true; 6830 return true;
6830 } 6831 }
6831 } 6832 }
6832 } 6833 }
6833 return false; 6834 return false;
6834 } 6835 }
6835 6836
6836 void LibraryPrefix::AddLibrary(const Library& library) const {
6837 intptr_t num_current_libs = num_libs();
6838 6837
6839 // First check if the library is already in the list of libraries imported. 6838 void LibraryPrefix::AddImport(const Namespace& import) const {
6840 if (ContainsLibrary(library)) { 6839 intptr_t num_current_imports = num_imports();
siva 2012/09/24 18:28:51 This seems to imply that a library can be imported
hausner 2012/09/24 20:25:43 The spec does not say what happens if the combinat
6841 return; // Library already imported with same prefix.
6842 }
6843 6840
6844 // The library needs to be added to the list. 6841 // The library needs to be added to the list.
6845 Array& libs = Array::Handle(libraries()); 6842 Array& imports = Array::Handle(this->imports());
6846 const intptr_t length = (libs.IsNull()) ? 0 : libs.Length(); 6843 const intptr_t length = (imports.IsNull()) ? 0 : imports.Length();
6847 // Grow the list if it is full. 6844 // Grow the list if it is full.
6848 if (num_current_libs >= length) { 6845 if (num_current_imports >= length) {
6849 const intptr_t new_length = length + kIncrementSize; 6846 const intptr_t new_length = length + kIncrementSize;
6850 libs = Array::Grow(libs, new_length, Heap::kOld); 6847 imports = Array::Grow(imports, new_length, Heap::kOld);
6851 set_libraries(libs); 6848 set_imports(imports);
6852 } 6849 }
6853 libs.SetAt(num_current_libs, library); 6850 imports.SetAt(num_current_imports, import);
6854 set_num_libs(num_current_libs + 1); 6851 set_num_imports(num_current_imports + 1);
6855 } 6852 }
6856 6853
6857 6854
6858 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const { 6855 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const {
6859 Array& libs = Array::Handle(libraries()); 6856 Array& imports = Array::Handle(this->imports());
6860 Class& resolved_class = Class::Handle(); 6857 Object& obj = Object::Handle();
6861 Library& lib = Library::Handle(); 6858 Namespace& import = Namespace::Handle();
6862 for (intptr_t i = 0; i < num_libs(); i++) { 6859 for (intptr_t i = 0; i < num_imports(); i++) {
6863 lib ^= libs.At(i); 6860 import ^= imports.At(i);
6864 ASSERT(!lib.IsNull()); 6861 obj = import.Lookup(class_name);
6865 resolved_class = lib.LookupLocalClass(class_name); 6862 if (!obj.IsNull() && obj.IsClass()) {
6866 if (!resolved_class.IsNull()) { 6863 // TODO(hausner):
6867 return resolved_class.raw(); 6864 return Class::Cast(obj).raw();
6868 } 6865 }
6869 } 6866 }
6870 return Class::null(); 6867 return Class::null();
6871 } 6868 }
6872 6869
6873 6870
6874 RawLibraryPrefix* LibraryPrefix::New() { 6871 RawLibraryPrefix* LibraryPrefix::New() {
6875 ASSERT(Object::library_prefix_class() != Class::null()); 6872 ASSERT(Object::library_prefix_class() != Class::null());
6876 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId, 6873 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId,
6877 LibraryPrefix::InstanceSize(), 6874 LibraryPrefix::InstanceSize(),
6878 Heap::kOld); 6875 Heap::kOld);
6879 return reinterpret_cast<RawLibraryPrefix*>(raw); 6876 return reinterpret_cast<RawLibraryPrefix*>(raw);
6880 } 6877 }
6881 6878
6882 6879
6883 RawLibraryPrefix* LibraryPrefix::New(const String& name, const Library& lib) { 6880 RawLibraryPrefix* LibraryPrefix::New(const String& name,
6881 const Namespace& import) {
6884 const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New()); 6882 const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New());
6885 result.set_name(name); 6883 result.set_name(name);
6886 result.set_num_libs(0); 6884 result.set_num_imports(0);
6887 result.AddLibrary(lib); 6885 result.set_imports(Array::Handle(Array::New(kInitialSize)));
6886 result.AddImport(import);
6888 return result.raw(); 6887 return result.raw();
6889 } 6888 }
6890 6889
6891 6890
6891 void LibraryPrefix::set_name(const String& value) const {
6892 ASSERT(value.IsSymbol());
6893 StorePointer(&raw_ptr()->name_, value.raw());
6894 }
6895
6896
6897 void LibraryPrefix::set_imports(const Array& value) const {
6898 StorePointer(&raw_ptr()->imports_, value.raw());
6899 }
6900
6901
6902 void LibraryPrefix::set_num_imports(intptr_t value) const {
6903 raw_ptr()->num_imports_ = value;
6904 }
6905
6906
6892 const char* LibraryPrefix::ToCString() const { 6907 const char* LibraryPrefix::ToCString() const {
6893 const char* kFormat = "LibraryPrefix:'%s'"; 6908 const char* kFormat = "LibraryPrefix:'%s'";
6894 const String& prefix = String::Handle(name()); 6909 const String& prefix = String::Handle(name());
6895 intptr_t len = OS::SNPrint(NULL, 0, kFormat, prefix.ToCString()) + 1; 6910 intptr_t len = OS::SNPrint(NULL, 0, kFormat, prefix.ToCString()) + 1;
6896 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 6911 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
6897 OS::SNPrint(chars, len, kFormat, prefix.ToCString()); 6912 OS::SNPrint(chars, len, kFormat, prefix.ToCString());
6898 return chars; 6913 return chars;
6899 } 6914 }
6900 6915
6901 6916
6902 void LibraryPrefix::set_name(const String& value) const { 6917 const char* Namespace::ToCString() const {
6903 ASSERT(value.IsSymbol()); 6918 const char* kFormat = "Namespace for library '%s'";
6904 StorePointer(&raw_ptr()->name_, value.raw()); 6919 const Library& lib = Library::Handle(library());
6920 intptr_t len = OS::SNPrint(NULL, 0, kFormat, lib.ToCString()) + 1;
6921 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
6922 OS::SNPrint(chars, len, kFormat, lib.ToCString());
6923 return chars;
6905 } 6924 }
6906 6925
6907 6926
6908 void LibraryPrefix::set_libraries(const Array& value) const { 6927 bool Namespace::HidesName(const String& name) const {
6909 StorePointer(&raw_ptr()->libraries_, value.raw()); 6928 // Check whether the name is in the list of explicitly hidden names.
6929 if (hide_names() != Array::null()) {
6930 const Array& names = Array::Handle(hide_names());
6931 String& hidden = String::Handle();
6932 intptr_t num_names = names.Length();
6933 for (intptr_t i = 0; i < num_names; i++) {
6934 hidden ^= names.At(i);
6935 if (name.Equals(hidden)) {
6936 return true;
6937 }
6938 }
6939 }
6940 // The name is not explicitly hidden. Now check whether it is in the
6941 // list of explicitly visible names, if there is one.
6942 if (show_names() != Array::null()) {
6943 const Array& names = Array::Handle(show_names());
6944 String& shown = String::Handle();
6945 intptr_t num_names = names.Length();
6946 for (intptr_t i = 0; i < num_names; i++) {
6947 shown ^= names.At(i);
6948 if (name.Equals(shown)) {
6949 return false;
6950 }
6951 }
6952 // There is a list of visible names. The name we're looking for is not
6953 // contained in the list, so it is hidden.
6954 return true;
6955 }
6956 // The name is not filtered out.
6957 return false;
6910 } 6958 }
6911 6959
6912 6960
6913 void LibraryPrefix::set_num_libs(intptr_t value) const { 6961 RawObject* Namespace::Lookup(const String& name) const {
6914 raw_ptr()->num_libs_ = value; 6962 intptr_t i = 0;
6963 const Library& lib = Library::Handle(library());
6964 const Object& obj = Object::Handle(lib.LookupEntry(name, &i));
6965 if (obj.IsNull() || HidesName(name)) {
6966 return Object::null();
6967 }
6968 return obj.raw();
6969 }
6970
6971
6972 RawNamespace* Namespace::New() {
6973 ASSERT(Object::namespace_class() != Class::null());
6974 RawObject* raw = Object::Allocate(Namespace::kClassId,
6975 Namespace::InstanceSize(),
6976 Heap::kOld);
6977 return reinterpret_cast<RawNamespace*>(raw);
6978 }
6979
6980
6981 RawNamespace* Namespace::New(const Library& library,
6982 const Array& show_names,
6983 const Array& hide_names) {
6984 ASSERT(show_names.IsNull() || (show_names.Length() > 0));
6985 ASSERT(hide_names.IsNull() || (hide_names.Length() > 0));
6986 const Namespace& result = Namespace::Handle(Namespace::New());
6987 result.StorePointer(&result.raw_ptr()->library_, library.raw());
6988 result.StorePointer(&result.raw_ptr()->show_names_, show_names.raw());
6989 result.StorePointer(&result.raw_ptr()->hide_names_, hide_names.raw());
6990 return result.raw();
6915 } 6991 }
6916 6992
6917 6993
6918 RawError* Library::CompileAll() { 6994 RawError* Library::CompileAll() {
6919 Error& error = Error::Handle(); 6995 Error& error = Error::Handle();
6920 const GrowableObjectArray& libs = GrowableObjectArray::Handle( 6996 const GrowableObjectArray& libs = GrowableObjectArray::Handle(
6921 Isolate::Current()->object_store()->libraries()); 6997 Isolate::Current()->object_store()->libraries());
6922 Library& lib = Library::Handle(); 6998 Library& lib = Library::Handle();
6923 Class& cls = Class::Handle(); 6999 Class& cls = Class::Handle();
6924 for (int i = 0; i < libs.Length(); i++) { 7000 for (int i = 0; i < libs.Length(); i++) {
(...skipping 4909 matching lines...) Expand 10 before | Expand all | Expand 10 after
11834 } 11910 }
11835 return result.raw(); 11911 return result.raw();
11836 } 11912 }
11837 11913
11838 11914
11839 const char* WeakProperty::ToCString() const { 11915 const char* WeakProperty::ToCString() const {
11840 return "_WeakProperty"; 11916 return "_WeakProperty";
11841 } 11917 }
11842 11918
11843 } // namespace dart 11919 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698