Chromium Code Reviews| 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(); |
|
Cutch
2014/05/28 21:29:03
Should the RedirectToDeliveryFailurePort get a cha
Ivan Posva
2014/05/28 21:39:42
OOB should never have a redirect port associated w
|
| + 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; |
| } |