diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 73cd2e5..00032a4 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -782,7 +782,7 @@
   const char* const* enums_;
 };
 
-typedef bool (*ServiceMethodEntry)(Thread* thread, JSONStream* js);
+typedef void (*ServiceMethodEntry)(Thread* thread, JSONStream* js);
 
 struct ServiceMethodDescriptor {
   const char* name;
@@ -925,13 +925,8 @@
         js.PostReply();
         return T->StealStickyError();
       }
-      if (method->entry(T, &js)) {
-        js.PostReply();
-      } else {
-        // NOTE(turnidge): All message handlers currently return true,
-        // so this case shouldn't be reached, at present.
-        UNIMPLEMENTED();
-      }
+      method->entry(T, &js);
+      js.PostReply();
       return T->StealStickyError();
     }
 
@@ -1405,9 +1400,8 @@
     NULL,
 };
 
-static bool GetIsolate(Thread* thread, JSONStream* js) {
+static void GetIsolate(Thread* thread, JSONStream* js) {
   thread->isolate()->PrintJSON(js, false);
-  return true;
 }
 
 static const MethodParameter* get_isolate_group_params[] = {
@@ -1462,11 +1456,10 @@
       /*if_not_found=*/[&js]() { PrintSentinel(js, kExpiredSentinel); });
 }
 
-static bool GetIsolateGroup(Thread* thread, JSONStream* js) {
+static void GetIsolateGroup(Thread* thread, JSONStream* js) {
   ActOnIsolateGroup(js, [&](IsolateGroup* isolate_group) {
     isolate_group->PrintJSON(js, false);
   });
-  return true;
 }
 
 static const MethodParameter* get_memory_usage_params[] = {
@@ -1474,9 +1467,8 @@
     NULL,
 };
 
-static bool GetMemoryUsage(Thread* thread, JSONStream* js) {
+static void GetMemoryUsage(Thread* thread, JSONStream* js) {
   thread->isolate()->PrintMemoryUsageJSON(js);
-  return true;
 }
 
 static const MethodParameter* get_isolate_group_memory_usage_params[] = {
@@ -1484,11 +1476,10 @@
     NULL,
 };
 
-static bool GetIsolateGroupMemoryUsage(Thread* thread, JSONStream* js) {
+static void GetIsolateGroupMemoryUsage(Thread* thread, JSONStream* js) {
   ActOnIsolateGroup(js, [&](IsolateGroup* isolate_group) {
     isolate_group->PrintMemoryUsageJSON(js);
   });
-  return true;
 }
 
 static const MethodParameter* get_scripts_params[] = {
@@ -1496,7 +1487,7 @@
     NULL,
 };
 
-static bool GetScripts(Thread* thread, JSONStream* js) {
+static void GetScripts(Thread* thread, JSONStream* js) {
   auto object_store = thread->isolate_group()->object_store();
   Zone* zone = thread->zone();
 
@@ -1523,7 +1514,6 @@
       }
     }
   }
-  return true;
 }
 
 static const MethodParameter* get_stack_params[] = {
@@ -1532,9 +1522,9 @@
     NULL,
 };
 
-static bool GetStack(Thread* thread, JSONStream* js) {
+static void GetStack(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
   intptr_t limit = 0;
   bool has_limit = js->HasParam("limit");
@@ -1542,7 +1532,7 @@
     limit = UIntParameter::Parse(js->LookupParam("limit"));
     if (limit < 0) {
       PrintInvalidParamError(js, "limit");
-      return true;
+      return;
     }
   }
   Isolate* isolate = thread->isolate();
@@ -1606,16 +1596,13 @@
     MessageHandler::AcquiredQueues aq(isolate->message_handler());
     jsobj.AddProperty("messages", aq.queue());
   }
-
-  return true;
 }
 
-static bool HandleCommonEcho(JSONObject* jsobj, JSONStream* js) {
+static void HandleCommonEcho(JSONObject* jsobj, JSONStream* js) {
   jsobj->AddProperty("type", "_EchoResponse");
   if (js->HasParam("text")) {
     jsobj->AddProperty("text", js->LookupParam("text"));
   }
-  return true;
 }
 
 void Service::SendEchoEvent(Isolate* isolate, const char* text) {
@@ -1651,17 +1638,17 @@
                     data_size);
 }
 
-static bool TriggerEchoEvent(Thread* thread, JSONStream* js) {
+static void TriggerEchoEvent(Thread* thread, JSONStream* js) {
   if (Service::echo_stream.enabled()) {
     Service::SendEchoEvent(thread->isolate(), js->LookupParam("text"));
   }
   JSONObject jsobj(js);
-  return HandleCommonEcho(&jsobj, js);
+  HandleCommonEcho(&jsobj, js);
 }
 
-static bool Echo(Thread* thread, JSONStream* js) {
+static void Echo(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
-  return HandleCommonEcho(&jsobj, js);
+  HandleCommonEcho(&jsobj, js);
 }
 
 static bool ContainsNonInstance(const Object& obj) {
@@ -2121,7 +2108,7 @@
   return NULL;
 }
 
-static bool PrintInboundReferences(Thread* thread,
+static void PrintInboundReferences(Thread* thread,
                                    Object* target,
                                    intptr_t limit,
                                    JSONStream* js) {
@@ -2188,8 +2175,6 @@
   for (intptr_t i = 0; i < path.Length(); i++) {
     path.SetAt(i, Object::null_object());
   }
-
-  return true;
 }
 
 static const MethodParameter* get_inbound_references_params[] = {
@@ -2197,21 +2182,21 @@
     NULL,
 };
 
-static bool GetInboundReferences(Thread* thread, JSONStream* js) {
+static void GetInboundReferences(Thread* thread, JSONStream* js) {
   const char* target_id = js->LookupParam("targetId");
   if (target_id == NULL) {
     PrintMissingParamError(js, "targetId");
-    return true;
+    return;
   }
   const char* limit_cstr = js->LookupParam("limit");
   if (limit_cstr == NULL) {
     PrintMissingParamError(js, "limit");
-    return true;
+    return;
   }
   intptr_t limit;
   if (!GetIntegerId(limit_cstr, &limit)) {
     PrintInvalidParamError(js, "limit");
-    return true;
+    return;
   }
 
   Object& obj = Object::Handle(thread->zone());
@@ -2228,12 +2213,12 @@
     } else {
       PrintInvalidParamError(js, "targetId");
     }
-    return true;
+    return;
   }
-  return PrintInboundReferences(thread, &obj, limit, js);
+  PrintInboundReferences(thread, &obj, limit, js);
 }
 
-static bool PrintRetainingPath(Thread* thread,
+static void PrintRetainingPath(Thread* thread,
                                Object* obj,
                                intptr_t limit,
                                JSONStream* js) {
@@ -2323,8 +2308,6 @@
   for (intptr_t i = 0; i < path.Length(); i++) {
     path.SetAt(i, Object::null_object());
   }
-
-  return true;
 }
 
 static const MethodParameter* get_retaining_path_params[] = {
@@ -2332,21 +2315,21 @@
     NULL,
 };
 
-static bool GetRetainingPath(Thread* thread, JSONStream* js) {
+static void GetRetainingPath(Thread* thread, JSONStream* js) {
   const char* target_id = js->LookupParam("targetId");
   if (target_id == NULL) {
     PrintMissingParamError(js, "targetId");
-    return true;
+    return;
   }
   const char* limit_cstr = js->LookupParam("limit");
   if (limit_cstr == NULL) {
     PrintMissingParamError(js, "limit");
-    return true;
+    return;
   }
   intptr_t limit;
   if (!GetIntegerId(limit_cstr, &limit)) {
     PrintInvalidParamError(js, "limit");
-    return true;
+    return;
   }
 
   Object& obj = Object::Handle(thread->zone());
@@ -2363,9 +2346,9 @@
     } else {
       PrintInvalidParamError(js, "targetId");
     }
-    return true;
+    return;
   }
-  return PrintRetainingPath(thread, &obj, limit, js);
+  PrintRetainingPath(thread, &obj, limit, js);
 }
 
 static const MethodParameter* get_retained_size_params[] = {
@@ -2374,7 +2357,7 @@
     NULL,
 };
 
-static bool GetRetainedSize(Thread* thread, JSONStream* js) {
+static void GetRetainedSize(Thread* thread, JSONStream* js) {
   const char* target_id = js->LookupParam("targetId");
   ASSERT(target_id != NULL);
   ObjectIdRing::LookupResult lookup_result;
@@ -2388,7 +2371,7 @@
     } else {
       PrintInvalidParamError(js, "targetId");
     }
-    return true;
+    return;
   }
   // TODO(rmacnak): There is no way to get the size retained by a class object.
   // SizeRetainedByClass should be a separate RPC.
@@ -2398,14 +2381,13 @@
     intptr_t retained_size = graph.SizeRetainedByClass(cls.id());
     const Object& result = Object::Handle(Integer::New(retained_size));
     result.PrintJSON(js, true);
-    return true;
+    return;
   }
 
   ObjectGraph graph(thread);
   intptr_t retained_size = graph.SizeRetainedByInstance(obj);
   const Object& result = Object::Handle(Integer::New(retained_size));
   result.PrintJSON(js, true);
-  return true;
 }
 
 static const MethodParameter* get_reachable_size_params[] = {
@@ -2414,7 +2396,7 @@
     NULL,
 };
 
