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

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

Issue 573293004: Fix issue 17514770 (https://b2.corp.google.com/issues/17514770) (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 3 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 8727 matching lines...) Expand 10 before | Expand all | Expand 10 after
8738 8738
8739 8739
8740 void Library::SetLoadError(const Instance& error) const { 8740 void Library::SetLoadError(const Instance& error) const {
8741 // Should not be already successfully loaded or just allocated. 8741 // Should not be already successfully loaded or just allocated.
8742 ASSERT(LoadInProgress() || LoadRequested() || LoadFailed()); 8742 ASSERT(LoadInProgress() || LoadRequested() || LoadFailed());
8743 raw_ptr()->load_state_ = RawLibrary::kLoadError; 8743 raw_ptr()->load_state_ = RawLibrary::kLoadError;
8744 StorePointer(&raw_ptr()->load_error_, error.raw()); 8744 StorePointer(&raw_ptr()->load_error_, error.raw());
8745 } 8745 }
8746 8746
8747 8747
8748 // Traits for looking up Libraries by url in a hash set.
8749 class LibraryUrl {
Ivan Posva 2014/09/18 00:58:05 Not needed.
siva 2014/09/18 01:07:37 Done.
8750 public:
8751 LibraryUrl(const String& url, String* tmp_string)
8752 : url_(url), tmp_string_(tmp_string) {}
8753 bool Matches(const Library& library) const {
8754 if (url_.IsSymbol()) {
8755 return url_.raw() == library.url();
8756 } else {
8757 *tmp_string_ = library.url();
8758 return url_.Equals(*tmp_string_);
8759 }
8760 }
8761 intptr_t Hash() const { return url_.Hash(); }
8762 private:
8763 const String& url_;
8764 String* tmp_string_;
8765 };
8766
8767
8768 class LibraryUrlTraits {
8769 public:
8770 // Called when growing the table.
8771 static bool IsMatch(const Object& a, const Object& b) {
8772 ASSERT(a.IsLibrary() && b.IsLibrary());
8773 // Library objects are always canonical.
8774 return a.raw() == b.raw();
8775 }
8776 static bool IsMatch(const LibraryUrl& url, const Object& obj) {
8777 return url.Matches(Library::Cast(obj));
Ivan Posva 2014/09/18 00:58:05 ditto.
siva 2014/09/18 01:07:37 Done.
8778 }
8779 static uword Hash(const Object& key) {
8780 return Library::Cast(key).UrlHash();
8781 }
8782 static uword Hash(const LibraryUrl& url) {
Ivan Posva 2014/09/18 00:58:05 ditto.
siva 2014/09/18 01:07:37 Done.
8783 return url.Hash();
8784 }
8785 };
8786
8787
8788 typedef UnorderedHashSet<LibraryUrlTraits> LibraryLoadErrorSet;
8789
8790
8748 RawInstance* Library::TransitiveLoadError() const { 8791 RawInstance* Library::TransitiveLoadError() const {
8749 if (LoadError() != Instance::null()) { 8792 if (LoadError() != Instance::null()) {
8750 return LoadError(); 8793 return LoadError();
8751 } 8794 }
8795 Isolate* isolate = Isolate::Current();
8796 ObjectStore* object_store = isolate->object_store();
8797 LibraryLoadErrorSet set(object_store->library_load_error_table());
8798 bool present = false;
8799 if (set.GetOrNull(*this, &present) != Object::null()) {
8800 object_store->set_library_load_error_table(set.Release());
8801 return Instance::null();
8802 }
8803 // Ensure we don't repeatedly visit the same library again.
8804 set.Insert(*this);
8805 object_store->set_library_load_error_table(set.Release());
8752 intptr_t num_imp = num_imports(); 8806 intptr_t num_imp = num_imports();
8753 Library& lib = Library::Handle(); 8807 Library& lib = Library::Handle(isolate);
8754 Instance& error = Instance::Handle(); 8808 Instance& error = Instance::Handle(isolate);
8755 for (intptr_t i = 0; i < num_imp; i++) { 8809 for (intptr_t i = 0; i < num_imp; i++) {
8810 HANDLESCOPE(isolate);
8756 lib = ImportLibraryAt(i); 8811 lib = ImportLibraryAt(i);
8757 // Break potential import cycles while recursing through imports.
8758 set_num_imports(0);
8759 error = lib.TransitiveLoadError(); 8812 error = lib.TransitiveLoadError();
8760 set_num_imports(num_imp);
8761 if (!error.IsNull()) { 8813 if (!error.IsNull()) {
8762 break; 8814 break;
8763 } 8815 }
8764 } 8816 }
8765 return error.raw(); 8817 return error.raw();
8766 } 8818 }
8767 8819
8768 8820
8769 static RawString* MakeClassMetaName(const Class& cls) { 8821 static RawString* MakeClassMetaName(const Class& cls) {
8770 String& cname = String::Handle(cls.Name()); 8822 String& cname = String::Handle(cls.Name());
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after
9934 const Array& imports = Array::Handle(this->imports()); 9986 const Array& imports = Array::Handle(this->imports());
9935 Namespace& import = Namespace::Handle(); 9987 Namespace& import = Namespace::Handle();
9936 import ^= imports.At(index); 9988 import ^= imports.At(index);
9937 return import.library(); 9989 return import.library();
9938 } 9990 }
9939 return Library::null(); 9991 return Library::null();
9940 } 9992 }
9941 9993
9942 9994
9943 RawInstance* LibraryPrefix::LoadError() const { 9995 RawInstance* LibraryPrefix::LoadError() const {
9944 Library& lib = Library::Handle(); 9996 const intptr_t kNumLibs = 25;
Ivan Posva 2014/09/18 00:58:04 Please use the already known number of loaded libr
siva 2014/09/18 01:07:37 Done.
9945 Instance& error = Instance::Handle(); 9997 Isolate* isolate = Isolate::Current();
9998 ObjectStore* object_store = isolate->object_store();
9999 LibraryLoadErrorSet set(HashTables::New<LibraryLoadErrorSet>(kNumLibs));
10000 object_store->set_library_load_error_table(set.Release());
10001 Library& lib = Library::Handle(isolate);
10002 Instance& error = Instance::Handle(isolate);
9946 for (int32_t i = 0; i < num_imports(); i++) { 10003 for (int32_t i = 0; i < num_imports(); i++) {
9947 lib = GetLibrary(i); 10004 lib = GetLibrary(i);
9948 ASSERT(!lib.IsNull()); 10005 ASSERT(!lib.IsNull());
9949 error = lib.TransitiveLoadError(); 10006 error = lib.TransitiveLoadError();
9950 if (!error.IsNull()) { 10007 if (!error.IsNull()) {
9951 return error.raw(); 10008 break;
9952 } 10009 }
9953 } 10010 }
9954 return Instance::null(); 10011 object_store->set_library_load_error_table(Object::empty_array());
10012 return error.raw();
9955 } 10013 }
9956 10014
9957 10015
9958 bool LibraryPrefix::ContainsLibrary(const Library& library) const { 10016 bool LibraryPrefix::ContainsLibrary(const Library& library) const {
9959 int32_t num_current_imports = num_imports(); 10017 int32_t num_current_imports = num_imports();
9960 if (num_current_imports > 0) { 10018 if (num_current_imports > 0) {
9961 Library& lib = Library::Handle(); 10019 Library& lib = Library::Handle();
9962 const String& url = String::Handle(library.url()); 10020 const String& url = String::Handle(library.url());
9963 String& lib_url = String::Handle(); 10021 String& lib_url = String::Handle();
9964 for (int32_t i = 0; i < num_current_imports; i++) { 10022 for (int32_t i = 0; i < num_current_imports; i++) {
(...skipping 10401 matching lines...) Expand 10 before | Expand all | Expand 10 after
20366 return tag_label.ToCString(); 20424 return tag_label.ToCString();
20367 } 20425 }
20368 20426
20369 20427
20370 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 20428 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
20371 Instance::PrintJSONImpl(stream, ref); 20429 Instance::PrintJSONImpl(stream, ref);
20372 } 20430 }
20373 20431
20374 20432
20375 } // namespace dart 20433 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698