| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/object.h" | 6 #include "vm/object.h" |
| 7 #include "vm/json_stream.h" | 7 #include "vm/json_stream.h" |
| 8 | 8 |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| 11 | 11 |
| 12 JSONStream::JSONStream(TextBuffer* buffer) { | 12 JSONStream::JSONStream(intptr_t buf_size) : buffer_(buf_size) { |
| 13 ASSERT(buffer != NULL); | |
| 14 buffer_ = buffer; | |
| 15 open_objects_ = 0; | 13 open_objects_ = 0; |
| 16 arguments_ = NULL; | 14 arguments_ = NULL; |
| 17 num_arguments_ = 0; | 15 num_arguments_ = 0; |
| 18 option_keys_ = NULL; | 16 option_keys_ = NULL; |
| 19 option_values_ = NULL; | 17 option_values_ = NULL; |
| 20 num_options_ = 0; | 18 num_options_ = 0; |
| 21 } | 19 } |
| 22 | 20 |
| 23 | 21 |
| 24 JSONStream::~JSONStream() { | 22 JSONStream::~JSONStream() { |
| 25 } | 23 } |
| 26 | 24 |
| 27 | 25 |
| 28 void JSONStream::Clear() { | 26 void JSONStream::Clear() { |
| 29 buffer_->Clear(); | 27 buffer_.Clear(); |
| 30 open_objects_ = 0; | 28 open_objects_ = 0; |
| 31 } | 29 } |
| 32 | 30 |
| 33 | 31 |
| 34 void JSONStream::OpenObject(const char* property_name) { | 32 void JSONStream::OpenObject(const char* property_name) { |
| 35 PrintCommaIfNeeded(); | 33 PrintCommaIfNeeded(); |
| 36 open_objects_++; | 34 open_objects_++; |
| 37 if (property_name != NULL) { | 35 if (property_name != NULL) { |
| 38 PrintPropertyName(property_name); | 36 PrintPropertyName(property_name); |
| 39 } | 37 } |
| 40 buffer_->AddChar('{'); | 38 buffer_.AddChar('{'); |
| 41 } | 39 } |
| 42 | 40 |
| 43 | 41 |
| 44 void JSONStream::CloseObject() { | 42 void JSONStream::CloseObject() { |
| 45 ASSERT(open_objects_ > 0); | 43 ASSERT(open_objects_ > 0); |
| 46 open_objects_--; | 44 open_objects_--; |
| 47 buffer_->AddChar('}'); | 45 buffer_.AddChar('}'); |
| 48 } | 46 } |
| 49 | 47 |
| 50 | 48 |
| 51 void JSONStream::OpenArray(const char* property_name) { | 49 void JSONStream::OpenArray(const char* property_name) { |
| 52 PrintCommaIfNeeded(); | 50 PrintCommaIfNeeded(); |
| 53 if (property_name != NULL) { | 51 if (property_name != NULL) { |
| 54 PrintPropertyName(property_name); | 52 PrintPropertyName(property_name); |
| 55 } | 53 } |
| 56 open_objects_++; | 54 open_objects_++; |
| 57 buffer_->AddChar('['); | 55 buffer_.AddChar('['); |
| 58 } | 56 } |
| 59 | 57 |
| 60 | 58 |
| 61 void JSONStream::CloseArray() { | 59 void JSONStream::CloseArray() { |
| 62 ASSERT(open_objects_ > 0); | 60 ASSERT(open_objects_ > 0); |
| 63 open_objects_--; | 61 open_objects_--; |
| 64 buffer_->AddChar(']'); | 62 buffer_.AddChar(']'); |
| 65 } | 63 } |
| 66 | 64 |
| 67 | 65 |
| 68 void JSONStream::PrintValueBool(bool b) { | 66 void JSONStream::PrintValueBool(bool b) { |
| 69 PrintCommaIfNeeded(); | 67 PrintCommaIfNeeded(); |
| 70 buffer_->Printf("%s", b ? "true" : "false"); | 68 buffer_.Printf("%s", b ? "true" : "false"); |
| 71 } | 69 } |
| 72 | 70 |
| 73 | 71 |
| 74 void JSONStream::PrintValue(intptr_t i) { | 72 void JSONStream::PrintValue(intptr_t i) { |
| 75 PrintCommaIfNeeded(); | 73 PrintCommaIfNeeded(); |
| 76 buffer_->Printf("%" Pd "", i); | 74 buffer_.Printf("%" Pd "", i); |
| 77 } | 75 } |
| 78 | 76 |
| 79 | 77 |
| 80 void JSONStream::PrintValue(double d) { | 78 void JSONStream::PrintValue(double d) { |
| 81 PrintCommaIfNeeded(); | 79 PrintCommaIfNeeded(); |
| 82 buffer_->Printf("%f", d); | 80 buffer_.Printf("%f", d); |
| 83 } | 81 } |
| 84 | 82 |
| 85 | 83 |
| 86 void JSONStream::PrintValue(const char* s) { | 84 void JSONStream::PrintValue(const char* s) { |
| 87 PrintCommaIfNeeded(); | 85 PrintCommaIfNeeded(); |
| 88 buffer_->AddChar('"'); | 86 buffer_.AddChar('"'); |
| 89 buffer_->AddEscapedString(s); | 87 buffer_.AddEscapedString(s); |
| 90 buffer_->AddChar('"'); | 88 buffer_.AddChar('"'); |
| 91 } | 89 } |
| 92 | 90 |
| 93 | 91 |
| 94 void JSONStream::PrintfValue(const char* format, ...) { | 92 void JSONStream::PrintfValue(const char* format, ...) { |
| 95 PrintCommaIfNeeded(); | 93 PrintCommaIfNeeded(); |
| 96 | 94 |
| 97 va_list args; | 95 va_list args; |
| 98 va_start(args, format); | 96 va_start(args, format); |
| 99 intptr_t len = OS::VSNPrint(NULL, 0, format, args); | 97 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 100 va_end(args); | 98 va_end(args); |
| 101 char* p = reinterpret_cast<char*>(malloc(len+1)); | 99 char* p = reinterpret_cast<char*>(malloc(len+1)); |
| 102 va_start(args, format); | 100 va_start(args, format); |
| 103 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); | 101 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| 104 va_end(args); | 102 va_end(args); |
| 105 ASSERT(len == len2); | 103 ASSERT(len == len2); |
| 106 buffer_->AddChar('"'); | 104 buffer_.AddChar('"'); |
| 107 buffer_->AddEscapedString(p); | 105 buffer_.AddEscapedString(p); |
| 108 buffer_->AddChar('"'); | 106 buffer_.AddChar('"'); |
| 109 free(p); | 107 free(p); |
| 110 } | 108 } |
| 111 | 109 |
| 112 | 110 |
| 113 void JSONStream::PrintValue(const Object& o, bool ref) { | 111 void JSONStream::PrintValue(const Object& o, bool ref) { |
| 114 PrintCommaIfNeeded(); | 112 PrintCommaIfNeeded(); |
| 115 o.PrintToJSONStream(this, ref); | 113 o.PrintToJSONStream(this, ref); |
| 116 } | 114 } |
| 117 | 115 |
| 118 | 116 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 144 PrintPropertyName(name); | 142 PrintPropertyName(name); |
| 145 va_list args; | 143 va_list args; |
| 146 va_start(args, format); | 144 va_start(args, format); |
| 147 intptr_t len = OS::VSNPrint(NULL, 0, format, args); | 145 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 148 va_end(args); | 146 va_end(args); |
| 149 char* p = reinterpret_cast<char*>(malloc(len+1)); | 147 char* p = reinterpret_cast<char*>(malloc(len+1)); |
| 150 va_start(args, format); | 148 va_start(args, format); |
| 151 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); | 149 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| 152 va_end(args); | 150 va_end(args); |
| 153 ASSERT(len == len2); | 151 ASSERT(len == len2); |
| 154 buffer_->AddChar('"'); | 152 buffer_.AddChar('"'); |
| 155 buffer_->AddEscapedString(p); | 153 buffer_.AddEscapedString(p); |
| 156 buffer_->AddChar('"'); | 154 buffer_.AddChar('"'); |
| 157 free(p); | 155 free(p); |
| 158 } | 156 } |
| 159 | 157 |
| 160 | 158 |
| 161 void JSONStream::SetArguments(const char** arguments, intptr_t num_arguments) { | 159 void JSONStream::SetArguments(const char** arguments, intptr_t num_arguments) { |
| 162 arguments_ = arguments; | 160 arguments_ = arguments; |
| 163 num_arguments_ = num_arguments; | 161 num_arguments_ = num_arguments; |
| 164 } | 162 } |
| 165 | 163 |
| 166 | 164 |
| 167 void JSONStream::SetOptions(const char** option_keys, | 165 void JSONStream::SetOptions(const char** option_keys, |
| 168 const char** option_values, | 166 const char** option_values, |
| 169 intptr_t num_options) { | 167 intptr_t num_options) { |
| 170 option_keys_ = option_keys; | 168 option_keys_ = option_keys; |
| 171 option_values_ = option_values; | 169 option_values_ = option_values; |
| 172 num_options_ = num_options; | 170 num_options_ = num_options; |
| 173 } | 171 } |
| 174 | 172 |
| 175 | 173 |
| 176 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) { | 174 void JSONStream::PrintProperty(const char* name, const Object& o, bool ref) { |
| 177 PrintPropertyName(name); | 175 PrintPropertyName(name); |
| 178 PrintValue(o, ref); | 176 PrintValue(o, ref); |
| 179 } | 177 } |
| 180 | 178 |
| 181 | 179 |
| 182 void JSONStream::PrintPropertyName(const char* name) { | 180 void JSONStream::PrintPropertyName(const char* name) { |
| 183 ASSERT(name != NULL); | 181 ASSERT(name != NULL); |
| 184 PrintCommaIfNeeded(); | 182 PrintCommaIfNeeded(); |
| 185 buffer_->AddChar('"'); | 183 buffer_.AddChar('"'); |
| 186 buffer_->AddEscapedString(name); | 184 buffer_.AddEscapedString(name); |
| 187 buffer_->AddChar('"'); | 185 buffer_.AddChar('"'); |
| 188 buffer_->AddChar(':'); | 186 buffer_.AddChar(':'); |
| 189 } | 187 } |
| 190 | 188 |
| 191 | 189 |
| 192 void JSONStream::PrintCommaIfNeeded() { | 190 void JSONStream::PrintCommaIfNeeded() { |
| 193 if (NeedComma()) { | 191 if (NeedComma()) { |
| 194 buffer_->AddChar(','); | 192 buffer_.AddChar(','); |
| 195 } | 193 } |
| 196 } | 194 } |
| 197 | 195 |
| 198 | 196 |
| 199 bool JSONStream::NeedComma() { | 197 bool JSONStream::NeedComma() { |
| 200 const char* buffer = buffer_->buf(); | 198 const char* buffer = buffer_.buf(); |
| 201 intptr_t length = buffer_->length(); | 199 intptr_t length = buffer_.length(); |
| 202 if (length == 0) { | 200 if (length == 0) { |
| 203 return false; | 201 return false; |
| 204 } | 202 } |
| 205 char ch = buffer[length-1]; | 203 char ch = buffer[length-1]; |
| 206 return ch != '[' && ch != '{' && ch != ':' && ch != ','; | 204 return (ch != '[') && (ch != '{') && (ch != ':') && (ch != ','); |
| 205 } |
| 206 |
| 207 |
| 208 JSONObject::JSONObject(const JSONArray& arr) : stream_(arr.stream_) { |
| 209 stream_->OpenObject(); |
| 210 } |
| 211 |
| 212 |
| 213 void JSONObject::AddPropertyF(const char* name, |
| 214 const char* format, ...) const { |
| 215 stream_->PrintPropertyName(name); |
| 216 va_list args; |
| 217 va_start(args, format); |
| 218 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 219 va_end(args); |
| 220 char* p = reinterpret_cast<char*>(malloc(len+1)); |
| 221 va_start(args, format); |
| 222 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| 223 va_end(args); |
| 224 ASSERT(len == len2); |
| 225 stream_->buffer_.AddChar('"'); |
| 226 stream_->buffer_.AddEscapedString(p); |
| 227 stream_->buffer_.AddChar('"'); |
| 228 free(p); |
| 229 } |
| 230 |
| 231 |
| 232 void JSONArray::AddValueF(const char* format, ...) const { |
| 233 stream_->PrintCommaIfNeeded(); |
| 234 va_list args; |
| 235 va_start(args, format); |
| 236 intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| 237 va_end(args); |
| 238 char* p = reinterpret_cast<char*>(malloc(len+1)); |
| 239 va_start(args, format); |
| 240 intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| 241 va_end(args); |
| 242 ASSERT(len == len2); |
| 243 stream_->buffer_.AddChar('"'); |
| 244 stream_->buffer_.AddEscapedString(p); |
| 245 stream_->buffer_.AddChar('"'); |
| 246 free(p); |
| 207 } | 247 } |
| 208 | 248 |
| 209 } // namespace dart | 249 } // namespace dart |
| 210 | 250 |
| OLD | NEW |