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

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
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 4387 matching lines...) Expand 10 before | Expand all | Expand 10 after
4730 void UnhandledException::set_stacktrace(const Instance& stacktrace) const { 4730 void UnhandledException::set_stacktrace(const Instance& stacktrace) const {
4731 StorePointer(&raw_ptr()->stacktrace_, stacktrace.raw()); 4731 StorePointer(&raw_ptr()->stacktrace_, stacktrace.raw());
4732 } 4732 }
4733 4733
4734 4734
4735 const char* UnhandledException::ToCString() const { 4735 const char* UnhandledException::ToCString() const {
4736 return "UnhandledException"; 4736 return "UnhandledException";
4737 } 4737 }
4738 4738
4739 4739
4740 RawApiFailure* ApiFailure::New(const String& message, Heap::Space space) { 4740 RawApiError* ApiError::New(const String& message, Heap::Space space) {
4741 const Class& cls = Class::Handle(Object::api_failure_class()); 4741 const Class& cls = Class::Handle(Object::api_error_class());
4742 ApiFailure& result = ApiFailure::Handle(); 4742 ApiError& result = ApiError::Handle();
4743 { 4743 {
4744 RawObject* raw = Object::Allocate(cls, 4744 RawObject* raw = Object::Allocate(cls,
4745 ApiFailure::InstanceSize(), 4745 ApiError::InstanceSize(),
4746 space); 4746 space);
4747 NoGCScope no_gc; 4747 NoGCScope no_gc;
4748 result ^= raw; 4748 result ^= raw;
4749 } 4749 }
4750 result.set_message(message); 4750 result.set_data(message);
4751 return result.raw(); 4751 return result.raw();
4752 } 4752 }
4753 4753
4754 4754
4755 void ApiFailure::set_message(const String& message) const { 4755 RawApiError* ApiError::New(const UnhandledException& exception,
4756 StorePointer(&raw_ptr()->message_, message.raw()); 4756 Heap::Space space) {
4757 const Class& cls = Class::Handle(Object::api_error_class());
4758 ApiError& result = ApiError::Handle();
4759 {
4760 RawObject* raw = Object::Allocate(cls,
4761 ApiError::InstanceSize(),
4762 space);
4763 NoGCScope no_gc;
4764 result ^= raw;
4765 }
4766 result.set_data(exception);
4767 return result.raw();
4757 } 4768 }
4758 4769
4759 4770
4760 const char* ApiFailure::ToCString() const { 4771 void ApiError::set_data(const Object& data) const {
4761 return "ApiFailure"; 4772 StorePointer(&raw_ptr()->data_, data.raw());
4773 }
4774
4775
4776 const char* ApiError::ToCString() const {
4777 return "ApiError";
Anton Muhin 2011/11/09 12:34:03 I know it's not common, but maybe output data.ToCS
4762 } 4778 }
4763 4779
4764 4780
4765 bool Instance::Equals(const Instance& other) const { 4781 bool Instance::Equals(const Instance& other) const {
4766 if (this->raw() == other.raw()) { 4782 if (this->raw() == other.raw()) {
4767 return true; // "===". 4783 return true; // "===".
4768 } 4784 }
4769 4785
4770 if (other.IsNull() || (this->clazz() != other.clazz())) { 4786 if (other.IsNull() || (this->clazz() != other.clazz())) {
4771 return false; 4787 return false;
(...skipping 2172 matching lines...) Expand 10 before | Expand all | Expand 10 after
6944 const String& str = String::Handle(pattern()); 6960 const String& str = String::Handle(pattern());
6945 const char* format = "JSRegExp: pattern=%s flags=%s"; 6961 const char* format = "JSRegExp: pattern=%s flags=%s";
6946 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 6962 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
6947 char* chars = reinterpret_cast<char*>( 6963 char* chars = reinterpret_cast<char*>(
6948 Isolate::Current()->current_zone()->Allocate(len + 1)); 6964 Isolate::Current()->current_zone()->Allocate(len + 1));
6949 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 6965 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
6950 return chars; 6966 return chars;
6951 } 6967 }
6952 6968
6953 } // namespace dart 6969 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698