Index: runtime/vm/json_stream.cc |
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc |
index 82283719d70a77db751f753584c9e22bf1e99ce8..2ed62efd8c1caf16ed1ab3bfaa4e79f129dc22e6 100644 |
--- a/runtime/vm/json_stream.cc |
+++ b/runtime/vm/json_stream.cc |
@@ -83,6 +83,74 @@ void JSONStream::SetupError() { |
} |
+static const char* GetJSONRpcErrorMessage(intptr_t code) { |
+ switch (code) { |
+ case kParseError: |
+ return "Parse error"; |
+ case kInvalidRequest: |
+ return "Invalid Request"; |
+ case kMethodNotFound: |
+ return "Method not found"; |
+ case kInvalidParams: |
+ return "Invalid params"; |
+ case kInternalError: |
+ return "Internal error"; |
+ case kVMMustBePaused: |
+ return "VM must be paused"; |
+ case kNoBreakAtLine: |
+ return "Cannot set breakpoint at line"; |
+ case kNoBreakAtFunction: |
+ return "Cannot set breakpoint at function"; |
+ case kProfilingDisabled: |
+ return "Profiling is disabled"; |
+ default: |
+ UNIMPLEMENTED(); |
+ return "Unexpected rpc error code"; |
+ } |
+} |
+ |
+ |
+static void PrintRequest(JSONObject* obj, JSONStream* js) { |
+ JSONObject jsobj(obj, "request"); |
+ jsobj.AddProperty("method", js->method()); |
+ { |
+ JSONObject params(&jsobj, "params"); |
+ for (intptr_t i = 0; i < js->num_params(); i++) { |
+ params.AddProperty(js->GetParamKey(i), js->GetParamValue(i)); |
+ } |
+ } |
+} |
+ |
+ |
+void JSONStream::PrintError(intptr_t code, |
+ const char* details_format, ...) { |
+ SetupError(); |
+ JSONObject jsobj(this); |
+ jsobj.AddProperty("code", code); |
+ jsobj.AddProperty("message", GetJSONRpcErrorMessage(code)); |
+ { |
+ JSONObject data(&jsobj, "data"); |
+ PrintRequest(&data, this); |
+ if (details_format != NULL) { |
+ Isolate* isolate = Isolate::Current(); |
+ |
+ va_list args; |
+ va_start(args, details_format); |
+ intptr_t len = OS::VSNPrint(NULL, 0, details_format, args); |
+ va_end(args); |
+ |
+ char* buffer = isolate->current_zone()->Alloc<char>(len + 1); |
+ va_list args2; |
+ va_start(args2, details_format); |
+ OS::VSNPrint(buffer, (len + 1), details_format, args2); |
+ va_end(args2); |
+ |
+ data.AddProperty("details", buffer); |
+ } |
+ } |
+} |
+ |
+ |
static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
return reinterpret_cast<uint8_t*>(new_ptr); |