Index: runtime/vm/json_stream.cc |
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc |
index c122bb787e24132a107acf53fd4ce4e6887c913d..f51cb12db2abea5b7d397b040063294d2de5e954 100644 |
--- a/runtime/vm/json_stream.cc |
+++ b/runtime/vm/json_stream.cc |
@@ -79,6 +79,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); |
Cutch
2015/05/13 17:50:10
zone->PrintToString ?
turnidge
2015/05/14 17:53:43
We would need to add a new version of zone->PrintT
|
+ 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); |