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

Unified Diff: runtime/vm/isolate.cc

Issue 300223011: - Add possibility to redirect messages if they were not delivered. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | runtime/vm/json_stream.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate.cc
===================================================================
--- runtime/vm/isolate.cc (revision 36729)
+++ runtime/vm/isolate.cc (working copy)
@@ -45,6 +45,10 @@
"Pause isolates exiting.");
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
void Isolate::RegisterClass(const Class& cls) {
class_table()->Register(cls);
}
@@ -74,7 +78,7 @@
void CheckAccess();
#endif
bool IsCurrentIsolate() const;
- virtual Isolate* GetIsolate() const { return isolate_; }
+ virtual Isolate* isolate() const { return isolate_; }
bool UnhandledExceptionCallbackHandler(const Object& message,
const UnhandledException& error);
@@ -101,27 +105,27 @@
void IsolateMessageHandler::MessageNotify(Message::Priority priority) {
if (priority >= Message::kOOBPriority) {
// Handle out of band messages even if the isolate is busy.
- isolate_->ScheduleInterrupts(Isolate::kMessageInterrupt);
+ I->ScheduleInterrupts(Isolate::kMessageInterrupt);
}
- Dart_MessageNotifyCallback callback = isolate_->message_notify_callback();
+ Dart_MessageNotifyCallback callback = I->message_notify_callback();
if (callback) {
// Allow the embedder to handle message notification.
- (*callback)(Api::CastIsolate(isolate_));
+ (*callback)(Api::CastIsolate(I));
}
}
bool IsolateMessageHandler::HandleMessage(Message* message) {
- StartIsolateScope start_scope(isolate_);
- StackZone zone(isolate_);
- HandleScope handle_scope(isolate_);
+ StartIsolateScope start_scope(I);
+ StackZone zone(I);
+ HandleScope handle_scope(I);
// TODO(turnidge): Rework collection total dart execution. This can
// overcount when other things (gc, compilation) are active.
TIMERSCOPE(isolate_, time_dart_execution);
// If the message is in band we lookup the handler to dispatch to. If the
// receive port was closed, we drop the message without deserializing it.
- Object& msg_handler = Object::Handle();
+ Object& msg_handler = Object::Handle(I);
if (!message->IsOOB()) {
msg_handler = DartLibraryCalls::LookupHandler(message->dest_port());
if (msg_handler.IsError()) {
@@ -129,15 +133,20 @@
Error::Cast(msg_handler));
}
if (msg_handler.IsNull()) {
- delete message;
+ // If the port has been closed then the message will be dropped at this
+ // point. Make sure to post to the delivery failure port in that case.
+ if (message->RedirectToDeliveryFailurePort()) {
+ PortMap::PostMessage(message);
+ } else {
+ delete message;
+ }
return true;
}
}
// Parse the message.
- SnapshotReader reader(message->data(), message->len(),
- Snapshot::kMessage, Isolate::Current());
- const Object& msg_obj = Object::Handle(reader.ReadObject());
+ SnapshotReader reader(message->data(), message->len(), Snapshot::kMessage, I);
+ const Object& msg_obj = Object::Handle(I, reader.ReadObject());
if (msg_obj.IsError()) {
// An error occurred while reading the message.
return ProcessUnhandledException(Object::null_instance(),
@@ -152,14 +161,26 @@
UNREACHABLE();
}
- Instance& msg = Instance::Handle();
+ Instance& msg = Instance::Handle(I);
msg ^= msg_obj.raw(); // Can't use Instance::Cast because may be null.
bool success = true;
if (message->IsOOB()) {
- Service::HandleIsolateMessage(isolate_, msg);
+ ASSERT(msg.IsArray());
+ const Object& oob_tag = Object::Handle(I, Array::Cast(msg).At(0));
+ ASSERT(oob_tag.IsSmi());
+ switch (Smi::Cast(oob_tag).Value()) {
+ case Message::kServiceOOBMsg: {
+ Service::HandleIsolateMessage(I, msg);
+ break;
+ }
+ default: {
+ UNREACHABLE();
+ break;
+ }
+ }
} else {
- const Object& result = Object::Handle(
+ const Object& result = Object::Handle(I,
DartLibraryCalls::HandleMessage(msg_handler, msg));
if (result.IsError()) {
success = ProcessUnhandledException(msg, Error::Cast(result));
@@ -173,20 +194,17 @@
RawFunction* IsolateMessageHandler::ResolveCallbackFunction() {
- ASSERT(isolate_->object_store()->unhandled_exception_handler() != NULL);
- String& callback_name = String::Handle(isolate_);
- if (isolate_->object_store()->unhandled_exception_handler() !=
- String::null()) {
- callback_name = isolate_->object_store()->unhandled_exception_handler();
+ ASSERT(I->object_store()->unhandled_exception_handler() != NULL);
+ String& callback_name = String::Handle(I);
+ if (I->object_store()->unhandled_exception_handler() != String::null()) {
+ callback_name = I->object_store()->unhandled_exception_handler();
} else {
callback_name = String::New("_unhandledExceptionCallback");
}
- Library& lib =
- Library::Handle(isolate_, isolate_->object_store()->isolate_library());
- Function& func =
- Function::Handle(isolate_, lib.LookupLocalFunction(callback_name));
+ Library& lib = Library::Handle(I, I->object_store()->isolate_library());
+ Function& func = Function::Handle(I, lib.LookupLocalFunction(callback_name));
if (func.IsNull()) {
- lib = isolate_->object_store()->root_library();
+ lib = I->object_store()->root_library();
// Note: bootstrap code in builtin library may attempt to resolve a
// callback function before the script is fully loaded, in which case
// the root library may not be registered yet.
@@ -200,34 +218,31 @@
bool IsolateMessageHandler::UnhandledExceptionCallbackHandler(
const Object& message, const UnhandledException& error) {
- const Instance& cause = Instance::Handle(isolate_, error.exception());
- const Instance& stacktrace =
- Instance::Handle(isolate_, error.stacktrace());
+ const Instance& cause = Instance::Handle(I, error.exception());
+ const Instance& stacktrace = Instance::Handle(I, error.stacktrace());
// Wrap these args into an IsolateUncaughtException object.
- const Array& exception_args = Array::Handle(Array::New(3));
+ const Array& exception_args = Array::Handle(I, Array::New(3));
exception_args.SetAt(0, message);
exception_args.SetAt(1, cause);
exception_args.SetAt(2, stacktrace);
- const Object& exception =
- Object::Handle(isolate_,
- Exceptions::Create(Exceptions::kIsolateUnhandledException,
- exception_args));
+ const Object& exception = Object::Handle(I,
+ Exceptions::Create(Exceptions::kIsolateUnhandledException,
+ exception_args));
if (exception.IsError()) {
return false;
}
ASSERT(exception.IsInstance());
// Invoke script's callback function.
- Object& function = Object::Handle(isolate_, ResolveCallbackFunction());
+ Object& function = Object::Handle(I, ResolveCallbackFunction());
if (function.IsNull() || function.IsError()) {
return false;
}
- const Array& callback_args = Array::Handle(Array::New(1));
+ const Array& callback_args = Array::Handle(I, Array::New(1));
callback_args.SetAt(0, exception);
- const Object& result =
- Object::Handle(DartEntry::InvokeFunction(Function::Cast(function),
- callback_args));
+ const Object& result = Object::Handle(I,
+ DartEntry::InvokeFunction(Function::Cast(function), callback_args));
if (result.IsError()) {
const Error& err = Error::Cast(result);
OS::PrintErr("failed calling unhandled exception callback: %s\n",
@@ -238,7 +253,7 @@
ASSERT(result.IsBool());
bool continue_from_exception = Bool::Cast(result).value();
if (continue_from_exception) {
- isolate_->object_store()->clear_sticky_error();
+ I->object_store()->clear_sticky_error();
}
return continue_from_exception;
}
@@ -251,7 +266,7 @@
bool IsolateMessageHandler::IsCurrentIsolate() const {
- return (isolate_ == Isolate::Current());
+ return (I == Isolate::Current());
}
@@ -261,8 +276,8 @@
// Invoke the isolate's uncaught exception handler, if it exists.
const UnhandledException& error = UnhandledException::Cast(result);
RawInstance* exception = error.exception();
- if ((exception != isolate_->object_store()->out_of_memory()) &&
- (exception != isolate_->object_store()->stack_overflow())) {
+ if ((exception != I->object_store()->out_of_memory()) &&
+ (exception != I->object_store()->stack_overflow())) {
if (UnhandledExceptionCallbackHandler(message, error)) {
return true;
}
@@ -272,12 +287,12 @@
// Invoke the isolate's unhandled exception callback if there is one.
if (Isolate::UnhandledExceptionCallback() != NULL) {
Dart_EnterScope();
- Dart_Handle error = Api::NewHandle(isolate_, result.raw());
+ Dart_Handle error = Api::NewHandle(I, result.raw());
(Isolate::UnhandledExceptionCallback())(error);
Dart_ExitScope();
}
- isolate_->object_store()->set_sticky_error(result);
+ I->object_store()->set_sticky_error(result);
return false;
}
« no previous file with comments | « no previous file | runtime/vm/json_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698