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; |
} |