OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/json/json_parser.h" | 5 #include "base/json/json_parser.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 ReportError(JSONReader::JSON_UNEXPECTED_TOKEN, 1); | 337 ReportError(JSONReader::JSON_UNEXPECTED_TOKEN, 1); |
338 return nullptr; | 338 return nullptr; |
339 } | 339 } |
340 | 340 |
341 StackMarker depth_check(&stack_depth_); | 341 StackMarker depth_check(&stack_depth_); |
342 if (depth_check.IsTooDeep()) { | 342 if (depth_check.IsTooDeep()) { |
343 ReportError(JSONReader::JSON_TOO_MUCH_NESTING, 1); | 343 ReportError(JSONReader::JSON_TOO_MUCH_NESTING, 1); |
344 return nullptr; | 344 return nullptr; |
345 } | 345 } |
346 | 346 |
347 std::unique_ptr<DictionaryValue> dict(new DictionaryValue); | 347 std::vector<Value::DictStorage::value_type> dict_storage; |
348 | 348 |
349 NextChar(); | 349 NextChar(); |
350 Token token = GetNextToken(); | 350 Token token = GetNextToken(); |
351 while (token != T_OBJECT_END) { | 351 while (token != T_OBJECT_END) { |
352 if (token != T_STRING) { | 352 if (token != T_STRING) { |
353 ReportError(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, 1); | 353 ReportError(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, 1); |
354 return nullptr; | 354 return nullptr; |
355 } | 355 } |
356 | 356 |
357 // First consume the key. | 357 // First consume the key. |
(...skipping 11 matching lines...) Expand all Loading... |
369 } | 369 } |
370 | 370 |
371 // The next token is the value. Ownership transfers to |dict|. | 371 // The next token is the value. Ownership transfers to |dict|. |
372 NextChar(); | 372 NextChar(); |
373 std::unique_ptr<Value> value = ParseNextToken(); | 373 std::unique_ptr<Value> value = ParseNextToken(); |
374 if (!value) { | 374 if (!value) { |
375 // ReportError from deeper level. | 375 // ReportError from deeper level. |
376 return nullptr; | 376 return nullptr; |
377 } | 377 } |
378 | 378 |
379 dict->SetWithoutPathExpansion(key.AsStringPiece(), std::move(value)); | 379 dict_storage.emplace_back(key.DestructiveAsString(), std::move(value)); |
380 | 380 |
381 NextChar(); | 381 NextChar(); |
382 token = GetNextToken(); | 382 token = GetNextToken(); |
383 if (token == T_LIST_SEPARATOR) { | 383 if (token == T_LIST_SEPARATOR) { |
384 NextChar(); | 384 NextChar(); |
385 token = GetNextToken(); | 385 token = GetNextToken(); |
386 if (token == T_OBJECT_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) { | 386 if (token == T_OBJECT_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) { |
387 ReportError(JSONReader::JSON_TRAILING_COMMA, 1); | 387 ReportError(JSONReader::JSON_TRAILING_COMMA, 1); |
388 return nullptr; | 388 return nullptr; |
389 } | 389 } |
390 } else if (token != T_OBJECT_END) { | 390 } else if (token != T_OBJECT_END) { |
391 ReportError(JSONReader::JSON_SYNTAX_ERROR, 0); | 391 ReportError(JSONReader::JSON_SYNTAX_ERROR, 0); |
392 return nullptr; | 392 return nullptr; |
393 } | 393 } |
394 } | 394 } |
395 | 395 |
396 return std::move(dict); | 396 return MakeUnique<Value>( |
| 397 Value::DictStorage(std::move(dict_storage), KEEP_LAST_OF_DUPES)); |
397 } | 398 } |
398 | 399 |
399 std::unique_ptr<Value> JSONParser::ConsumeList() { | 400 std::unique_ptr<Value> JSONParser::ConsumeList() { |
400 if (*pos_ != '[') { | 401 if (*pos_ != '[') { |
401 ReportError(JSONReader::JSON_UNEXPECTED_TOKEN, 1); | 402 ReportError(JSONReader::JSON_UNEXPECTED_TOKEN, 1); |
402 return nullptr; | 403 return nullptr; |
403 } | 404 } |
404 | 405 |
405 StackMarker depth_check(&stack_depth_); | 406 StackMarker depth_check(&stack_depth_); |
406 if (depth_check.IsTooDeep()) { | 407 if (depth_check.IsTooDeep()) { |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 const std::string& description) { | 830 const std::string& description) { |
830 if (line || column) { | 831 if (line || column) { |
831 return StringPrintf("Line: %i, column: %i, %s", | 832 return StringPrintf("Line: %i, column: %i, %s", |
832 line, column, description.c_str()); | 833 line, column, description.c_str()); |
833 } | 834 } |
834 return description; | 835 return description; |
835 } | 836 } |
836 | 837 |
837 } // namespace internal | 838 } // namespace internal |
838 } // namespace base | 839 } // namespace base |
OLD | NEW |