Chromium Code Reviews| Index: runtime/vm/json_stream.cc |
| diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc |
| index d95345b4953c184401adf3e477710531c5b33f80..3f50757364cfda4ba6cb9188184b4c86d3984aa0 100644 |
| --- a/runtime/vm/json_stream.cc |
| +++ b/runtime/vm/json_stream.cc |
| @@ -490,21 +490,28 @@ void JSONStream::PrintValueNoEscape(const char* s) { |
| void JSONStream::PrintfValue(const char* format, ...) { |
| + const intptr_t kOnStackBufferCapacity = 4096; |
|
zra
2017/03/31 17:47:09
Maybe something like:
class MaybeOnStackBuffer {
Cutch
2017/03/31 18:04:47
Done.
|
| + char on_stack_buffer[kOnStackBufferCapacity]; |
| PrintCommaIfNeeded(); |
| va_list args; |
| va_start(args, format); |
| intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| - char* p = reinterpret_cast<char*>(malloc(len + 1)); |
| + char* p = &on_stack_buffer[0]; |
| + if (len + 1 >= kOnStackBufferCapacity) { |
|
siva
2017/03/31 17:59:33
((len + 1) >= kOnStackBufferCapacity) here and bel
Cutch
2017/03/31 18:04:47
Acknowledged.
|
| + p = reinterpret_cast<char*>(malloc(len + 1)); |
| + } |
| va_start(args, format); |
| intptr_t len2 = OS::VSNPrint(p, len + 1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| buffer_.AddChar('"'); |
| - AddEscapedUTF8String(p); |
| + AddEscapedUTF8String(p, len); |
| buffer_.AddChar('"'); |
| - free(p); |
| + if (p != &on_stack_buffer[0]) { |
| + free(p); |
| + } |
| } |
| @@ -712,20 +719,28 @@ void JSONStream::PrintProperty(const char* name, |
| void JSONStream::PrintfProperty(const char* name, const char* format, ...) { |
| + const intptr_t kOnStackBufferCapacity = 4096; |
| + char on_stack_buffer[kOnStackBufferCapacity]; |
| PrintPropertyName(name); |
| va_list args; |
| va_start(args, format); |
| intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| - char* p = reinterpret_cast<char*>(malloc(len + 1)); |
| + char* p = &on_stack_buffer[0]; |
| + if (len + 1 >= kOnStackBufferCapacity) { |
| + p = reinterpret_cast<char*>(malloc(len + 1)); |
| + } |
| + |
| va_start(args, format); |
| intptr_t len2 = OS::VSNPrint(p, len + 1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| buffer_.AddChar('"'); |
| - AddEscapedUTF8String(p); |
| + AddEscapedUTF8String(p, len); |
| buffer_.AddChar('"'); |
| - free(p); |
| + if (p != &on_stack_buffer[0]) { |
| + free(p); |
| + } |
| } |
| @@ -912,6 +927,8 @@ JSONObject::JSONObject(const JSONArray* arr) : stream_(arr->stream_) { |
| void JSONObject::AddFixedServiceId(const char* format, ...) const { |
| + const intptr_t kOnStackBufferCapacity = 4096; |
| + char on_stack_buffer[kOnStackBufferCapacity]; |
| // Mark that this id is fixed. |
| AddProperty("fixedId", true); |
| // Add the id property. |
| @@ -920,15 +937,20 @@ void JSONObject::AddFixedServiceId(const char* format, ...) const { |
| va_start(args, format); |
| intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| - char* p = reinterpret_cast<char*>(malloc(len + 1)); |
| + char* p = &on_stack_buffer[0]; |
| + if (len + 1 >= kOnStackBufferCapacity) { |
| + p = reinterpret_cast<char*>(malloc(len + 1)); |
| + } |
| va_start(args, format); |
| intptr_t len2 = OS::VSNPrint(p, len + 1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| stream_->buffer_.AddChar('"'); |
| - stream_->AddEscapedUTF8String(p); |
| + stream_->AddEscapedUTF8String(p, len); |
| stream_->buffer_.AddChar('"'); |
| - free(p); |
| + if (p != &on_stack_buffer[0]) { |
| + free(p); |
| + } |
| } |
| @@ -989,38 +1011,52 @@ void JSONObject::AddUnresolvedLocation( |
| void JSONObject::AddPropertyF(const char* name, const char* format, ...) const { |
| + const intptr_t kOnStackBufferCapacity = 4096; |
| + char on_stack_buffer[kOnStackBufferCapacity]; |
| stream_->PrintPropertyName(name); |
| va_list args; |
| va_start(args, format); |
| intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| - char* p = reinterpret_cast<char*>(malloc(len + 1)); |
| + char* p = &on_stack_buffer[0]; |
| + if (len + 1 >= kOnStackBufferCapacity) { |
| + p = reinterpret_cast<char*>(malloc(len + 1)); |
| + } |
| va_start(args, format); |
| intptr_t len2 = OS::VSNPrint(p, len + 1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| stream_->buffer_.AddChar('"'); |
| - stream_->AddEscapedUTF8String(p); |
| + stream_->AddEscapedUTF8String(p, len); |
| stream_->buffer_.AddChar('"'); |
| - free(p); |
| + if (p != &on_stack_buffer[0]) { |
| + free(p); |
| + } |
| } |
| void JSONArray::AddValueF(const char* format, ...) const { |
| + const intptr_t kOnStackBufferCapacity = 4096; |
| + char on_stack_buffer[kOnStackBufferCapacity]; |
| stream_->PrintCommaIfNeeded(); |
| va_list args; |
| va_start(args, format); |
| intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| - char* p = reinterpret_cast<char*>(malloc(len + 1)); |
| + char* p = &on_stack_buffer[0]; |
| + if (len + 1 >= kOnStackBufferCapacity) { |
| + p = reinterpret_cast<char*>(malloc(len + 1)); |
| + } |
| va_start(args, format); |
| intptr_t len2 = OS::VSNPrint(p, len + 1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| stream_->buffer_.AddChar('"'); |
| - stream_->AddEscapedUTF8String(p); |
| + stream_->AddEscapedUTF8String(p, len); |
| stream_->buffer_.AddChar('"'); |
| - free(p); |
| + if (p != &on_stack_buffer[0]) { |
| + free(p); |
| + } |
| } |
| #endif // !PRODUCT |