Chromium Code Reviews| 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); |