-static bool GetReachableSize(Thread* thread, JSONStream* js) {
+static void GetReachableSize(Thread* thread, JSONStream* js) {
   const char* target_id = js->LookupParam("targetId");
   ASSERT(target_id != NULL);
   ObjectIdRing::LookupResult lookup_result;
@@ -2428,7 +2410,7 @@
     } else {
       PrintInvalidParamError(js, "targetId");
     }
-    return true;
+    return;
   }
   // TODO(rmacnak): There is no way to get the size retained by a class object.
   // SizeRetainedByClass should be a separate RPC.
@@ -2438,14 +2420,13 @@
     intptr_t retained_size = graph.SizeReachableByClass(cls.id());
     const Object& result = Object::Handle(Integer::New(retained_size));
     result.PrintJSON(js, true);
-    return true;
+    return;
   }
 
   ObjectGraph graph(thread);
   intptr_t retained_size = graph.SizeReachableByInstance(obj);
   const Object& result = Object::Handle(Integer::New(retained_size));
   result.PrintJSON(js, true);
-  return true;
 }
 
 static const MethodParameter* invoke_params[] = {
@@ -2453,21 +2434,21 @@
     NULL,
 };
 
-static bool Invoke(Thread* thread, JSONStream* js) {
+static void Invoke(Thread* thread, JSONStream* js) {
   const char* receiver_id = js->LookupParam("targetId");
   if (receiver_id == NULL) {
     PrintMissingParamError(js, "targetId");
-    return true;
+    return;
   }
   const char* selector_cstr = js->LookupParam("selector");
   if (selector_cstr == NULL) {
     PrintMissingParamError(js, "selector");
-    return true;
+    return;
   }
   const char* argument_ids = js->LookupParam("argumentIds");
   if (argument_ids == NULL) {
     PrintMissingParamError(js, "argumentIds");
-    return true;
+    return;
   }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2489,7 +2470,7 @@
     } else {
       PrintInvalidParamError(js, "targetId");
     }
-    return true;
+    return;
   }
 
   const GrowableObjectArray& growable_args =
@@ -2504,7 +2485,7 @@
   intptr_t n = strlen(argument_ids);
   if ((n < 2) || (argument_ids[0] != '[') || (argument_ids[n - 1] != ']')) {
     PrintInvalidParamError(js, "argumentIds");
-    return true;
+    return;
   }
   if (n > 2) {
     intptr_t start = 1;
@@ -2516,7 +2497,7 @@
       if (end == start) {
         // Empty element.
         PrintInvalidParamError(js, "argumentIds");
-        return true;
+        return;
       }
 
       const char* argument_id =
@@ -2529,7 +2510,7 @@
       if (!(argument.IsInstance() || argument.IsNull()) ||
           ContainsNonInstance(argument)) {
         PrintInvalidParamError(js, "argumentIds");
-        return true;
+        return;
       }
       if (argument.ptr() == Object::sentinel().ptr()) {
         if (lookup_result == ObjectIdRing::kCollected) {
@@ -2539,7 +2520,7 @@
         } else {
           PrintInvalidParamError(js, "argumentIds");
         }
-        return true;
+        return;
       }
       growable_args.Add(argument);
 
@@ -2557,14 +2538,14 @@
     const Object& result =
         Object::Handle(zone, lib.Invoke(selector, args, arg_names));
     result.PrintJSON(js, true);
-    return true;
+    return;
   }
   if (receiver.IsClass()) {
     const Class& cls = Class::Cast(receiver);
     const Object& result =
         Object::Handle(zone, cls.Invoke(selector, args, arg_names));
     result.PrintJSON(js, true);
-    return true;
+    return;
   }
   if (is_instance) {
     // We don't use Instance::Cast here because it doesn't allow null.
@@ -2573,13 +2554,12 @@
     const Object& result =
         Object::Handle(zone, instance.Invoke(selector, args, arg_names));
     result.PrintJSON(js, true);
-    return true;
+    return;
   }
   js->PrintError(kInvalidParams,
                  "%s: invalid 'targetId' parameter: "
                  "Cannot invoke against a VM-internal object",
                  js->method());
-  return true;
 }
 
 static const MethodParameter* evaluate_params[] = {
@@ -2697,14 +2677,13 @@
   return false;
 }
 
-static bool Evaluate(Thread* thread, JSONStream* js) {
+static void Evaluate(Thread* thread, JSONStream* js) {
   // If a compilation service is available, this RPC invocation will have been
   // intercepted by RunningIsolates.routeRequest.
   js->PrintError(
       kExpressionCompilationError,
       "%s: No compilation service available; cannot evaluate from source.",
       js->method());
-  return true;
 }
 
 static const MethodParameter* build_expression_evaluation_scope_params[] = {
@@ -2714,9 +2693,9 @@
     NULL,
 };
 
-static bool BuildExpressionEvaluationScope(Thread* thread, JSONStream* js) {
+static void BuildExpressionEvaluationScope(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   Isolate* isolate = thread->isolate();
@@ -2724,7 +2703,7 @@
   intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
   if (framePos >= stack->Length()) {
     PrintInvalidParamError(js, "frameIndex");
-    return true;
+    return;
   }
 
   Zone* zone = thread->zone();
@@ -2739,7 +2718,7 @@
   bool isStatic = false;
 
   if (BuildScope(thread, js, param_names, param_values)) {
-    return true;
+    return;
   }
 
   if (js->HasParam("frameIndex")) {
@@ -2748,7 +2727,7 @@
     intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
     if (framePos >= stack->Length()) {
       PrintInvalidParamError(js, "frameIndex");
-      return true;
+      return;
     }
 
     ActivationFrame* frame = stack->FrameAt(framePos);
@@ -2772,7 +2751,7 @@
     if (!js->HasParam("targetId")) {
       js->PrintError(kInvalidParams,
                      "Either targetId or frameIndex has to be provided.");
-      return true;
+      return;
     }
     const char* target_id = js->LookupParam("targetId");
 
@@ -2781,7 +2760,7 @@
         zone, LookupHeapObject(thread, target_id, &lookup_result));
     if (obj.ptr() == Object::sentinel().ptr()) {
       PrintInvalidParamError(js, "targetId");
-      return true;
+      return;
     }
     if (obj.IsLibrary()) {
       const Library& lib = Library::Cast(obj);
@@ -2804,7 +2783,7 @@
         js->PrintError(
             kInvalidParams,
             "Expressions can be evaluated only with regular Dart instances");
-        return true;
+        return;
       }
 
       if (!cls.IsTopLevel()) {
@@ -2843,8 +2822,6 @@
     report.AddProperty("klass", klass_name.ToCString());
   }
   report.AddProperty("isStatic", isStatic);
-
-  return true;
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2895,13 +2872,12 @@
     NULL,
 };
 
-static bool CompileExpression(Thread* thread, JSONStream* js) {
+static void CompileExpression(Thread* thread, JSONStream* js) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   js->PrintError(kFeatureDisabled, "Debugger is disabled in AOT mode.");
-  return true;
 #else
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   if (!KernelIsolate::IsRunning() && !KernelIsolate::Start()) {
@@ -2909,7 +2885,7 @@
         kExpressionCompilationError,
         "%s: No compilation service available; cannot evaluate from source.",
         js->method());
-    return true;
+    return;
   }
 
   const char* klass = js->LookupParam("klass");
@@ -2920,14 +2896,14 @@
       GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
   if (!ParseCSVList(js->LookupParam("definitions"), params)) {
     PrintInvalidParamError(js, "definitions");
-    return true;
+    return;
   }
 
   const GrowableObjectArray& type_params =
       GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
   if (!ParseCSVList(js->LookupParam("typeDefinitions"), type_params)) {
     PrintInvalidParamError(js, "typedDefinitions");
-    return true;
+    return;
   }
 
   const uint8_t* kernel_buffer = Service::dart_library_kernel();
@@ -2943,7 +2919,7 @@
   if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
     js->PrintError(kExpressionCompilationError, "%s", compilation_result.error);
     free(compilation_result.error);
-    return true;
+    return;
   }
 
   const uint8_t* kernel_bytes = compilation_result.kernel;
@@ -2952,7 +2928,6 @@
 
   JSONObject report(js);
   report.AddPropertyBase64("kernelBytes", kernel_bytes, kernel_length);
-  return true;
 #endif
 }
 
