OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
439 SET_CLASS_NAME(type_arguments, TypeArguments); | 443 SET_CLASS_NAME(type_arguments, TypeArguments); |
440 SET_CLASS_NAME(instantiated_type_arguments, InstantiatedTypeArguments); | 444 SET_CLASS_NAME(instantiated_type_arguments, InstantiatedTypeArguments); |
441 SET_CLASS_NAME(patch_class, PatchClass); | 445 SET_CLASS_NAME(patch_class, PatchClass); |
442 SET_CLASS_NAME(function, Function); | 446 SET_CLASS_NAME(function, Function); |
443 SET_CLASS_NAME(closure_data, ClosureData); | 447 SET_CLASS_NAME(closure_data, ClosureData); |
444 SET_CLASS_NAME(field, Field); | 448 SET_CLASS_NAME(field, Field); |
445 SET_CLASS_NAME(literal_token, LiteralToken); | 449 SET_CLASS_NAME(literal_token, LiteralToken); |
446 SET_CLASS_NAME(token_stream, TokenStream); | 450 SET_CLASS_NAME(token_stream, TokenStream); |
447 SET_CLASS_NAME(script, Script); | 451 SET_CLASS_NAME(script, Script); |
448 SET_CLASS_NAME(library, LibraryClass); | 452 SET_CLASS_NAME(library, LibraryClass); |
449 SET_CLASS_NAME(library_prefix, LibraryPrefix); | 453 SET_CLASS_NAME(library_prefix, LibraryPrefix); |
siva
2012/09/24 21:20:40
oops forgot this:
We are missing
SET_CLASS_NAME(na
hausner
2012/09/24 21:41:06
Done.
| |
450 SET_CLASS_NAME(code, Code); | 454 SET_CLASS_NAME(code, Code); |
451 SET_CLASS_NAME(instructions, Instructions); | 455 SET_CLASS_NAME(instructions, Instructions); |
452 SET_CLASS_NAME(pc_descriptors, PcDescriptors); | 456 SET_CLASS_NAME(pc_descriptors, PcDescriptors); |
453 SET_CLASS_NAME(stackmap, Stackmap); | 457 SET_CLASS_NAME(stackmap, Stackmap); |
454 SET_CLASS_NAME(var_descriptors, LocalVarDescriptors); | 458 SET_CLASS_NAME(var_descriptors, LocalVarDescriptors); |
455 SET_CLASS_NAME(exception_handlers, ExceptionHandlers); | 459 SET_CLASS_NAME(exception_handlers, ExceptionHandlers); |
456 SET_CLASS_NAME(deopt_info, DeoptInfo); | 460 SET_CLASS_NAME(deopt_info, DeoptInfo); |
457 SET_CLASS_NAME(context, Context); | 461 SET_CLASS_NAME(context, Context); |
458 SET_CLASS_NAME(context_scope, ContextScope); | 462 SET_CLASS_NAME(context_scope, ContextScope); |
459 SET_CLASS_NAME(icdata, ICData); | 463 SET_CLASS_NAME(icdata, ICData); |
(...skipping 5804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 20 matching lines...) Expand all Loading... | |
6314 Function& function = Function::Handle(LookupLocalFunction(name)); | 6317 Function& function = Function::Handle(LookupLocalFunction(name)); |
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 any imported libs. |
6325 // libs. | |
6326 const Array& imports = Array::Handle(this->imports()); | 6328 const Array& imports = Array::Handle(this->imports()); |
6327 Library& import_lib = Library::Handle(); | 6329 Namespace& import = Namespace::Handle(); |
6330 Object& obj = Object::Handle(); | |
6328 for (intptr_t j = 0; j < this->num_imports(); j++) { | 6331 for (intptr_t j = 0; j < this->num_imports(); j++) { |
6329 import_lib ^= imports.At(j); | 6332 import ^= imports.At(j); |
6330 | 6333 obj = import.Lookup(name); |
6331 | 6334 if (!obj.IsNull() && obj.IsFunction()) { |
6332 function = import_lib.LookupLocalFunction(name); | 6335 function ^= obj.raw(); |
6333 if (!function.IsNull()) { | |
6334 return function.raw(); | 6336 return function.raw(); |
6335 } | 6337 } |
6336 } | 6338 } |
6337 return Function::null(); | 6339 return Function::null(); |
6338 } | 6340 } |
6339 | 6341 |
6340 | 6342 |
6341 RawFunction* Library::LookupLocalFunction(const String& name) const { | 6343 RawFunction* Library::LookupLocalFunction(const String& name) const { |
6342 Isolate* isolate = Isolate::Current(); | 6344 Isolate* isolate = Isolate::Current(); |
6343 Object& obj = Object::Handle(isolate, Object::null()); | 6345 Object& obj = Object::Handle(isolate, Object::null()); |
(...skipping 10 matching lines...) Expand all Loading... | |
6354 return Function::null(); | 6356 return Function::null(); |
6355 } | 6357 } |
6356 | 6358 |
6357 | 6359 |
6358 RawObject* Library::LookupObject(const String& name) const { | 6360 RawObject* Library::LookupObject(const String& name) const { |
6359 // First check if name is found in the local scope of the library. | 6361 // First check if name is found in the local scope of the library. |
6360 Object& obj = Object::Handle(LookupLocalObject(name)); | 6362 Object& obj = Object::Handle(LookupLocalObject(name)); |
6361 if (!obj.IsNull()) { | 6363 if (!obj.IsNull()) { |
6362 return obj.raw(); | 6364 return obj.raw(); |
6363 } | 6365 } |
6364 // Now check if name is found in the top level scope of any imported libs. | 6366 // Now check if name is found in any imported libs. |
6365 const Array& imports = Array::Handle(this->imports()); | 6367 const Array& imports = Array::Handle(this->imports()); |
6366 Library& import_lib = Library::Handle(); | 6368 Namespace& import = Namespace::Handle(); |
6367 for (intptr_t j = 0; j < this->num_imports(); j++) { | 6369 for (intptr_t j = 0; j < this->num_imports(); j++) { |
6368 import_lib ^= imports.At(j); | 6370 import ^= imports.At(j); |
6369 obj = import_lib.LookupLocalObject(name); | 6371 obj = import.Lookup(name); |
6370 if (!obj.IsNull()) { | 6372 if (!obj.IsNull()) { |
6371 return obj.raw(); | 6373 return obj.raw(); |
6372 } | 6374 } |
6373 } | 6375 } |
6374 return Object::null(); | 6376 return Object::null(); |
6375 } | 6377 } |
6376 | 6378 |
6377 | 6379 |
6378 RawClass* Library::LookupClass(const String& name) const { | 6380 RawClass* Library::LookupClass(const String& name) const { |
6379 Object& obj = Object::Handle(LookupObject(name)); | 6381 Object& obj = Object::Handle(LookupObject(name)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6436 anon_array.SetAt(num_anonymous, cls); | 6438 anon_array.SetAt(num_anonymous, cls); |
6437 num_anonymous++; | 6439 num_anonymous++; |
6438 raw_ptr()->num_anonymous_ = num_anonymous; | 6440 raw_ptr()->num_anonymous_ = num_anonymous; |
6439 } | 6441 } |
6440 | 6442 |
6441 | 6443 |
6442 RawLibrary* Library::LookupImport(const String& url) const { | 6444 RawLibrary* Library::LookupImport(const String& url) const { |
6443 Isolate* isolate = Isolate::Current(); | 6445 Isolate* isolate = Isolate::Current(); |
6444 const Array& imports = Array::Handle(isolate, this->imports()); | 6446 const Array& imports = Array::Handle(isolate, this->imports()); |
6445 intptr_t num_imports = this->num_imports(); | 6447 intptr_t num_imports = this->num_imports(); |
6448 Namespace& import = Namespace::Handle(isolate, Namespace::null()); | |
6446 Library& lib = Library::Handle(isolate, Library::null()); | 6449 Library& lib = Library::Handle(isolate, Library::null()); |
6447 String& import_url = String::Handle(isolate, String::null()); | 6450 String& import_url = String::Handle(isolate, String::null()); |
6448 for (int i = 0; i < num_imports; i++) { | 6451 for (int i = 0; i < num_imports; i++) { |
6449 lib ^= imports.At(i); | 6452 import ^= imports.At(i); |
6453 lib = import.library(); | |
6450 import_url = lib.url(); | 6454 import_url = lib.url(); |
6451 if (url.Equals(import_url)) { | 6455 if (url.Equals(import_url)) { |
6452 return lib.raw(); | 6456 return lib.raw(); |
6453 } | 6457 } |
6454 } | 6458 } |
6455 return Library::null(); | 6459 return Library::null(); |
6456 } | 6460 } |
6457 | 6461 |
6458 | 6462 |
6459 RawLibrary* Library::ImportAt(intptr_t index) const { | 6463 RawLibrary* Library::ImportLibraryAt(intptr_t index) const { |
6460 if ((index < 0) || index >= num_imports()) { | 6464 Namespace& import = Namespace::Handle(ImportAt(index)); |
6465 if (import.IsNull()) { | |
6461 return Library::null(); | 6466 return Library::null(); |
6462 } | 6467 } |
6463 const Array& import_list = Array::Handle(imports()); | 6468 return import.library(); |
6464 Library& lib = Library::Handle(); | |
6465 lib ^= import_list.At(index); | |
6466 return lib.raw(); | |
6467 } | 6469 } |
6468 | 6470 |
6469 | 6471 |
6470 RawLibraryPrefix* Library::ImportPrefixAt(intptr_t index) const { | 6472 RawNamespace* Library::ImportAt(intptr_t index) const { |
6471 const Library& imported = Library::Handle(ImportAt(index)); | 6473 if ((index < 0) || index >= num_imports()) { |
6472 if (imported.IsNull()) { | 6474 return Namespace::null(); |
6473 return LibraryPrefix::null(); | |
6474 } | 6475 } |
6475 DictionaryIterator it(*this); | 6476 const Array& import_list = Array::Handle(imports()); |
6476 Object& obj = Object::Handle(); | 6477 Namespace& import = Namespace::Handle(); |
6477 while (it.HasNext()) { | 6478 import ^= import_list.At(index); |
6478 obj = it.GetNext(); | 6479 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 } | 6480 } |
6488 | 6481 |
6489 | 6482 |
6490 bool Library::ImportsCorelib() const { | 6483 bool Library::ImportsCorelib() const { |
6491 Isolate* isolate = Isolate::Current(); | 6484 Isolate* isolate = Isolate::Current(); |
6492 Library& imported = Library::Handle(isolate); | 6485 Library& imported = Library::Handle(isolate); |
6493 intptr_t count = num_imports(); | 6486 intptr_t count = num_imports(); |
6494 for (int i = 0; i < count; i++) { | 6487 for (int i = 0; i < count; i++) { |
6495 imported = ImportAt(i); | 6488 imported = ImportLibraryAt(i); |
6496 if (imported.IsCoreLibrary()) { | 6489 if (imported.IsCoreLibrary()) { |
6497 return true; | 6490 return true; |
6498 } | 6491 } |
6499 } | 6492 } |
6500 LibraryPrefix& prefix = LibraryPrefix::Handle(isolate); | 6493 LibraryPrefix& prefix = LibraryPrefix::Handle(isolate); |
6501 LibraryPrefixIterator it(*this); | 6494 LibraryPrefixIterator it(*this); |
6502 while (it.HasNext()) { | 6495 while (it.HasNext()) { |
6503 prefix = it.GetNext(); | 6496 prefix = it.GetNext(); |
6504 count = prefix.num_libs(); | 6497 count = prefix.num_imports(); |
6505 for (int i = 0; i < count; i++) { | 6498 for (int i = 0; i < count; i++) { |
6506 imported = prefix.GetLibrary(i); | 6499 imported = prefix.GetLibrary(i); |
6507 if (imported.IsCoreLibrary()) { | 6500 if (imported.IsCoreLibrary()) { |
6508 return true; | 6501 return true; |
6509 } | 6502 } |
6510 } | 6503 } |
6511 } | 6504 } |
6512 return false; | 6505 return false; |
6513 } | 6506 } |
6514 | 6507 |
6515 | 6508 |
6516 void Library::AddImport(const Library& library) const { | 6509 void Library::AddImport(const Namespace& ns) const { |
6517 Array& imports = Array::Handle(this->imports()); | 6510 Array& imports = Array::Handle(this->imports()); |
6518 intptr_t capacity = imports.Length(); | 6511 intptr_t capacity = imports.Length(); |
6519 if (num_imports() == capacity) { | 6512 if (num_imports() == capacity) { |
6520 capacity = capacity + kImportsCapacityIncrement; | 6513 capacity = capacity + kImportsCapacityIncrement; |
6521 imports = Array::Grow(imports, capacity); | 6514 imports = Array::Grow(imports, capacity); |
6522 StorePointer(&raw_ptr()->imports_, imports.raw()); | 6515 StorePointer(&raw_ptr()->imports_, imports.raw()); |
6523 } | 6516 } |
6524 intptr_t index = num_imports(); | 6517 intptr_t index = num_imports(); |
6525 imports.SetAt(index, library); | 6518 imports.SetAt(index, ns); |
6526 set_num_imports(index + 1); | 6519 set_num_imports(index + 1); |
6527 } | 6520 } |
6528 | 6521 |
6529 | 6522 |
6530 void Library::InitClassDictionary() const { | 6523 void Library::InitClassDictionary() const { |
6531 // The last element of the dictionary specifies the number of in use slots. | 6524 // The last element of the dictionary specifies the number of in use slots. |
6532 // TODO(iposva): Find reasonable initial size. | 6525 // TODO(iposva): Find reasonable initial size. |
6533 const int kInitialElementCount = 16; | 6526 const int kInitialElementCount = 16; |
6534 | 6527 |
6535 const Array& dictionary = | 6528 const Array& dictionary = |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6568 result.raw_ptr()->imports_ = Object::empty_array(); | 6561 result.raw_ptr()->imports_ = Object::empty_array(); |
6569 result.raw_ptr()->loaded_scripts_ = Array::null(); | 6562 result.raw_ptr()->loaded_scripts_ = Array::null(); |
6570 result.set_native_entry_resolver(NULL); | 6563 result.set_native_entry_resolver(NULL); |
6571 result.raw_ptr()->corelib_imported_ = true; | 6564 result.raw_ptr()->corelib_imported_ = true; |
6572 result.set_debuggable(false); | 6565 result.set_debuggable(false); |
6573 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; | 6566 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; |
6574 result.raw_ptr()->index_ = -1; | 6567 result.raw_ptr()->index_ = -1; |
6575 result.InitClassDictionary(); | 6568 result.InitClassDictionary(); |
6576 result.InitImportList(); | 6569 result.InitImportList(); |
6577 if (import_core_lib) { | 6570 if (import_core_lib) { |
6578 Library& core_lib = Library::Handle(Library::CoreLibrary()); | 6571 const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
6579 ASSERT(!core_lib.IsNull()); | 6572 ASSERT(!core_lib.IsNull()); |
6580 result.AddImport(core_lib); | 6573 const Namespace& ns = Namespace::Handle( |
6574 Namespace::New(core_lib, Array::Handle(), Array::Handle())); | |
6575 result.AddImport(ns); | |
6581 } | 6576 } |
6582 return result.raw(); | 6577 return result.raw(); |
6583 } | 6578 } |
6584 | 6579 |
6585 | 6580 |
6586 RawLibrary* Library::New(const String& url) { | 6581 RawLibrary* Library::New(const String& url) { |
6587 return NewLibraryHelper(url, false); | 6582 return NewLibraryHelper(url, false); |
6588 } | 6583 } |
6589 | 6584 |
6590 | 6585 |
6591 void Library::InitCoreLibrary(Isolate* isolate) { | 6586 void Library::InitCoreLibrary(Isolate* isolate) { |
6592 const String& core_lib_url = String::Handle(Symbols::New("dart:core")); | 6587 const String& core_lib_url = String::Handle(Symbols::New("dart:core")); |
6593 const Library& core_lib = | 6588 const Library& core_lib = |
6594 Library::Handle(Library::NewLibraryHelper(core_lib_url, false)); | 6589 Library::Handle(Library::NewLibraryHelper(core_lib_url, false)); |
6595 core_lib.Register(); | 6590 core_lib.Register(); |
6591 const Namespace& core_ns = Namespace::Handle( | |
6592 Namespace::New(core_lib, Array::Handle(), Array::Handle())); | |
6596 isolate->object_store()->set_core_library(core_lib); | 6593 isolate->object_store()->set_core_library(core_lib); |
6597 const String& core_impl_lib_url = | 6594 const String& core_impl_lib_url = |
6598 String::Handle(Symbols::New("dart:coreimpl")); | 6595 String::Handle(Symbols::New("dart:coreimpl")); |
6599 const Library& core_impl_lib = | 6596 const Library& core_impl_lib = |
6600 Library::Handle(Library::NewLibraryHelper(core_impl_lib_url, false)); | 6597 Library::Handle(Library::NewLibraryHelper(core_impl_lib_url, false)); |
6601 isolate->object_store()->set_core_impl_library(core_impl_lib); | 6598 isolate->object_store()->set_core_impl_library(core_impl_lib); |
6602 core_impl_lib.Register(); | 6599 core_impl_lib.Register(); |
6603 core_lib.AddImport(core_impl_lib); | 6600 const Namespace& impl_ns = Namespace::Handle( |
6604 core_impl_lib.AddImport(core_lib); | 6601 Namespace::New(core_impl_lib, Array::Handle(), Array::Handle())); |
6602 core_lib.AddImport(impl_ns); | |
6603 core_impl_lib.AddImport(core_ns); | |
6605 Library::InitMathLibrary(isolate); | 6604 Library::InitMathLibrary(isolate); |
6606 const Library& math_lib = Library::Handle(Library::MathLibrary()); | 6605 const Library& math_lib = Library::Handle(Library::MathLibrary()); |
6607 core_lib.AddImport(math_lib); | 6606 const Namespace& math_ns = Namespace::Handle( |
6608 core_impl_lib.AddImport(math_lib); | 6607 Namespace::New(math_lib, Array::Handle(), Array::Handle())); |
6608 core_lib.AddImport(math_ns); | |
6609 core_impl_lib.AddImport(math_ns); | |
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 const Namespace& impl_ns = Namespace::Handle( |
6626 Namespace::New(core_impl_lib, Array::Handle(), Array::Handle())); | |
6627 lib.AddImport(impl_ns); | |
6625 isolate->object_store()->set_math_library(lib); | 6628 isolate->object_store()->set_math_library(lib); |
6626 } | 6629 } |
6627 | 6630 |
6628 | 6631 |
6629 void Library::InitIsolateLibrary(Isolate* isolate) { | 6632 void Library::InitIsolateLibrary(Isolate* isolate) { |
6630 const String& url = String::Handle(Symbols::New("dart:isolate")); | 6633 const String& url = String::Handle(Symbols::New("dart:isolate")); |
6631 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); | 6634 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
6632 lib.Register(); | 6635 lib.Register(); |
6633 isolate->object_store()->set_isolate_library(lib); | 6636 isolate->object_store()->set_isolate_library(lib); |
6634 } | 6637 } |
6635 | 6638 |
6636 | 6639 |
6637 void Library::InitMirrorsLibrary(Isolate* isolate) { | 6640 void Library::InitMirrorsLibrary(Isolate* isolate) { |
6638 const String& url = String::Handle(Symbols::New("dart:mirrors")); | 6641 const String& url = String::Handle(Symbols::New("dart:mirrors")); |
6639 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); | 6642 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
6640 lib.Register(); | 6643 lib.Register(); |
6641 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 6644 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
6642 lib.AddImport(isolate_lib); | 6645 const Namespace& isolate_ns = Namespace::Handle( |
6646 Namespace::New(isolate_lib, Array::Handle(), Array::Handle())); | |
6647 lib.AddImport(isolate_ns); | |
6643 const Library& wrappers_lib = | 6648 const Library& wrappers_lib = |
6644 Library::Handle(Library::NativeWrappersLibrary()); | 6649 Library::Handle(Library::NativeWrappersLibrary()); |
6645 lib.AddImport(wrappers_lib); | 6650 const Namespace& wrappers_ns = Namespace::Handle( |
6651 Namespace::New(wrappers_lib, Array::Handle(), Array::Handle())); | |
6652 lib.AddImport(wrappers_ns); | |
6646 isolate->object_store()->set_mirrors_library(lib); | 6653 isolate->object_store()->set_mirrors_library(lib); |
6647 } | 6654 } |
6648 | 6655 |
6649 | 6656 |
6650 void Library::InitScalarlistLibrary(Isolate* isolate) { | 6657 void Library::InitScalarlistLibrary(Isolate* isolate) { |
6651 const String& url = String::Handle(Symbols::New("dart:scalarlist")); | 6658 const String& url = String::Handle(Symbols::New("dart:scalarlist")); |
6652 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); | 6659 const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
6653 lib.Register(); | 6660 lib.Register(); |
6654 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary()); | 6661 const Library& core_impl_lib = Library::Handle(Library::CoreImplLibrary()); |
6655 lib.AddImport(core_impl_lib); | 6662 const Namespace& impl_ns = Namespace::Handle( |
6663 Namespace::New(core_impl_lib, Array::Handle(), Array::Handle())); | |
6664 lib.AddImport(impl_ns); | |
6656 isolate->object_store()->set_scalarlist_library(lib); | 6665 isolate->object_store()->set_scalarlist_library(lib); |
6657 } | 6666 } |
6658 | 6667 |
6659 | 6668 |
6660 void Library::InitNativeWrappersLibrary(Isolate* isolate) { | 6669 void Library::InitNativeWrappersLibrary(Isolate* isolate) { |
6661 static const int kNumNativeWrappersClasses = 4; | 6670 static const int kNumNativeWrappersClasses = 4; |
6662 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); | 6671 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); |
6663 const String& native_flds_lib_url = String::Handle( | 6672 const String& native_flds_lib_url = String::Handle( |
6664 Symbols::New("dart:nativewrappers")); | 6673 Symbols::New("dart:nativewrappers")); |
6665 const Library& native_flds_lib = Library::Handle( | 6674 const Library& native_flds_lib = Library::Handle( |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6799 const char* kFormat = "Library:'%s'"; | 6808 const char* kFormat = "Library:'%s'"; |
6800 const String& name = String::Handle(url()); | 6809 const String& name = String::Handle(url()); |
6801 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString()) + 1; | 6810 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name.ToCString()) + 1; |
6802 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 6811 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
6803 OS::SNPrint(chars, len, kFormat, name.ToCString()); | 6812 OS::SNPrint(chars, len, kFormat, name.ToCString()); |
6804 return chars; | 6813 return chars; |
6805 } | 6814 } |
6806 | 6815 |
6807 | 6816 |
6808 RawLibrary* LibraryPrefix::GetLibrary(int index) const { | 6817 RawLibrary* LibraryPrefix::GetLibrary(int index) const { |
6809 Library& lib = Library::Handle(); | 6818 if ((index >= 0) || (index < num_imports())) { |
6810 if ((index >= 0) || (index < num_libs())) { | 6819 const Array& imports = Array::Handle(this->imports()); |
6811 Array& libs = Array::Handle(libraries()); | 6820 const Namespace& import = Namespace::CheckedHandle(imports.At(index)); |
6812 lib ^= libs.At(index); | 6821 return import.library(); |
6813 } | 6822 } |
6814 return lib.raw(); | 6823 return Library::null(); |
6815 } | 6824 } |
6816 | 6825 |
6817 | 6826 |
6818 bool LibraryPrefix::ContainsLibrary(const Library& library) const { | 6827 bool LibraryPrefix::ContainsLibrary(const Library& library) const { |
6819 intptr_t num_current_libs = num_libs(); | 6828 intptr_t num_current_imports = num_imports(); |
6820 if (num_current_libs > 0) { | 6829 if (num_current_imports > 0) { |
6821 Library& lib = Library::Handle(); | 6830 Library& lib = Library::Handle(); |
6822 const String& url = String::Handle(library.url()); | 6831 const String& url = String::Handle(library.url()); |
6823 String& lib_url = String::Handle(); | 6832 String& lib_url = String::Handle(); |
6824 for (intptr_t i = 0; i < num_current_libs; i++) { | 6833 for (intptr_t i = 0; i < num_current_imports; i++) { |
6825 lib = GetLibrary(i); | 6834 lib = GetLibrary(i); |
6826 ASSERT(!lib.IsNull()); | 6835 ASSERT(!lib.IsNull()); |
6827 lib_url = lib.url(); | 6836 lib_url = lib.url(); |
6828 if (url.Equals(lib_url)) { | 6837 if (url.Equals(lib_url)) { |
6829 return true; | 6838 return true; |
6830 } | 6839 } |
6831 } | 6840 } |
6832 } | 6841 } |
6833 return false; | 6842 return false; |
6834 } | 6843 } |
6835 | 6844 |
6836 void LibraryPrefix::AddLibrary(const Library& library) const { | |
6837 intptr_t num_current_libs = num_libs(); | |
6838 | 6845 |
6839 // First check if the library is already in the list of libraries imported. | 6846 void LibraryPrefix::AddImport(const Namespace& import) const { |
6840 if (ContainsLibrary(library)) { | 6847 intptr_t num_current_imports = num_imports(); |
6841 return; // Library already imported with same prefix. | |
6842 } | |
6843 | 6848 |
6844 // The library needs to be added to the list. | 6849 // The library needs to be added to the list. |
6845 Array& libs = Array::Handle(libraries()); | 6850 Array& imports = Array::Handle(this->imports()); |
6846 const intptr_t length = (libs.IsNull()) ? 0 : libs.Length(); | 6851 const intptr_t length = (imports.IsNull()) ? 0 : imports.Length(); |
6847 // Grow the list if it is full. | 6852 // Grow the list if it is full. |
6848 if (num_current_libs >= length) { | 6853 if (num_current_imports >= length) { |
6849 const intptr_t new_length = length + kIncrementSize; | 6854 const intptr_t new_length = length + kIncrementSize; |
6850 libs = Array::Grow(libs, new_length, Heap::kOld); | 6855 imports = Array::Grow(imports, new_length, Heap::kOld); |
6851 set_libraries(libs); | 6856 set_imports(imports); |
6852 } | 6857 } |
6853 libs.SetAt(num_current_libs, library); | 6858 imports.SetAt(num_current_imports, import); |
6854 set_num_libs(num_current_libs + 1); | 6859 set_num_imports(num_current_imports + 1); |
6855 } | 6860 } |
6856 | 6861 |
6857 | 6862 |
6858 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const { | 6863 RawClass* LibraryPrefix::LookupLocalClass(const String& class_name) const { |
6859 Array& libs = Array::Handle(libraries()); | 6864 Array& imports = Array::Handle(this->imports()); |
6860 Class& resolved_class = Class::Handle(); | 6865 Object& obj = Object::Handle(); |
6861 Library& lib = Library::Handle(); | 6866 Namespace& import = Namespace::Handle(); |
6862 for (intptr_t i = 0; i < num_libs(); i++) { | 6867 for (intptr_t i = 0; i < num_imports(); i++) { |
6863 lib ^= libs.At(i); | 6868 import ^= imports.At(i); |
6864 ASSERT(!lib.IsNull()); | 6869 obj = import.Lookup(class_name); |
6865 resolved_class = lib.LookupLocalClass(class_name); | 6870 if (!obj.IsNull() && obj.IsClass()) { |
6866 if (!resolved_class.IsNull()) { | 6871 // TODO(hausner): |
6867 return resolved_class.raw(); | 6872 return Class::Cast(obj).raw(); |
6868 } | 6873 } |
6869 } | 6874 } |
6870 return Class::null(); | 6875 return Class::null(); |
6871 } | 6876 } |
6872 | 6877 |
6873 | 6878 |
6874 RawLibraryPrefix* LibraryPrefix::New() { | 6879 RawLibraryPrefix* LibraryPrefix::New() { |
6875 ASSERT(Object::library_prefix_class() != Class::null()); | 6880 ASSERT(Object::library_prefix_class() != Class::null()); |
6876 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId, | 6881 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId, |
6877 LibraryPrefix::InstanceSize(), | 6882 LibraryPrefix::InstanceSize(), |
6878 Heap::kOld); | 6883 Heap::kOld); |
6879 return reinterpret_cast<RawLibraryPrefix*>(raw); | 6884 return reinterpret_cast<RawLibraryPrefix*>(raw); |
6880 } | 6885 } |
6881 | 6886 |
6882 | 6887 |
6883 RawLibraryPrefix* LibraryPrefix::New(const String& name, const Library& lib) { | 6888 RawLibraryPrefix* LibraryPrefix::New(const String& name, |
6889 const Namespace& import) { | |
6884 const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New()); | 6890 const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New()); |
6885 result.set_name(name); | 6891 result.set_name(name); |
6886 result.set_num_libs(0); | 6892 result.set_num_imports(0); |
6887 result.AddLibrary(lib); | 6893 result.set_imports(Array::Handle(Array::New(kInitialSize))); |
6894 result.AddImport(import); | |
6888 return result.raw(); | 6895 return result.raw(); |
6889 } | 6896 } |
6890 | 6897 |
6891 | 6898 |
6899 void LibraryPrefix::set_name(const String& value) const { | |
6900 ASSERT(value.IsSymbol()); | |
6901 StorePointer(&raw_ptr()->name_, value.raw()); | |
6902 } | |
6903 | |
6904 | |
6905 void LibraryPrefix::set_imports(const Array& value) const { | |
6906 StorePointer(&raw_ptr()->imports_, value.raw()); | |
6907 } | |
6908 | |
6909 | |
6910 void LibraryPrefix::set_num_imports(intptr_t value) const { | |
6911 raw_ptr()->num_imports_ = value; | |
6912 } | |
6913 | |
6914 | |
6892 const char* LibraryPrefix::ToCString() const { | 6915 const char* LibraryPrefix::ToCString() const { |
6893 const char* kFormat = "LibraryPrefix:'%s'"; | 6916 const char* kFormat = "LibraryPrefix:'%s'"; |
6894 const String& prefix = String::Handle(name()); | 6917 const String& prefix = String::Handle(name()); |
6895 intptr_t len = OS::SNPrint(NULL, 0, kFormat, prefix.ToCString()) + 1; | 6918 intptr_t len = OS::SNPrint(NULL, 0, kFormat, prefix.ToCString()) + 1; |
6896 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 6919 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
6897 OS::SNPrint(chars, len, kFormat, prefix.ToCString()); | 6920 OS::SNPrint(chars, len, kFormat, prefix.ToCString()); |
6898 return chars; | 6921 return chars; |
6899 } | 6922 } |
6900 | 6923 |
6901 | 6924 |
6902 void LibraryPrefix::set_name(const String& value) const { | 6925 const char* Namespace::ToCString() const { |
6903 ASSERT(value.IsSymbol()); | 6926 const char* kFormat = "Namespace for library '%s'"; |
6904 StorePointer(&raw_ptr()->name_, value.raw()); | 6927 const Library& lib = Library::Handle(library()); |
6928 intptr_t len = OS::SNPrint(NULL, 0, kFormat, lib.ToCString()) + 1; | |
6929 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | |
6930 OS::SNPrint(chars, len, kFormat, lib.ToCString()); | |
6931 return chars; | |
6905 } | 6932 } |
6906 | 6933 |
6907 | 6934 |
6908 void LibraryPrefix::set_libraries(const Array& value) const { | 6935 bool Namespace::HidesName(const String& name) const { |
6909 StorePointer(&raw_ptr()->libraries_, value.raw()); | 6936 // Check whether the name is in the list of explicitly hidden names. |
6937 if (hide_names() != Array::null()) { | |
6938 const Array& names = Array::Handle(hide_names()); | |
6939 String& hidden = String::Handle(); | |
6940 intptr_t num_names = names.Length(); | |
6941 for (intptr_t i = 0; i < num_names; i++) { | |
6942 hidden ^= names.At(i); | |
6943 if (name.Equals(hidden)) { | |
6944 return true; | |
6945 } | |
6946 } | |
6947 } | |
6948 // The name is not explicitly hidden. Now check whether it is in the | |
6949 // list of explicitly visible names, if there is one. | |
6950 if (show_names() != Array::null()) { | |
6951 const Array& names = Array::Handle(show_names()); | |
6952 String& shown = String::Handle(); | |
6953 intptr_t num_names = names.Length(); | |
6954 for (intptr_t i = 0; i < num_names; i++) { | |
6955 shown ^= names.At(i); | |
6956 if (name.Equals(shown)) { | |
6957 return false; | |
6958 } | |
6959 } | |
6960 // There is a list of visible names. The name we're looking for is not | |
6961 // contained in the list, so it is hidden. | |
6962 return true; | |
6963 } | |
6964 // The name is not filtered out. | |
6965 return false; | |
6910 } | 6966 } |
6911 | 6967 |
6912 | 6968 |
6913 void LibraryPrefix::set_num_libs(intptr_t value) const { | 6969 RawObject* Namespace::Lookup(const String& name) const { |
6914 raw_ptr()->num_libs_ = value; | 6970 intptr_t i = 0; |
6971 const Library& lib = Library::Handle(library()); | |
6972 const Object& obj = Object::Handle(lib.LookupEntry(name, &i)); | |
6973 if (obj.IsNull() || HidesName(name)) { | |
6974 return Object::null(); | |
6975 } | |
6976 return obj.raw(); | |
6977 } | |
6978 | |
6979 | |
6980 RawNamespace* Namespace::New() { | |
6981 ASSERT(Object::namespace_class() != Class::null()); | |
6982 RawObject* raw = Object::Allocate(Namespace::kClassId, | |
6983 Namespace::InstanceSize(), | |
6984 Heap::kOld); | |
6985 return reinterpret_cast<RawNamespace*>(raw); | |
6986 } | |
6987 | |
6988 | |
6989 RawNamespace* Namespace::New(const Library& library, | |
6990 const Array& show_names, | |
6991 const Array& hide_names) { | |
6992 ASSERT(show_names.IsNull() || (show_names.Length() > 0)); | |
6993 ASSERT(hide_names.IsNull() || (hide_names.Length() > 0)); | |
6994 const Namespace& result = Namespace::Handle(Namespace::New()); | |
6995 result.StorePointer(&result.raw_ptr()->library_, library.raw()); | |
6996 result.StorePointer(&result.raw_ptr()->show_names_, show_names.raw()); | |
6997 result.StorePointer(&result.raw_ptr()->hide_names_, hide_names.raw()); | |
6998 return result.raw(); | |
6915 } | 6999 } |
6916 | 7000 |
6917 | 7001 |
6918 RawError* Library::CompileAll() { | 7002 RawError* Library::CompileAll() { |
6919 Error& error = Error::Handle(); | 7003 Error& error = Error::Handle(); |
6920 const GrowableObjectArray& libs = GrowableObjectArray::Handle( | 7004 const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
6921 Isolate::Current()->object_store()->libraries()); | 7005 Isolate::Current()->object_store()->libraries()); |
6922 Library& lib = Library::Handle(); | 7006 Library& lib = Library::Handle(); |
6923 Class& cls = Class::Handle(); | 7007 Class& cls = Class::Handle(); |
6924 for (int i = 0; i < libs.Length(); i++) { | 7008 for (int i = 0; i < libs.Length(); i++) { |
(...skipping 5008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11933 } | 12017 } |
11934 return result.raw(); | 12018 return result.raw(); |
11935 } | 12019 } |
11936 | 12020 |
11937 | 12021 |
11938 const char* WeakProperty::ToCString() const { | 12022 const char* WeakProperty::ToCString() const { |
11939 return "_WeakProperty"; | 12023 return "_WeakProperty"; |
11940 } | 12024 } |
11941 | 12025 |
11942 } // namespace dart | 12026 } // namespace dart |
OLD | NEW |