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

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

Issue 8501034: Deal with unhandled exceptions the same way in all Dart api functions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 1 month 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/parser.cc » ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/assert.h" 8 #include "vm/assert.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 67 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
68 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 68 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
69 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 69 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
70 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 70 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
71 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 71 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
72 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 72 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
73 RawClass* Object::exception_handlers_class_ = 73 RawClass* Object::exception_handlers_class_ =
74 reinterpret_cast<RawClass*>(RAW_NULL); 74 reinterpret_cast<RawClass*>(RAW_NULL);
75 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 75 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
76 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 76 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
77 RawClass* Object::api_failure_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 77 RawClass* Object::api_error_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
78 #undef RAW_NULL 78 #undef RAW_NULL
79 79
80 int Object::GetSingletonClassIndex(const RawClass* raw_class) { 80 int Object::GetSingletonClassIndex(const RawClass* raw_class) {
81 ASSERT(raw_class->IsHeapObject()); 81 ASSERT(raw_class->IsHeapObject());
82 if (raw_class == class_class()) { 82 if (raw_class == class_class()) {
83 return kClassClass; 83 return kClassClass;
84 } else if (raw_class == null_class()) { 84 } else if (raw_class == null_class()) {
85 return kNullClass; 85 return kNullClass;
86 } else if (raw_class == dynamic_class()) { 86 } else if (raw_class == dynamic_class()) {
87 return kDynamicClass; 87 return kDynamicClass;
(...skipping 30 matching lines...) Expand all
118 } else if (raw_class == instructions_class()) { 118 } else if (raw_class == instructions_class()) {
119 return kInstructionsClass; 119 return kInstructionsClass;
120 } else if (raw_class == pc_descriptors_class()) { 120 } else if (raw_class == pc_descriptors_class()) {
121 return kPcDescriptorsClass; 121 return kPcDescriptorsClass;
122 } else if (raw_class == exception_handlers_class()) { 122 } else if (raw_class == exception_handlers_class()) {
123 return kExceptionHandlersClass; 123 return kExceptionHandlersClass;
124 } else if (raw_class == context_class()) { 124 } else if (raw_class == context_class()) {
125 return kContextClass; 125 return kContextClass;
126 } else if (raw_class == context_scope_class()) { 126 } else if (raw_class == context_scope_class()) {
127 return kContextScopeClass; 127 return kContextScopeClass;
128 } else if (raw_class == api_failure_class()) { 128 } else if (raw_class == api_error_class()) {
129 return kApiFailureClass; 129 return kApiErrorClass;
130 } 130 }
131 return kInvalidIndex; 131 return kInvalidIndex;
132 } 132 }
133 133
134 134
135 RawClass* Object::GetSingletonClass(int index) { 135 RawClass* Object::GetSingletonClass(int index) {
136 switch (index) { 136 switch (index) {
137 case kClassClass: return class_class(); 137 case kClassClass: return class_class();
138 case kNullClass: return null_class(); 138 case kNullClass: return null_class();
139 case kDynamicClass: return dynamic_class(); 139 case kDynamicClass: return dynamic_class();
(...skipping 11 matching lines...) Expand all
151 case kTokenStreamClass: return token_stream_class(); 151 case kTokenStreamClass: return token_stream_class();
152 case kScriptClass: return script_class(); 152 case kScriptClass: return script_class();
153 case kLibraryClass: return library_class(); 153 case kLibraryClass: return library_class();
154 case kLibraryPrefixClass: return library_prefix_class(); 154 case kLibraryPrefixClass: return library_prefix_class();
155 case kCodeClass: return code_class(); 155 case kCodeClass: return code_class();
156 case kInstructionsClass: return instructions_class(); 156 case kInstructionsClass: return instructions_class();
157 case kPcDescriptorsClass: return pc_descriptors_class(); 157 case kPcDescriptorsClass: return pc_descriptors_class();
158 case kExceptionHandlersClass: return exception_handlers_class(); 158 case kExceptionHandlersClass: return exception_handlers_class();
159 case kContextClass: return context_class(); 159 case kContextClass: return context_class();
160 case kContextScopeClass: return context_scope_class(); 160 case kContextScopeClass: return context_scope_class();
161 case kApiFailureClass: return api_failure_class(); 161 case kApiErrorClass: return api_error_class();
162 default: break; 162 default: break;
163 } 163 }
164 UNREACHABLE(); 164 UNREACHABLE();
165 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL. 165 return reinterpret_cast<RawClass*>(kHeapObjectTag); // return RAW_NULL.
166 } 166 }
167 167
168 168
169 const char* Object::GetSingletonClassName(int index) { 169 const char* Object::GetSingletonClassName(int index) {
170 switch (index) { 170 switch (index) {
171 case kClassClass: return "Class"; 171 case kClassClass: return "Class";
(...skipping 12 matching lines...) Expand all
184 case kTokenStreamClass: return "TokenStream"; 184 case kTokenStreamClass: return "TokenStream";
185 case kScriptClass: return "Script"; 185 case kScriptClass: return "Script";
186 case kLibraryClass: return "Library"; 186 case kLibraryClass: return "Library";
187 case kLibraryPrefixClass: return "LibraryPrefix"; 187 case kLibraryPrefixClass: return "LibraryPrefix";
188 case kCodeClass: return "Code"; 188 case kCodeClass: return "Code";
189 case kInstructionsClass: return "Instructions"; 189 case kInstructionsClass: return "Instructions";
190 case kPcDescriptorsClass: return "PcDescriptors"; 190 case kPcDescriptorsClass: return "PcDescriptors";
191 case kExceptionHandlersClass: return "ExceptionHandlers"; 191 case kExceptionHandlersClass: return "ExceptionHandlers";
192 case kContextClass: return "Context"; 192 case kContextClass: return "Context";
193 case kContextScopeClass: return "ContextScope"; 193 case kContextScopeClass: return "ContextScope";
194 case kApiFailureClass: return "ApiFailure"; 194 case kApiErrorClass: return "ApiError";
195 default: break; 195 default: break;
196 } 196 }
197 UNREACHABLE(); 197 UNREACHABLE();
198 return NULL; 198 return NULL;
199 } 199 }
200 200
201 201
202 void Object::InitOnce() { 202 void Object::InitOnce() {
203 // TODO(iposva): NoGCScope needs to be added here. 203 // TODO(iposva): NoGCScope needs to be added here.
204 ASSERT(class_class() == null_); 204 ASSERT(class_class() == null_);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 321
322 cls = Class::New<ExceptionHandlers>(); 322 cls = Class::New<ExceptionHandlers>();
323 exception_handlers_class_ = cls.raw(); 323 exception_handlers_class_ = cls.raw();
324 324
325 cls = Class::New<Context>(); 325 cls = Class::New<Context>();
326 context_class_ = cls.raw(); 326 context_class_ = cls.raw();
327 327
328 cls = Class::New<ContextScope>(); 328 cls = Class::New<ContextScope>();
329 context_scope_class_ = cls.raw(); 329 context_scope_class_ = cls.raw();
330 330
331 cls = Class::New<ApiFailure>(); 331 cls = Class::New<ApiError>();
332 api_failure_class_ = cls.raw(); 332 api_error_class_ = cls.raw();
333 333
334 ASSERT(class_class() != null_); 334 ASSERT(class_class() != null_);
335 } 335 }
336 336
337 337
338 void Object::Init(Isolate* isolate) { 338 void Object::Init(Isolate* isolate) {
339 TIMERSCOPE(time_bootstrap); 339 TIMERSCOPE(time_bootstrap);
340 ObjectStore* object_store = isolate->object_store(); 340 ObjectStore* object_store = isolate->object_store();
341 341
342 Class& cls = Class::Handle(); 342 Class& cls = Class::Handle();
(...skipping 4398 matching lines...) Expand 10 before | Expand all | Expand 10 after
4741 void UnhandledException::set_stacktrace(const Instance& stacktrace) const { 4741 void UnhandledException::set_stacktrace(const Instance& stacktrace) const {
4742 StorePointer(&raw_ptr()->stacktrace_, stacktrace.raw()); 4742 StorePointer(&raw_ptr()->stacktrace_, stacktrace.raw());
4743 } 4743 }
4744 4744
4745 4745
4746 const char* UnhandledException::ToCString() const { 4746 const char* UnhandledException::ToCString() const {
4747 return "UnhandledException"; 4747 return "UnhandledException";
4748 } 4748 }
4749 4749
4750 4750
4751 RawApiFailure* ApiFailure::New(const String& message, Heap::Space space) { 4751 RawApiError* ApiError::New(const String& message, Heap::Space space) {
4752 const Class& cls = Class::Handle(Object::api_failure_class()); 4752 const Class& cls = Class::Handle(Object::api_error_class());
4753 ApiFailure& result = ApiFailure::Handle(); 4753 ApiError& result = ApiError::Handle();
4754 { 4754 {
4755 RawObject* raw = Object::Allocate(cls, 4755 RawObject* raw = Object::Allocate(cls,
4756 ApiFailure::InstanceSize(), 4756 ApiError::InstanceSize(),
4757 space); 4757 space);
4758 NoGCScope no_gc; 4758 NoGCScope no_gc;
4759 result ^= raw; 4759 result ^= raw;
4760 } 4760 }
4761 result.set_message(message); 4761 result.set_data(message);
4762 return result.raw(); 4762 return result.raw();
4763 } 4763 }
4764 4764
4765 4765
4766 void ApiFailure::set_message(const String& message) const { 4766 RawApiError* ApiError::New(const UnhandledException& exception,
4767 StorePointer(&raw_ptr()->message_, message.raw()); 4767 Heap::Space space) {
4768 const Class& cls = Class::Handle(Object::api_error_class());
4769 ApiError& result = ApiError::Handle();
4770 {
4771 RawObject* raw = Object::Allocate(cls,
4772 ApiError::InstanceSize(),
4773 space);
4774 NoGCScope no_gc;
4775 result ^= raw;
4776 }
4777 result.set_data(exception);
4778 return result.raw();
4768 } 4779 }
4769 4780
4770 4781
4771 const char* ApiFailure::ToCString() const { 4782 void ApiError::set_data(const Object& data) const {
4772 return "ApiFailure"; 4783 StorePointer(&raw_ptr()->data_, data.raw());
4784 }
4785
4786
4787 const char* ApiError::ToCString() const {
4788 return "ApiError";
4773 } 4789 }
4774 4790
4775 4791
4776 bool Instance::Equals(const Instance& other) const { 4792 bool Instance::Equals(const Instance& other) const {
4777 if (this->raw() == other.raw()) { 4793 if (this->raw() == other.raw()) {
4778 return true; // "===". 4794 return true; // "===".
4779 } 4795 }
4780 4796
4781 if (other.IsNull() || (this->clazz() != other.clazz())) { 4797 if (other.IsNull() || (this->clazz() != other.clazz())) {
4782 return false; 4798 return false;
(...skipping 2181 matching lines...) Expand 10 before | Expand all | Expand 10 after
6964 const String& str = String::Handle(pattern()); 6980 const String& str = String::Handle(pattern());
6965 const char* format = "JSRegExp: pattern=%s flags=%s"; 6981 const char* format = "JSRegExp: pattern=%s flags=%s";
6966 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 6982 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
6967 char* chars = reinterpret_cast<char*>( 6983 char* chars = reinterpret_cast<char*>(
6968 Isolate::Current()->current_zone()->Allocate(len + 1)); 6984 Isolate::Current()->current_zone()->Allocate(len + 1));
6969 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 6985 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
6970 return chars; 6986 return chars;
6971 } 6987 }
6972 6988
6973 } // namespace dart 6989 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698