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 |