Chromium Code Reviews| Index: runtime/vm/json_stream.cc |
| =================================================================== |
| --- runtime/vm/json_stream.cc (revision 27302) |
| +++ runtime/vm/json_stream.cc (working copy) |
| @@ -9,9 +9,7 @@ |
| namespace dart { |
| -JSONStream::JSONStream(TextBuffer* buffer) { |
| - ASSERT(buffer != NULL); |
| - buffer_ = buffer; |
| +JSONStream::JSONStream(intptr_t buf_size) : buffer_(buf_size) { |
| open_objects_ = 0; |
| arguments_ = NULL; |
| num_arguments_ = 0; |
| @@ -26,7 +24,7 @@ |
| void JSONStream::Clear() { |
| - buffer_->Clear(); |
| + buffer_.Clear(); |
| open_objects_ = 0; |
| } |
| @@ -37,14 +35,14 @@ |
| if (property_name != NULL) { |
| PrintPropertyName(property_name); |
| } |
| - buffer_->AddChar('{'); |
| + buffer_.AddChar('{'); |
| } |
| void JSONStream::CloseObject() { |
| ASSERT(open_objects_ > 0); |
| open_objects_--; |
| - buffer_->AddChar('}'); |
| + buffer_.AddChar('}'); |
| } |
| @@ -54,40 +52,40 @@ |
| PrintPropertyName(property_name); |
| } |
| open_objects_++; |
| - buffer_->AddChar('['); |
| + buffer_.AddChar('['); |
| } |
| void JSONStream::CloseArray() { |
| ASSERT(open_objects_ > 0); |
| open_objects_--; |
| - buffer_->AddChar(']'); |
| + buffer_.AddChar(']'); |
| } |
| void JSONStream::PrintValueBool(bool b) { |
| PrintCommaIfNeeded(); |
| - buffer_->Printf("%s", b ? "true" : "false"); |
| + buffer_.Printf("%s", b ? "true" : "false"); |
| } |
| void JSONStream::PrintValue(intptr_t i) { |
| PrintCommaIfNeeded(); |
| - buffer_->Printf("%" Pd "", i); |
| + buffer_.Printf("%" Pd "", i); |
| } |
| void JSONStream::PrintValue(double d) { |
| PrintCommaIfNeeded(); |
| - buffer_->Printf("%f", d); |
| + buffer_.Printf("%f", d); |
| } |
| void JSONStream::PrintValue(const char* s) { |
| PrintCommaIfNeeded(); |
| - buffer_->AddChar('"'); |
| - buffer_->AddEscapedString(s); |
| - buffer_->AddChar('"'); |
| + buffer_.AddChar('"'); |
| + buffer_.AddEscapedString(s); |
| + buffer_.AddChar('"'); |
| } |
| @@ -103,9 +101,9 @@ |
| intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| - buffer_->AddChar('"'); |
| - buffer_->AddEscapedString(p); |
| - buffer_->AddChar('"'); |
| + buffer_.AddChar('"'); |
| + buffer_.AddEscapedString(p); |
| + buffer_.AddChar('"'); |
| free(p); |
| } |
| @@ -151,9 +149,9 @@ |
| intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| - buffer_->AddChar('"'); |
| - buffer_->AddEscapedString(p); |
| - buffer_->AddChar('"'); |
| + buffer_.AddChar('"'); |
| + buffer_.AddEscapedString(p); |
| + buffer_.AddChar('"'); |
| free(p); |
| } |
| @@ -182,29 +180,71 @@ |
| void JSONStream::PrintPropertyName(const char* name) { |
| ASSERT(name != NULL); |
| PrintCommaIfNeeded(); |
| - buffer_->AddChar('"'); |
| - buffer_->AddEscapedString(name); |
| - buffer_->AddChar('"'); |
| - buffer_->AddChar(':'); |
| + buffer_.AddChar('"'); |
| + buffer_.AddEscapedString(name); |
| + buffer_.AddChar('"'); |
| + buffer_.AddChar(':'); |
| } |
| void JSONStream::PrintCommaIfNeeded() { |
| if (NeedComma()) { |
| - buffer_->AddChar(','); |
| + buffer_.AddChar(','); |
| } |
| } |
| bool JSONStream::NeedComma() { |
| - const char* buffer = buffer_->buf(); |
| - intptr_t length = buffer_->length(); |
| + const char* buffer = buffer_.buf(); |
| + intptr_t length = buffer_.length(); |
| if (length == 0) { |
| return false; |
| } |
| char ch = buffer[length-1]; |
| - return ch != '[' && ch != '{' && ch != ':' && ch != ','; |
| + return (ch != '[') && (ch != '{') && (ch != ':') && (ch != ','); |
| } |
| + |
| +JSONObject::JSONObject(const JSONArray& arr) : stream_(arr.stream_) { |
| + stream_->OpenObject(); |
| +} |
| + |
| + |
| +void JSONObject::AddFormattedProperty(const char* name, |
| + const char* format, ...) const { |
| + 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)); |
| + va_start(args, format); |
| + intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| + va_end(args); |
| + ASSERT(len == len2); |
| + stream_->buffer_.AddChar('"'); |
| + stream_->buffer_.AddEscapedString(p); |
| + stream_->buffer_.AddChar('"'); |
| + free(p); |
| +} |
| + |
| + |
| +void JSONArray::AddFormattedValue(const char* format, ...) const { |
| + 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)); |
| + va_start(args, format); |
| + intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| + va_end(args); |
| + ASSERT(len == len2); |
| + stream_->buffer_.AddChar('"'); |
| + stream_->buffer_.AddEscapedString(p); |
| + stream_->buffer_.AddChar('"'); |
| + free(p); |
|
siva
2013/09/09 22:45:26
Might make sense to abstract the common code in
Ad
Ivan Posva
2013/09/10 17:21:31
I would like to add support for an AddValueV in ad
|
| +} |
| + |
| } // namespace dart |