@@ -2970,9 +2945,9 @@
   return ExternalTypedData::NewFinalizeWithFree(kernel_buffer, kernel_length);
 }
 
-static bool EvaluateCompiledExpression(Thread* thread, JSONStream* js) {
+static void EvaluateCompiledExpression(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   Isolate* isolate = thread->isolate();
@@ -2985,7 +2960,7 @@
   intptr_t frame_pos = UIntParameter::Parse(js->LookupParam("frameIndex"));
   if (frame_pos >= stack->Length()) {
     PrintInvalidParamError(js, "frameIndex");
-    return true;
+    return;
   }
   Zone* zone = thread->zone();
   const GrowableObjectArray& param_names =
@@ -2993,7 +2968,7 @@
   const GrowableObjectArray& param_values =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
   if (BuildScope(thread, js, param_names, param_values)) {
-    return true;
+    return;
   }
   const GrowableObjectArray& type_params_names =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
@@ -3006,7 +2981,7 @@
     intptr_t frame_pos = UIntParameter::Parse(js->LookupParam("frameIndex"));
     if (frame_pos >= stack->Length()) {
       PrintInvalidParamError(js, "frameIndex");
-      return true;
+      return;
     }
 
     ActivationFrame* frame = stack->FrameAt(frame_pos);
@@ -3022,13 +2997,12 @@
             Array::Handle(zone, Array::MakeFixedLength(param_values)),
             type_arguments));
     result.PrintJSON(js, true);
-    return true;
   } else {
     // evaluating expression in the context of a given object
     if (!js->HasParam("targetId")) {
       js->PrintError(kInvalidParams,
                      "Either targetId or frameIndex has to be provided.");
-      return true;
+      return;
     }
     const char* target_id = js->LookupParam("targetId");
     ObjectIdRing::LookupResult lookup_result;
@@ -3042,7 +3016,7 @@
       } else {
         PrintInvalidParamError(js, "targetId");
       }
-      return true;
+      return;
     }
     TypeArguments& type_arguments = TypeArguments::Handle(zone);
     if (obj.IsLibrary()) {
@@ -3055,7 +3029,7 @@
               Array::Handle(zone, Array::MakeFixedLength(param_values)),
               type_arguments));
       result.PrintJSON(js, true);
-      return true;
+      return;
     }
     if (obj.IsClass()) {
       const Class& cls = Class::Cast(obj);
@@ -3067,7 +3041,7 @@
               Array::Handle(zone, Array::MakeFixedLength(param_values)),
               type_arguments));
       result.PrintJSON(js, true);
-      return true;
+      return;
     }
     if ((obj.IsInstance() || obj.IsNull()) && !ContainsNonInstance(obj)) {
       // We don't use Instance::Cast here because it doesn't allow null.
@@ -3082,13 +3056,12 @@
               Array::Handle(zone, Array::MakeFixedLength(param_values)),
               type_arguments));
       result.PrintJSON(js, true);
-      return true;
+      return;
     }
     js->PrintError(kInvalidParams,
                    "%s: invalid 'targetId' parameter: "
                    "Cannot evaluate against a VM-internal object",
                    js->method());
-    return true;
   }
 }
 
@@ -3099,14 +3072,13 @@
     NULL,
 };
 
-static bool EvaluateInFrame(Thread* thread, JSONStream* js) {
+static void EvaluateInFrame(Thread* thread, JSONStream* js) {
   // If a compilation service is available, this RPC invocation will have been
   // intercepted by RunningIsolates.routeRequest.
   js->PrintError(
       kExpressionCompilationError,
       "%s: No compilation service available; cannot evaluate from source.",
       js->method());
-  return true;
 }
 
 static void MarkClasses(const Class& root,
@@ -3197,27 +3169,27 @@
     NULL,
 };
 
-static bool GetInstances(Thread* thread, JSONStream* js) {
+static void GetInstances(Thread* thread, JSONStream* js) {
   const char* object_id = js->LookupParam("objectId");
   if (object_id == NULL) {
     PrintMissingParamError(js, "objectId");
-    return true;
+    return;
   }
   const char* limit_cstr = js->LookupParam("limit");
   if (limit_cstr == NULL) {
     PrintMissingParamError(js, "limit");
-    return true;
+    return;
   }
   intptr_t limit;
   if (!GetIntegerId(limit_cstr, &limit)) {
     PrintInvalidParamError(js, "limit");
-    return true;
+    return;
   }
 
   const Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
   if (obj.ptr() == Object::sentinel().ptr() || !obj.IsClass()) {
     PrintInvalidParamError(js, "objectId");
-    return true;
+    return;
   }
   const Class& cls = Class::Cast(obj);
 
@@ -3244,7 +3216,6 @@
       samples.AddValue(storage.At(i));
     }
   }
-  return true;
 }
 
 static const MethodParameter* get_instances_as_array_params[] = {
@@ -3252,11 +3223,11 @@
     NULL,
 };
 
-static bool GetInstancesAsArray(Thread* thread, JSONStream* js) {
+static void GetInstancesAsArray(Thread* thread, JSONStream* js) {
   const char* object_id = js->LookupParam("objectId");
   if (object_id == NULL) {
     PrintMissingParamError(js, "objectId");
-    return true;
+    return;
   }
 
   bool include_subclasses =
@@ -3267,7 +3238,7 @@
   const Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
   if (obj.ptr() == Object::sentinel().ptr() || !obj.IsClass()) {
     PrintInvalidParamError(js, "objectId");
-    return true;
+    return;
   }
   const Class& cls = Class::Cast(obj);
 
@@ -3293,7 +3264,6 @@
     }
   }
   instances.PrintJSON(js, /* as_ref */ true);
-  return true;
 }
 
 static const MethodParameter* get_ports_params[] = {
@@ -3301,7 +3271,7 @@
     NULL,
 };
 
-static bool GetPorts(Thread* thread, JSONStream* js) {
+static void GetPorts(Thread* thread, JSONStream* js) {
   // Ensure the array and handles created below are promptly destroyed.
   StackZone zone(thread);
   HANDLESCOPE(thread);
@@ -3320,7 +3290,6 @@
       }
     }
   }
-  return true;
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -3345,13 +3314,12 @@
     NULL,
 };
 
