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

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

Issue 419103003: Handle load errors in deferred code (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 4 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/cpu.h" 10 #include "vm/cpu.h"
(...skipping 8527 matching lines...) Expand 10 before | Expand all | Expand 10 after
8538 } 8538 }
8539 8539
8540 8540
8541 void Library::SetLoaded() const { 8541 void Library::SetLoaded() const {
8542 // Should not be already loaded or just allocated. 8542 // Should not be already loaded or just allocated.
8543 ASSERT(LoadInProgress() || LoadRequested()); 8543 ASSERT(LoadInProgress() || LoadRequested());
8544 raw_ptr()->load_state_ = RawLibrary::kLoaded; 8544 raw_ptr()->load_state_ = RawLibrary::kLoaded;
8545 } 8545 }
8546 8546
8547 8547
8548 void Library::SetLoadError() const { 8548 void Library::SetLoadError(const Object& error) const {
8549 // Should not be already successfully loaded or just allocated. 8549 // Should not be already successfully loaded or just allocated.
8550 ASSERT(LoadInProgress() || LoadRequested() || LoadError()); 8550 ASSERT(LoadInProgress() || LoadRequested() || LoadFailed());
8551 raw_ptr()->load_state_ = RawLibrary::kLoadError; 8551 raw_ptr()->load_state_ = RawLibrary::kLoadError;
8552 StorePointer(&raw_ptr()->load_error_, error.raw());
8553 }
8554
8555
8556 RawObject* Library::TransitiveLoadError() const {
8557 if (LoadError() != Error::null()) {
8558 return LoadError();
8559 }
8560 intptr_t num_imp = num_imports();
8561 Library& lib = Library::Handle();
8562 Object& error = Object::Handle();
8563 for (intptr_t i = 0; i < num_imp; i++) {
8564 lib = ImportLibraryAt(i);
8565 // Break potential import cycles while recursing through imports.
8566 set_num_imports(0);
8567 error = lib.TransitiveLoadError();
8568 set_num_imports(num_imp);
8569 if (!error.IsNull()) {
8570 break;
8571 }
8572 }
8573 return error.raw();
8552 } 8574 }
8553 8575
8554 8576
8555 static RawString* MakeClassMetaName(const Class& cls) { 8577 static RawString* MakeClassMetaName(const Class& cls) {
8556 String& cname = String::Handle(cls.Name()); 8578 String& cname = String::Handle(cls.Name());
8557 return String::Concat(Symbols::At(), cname); 8579 return String::Concat(Symbols::At(), cname);
8558 } 8580 }
8559 8581
8560 8582
8561 static RawString* MakeFieldMetaName(const Field& field) { 8583 static RawString* MakeFieldMetaName(const Field& field) {
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
9344 result.StorePointer(&result.raw_ptr()->url_, url.raw()); 9366 result.StorePointer(&result.raw_ptr()->url_, url.raw());
9345 result.raw_ptr()->resolved_names_ = Object::empty_array().raw(); 9367 result.raw_ptr()->resolved_names_ = Object::empty_array().raw();
9346 result.raw_ptr()->dictionary_ = Object::empty_array().raw(); 9368 result.raw_ptr()->dictionary_ = Object::empty_array().raw();
9347 result.StorePointer(&result.raw_ptr()->metadata_, 9369 result.StorePointer(&result.raw_ptr()->metadata_,
9348 GrowableObjectArray::New(4, Heap::kOld)); 9370 GrowableObjectArray::New(4, Heap::kOld));
9349 result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw(); 9371 result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw();
9350 result.raw_ptr()->num_anonymous_ = 0; 9372 result.raw_ptr()->num_anonymous_ = 0;
9351 result.raw_ptr()->imports_ = Object::empty_array().raw(); 9373 result.raw_ptr()->imports_ = Object::empty_array().raw();
9352 result.raw_ptr()->exports_ = Object::empty_array().raw(); 9374 result.raw_ptr()->exports_ = Object::empty_array().raw();
9353 result.raw_ptr()->loaded_scripts_ = Array::null(); 9375 result.raw_ptr()->loaded_scripts_ = Array::null();
9376 result.raw_ptr()->load_error_ = Object::null();
9354 result.set_native_entry_resolver(NULL); 9377 result.set_native_entry_resolver(NULL);
9355 result.set_native_entry_symbol_resolver(NULL); 9378 result.set_native_entry_symbol_resolver(NULL);
9356 result.raw_ptr()->corelib_imported_ = true; 9379 result.raw_ptr()->corelib_imported_ = true;
9357 result.set_debuggable(false); 9380 result.set_debuggable(false);
9358 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme())); 9381 result.set_is_dart_scheme(url.StartsWith(Symbols::DartScheme()));
9359 result.raw_ptr()->load_state_ = RawLibrary::kAllocated; 9382 result.raw_ptr()->load_state_ = RawLibrary::kAllocated;
9360 result.raw_ptr()->index_ = -1; 9383 result.raw_ptr()->index_ = -1;
9361 const intptr_t kInitialNameCacheSize = 64; 9384 const intptr_t kInitialNameCacheSize = 64;
9362 result.InitResolvedNamesCache(kInitialNameCacheSize); 9385 result.InitResolvedNamesCache(kInitialNameCacheSize);
9363 result.InitClassDictionary(); 9386 result.InitClassDictionary();
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
9720 if ((index >= 0) || (index < num_imports())) { 9743 if ((index >= 0) || (index < num_imports())) {
9721 const Array& imports = Array::Handle(this->imports()); 9744 const Array& imports = Array::Handle(this->imports());
9722 Namespace& import = Namespace::Handle(); 9745 Namespace& import = Namespace::Handle();
9723 import ^= imports.At(index); 9746 import ^= imports.At(index);
9724 return import.library(); 9747 return import.library();
9725 } 9748 }
9726 return Library::null(); 9749 return Library::null();
9727 } 9750 }
9728 9751
9729 9752
9753 RawObject* LibraryPrefix::LoadError() const {
9754 Library& lib = Library::Handle();
9755 Object& error = Object::Handle();
9756 for (int32_t i = 0; i < num_imports(); i++) {
9757 lib = GetLibrary(i);
9758 ASSERT(!lib.IsNull());
9759 error = lib.TransitiveLoadError();
9760 if (!error.IsNull()) {
9761 return error.raw();
9762 }
9763 }
9764 return Object::null();
9765 }
9766
9767
9730 bool LibraryPrefix::ContainsLibrary(const Library& library) const { 9768 bool LibraryPrefix::ContainsLibrary(const Library& library) const {
9731 intptr_t num_current_imports = num_imports(); 9769 int32_t num_current_imports = num_imports();
9732 if (num_current_imports > 0) { 9770 if (num_current_imports > 0) {
9733 Library& lib = Library::Handle(); 9771 Library& lib = Library::Handle();
9734 const String& url = String::Handle(library.url()); 9772 const String& url = String::Handle(library.url());
9735 String& lib_url = String::Handle(); 9773 String& lib_url = String::Handle();
9736 for (intptr_t i = 0; i < num_current_imports; i++) { 9774 for (int32_t i = 0; i < num_current_imports; i++) {
9737 lib = GetLibrary(i); 9775 lib = GetLibrary(i);
9738 ASSERT(!lib.IsNull()); 9776 ASSERT(!lib.IsNull());
9739 lib_url = lib.url(); 9777 lib_url = lib.url();
9740 if (url.Equals(lib_url)) { 9778 if (url.Equals(lib_url)) {
9741 return true; 9779 return true;
9742 } 9780 }
9743 } 9781 }
9744 } 9782 }
9745 return false; 9783 return false;
9746 } 9784 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
9837 // - mark this prefixes as loaded; 9875 // - mark this prefixes as loaded;
9838 // - complete the future associated with this prefix. 9876 // - complete the future associated with this prefix.
9839 const Library& deferred_lib = Library::Handle(GetLibrary(0)); 9877 const Library& deferred_lib = Library::Handle(GetLibrary(0));
9840 if (deferred_lib.Loaded()) { 9878 if (deferred_lib.Loaded()) {
9841 this->set_is_loaded(); 9879 this->set_is_loaded();
9842 return true; 9880 return true;
9843 } else if (deferred_lib.LoadNotStarted()) { 9881 } else if (deferred_lib.LoadNotStarted()) {
9844 Isolate* isolate = Isolate::Current(); 9882 Isolate* isolate = Isolate::Current();
9845 Api::Scope api_scope(isolate); 9883 Api::Scope api_scope(isolate);
9846 deferred_lib.SetLoadRequested(); 9884 deferred_lib.SetLoadRequested();
9885 const GrowableObjectArray& pending_deferred_loads =
9886 GrowableObjectArray::Handle(
9887 isolate->object_store()->pending_deferred_loads());
9888 pending_deferred_loads.Add(deferred_lib);
Ivan Posva 2014/07/31 18:29:04 Please make sure this is reset when the loads are
hausner 2014/07/31 21:12:45 Added to Dart_FinalizeLoading()
9847 const String& lib_url = String::Handle(isolate, deferred_lib.url()); 9889 const String& lib_url = String::Handle(isolate, deferred_lib.url());
9848 Dart_LibraryTagHandler handler = isolate->library_tag_handler(); 9890 Dart_LibraryTagHandler handler = isolate->library_tag_handler();
9849 handler(Dart_kImportTag, 9891 handler(Dart_kImportTag,
9850 Api::NewHandle(isolate, importer()), 9892 Api::NewHandle(isolate, importer()),
9851 Api::NewHandle(isolate, lib_url.raw())); 9893 Api::NewHandle(isolate, lib_url.raw()));
9852 } else { 9894 } else {
9853 // Another load request is in flight. 9895 // Another load request is in flight.
9854 ASSERT(deferred_lib.LoadRequested()); 9896 ASSERT(deferred_lib.LoadRequested());
9855 } 9897 }
9856 return false; // Load request not yet completed. 9898 return false; // Load request not yet completed.
(...skipping 9495 matching lines...) Expand 10 before | Expand all | Expand 10 after
19352 return tag_label.ToCString(); 19394 return tag_label.ToCString();
19353 } 19395 }
19354 19396
19355 19397
19356 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 19398 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
19357 Instance::PrintJSONImpl(stream, ref); 19399 Instance::PrintJSONImpl(stream, ref);
19358 } 19400 }
19359 19401
19360 19402
19361 } // namespace dart 19403 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698