| Index: runtime/vm/service.cc
|
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
|
| index 855229f3de76d26da70ee24e8f128cfbe46cc013..05f7fcdeba7ed62dbe0af5b77cf20021f312a966 100644
|
| --- a/runtime/vm/service.cc
|
| +++ b/runtime/vm/service.cc
|
| @@ -813,9 +813,9 @@ void Service::PostError(const String& method_name,
|
| }
|
|
|
|
|
| -void Service::InvokeMethod(Isolate* I,
|
| - const Array& msg,
|
| - bool parameters_are_dart_objects) {
|
| +RawError* Service::InvokeMethod(Isolate* I,
|
| + const Array& msg,
|
| + bool parameters_are_dart_objects) {
|
| Thread* T = Thread::Current();
|
| ASSERT(I == T->isolate());
|
| ASSERT(I != NULL);
|
| @@ -877,7 +877,7 @@ void Service::InvokeMethod(Isolate* I,
|
| // For now, always return an error.
|
| PrintInvalidParamError(&js, "_idZone");
|
| js.PostReply();
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
| }
|
| const char* c_method_name = method_name.ToCString();
|
| @@ -886,7 +886,7 @@ void Service::InvokeMethod(Isolate* I,
|
| if (method != NULL) {
|
| if (!ValidateParameters(method->parameters, &js)) {
|
| js.PostReply();
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
| if (method->entry(T, &js)) {
|
| js.PostReply();
|
| @@ -895,7 +895,7 @@ void Service::InvokeMethod(Isolate* I,
|
| // so this case shouldn't be reached, at present.
|
| UNIMPLEMENTED();
|
| }
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
|
|
| EmbedderServiceHandler* handler = FindIsolateEmbedderHandler(c_method_name);
|
| @@ -905,7 +905,7 @@ void Service::InvokeMethod(Isolate* I,
|
|
|
| if (handler != NULL) {
|
| EmbedderHandleMessage(handler, &js);
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
|
|
| const Instance& extension_handler =
|
| @@ -915,32 +915,32 @@ void Service::InvokeMethod(Isolate* I,
|
| param_values, reply_port, seq);
|
| // Schedule was successful. Extension code will post a reply
|
| // asynchronously.
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
|
|
| PrintUnrecognizedMethodError(&js);
|
| js.PostReply();
|
| - return;
|
| + return T->get_and_clear_sticky_error();
|
| }
|
| }
|
|
|
|
|
| -void Service::HandleRootMessage(const Array& msg_instance) {
|
| +RawError* Service::HandleRootMessage(const Array& msg_instance) {
|
| Isolate* isolate = Isolate::Current();
|
| - InvokeMethod(isolate, msg_instance);
|
| + return InvokeMethod(isolate, msg_instance);
|
| }
|
|
|
|
|
| -void Service::HandleObjectRootMessage(const Array& msg_instance) {
|
| +RawError* Service::HandleObjectRootMessage(const Array& msg_instance) {
|
| Isolate* isolate = Isolate::Current();
|
| - InvokeMethod(isolate, msg_instance, true);
|
| + return InvokeMethod(isolate, msg_instance, true);
|
| }
|
|
|
|
|
| -void Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
|
| +RawError* Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
|
| ASSERT(isolate != NULL);
|
| - InvokeMethod(isolate, msg);
|
| - MaybePause(isolate);
|
| + const Error& error = Error::Handle(InvokeMethod(isolate, msg));
|
| + return MaybePause(isolate, error);
|
| }
|
|
|
|
|
| @@ -2538,14 +2538,18 @@ void Service::CheckForPause(Isolate* isolate, JSONStream* stream) {
|
| }
|
|
|
|
|
| -void Service::MaybePause(Isolate* isolate) {
|
| +RawError* Service::MaybePause(Isolate* isolate, const Error& error) {
|
| // Don't pause twice.
|
| if (!isolate->IsPaused()) {
|
| if (isolate->should_pause_post_service_request()) {
|
| isolate->set_should_pause_post_service_request(false);
|
| - isolate->PausePostRequest();
|
| + // Before pausing, restore the sticky error. The debugger will return it
|
| + // from PausePostRequest.
|
| + Thread::Current()->set_sticky_error(error);
|
| + return isolate->PausePostRequest();
|
| }
|
| }
|
| + return error.raw();
|
| }
|
|
|
|
|
| @@ -3861,18 +3865,6 @@ static bool GetVM(Thread* thread, JSONStream* js) {
|
| }
|
|
|
|
|
| -static const MethodParameter* restart_vm_params[] = {
|
| - NO_ISOLATE_PARAMETER, NULL,
|
| -};
|
| -
|
| -
|
| -static bool RestartVM(Thread* thread, JSONStream* js) {
|
| - Isolate::KillAllIsolates(Isolate::kVMRestartMsg);
|
| - PrintSuccess(js);
|
| - return true;
|
| -}
|
| -
|
| -
|
| static const char* exception_pause_mode_names[] = {
|
| "All", "None", "Unhandled", NULL,
|
| };
|
| @@ -4142,8 +4134,6 @@ static const ServiceMethodDescriptor service_methods_[] = {
|
| pause_params },
|
| { "removeBreakpoint", RemoveBreakpoint,
|
| remove_breakpoint_params },
|
| - { "_restartVM", RestartVM,
|
| - restart_vm_params },
|
| { "reloadSources", ReloadSources,
|
| reload_sources_params },
|
| { "_reloadSources", ReloadSources,
|
|
|