-static bool GetSourceReport(Thread* thread, JSONStream* js) {
+static void GetSourceReport(Thread* thread, JSONStream* js) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   js->PrintError(kFeatureDisabled, "disabled in AOT mode and PRODUCT.");
-  return false;
 #else
   if (CheckCompilerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* reports_str = js->LookupParam("reports");
@@ -3388,7 +3356,7 @@
         Object::Handle(LookupHeapObject(thread, script_id_param, NULL));
     if (obj.ptr() == Object::sentinel().ptr() || !obj.IsScript()) {
       PrintInvalidParamError(js, "scriptId");
-      return true;
+      return;
     }
     script ^= obj.ptr();
   } else {
@@ -3397,20 +3365,19 @@
           kInvalidParams,
           "%s: the 'tokenPos' parameter requires the 'scriptId' parameter",
           js->method());
-      return true;
+      return;
     }
     if (js->HasParam("endTokenPos")) {
       js->PrintError(
           kInvalidParams,
           "%s: the 'endTokenPos' parameter requires the 'scriptId' parameter",
           js->method());
-      return true;
+      return;
     }
   }
   SourceReport report(report_set, compile_mode);
   report.PrintJSON(js, script, TokenPosition::Deserialize(start_pos),
                    TokenPosition::Deserialize(end_pos));
-  return true;
 #endif  // !DART_PRECOMPILED_RUNTIME
 }
 
@@ -3423,20 +3390,19 @@
     NULL,
 };
 
-static bool ReloadSources(Thread* thread, JSONStream* js) {
+static void ReloadSources(Thread* thread, JSONStream* js) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   js->PrintError(kFeatureDisabled, "Compiler is disabled in AOT mode.");
-  return true;
 #else
   if (CheckCompilerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   IsolateGroup* isolate_group = thread->isolate_group();
   if (isolate_group->library_tag_handler() == nullptr) {
     js->PrintError(kFeatureDisabled,
                    "A library tag handler must be installed.");
-    return true;
+    return;
   }
   // TODO(dartbug.com/36097): We need to change the "reloadSources" service-api
   // call to accept an isolate group instead of an isolate.
@@ -3446,16 +3412,16 @@
     js->PrintError(kIsolateReloadBarred,
                    "This isolate cannot reload sources anymore because there "
                    "was an unhandled exception error. Restart the isolate.");
-    return true;
+    return;
   }
   if (isolate_group->IsReloading()) {
     js->PrintError(kIsolateIsReloading, "This isolate is being reloaded.");
-    return true;
+    return;
   }
   if (!isolate_group->CanReload()) {
     js->PrintError(kFeatureDisabled,
                    "This isolate cannot reload sources right now.");
-    return true;
+    return;
   }
   const bool force_reload =
       BoolParameter::Parse(js->LookupParam("force"), false);
@@ -3465,7 +3431,6 @@
 
   Service::CheckForPause(isolate, js);
 
-  return true;
 #endif
 }
 
@@ -3491,11 +3456,11 @@
   return error.ptr();
 }
 
-static bool AddBreakpointCommon(Thread* thread,
+static void AddBreakpointCommon(Thread* thread,
                                 JSONStream* js,
                                 const String& script_uri) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* line_param = js->LookupParam("line");
@@ -3507,7 +3472,7 @@
     if (col == 0) {
       // Column number is 1-based.
       PrintInvalidParamError(js, "column");
-      return true;
+      return;
     }
   }
   ASSERT(!script_uri.IsNull());
@@ -3518,10 +3483,9 @@
     js->PrintError(kCannotAddBreakpoint,
                    "%s: Cannot add breakpoint at line '%s'", js->method(),
                    line_param);
-    return true;
+    return;
   }
   bpt->PrintJSON(js);
-  return true;
 }
 
 static const MethodParameter* add_breakpoint_params[] = {
@@ -3532,21 +3496,21 @@
     NULL,
 };
 
