diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc index d95345b4953..459d077dc62 100644 --- a/runtime/vm/json_stream.cc +++ b/runtime/vm/json_stream.cc @@ -23,6 +23,28 @@ namespace dart { #ifndef PRODUCT +class MaybeOnStackBuffer { + public: + explicit MaybeOnStackBuffer(intptr_t size) { + if (size > kOnStackBufferCapacity) { + p_ = reinterpret_cast(malloc(size)); + } else { + p_ = &buffer_[0]; + } + } + ~MaybeOnStackBuffer() { + if (p_ != &buffer_[0]) free(p_); + } + + char* p() { return p_; } + + private: + static const intptr_t kOnStackBufferCapacity = 4096; + char* p_; + char buffer_[kOnStackBufferCapacity]; +}; + + void AppendJSONStreamConsumer(Dart_StreamConsumer_State state, const char* stream_name, const uint8_t* buffer, @@ -496,15 +518,15 @@ void JSONStream::PrintfValue(const char* format, ...) { va_start(args, format); intptr_t len = OS::VSNPrint(NULL, 0, format, args); va_end(args); - char* p = reinterpret_cast(malloc(len + 1)); + MaybeOnStackBuffer mosb(len + 1); + char* p = mosb.p(); 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); } @@ -717,15 +739,15 @@ void JSONStream::PrintfProperty(const char* name, const char* format, ...) { va_start(args, format); intptr_t len = OS::VSNPrint(NULL, 0, format, args); va_end(args); - char* p = reinterpret_cast(malloc(len + 1)); + MaybeOnStackBuffer mosb(len + 1); + char* p = mosb.p(); 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); } @@ -920,15 +942,15 @@ 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(malloc(len + 1)); + MaybeOnStackBuffer mosb(len + 1); + char* p = mosb.p(); 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); } @@ -994,15 +1016,15 @@ void JSONObject::AddPropertyF(const char* name, const char* format, ...) const { va_start(args, format); intptr_t len = OS::VSNPrint(NULL, 0, format, args); va_end(args); - char* p = reinterpret_cast(malloc(len + 1)); + MaybeOnStackBuffer mosb(len + 1); + char* p = mosb.p(); 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); } @@ -1012,15 +1034,15 @@ void JSONArray::AddValueF(const char* format, ...) const { va_start(args, format); intptr_t len = OS::VSNPrint(NULL, 0, format, args); va_end(args); - char* p = reinterpret_cast(malloc(len + 1)); + MaybeOnStackBuffer mosb(len + 1); + char* p = mosb.p(); 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); } #endif // !PRODUCT