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

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

Issue 11413101: Added support for isolate unhandled exceptions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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) 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/isolate.h" 5 #include "vm/isolate.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 "lib/mirrors.h" 9 #include "lib/mirrors.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 23 matching lines...) Expand all
34 34
35 35
36 class IsolateMessageHandler : public MessageHandler { 36 class IsolateMessageHandler : public MessageHandler {
37 public: 37 public:
38 explicit IsolateMessageHandler(Isolate* isolate); 38 explicit IsolateMessageHandler(Isolate* isolate);
39 ~IsolateMessageHandler(); 39 ~IsolateMessageHandler();
40 40
41 const char* name() const; 41 const char* name() const;
42 void MessageNotify(Message::Priority priority); 42 void MessageNotify(Message::Priority priority);
43 bool HandleMessage(Message* message); 43 bool HandleMessage(Message* message);
44
45 #if defined(DEBUG) 44 #if defined(DEBUG)
46 // Check that it is safe to access this handler. 45 // Check that it is safe to access this handler.
47 void CheckAccess(); 46 void CheckAccess();
48 #endif 47 #endif
49 bool IsCurrentIsolate() const; 48 bool IsCurrentIsolate() const;
50 virtual Isolate* GetIsolate() const { return isolate_; } 49 virtual Isolate* GetIsolate() const { return isolate_; }
50 bool UnhandledExceptionCallbackHandler(const Object& message,
51 const UnhandledException& error);
51 52
52 private: 53 private:
53 Isolate* isolate_; 54 Isolate* isolate_;
54 }; 55 };
55 56
56 57
57 IsolateMessageHandler::IsolateMessageHandler(Isolate* isolate) 58 IsolateMessageHandler::IsolateMessageHandler(Isolate* isolate)
58 : isolate_(isolate) { 59 : isolate_(isolate) {
59 } 60 }
60 61
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 // malformed messages. If they (eventually) come from a remote 95 // malformed messages. If they (eventually) come from a remote
95 // machine, then it might make sense to drop the message entirely. 96 // machine, then it might make sense to drop the message entirely.
96 // In the case that the message originated locally, which is 97 // In the case that the message originated locally, which is
97 // always true for now, then this should never occur. 98 // always true for now, then this should never occur.
98 UNREACHABLE(); 99 UNREACHABLE();
99 } 100 }
100 101
101 Instance& msg = Instance::Handle(); 102 Instance& msg = Instance::Handle();
102 msg ^= msg_obj.raw(); // Can't use Instance::Cast because may be null. 103 msg ^= msg_obj.raw(); // Can't use Instance::Cast because may be null.
103 104
105 bool success = true;
104 if (message->IsOOB()) { 106 if (message->IsOOB()) {
105 // For now the only OOB messages are Mirrors messages. 107 // For now the only OOB messages are Mirrors messages.
106 HandleMirrorsMessage(isolate_, message->reply_port(), msg); 108 HandleMirrorsMessage(isolate_, message->reply_port(), msg);
107 delete message;
108 } else { 109 } else {
109 const Object& result = Object::Handle( 110 const Object& result = Object::Handle(
110 DartLibraryCalls::HandleMessage( 111 DartLibraryCalls::HandleMessage(
111 message->dest_port(), message->reply_port(), msg)); 112 message->dest_port(), message->reply_port(), msg));
112 delete message;
113 if (result.IsError()) { 113 if (result.IsError()) {
114 isolate_->object_store()->set_sticky_error(Error::Cast(result)); 114 isolate_->object_store()->set_sticky_error(Error::Cast(result));
115 return false; 115 if (result.IsUnhandledException()) {
116 const UnhandledException& error = UnhandledException::Cast(result);
117 RawInstance* exception = error.exception();
118 if ((exception != isolate_->object_store()->out_of_memory()) &&
119 (exception != isolate_->object_store()->stack_overflow())) {
120 success = UnhandledExceptionCallbackHandler(msg, error);
121 if (!success && (Isolate::UnhandledExceptionCallback() != NULL)) {
122 // Notify embedder that an unhandled exception occurred.
123 Dart_EnterScope();
124 Dart_Handle error_handle = Api::NewHandle(isolate_, error.raw());
125 (Isolate::UnhandledExceptionCallback())(error_handle);
126 // TODO(tball): add some sort of blocker to ensure embedder
127 // doesn't run any more code on this isolate.
128 Dart_ExitScope();
129 }
130 }
131 }
siva 2012/11/21 00:45:04 I presume a return of success == true would keep t
Tom Ball 2012/11/21 05:22:38 PTAL -- I refactored it and fixed when the Unhandl
132 } else {
133 ASSERT(result.IsNull());
116 } 134 }
117 ASSERT(result.IsNull());
118 } 135 }
119 return true; 136 delete message;
137 return success;
120 } 138 }
121 139
122 140
141 bool IsolateMessageHandler::UnhandledExceptionCallbackHandler(
142 const Object& message, const UnhandledException& error) {
143 RawInstance* callback =
144 isolate_->object_store()->unhandled_exception_closure();
145 Instance& closure = Instance::Handle(callback);
146 if (closure.IsNull()) {
147 return false; // Error wasn't handled by callback.
148 }
149 const Instance& stacktrace =
150 Instance::Handle(isolate_, error.stacktrace());
151
152 // Wrap these args into an IsolateUncaughtException object.
153 GrowableArray<const Object*> exception_args(3);
154 exception_args.Add(&message);
155 exception_args.Add(&error);
156 exception_args.Add(&stacktrace);
157 Object& exception = Object::Handle();
158 exception = Exceptions::Create(Exceptions::kIsolateUnhandledException,
159 exception_args);
160 if (exception.IsError()) {
161 return false;
162 }
163
164 // Invoke script's callback closure.
165 GrowableArray<const Object*> callback_args(1);
166 callback_args.Add(&exception);
167 const Array& kNoArgumentNames = Array::Handle(isolate_);
168 RawObject* response = DartEntry::InvokeClosure(closure,
169 callback_args,
170 kNoArgumentNames);
171 // TODO(tball): log any nested exceptions.
172 return (response == Bool::True());
173 }
174
175
123 #if defined(DEBUG) 176 #if defined(DEBUG)
124 void IsolateMessageHandler::CheckAccess() { 177 void IsolateMessageHandler::CheckAccess() {
125 ASSERT(IsCurrentIsolate()); 178 ASSERT(IsCurrentIsolate());
126 } 179 }
127 #endif 180 #endif
128 181
129 182
130 bool IsolateMessageHandler::IsCurrentIsolate() const { 183 bool IsolateMessageHandler::IsCurrentIsolate() const {
131 return (isolate_ == Isolate::Current()); 184 return (isolate_ == Isolate::Current());
132 } 185 }
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 "\tisolate: %s\n", name()); 492 "\tisolate: %s\n", name());
440 } 493 }
441 // TODO(5411455): For now just make sure there are no current isolates 494 // TODO(5411455): For now just make sure there are no current isolates
442 // as we are shutting down the isolate. 495 // as we are shutting down the isolate.
443 SetCurrent(NULL); 496 SetCurrent(NULL);
444 } 497 }
445 498
446 499
447 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL; 500 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL;
448 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL; 501 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL;
502 Dart_IsolateUnhandledExceptionCallback
503 Isolate::unhandled_exception_callback_ = NULL;
449 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL; 504 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL;
450 505
451 506
452 void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor, 507 void Isolate::VisitObjectPointers(ObjectPointerVisitor* visitor,
453 bool visit_prologue_weak_handles, 508 bool visit_prologue_weak_handles,
454 bool validate_frames) { 509 bool validate_frames) {
455 ASSERT(visitor != NULL); 510 ASSERT(visitor != NULL);
456 511
457 // Visit objects in the object store. 512 // Visit objects in the object store.
458 object_store()->VisitObjectPointers(visitor); 513 object_store()->VisitObjectPointers(visitor);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 546
492 547
493 void Isolate::VisitWeakPersistentHandles(HandleVisitor* visitor, 548 void Isolate::VisitWeakPersistentHandles(HandleVisitor* visitor,
494 bool visit_prologue_weak_handles) { 549 bool visit_prologue_weak_handles) {
495 if (api_state() != NULL) { 550 if (api_state() != NULL) {
496 api_state()->VisitWeakHandles(visitor, visit_prologue_weak_handles); 551 api_state()->VisitWeakHandles(visitor, visit_prologue_weak_handles);
497 } 552 }
498 } 553 }
499 554
500 } // namespace dart 555 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/object_store.h » ('j') | sdk/lib/isolate/base.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698