-static bool AddBreakpoint(Thread* thread, JSONStream* js) {
+static void AddBreakpoint(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* script_id_param = js->LookupParam("scriptId");
   Object& obj = Object::Handle(LookupHeapObject(thread, script_id_param, NULL));
   if (obj.ptr() == Object::sentinel().ptr() || !obj.IsScript()) {
     PrintInvalidParamError(js, "scriptId");
-    return true;
+    return;
   }
   const Script& script = Script::Cast(obj);
   const String& script_uri = String::Handle(script.url());
   ASSERT(!script_uri.IsNull());
-  return AddBreakpointCommon(thread, js, script_uri);
+  AddBreakpointCommon(thread, js, script_uri);
 }
 
 static const MethodParameter* add_breakpoint_with_script_uri_params[] = {
@@ -3557,14 +3521,14 @@
     NULL,
 };
 
-static bool AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) {
+static void AddBreakpointWithScriptUri(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* script_uri_param = js->LookupParam("scriptUri");
   const String& script_uri = String::Handle(String::New(script_uri_param));
-  return AddBreakpointCommon(thread, js, script_uri);
+  AddBreakpointCommon(thread, js, script_uri);
 }
 
 static const MethodParameter* add_breakpoint_at_entry_params[] = {
@@ -3573,16 +3537,16 @@
     NULL,
 };
 
-static bool AddBreakpointAtEntry(Thread* thread, JSONStream* js) {
+static void AddBreakpointAtEntry(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* function_id = js->LookupParam("functionId");
   Object& obj = Object::Handle(LookupHeapObject(thread, function_id, NULL));
   if (obj.ptr() == Object::sentinel().ptr() || !obj.IsFunction()) {
     PrintInvalidParamError(js, "functionId");
-    return true;
+    return;
   }
   const Function& function = Function::Cast(obj);
   Breakpoint* bpt =
@@ -3591,10 +3555,9 @@
     js->PrintError(kCannotAddBreakpoint,
                    "%s: Cannot add breakpoint at function '%s'", js->method(),
                    function.ToCString());
-    return true;
+    return;
   }
   bpt->PrintJSON(js);
-  return true;
 }
 
 static const MethodParameter* add_breakpoint_at_activation_params[] = {
@@ -3603,16 +3566,16 @@
     NULL,
 };
 
-static bool AddBreakpointAtActivation(Thread* thread, JSONStream* js) {
+static void AddBreakpointAtActivation(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* object_id = js->LookupParam("objectId");
   Object& obj = Object::Handle(LookupHeapObject(thread, object_id, NULL));
   if (obj.ptr() == Object::sentinel().ptr() || !obj.IsInstance()) {
     PrintInvalidParamError(js, "objectId");
-    return true;
+    return;
   }
   const Instance& closure = Instance::Cast(obj);
   Breakpoint* bpt =
@@ -3620,10 +3583,9 @@
   if (bpt == NULL) {
     js->PrintError(kCannotAddBreakpoint,
                    "%s: Cannot add breakpoint at activation", js->method());
-    return true;
+    return;
   }
   bpt->PrintJSON(js);
-  return true;
 }
 
 static const MethodParameter* remove_breakpoint_params[] = {
@@ -3631,14 +3593,14 @@
     NULL,
 };
 
-static bool RemoveBreakpoint(Thread* thread, JSONStream* js) {
+static void RemoveBreakpoint(Thread* thread, JSONStream* js) {
   if (CheckDebuggerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   if (!js->HasParam("breakpointId")) {
     PrintMissingParamError(js, "breakpointId");
-    return true;
+    return;
   }
   const char* bpt_id = js->LookupParam("breakpointId");
   ObjectIdRing::LookupResult lookup_result;
@@ -3648,11 +3610,10 @@
   // have been already removed?
   if (bpt == NULL) {
     PrintInvalidParamError(js, "breakpointId");
-    return true;
+    return;
   }
   isolate->debugger()->RemoveBreakpoint(bpt->id());
   PrintSuccess(js);
-  return true;
 }
 
 static ClassPtr GetMetricsClass(Thread* thread) {
@@ -3667,7 +3628,7 @@
   return metrics_cls.ptr();
 }
 
-static bool HandleNativeMetricsList(Thread* thread, JSONStream* js) {
+static void HandleNativeMetricsList(Thread* thread, JSONStream* js) {
   JSONObject obj(js);
   obj.AddProperty("type", "MetricList");
   {
@@ -3685,15 +3646,14 @@
     ISOLATE_GROUP_METRIC_LIST(ADD_METRIC);
 #undef ADD_METRIC
   }
-  return true;
 }
 
-static bool HandleNativeMetric(Thread* thread, JSONStream* js, const char* id) {
+static void HandleNativeMetric(Thread* thread, JSONStream* js, const char* id) {
   auto isolate = thread->isolate();
 #define ADD_METRIC(type, variable, name, unit)                                 \
   if (strcmp(id, name) == 0) {                                                 \
     isolate->Get##variable##Metric()->PrintJSON(js);                           \
-    return true;                                                               \
+    return;                                                                    \
   }
   ISOLATE_METRIC_LIST(ADD_METRIC);
 #undef ADD_METRIC
@@ -3702,16 +3662,15 @@
 #define ADD_METRIC(type, variable, name, unit)                                 \
   if (strcmp(id, name) == 0) {                                                 \
     isolate_group->Get##variable##Metric()->PrintJSON(js);                     \
-    return true;                                                               \
+    return;                                                                    \
   }
   ISOLATE_GROUP_METRIC_LIST(ADD_METRIC);
 #undef ADD_METRIC
 
   PrintInvalidParamError(js, "metricId");
-  return true;
 }
 
-static bool HandleDartMetricsList(Thread* thread, JSONStream* js) {
+static void HandleDartMetricsList(Thread* thread, JSONStream* js) {
   Zone* zone = thread->zone();
   const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(thread));
   const auto& error = metrics_cls.EnsureIsFinalized(Thread::Current());
@@ -3729,10 +3688,9 @@
   ASSERT(result.IsString());
   TextBuffer* buffer = js->buffer();
   buffer->AddString(String::Cast(result).ToCString());
-  return true;
 }
 
-static bool HandleDartMetric(Thread* thread, JSONStream* js, const char* id) {
+static void HandleDartMetric(Thread* thread, JSONStream* js, const char* id) {
   Zone* zone = thread->zone();
   const Class& metrics_cls = Class::Handle(zone, GetMetricsClass(thread));
   const String& print_metric_name = String::Handle(String::New("_printMetric"));
@@ -3751,10 +3709,9 @@
     ASSERT(result.IsString());
     TextBuffer* buffer = js->buffer();
     buffer->AddString(String::Cast(result).ToCString());
-    return true;
+    return;
   }
   PrintInvalidParamError(js, "metricId");
-  return true;
 }
 
 static const MethodParameter* get_isolate_metric_list_params[] = {
@@ -3762,7 +3719,7 @@
     NULL,
 };
 
-static bool GetIsolateMetricList(Thread* thread, JSONStream* js) {
+static void GetIsolateMetricList(Thread* thread, JSONStream* js) {
   bool native_metrics = false;
   if (js->HasParam("type")) {
     if (js->ParamIs("type", "Native")) {
@@ -3771,16 +3728,17 @@
       native_metrics = false;
     } else {
       PrintInvalidParamError(js, "type");
-      return true;
+      return;
     }
   } else {
     PrintMissingParamError(js, "type");
-    return true;
+    return;
   }
   if (native_metrics) {
-    return HandleNativeMetricsList(thread, js);
+    HandleNativeMetricsList(thread, js);
+  } else {
+    HandleDartMetricsList(thread, js);
   }
-  return HandleDartMetricsList(thread, js);
 }
 
 static const MethodParameter* get_isolate_metric_params[] = {
@@ -3788,52 +3746,31 @@
     NULL,
 };
 
-static bool GetIsolateMetric(Thread* thread, JSONStream* js) {
+static void GetIsolateMetric(Thread* thread, JSONStream* js) {
   const char* metric_id = js->LookupParam("metricId");
   if (metric_id == NULL) {
     PrintMissingParamError(js, "metricId");
-    return true;
+    return;
   }
   // Verify id begins with "metrics/".
   static const char* const kMetricIdPrefix = "metrics/";
   static intptr_t kMetricIdPrefixLen = strlen(kMetricIdPrefix);
   if (strncmp(metric_id, kMetricIdPrefix, kMetricIdPrefixLen) != 0) {
     PrintInvalidParamError(js, "metricId");
-    return true;
+    return;
   }
   // Check if id begins with "metrics/native/".
   static const char* const kNativeMetricIdPrefix = "metrics/native/";
   static intptr_t kNativeMetricIdPrefixLen = strlen(kNativeMetricIdPrefix);
   const bool native_metric =
       strncmp(metric_id, kNativeMetricIdPrefix, kNativeMetricIdPrefixLen) == 0;
+  const char* id = metric_id + (native_metric ? kNativeMetricIdPrefixLen
+                                              : kMetricIdPrefixLen);
   if (native_metric) {
-    const char* id = metric_id + kNativeMetricIdPrefixLen;
-    return HandleNativeMetric(thread, js, id);
+    HandleNativeMetric(thread, js, id);
+  } else {
+    HandleDartMetric(thread, js, id);
   }
-  const char* id = metric_id + kMetricIdPrefixLen;
-  return HandleDartMetric(thread, js, id);
-}
-
-static const MethodParameter* get_vm_metric_list_params[] = {
-    NO_ISOLATE_PARAMETER,
-    NULL,
-};
-
-static bool GetVMMetricList(Thread* thread, JSONStream* js) {
-  return false;
-}
-
-static const MethodParameter* get_vm_metric_params[] = {
-    NO_ISOLATE_PARAMETER,
-    NULL,
-};
-
-static bool GetVMMetric(Thread* thread, JSONStream* js) {
-  const char* metric_id = js->LookupParam("metricId");
-  if (metric_id == NULL) {
-    PrintMissingParamError(js, "metricId");
-  }
-  return false;
 }
 
 static const char* const timeline_streams_enum_names[] = {
@@ -3864,10 +3801,9 @@
 }
 #endif
 
-static bool SetVMTimelineFlags(Thread* thread, JSONStream* js) {
+static void SetVMTimelineFlags(Thread* thread, JSONStream* js) {
 #if !defined(SUPPORT_TIMELINE)
   PrintSuccess(js);
-  return true;
 #else
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
@@ -3892,8 +3828,6 @@
   }
 
   PrintSuccess(js);
-
-  return true;
 #endif
 }
 
@@ -3902,17 +3836,15 @@
     NULL,
 };
 
-static bool GetVMTimelineFlags(Thread* thread, JSONStream* js) {
+static void GetVMTimelineFlags(Thread* thread, JSONStream* js) {
 #if !defined(SUPPORT_TIMELINE)
   JSONObject obj(js);
   obj.AddProperty("type", "TimelineFlags");
-  return true;
 #else
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
   StackZone zone(thread);
   Timeline::PrintFlagsToJSON(js);
-  return true;
 #endif
 }
 
@@ -3921,11 +3853,10 @@
     NULL,
 };
 
-static bool GetVMTimelineMicros(Thread* thread, JSONStream* js) {
+static void GetVMTimelineMicros(Thread* thread, JSONStream* js) {
   JSONObject obj(js);
   obj.AddProperty("type", "Timestamp");
   obj.AddPropertyTimeMicros("timestamp", OS::GetCurrentMonotonicMicros());
-  return true;
 }
 
 static const MethodParameter* clear_vm_timeline_params[] = {
@@ -3933,7 +3864,7 @@
     NULL,
 };
 
-static bool ClearVMTimeline(Thread* thread, JSONStream* js) {
+static void ClearVMTimeline(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
   StackZone zone(thread);
@@ -3941,8 +3872,6 @@
   Timeline::Clear();
 
   PrintSuccess(js);
-
-  return true;
 }
 
 static const MethodParameter* get_vm_timeline_params[] = {
@@ -3952,7 +3881,7 @@
     NULL,
 };
 
-static bool GetVMTimeline(Thread* thread, JSONStream* js) {
+static void GetVMTimeline(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
   StackZone zone(thread);
@@ -3970,7 +3899,7 @@
                    "documentation for more details on where timeline events "
                    "can be found for this recorder type.",
                    timeline_recorder->name());
-    return true;
+    return;
   }
   int64_t time_origin_micros =
       Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
@@ -3978,7 +3907,6 @@
       Int64Parameter::Parse(js->LookupParam("timeExtentMicros"));
   TimelineEventFilter filter(time_origin_micros, time_extent_micros);
   timeline_recorder->PrintJSON(js, &filter);
-  return true;
 }
 
 static const char* const step_enum_names[] = {
@@ -3999,7 +3927,7 @@
     NULL,
 };
 
-static bool Resume(Thread* thread, JSONStream* js) {
+static void Resume(Thread* thread, JSONStream* js) {
   const char* step_param = js->LookupParam("step");
   Debugger::ResumeAction step = Debugger::kContinue;
   if (step_param != NULL) {
@@ -4014,7 +3942,7 @@
           kInvalidParams,
           "%s: the 'frameIndex' parameter can only be used when rewinding",
           js->method());
-      return true;
+      return;
     }
     frame_index = UIntParameter::Parse(js->LookupParam("frameIndex"));
   }
@@ -4032,7 +3960,7 @@
       Service::HandleEvent(&event);
     }
     PrintSuccess(js);
-    return true;
+    return;
   }
   if (isolate->message_handler()->should_pause_on_start()) {
     isolate->message_handler()->set_should_pause_on_start(false);
@@ -4042,28 +3970,27 @@
       Service::HandleEvent(&event);
     }
     PrintSuccess(js);
-    return true;
+    return;
   }
   if (isolate->message_handler()->is_paused_on_exit()) {
     isolate->message_handler()->set_should_pause_on_exit(false);
     isolate->SetResumeRequest();
     // We don't send a resume event because we will be exiting.
     PrintSuccess(js);
-    return true;
+    return;
   }
   if (isolate->debugger()->PauseEvent() == NULL) {
     js->PrintError(kIsolateMustBePaused, NULL);
-    return true;
+    return;
   }
 
   const char* error = NULL;
   if (!isolate->debugger()->SetResumeAction(step, frame_index, &error)) {
     js->PrintError(kCannotResume, "%s", error);
-    return true;
+    return;
   }
   isolate->SetResumeRequest();
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* kill_params[] = {
@@ -4071,14 +3998,13 @@
     NULL,
 };
 
-static bool Kill(Thread* thread, JSONStream* js) {
+static void Kill(Thread* thread, JSONStream* js) {
   const String& msg =
       String::Handle(String::New("isolate terminated by Kill service request"));
   const UnwindError& error = UnwindError::Handle(UnwindError::New(msg));
   error.set_is_user_initiated(true);
   Thread::Current()->set_sticky_error(error);
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* pause_params[] = {
@@ -4086,7 +4012,7 @@
     NULL,
 };
 
-static bool Pause(Thread* thread, JSONStream* js) {
+static void Pause(Thread* thread, JSONStream* js) {
   // TODO(turnidge): This interrupt message could have been sent from
   // the service isolate directly, but would require some special case
   // code.  That would prevent this isolate getting double-interrupted
@@ -4095,20 +4021,18 @@
   isolate->SendInternalLibMessage(Isolate::kInterruptMsg,
                                   isolate->pause_capability());
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* enable_profiler_params[] = {
     NULL,
 };
 
-static bool EnableProfiler(Thread* thread, JSONStream* js) {
+static void EnableProfiler(Thread* thread, JSONStream* js) {
   if (!FLAG_profiler) {
     FLAG_profiler = true;
     Profiler::Init();
   }
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* get_tag_profile_params[] = {
@@ -4116,11 +4040,10 @@
     NULL,
 };
 
-static bool GetTagProfile(Thread* thread, JSONStream* js) {
+static void GetTagProfile(Thread* thread, JSONStream* js) {
   JSONObject miniProfile(js);
   miniProfile.AddProperty("type", "TagProfile");
   thread->isolate()->vm_tag_counters()->PrintToJSONObject(&miniProfile);
-  return true;
 }
 
 static const MethodParameter* get_cpu_samples_params[] = {
@@ -4130,7 +4053,7 @@
     NULL,
 };
 
-static bool GetCpuSamples(Thread* thread, JSONStream* js) {
+static void GetCpuSamples(Thread* thread, JSONStream* js) {
   int64_t time_origin_micros =
       Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
@@ -4138,11 +4061,10 @@
   const bool include_code_samples =
       BoolParameter::Parse(js->LookupParam("_code"), false);
   if (CheckProfilerDisabled(thread, js)) {
-    return true;
+    return;
   }
   ProfilerService::PrintJSON(js, time_origin_micros, time_extent_micros,
                              include_code_samples);
-  return true;
 }
 
 static const MethodParameter* get_allocation_traces_params[] = {
@@ -4153,7 +4075,7 @@
     NULL,
 };
 
-static bool GetAllocationTraces(Thread* thread, JSONStream* js) {
+static void GetAllocationTraces(Thread* thread, JSONStream* js) {
   int64_t time_origin_micros =
       Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
@@ -4167,7 +4089,7 @@
     GetPrefixedIntegerId(class_id, "classes/", &cid);
     if (IsValidClassId(isolate, cid)) {
       if (CheckProfilerDisabled(thread, js)) {
-        return true;
+        return;
       }
       const Class& cls = Class::Handle(GetClassForId(isolate, cid));
       ProfilerService::PrintAllocationJSON(js, cls, time_origin_micros,
@@ -4178,12 +4100,11 @@
   } else {
     // Otherwise, return allocations for all traced class IDs.
     if (CheckProfilerDisabled(thread, js)) {
-      return true;
+      return;
     }
     ProfilerService::PrintAllocationJSON(js, time_origin_micros,
                                          time_extent_micros);
   }
-  return true;
 }
 
 static const MethodParameter* get_native_allocation_samples_params[] = {
@@ -4193,7 +4114,7 @@
     NULL,
 };
 
-static bool GetNativeAllocationSamples(Thread* thread, JSONStream* js) {
+static void GetNativeAllocationSamples(Thread* thread, JSONStream* js) {
   int64_t time_origin_micros =
       Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
   int64_t time_extent_micros =
@@ -4204,11 +4125,10 @@
   IsolateGroup::Current()->heap()->CollectAllGarbage();
 #endif
   if (CheckNativeAllocationProfilerDisabled(thread, js)) {
-    return true;
+    return;
   }
   ProfilerService::PrintNativeAllocationJSON(
       js, time_origin_micros, time_extent_micros, include_code_samples);
-  return true;
 }
 
 static const MethodParameter* clear_cpu_samples_params[] = {
@@ -4216,13 +4136,12 @@
     NULL,
 };
 
-static bool ClearCpuSamples(Thread* thread, JSONStream* js) {
+static void ClearCpuSamples(Thread* thread, JSONStream* js) {
   ProfilerService::ClearSamples();
   PrintSuccess(js);
-  return true;
 }
 
-static bool GetAllocationProfileImpl(Thread* thread,
+static void GetAllocationProfileImpl(Thread* thread,
                                      JSONStream* js,
                                      bool internal) {
   bool should_reset_accumulator = false;
@@ -4232,7 +4151,7 @@
       should_reset_accumulator = true;
     } else {
       PrintInvalidParamError(js, "reset");
-      return true;
+      return;
     }
   }
   if (js->HasParam("gc")) {
@@ -4240,7 +4159,7 @@
       should_collect = true;
     } else {
       PrintInvalidParamError(js, "gc");
-      return true;
+      return;
     }
   }
   auto isolate_group = thread->isolate_group();
@@ -4252,7 +4171,6 @@
     isolate_group->heap()->CollectAllGarbage();
   }
   isolate_group->class_table()->AllocationProfilePrintJSON(js, internal);
-  return true;
 }
 
 static const MethodParameter* get_allocation_profile_params[] = {
@@ -4260,12 +4178,12 @@
     NULL,
 };
 
-static bool GetAllocationProfilePublic(Thread* thread, JSONStream* js) {
-  return GetAllocationProfileImpl(thread, js, false);
+static void GetAllocationProfilePublic(Thread* thread, JSONStream* js) {
+  GetAllocationProfileImpl(thread, js, false);
 }
 
-static bool GetAllocationProfile(Thread* thread, JSONStream* js) {
-  return GetAllocationProfileImpl(thread, js, true);
+static void GetAllocationProfile(Thread* thread, JSONStream* js) {
+  GetAllocationProfileImpl(thread, js, true);
 }
 
 static const MethodParameter* collect_all_garbage_params[] = {
@@ -4273,11 +4191,10 @@
     NULL,
 };
 
-static bool CollectAllGarbage(Thread* thread, JSONStream* js) {
+static void CollectAllGarbage(Thread* thread, JSONStream* js) {
   auto heap = thread->isolate_group()->heap();
   heap->CollectAllGarbage(Heap::kDebugging);
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* get_heap_map_params[] = {
@@ -4285,7 +4202,7 @@
     NULL,
 };
 
-static bool GetHeapMap(Thread* thread, JSONStream* js) {
+static void GetHeapMap(Thread* thread, JSONStream* js) {
   auto isolate_group = thread->isolate_group();
   if (js->HasParam("gc")) {
     if (js->ParamIs("gc", "scavenge")) {
@@ -4297,11 +4214,10 @@
                                             Heap::kDebugging);
     } else {
       PrintInvalidParamError(js, "gc");
-      return true;
+      return;
     }
   }
   isolate_group->heap()->PrintHeapMapToJSONStream(isolate_group, js);
-  return true;
 }
 
 static const MethodParameter* request_heap_snapshot_params[] = {
@@ -4309,14 +4225,13 @@
     NULL,
 };
 
-static bool RequestHeapSnapshot(Thread* thread, JSONStream* js) {
+static void RequestHeapSnapshot(Thread* thread, JSONStream* js) {
   if (Service::heapsnapshot_stream.enabled()) {
     HeapSnapshotWriter writer(thread);
     writer.Write();
   }
   // TODO(koda): Provide some id that ties this request to async response(s).
   PrintSuccess(js);
-  return true;
 }
 
 static intptr_t GetProcessMemoryUsageHelper(JSONStream* js) {
@@ -4453,9 +4368,8 @@
     NULL,
 };
 
-static bool GetProcessMemoryUsage(Thread* thread, JSONStream* js) {
+static void GetProcessMemoryUsage(Thread* thread, JSONStream* js) {
   GetProcessMemoryUsageHelper(js);
-  return true;
 }
 
 void Service::SendInspectEvent(Isolate* isolate, const Object& inspectee) {
@@ -4574,7 +4488,7 @@
   JSONArray* handles_;
 };
 
-static bool GetPersistentHandles(Thread* thread, JSONStream* js) {
+static void GetPersistentHandles(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
   ASSERT(isolate != NULL);
 
@@ -4605,8 +4519,6 @@
           });
     }
   }
-
-  return true;
 }
 
 static const MethodParameter* get_ports_private_params[] = {
@@ -4614,13 +4526,12 @@
     NULL,
 };
 
-static bool GetPortsPrivate(Thread* thread, JSONStream* js) {
+static void GetPortsPrivate(Thread* thread, JSONStream* js) {
   MessageHandler* message_handler = thread->isolate()->message_handler();
   PortMap::PrintPortsForMessageHandler(message_handler, js);
-  return true;
 }
 
-static bool RespondWithMalformedJson(Thread* thread, JSONStream* js) {
+static void RespondWithMalformedJson(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("a", "a");
   JSONObject jsobj1(js);
@@ -4629,13 +4540,11 @@
   jsobj2.AddProperty("a", "a");
   JSONObject jsobj3(js);
   jsobj3.AddProperty("a", "a");
-  return true;
 }
 
-static bool RespondWithMalformedObject(Thread* thread, JSONStream* js) {
+static void RespondWithMalformedObject(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("bart", "simpson");
-  return true;
 }
 
 static const MethodParameter* get_object_params[] = {
@@ -4645,17 +4554,17 @@
     NULL,
 };
 
-static bool GetObject(Thread* thread, JSONStream* js) {
+static void GetObject(Thread* thread, JSONStream* js) {
   const char* id = js->LookupParam("objectId");
   if (id == NULL) {
     PrintMissingParamError(js, "objectId");
-    return true;
+    return;
   }
   if (js->HasParam("offset")) {
     intptr_t value = UIntParameter::Parse(js->LookupParam("offset"));
     if (value < 0) {
       PrintInvalidParamError(js, "offset");
-      return true;
+      return;
     }
     js->set_offset(value);
   }
@@ -4663,7 +4572,7 @@
     intptr_t value = UIntParameter::Parse(js->LookupParam("count"));
     if (value < 0) {
       PrintInvalidParamError(js, "count");
-      return true;
+      return;
     }
     js->set_count(value);
   }
@@ -4689,27 +4598,26 @@
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
     // We found a heap object for this id.  Return it.
     obj.PrintJSON(js, false);
-    return true;
+    return;
   } else if (lookup_result == ObjectIdRing::kCollected) {
     PrintSentinel(js, kCollectedSentinel);
-    return true;
+    return;
   } else if (lookup_result == ObjectIdRing::kExpired) {
     PrintSentinel(js, kExpiredSentinel);
-    return true;
+    return;
   }
 
   // Handle non-heap objects.
   Breakpoint* bpt = LookupBreakpoint(thread->isolate(), id, &lookup_result);
   if (bpt != NULL) {
     bpt->PrintJSON(js);
-    return true;
+    return;
   } else if (lookup_result == ObjectIdRing::kCollected) {
     PrintSentinel(js, kCollectedSentinel);
-    return true;
+    return;
   }
 
   PrintInvalidParamError(js, "objectId");
-  return true;
 }
 
 static const MethodParameter* get_object_store_params[] = {
@@ -4717,10 +4625,9 @@
     NULL,
 };
 
-static bool GetObjectStore(Thread* thread, JSONStream* js) {
+static void GetObjectStore(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   thread->isolate_group()->object_store()->PrintToJSONObject(&jsobj);
-  return true;
 }
 
 static const MethodParameter* get_isolate_object_store_params[] = {
@@ -4728,10 +4635,9 @@
     NULL,
 };
 
-static bool GetIsolateObjectStore(Thread* thread, JSONStream* js) {
+static void GetIsolateObjectStore(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   thread->isolate()->isolate_object_store()->PrintToJSONObject(&jsobj);
-  return true;
 }
 
 static const MethodParameter* get_class_list_params[] = {
@@ -4739,11 +4645,10 @@
     NULL,
 };
 
-static bool GetClassList(Thread* thread, JSONStream* js) {
+static void GetClassList(Thread* thread, JSONStream* js) {
   ClassTable* table = thread->isolate_group()->class_table();
   JSONObject jsobj(js);
   table->PrintToJSONObject(&jsobj);
-  return true;
 }
 
 static const MethodParameter* get_type_arguments_list_params[] = {
@@ -4751,7 +4656,7 @@
     NULL,
 };
 
-static bool GetTypeArgumentsList(Thread* thread, JSONStream* js) {
+static void GetTypeArgumentsList(Thread* thread, JSONStream* js) {
   bool only_with_instantiations = false;
   if (js->ParamIs("onlyWithInstantiations", "true")) {
     only_with_instantiations = true;
@@ -4780,7 +4685,6 @@
     }
   }
   typeargs_table.Release();
-  return true;
 }
 
 static const MethodParameter* get_version_params[] = {
@@ -4788,7 +4692,7 @@
     NULL,
 };
 
-static bool GetVersion(Thread* thread, JSONStream* js) {
+static void GetVersion(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "Version");
   jsobj.AddProperty("major",
@@ -4797,7 +4701,6 @@
                     static_cast<intptr_t>(SERVICE_PROTOCOL_MINOR_VERSION));
   jsobj.AddProperty("_privateMajor", static_cast<intptr_t>(0));
   jsobj.AddProperty("_privateMinor", static_cast<intptr_t>(0));
-  return true;
 }
 
 class ServiceIsolateVisitor : public IsolateVisitor {
@@ -4924,9 +4827,8 @@
   }
 }
 
-static bool GetVM(Thread* thread, JSONStream* js) {
+static void GetVM(Thread* thread, JSONStream* js) {
   Service::PrintJSONForVM(js, false);
-  return true;
 }
 
 static const char* exception_pause_mode_names[] = {
@@ -4949,17 +4851,17 @@
     NULL,
 };
 
-static bool SetExceptionPauseMode(Thread* thread, JSONStream* js) {
+static void SetExceptionPauseMode(Thread* thread, JSONStream* js) {
   const char* mode = js->LookupParam("mode");
   if (mode == NULL) {
     PrintMissingParamError(js, "mode");
-    return true;
+    return;
   }
   Dart_ExceptionPauseInfo info =
       EnumMapper(mode, exception_pause_mode_names, exception_pause_mode_values);
   if (info == kInvalidExceptionPauseInfo) {
     PrintInvalidParamError(js, "mode");
-    return true;
+    return;
   }
   Isolate* isolate = thread->isolate();
   isolate->debugger()->SetExceptionPauseInfo(info);
@@ -4968,7 +4870,6 @@
     Service::HandleEvent(&event);
   }
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* set_breakpoint_state_params[] = {
@@ -4978,7 +4879,7 @@
     nullptr,
 };
 
-static bool SetBreakpointState(Thread* thread, JSONStream* js) {
+static void SetBreakpointState(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
   const char* bpt_id = js->LookupParam("breakpointId");
   bool enable = BoolParameter::Parse(js->LookupParam("enable"), true);
@@ -4988,7 +4889,7 @@
   // have been already removed?
   if (bpt == nullptr) {
     PrintInvalidParamError(js, "breakpointId");
-    return true;
+    return;
   }
   if (isolate->debugger()->SetBreakpointState(bpt, enable)) {
     if (Service::debug_stream.enabled()) {
@@ -4998,7 +4899,6 @@
     }
   }
   bpt->PrintJSON(js);
-  return true;
 }
 
 static const MethodParameter* get_flag_list_params[] = {
@@ -5006,9 +4906,8 @@
     NULL,
 };
 
-static bool GetFlagList(Thread* thread, JSONStream* js) {
+static void GetFlagList(Thread* thread, JSONStream* js) {
   Flags::PrintJSON(js);
-  return true;
 }
 
 static const MethodParameter* set_flags_params[] = {
@@ -5016,23 +4915,23 @@
     NULL,
 };
 
-static bool SetFlag(Thread* thread, JSONStream* js) {
+static void SetFlag(Thread* thread, JSONStream* js) {
   const char* flag_name = js->LookupParam("name");
   if (flag_name == NULL) {
     PrintMissingParamError(js, "name");
-    return true;
+    return;
   }
   const char* flag_value = js->LookupParam("value");
   if (flag_value == NULL) {
     PrintMissingParamError(js, "value");
-    return true;
+    return;
   }
 
   if (Flags::Lookup(flag_name) == NULL) {
     JSONObject jsobj(js);
     jsobj.AddProperty("type", "Error");
     jsobj.AddProperty("message", "Cannot set flag: flag not found");
-    return true;
+    return;
   }
 
   // Changing most flags at runtime is dangerous because e.g., it may leave the
@@ -5063,7 +4962,7 @@
     JSONObject jsobj(js);
     jsobj.AddProperty("type", "Error");
     jsobj.AddProperty("message", "Cannot set flag: cannot change at runtime");
-    return true;
+    return;
   }
 
   const char* error = NULL;
@@ -5083,12 +4982,10 @@
       event.set_flag_new_value(flag_value);
       Service::HandleEvent(&event);
     }
-    return true;
   } else {
     JSONObject jsobj(js);
     jsobj.AddProperty("type", "Error");
     jsobj.AddProperty("message", error);
-    return true;
   }
 }
 
@@ -5099,7 +4996,7 @@
     NULL,
 };
 
-static bool SetLibraryDebuggable(Thread* thread, JSONStream* js) {
+static void SetLibraryDebuggable(Thread* thread, JSONStream* js) {
   const char* lib_id = js->LookupParam("libraryId");
   ObjectIdRing::LookupResult lookup_result;
   Object& obj =
@@ -5110,10 +5007,9 @@
     const Library& lib = Library::Cast(obj);
     lib.set_debuggable(is_debuggable);
     PrintSuccess(js);
-    return true;
+    return;
   }
   PrintInvalidParamError(js, "libraryId");
-  return true;
 }
 
 static const MethodParameter* set_name_params[] = {
@@ -5122,7 +5018,7 @@
     NULL,
 };
 
-static bool SetName(Thread* thread, JSONStream* js) {
+static void SetName(Thread* thread, JSONStream* js) {
   Isolate* isolate = thread->isolate();
   isolate->set_name(js->LookupParam("name"));
   if (Service::isolate_stream.enabled()) {
@@ -5130,7 +5026,7 @@
     Service::HandleEvent(&event);
   }
   PrintSuccess(js);
-  return true;
+  return;
 }
 
 static const MethodParameter* set_vm_name_params[] = {
@@ -5139,7 +5035,7 @@
     NULL,
 };
 
-static bool SetVMName(Thread* thread, JSONStream* js) {
+static void SetVMName(Thread* thread, JSONStream* js) {
   const char* name_param = js->LookupParam("name");
   free(vm_name);
   vm_name = Utils::StrDup(name_param);
@@ -5148,7 +5044,7 @@
     Service::HandleEvent(&event);
   }
   PrintSuccess(js);
-  return true;
+  return;
 }
 
 static const MethodParameter* set_trace_class_allocation_params[] = {
@@ -5158,9 +5054,9 @@
     NULL,
 };
 
-static bool SetTraceClassAllocation(Thread* thread, JSONStream* js) {
+static void SetTraceClassAllocation(Thread* thread, JSONStream* js) {
   if (CheckCompilerDisabled(thread, js)) {
-    return true;
+    return;
   }
 
   const char* class_id = js->LookupParam("classId");
@@ -5170,13 +5066,12 @@
   Isolate* isolate = thread->isolate();
   if (!IsValidClassId(isolate, cid)) {
     PrintInvalidParamError(js, "classId");
-    return true;
+    return;
   }
   const Class& cls = Class::Handle(GetClassForId(isolate, cid));
   ASSERT(!cls.IsNull());
   cls.SetTraceAllocation(enable);
   PrintSuccess(js);
-  return true;
 }
 
 static const MethodParameter* get_default_classes_aliases_params[] = {
@@ -5184,7 +5079,7 @@
     NULL,
 };
 
-static bool GetDefaultClassesAliases(Thread* thread, JSONStream* js) {
+static void GetDefaultClassesAliases(Thread* thread, JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "ClassesAliasesMap");
 
@@ -5257,8 +5152,6 @@
 #undef DEFINE_ADD_MAP_KEY
 #undef DEFINE_ADD_VALUE_F_CID
 #undef DEFINE_ADD_VALUE_F
-
-  return true;
 }
 
 // clang-format off
@@ -5360,10 +5253,6 @@
     get_version_params },
   { "getVM", GetVM,
     get_vm_params },
-  { "_getVMMetric", GetVMMetric,
-    get_vm_metric_params },
-  { "_getVMMetricList", GetVMMetricList,
-    get_vm_metric_list_params },
   { "getVMTimeline", GetVMTimeline,
     get_vm_timeline_params },
   { "getVMTimelineFlags", GetVMTimelineFlags,
diff --git a/tools/VERSION b/tools/VERSION
index 5c5e3c3..4cfe1b9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 64
+PRERELEASE 65
 PRERELEASE_PATCH 0
\ No newline at end of file
