OLD | NEW |
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2014 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/trace_event/trace_event_argument.h" | 5 #include "base/trace_event/trace_event_argument.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bits.h" | 11 #include "base/bits.h" |
12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/memory/ptr_util.h" |
13 #include "base/trace_event/trace_event_memory_overhead.h" | 14 #include "base/trace_event/trace_event_memory_overhead.h" |
14 #include "base/values.h" | 15 #include "base/values.h" |
15 | 16 |
16 namespace base { | 17 namespace base { |
17 namespace trace_event { | 18 namespace trace_event { |
18 | 19 |
19 namespace { | 20 namespace { |
20 const char kTypeStartDict = '{'; | 21 const char kTypeStartDict = '{'; |
21 const char kTypeEndDict = '}'; | 22 const char kTypeEndDict = '}'; |
22 const char kTypeStartArray = '['; | 23 const char kTypeStartArray = '['; |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 DEBUG_PUSH_CONTAINER(kStackTypeDict); | 228 DEBUG_PUSH_CONTAINER(kStackTypeDict); |
228 pickle_.WriteBytes(&kTypeStartDict, 1); | 229 pickle_.WriteBytes(&kTypeStartDict, 1); |
229 } | 230 } |
230 | 231 |
231 void TracedValue::EndArray() { | 232 void TracedValue::EndArray() { |
232 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 233 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
233 DEBUG_POP_CONTAINER(); | 234 DEBUG_POP_CONTAINER(); |
234 pickle_.WriteBytes(&kTypeEndArray, 1); | 235 pickle_.WriteBytes(&kTypeEndArray, 1); |
235 } | 236 } |
236 | 237 |
237 void TracedValue::SetValue(const char* name, scoped_ptr<base::Value> value) { | 238 void TracedValue::SetValue(const char* name, |
| 239 std::unique_ptr<base::Value> value) { |
238 SetBaseValueWithCopiedName(name, *value); | 240 SetBaseValueWithCopiedName(name, *value); |
239 } | 241 } |
240 | 242 |
241 void TracedValue::SetBaseValueWithCopiedName(base::StringPiece name, | 243 void TracedValue::SetBaseValueWithCopiedName(base::StringPiece name, |
242 const base::Value& value) { | 244 const base::Value& value) { |
243 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 245 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
244 switch (value.GetType()) { | 246 switch (value.GetType()) { |
245 case base::Value::TYPE_NULL: | 247 case base::Value::TYPE_NULL: |
246 case base::Value::TYPE_BINARY: | 248 case base::Value::TYPE_BINARY: |
247 NOTREACHED(); | 249 NOTREACHED(); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 const ListValue* list_value; | 342 const ListValue* list_value; |
341 value.GetAsList(&list_value); | 343 value.GetAsList(&list_value); |
342 BeginArray(); | 344 BeginArray(); |
343 for (base::Value* base_value : *list_value) | 345 for (base::Value* base_value : *list_value) |
344 AppendBaseValue(*base_value); | 346 AppendBaseValue(*base_value); |
345 EndArray(); | 347 EndArray(); |
346 } break; | 348 } break; |
347 } | 349 } |
348 } | 350 } |
349 | 351 |
350 scoped_ptr<base::Value> TracedValue::ToBaseValue() const { | 352 std::unique_ptr<base::Value> TracedValue::ToBaseValue() const { |
351 scoped_ptr<DictionaryValue> root(new DictionaryValue); | 353 std::unique_ptr<DictionaryValue> root(new DictionaryValue); |
352 DictionaryValue* cur_dict = root.get(); | 354 DictionaryValue* cur_dict = root.get(); |
353 ListValue* cur_list = nullptr; | 355 ListValue* cur_list = nullptr; |
354 std::vector<Value*> stack; | 356 std::vector<Value*> stack; |
355 PickleIterator it(pickle_); | 357 PickleIterator it(pickle_); |
356 const char* type; | 358 const char* type; |
357 | 359 |
358 while (it.ReadBytes(&type, 1)) { | 360 while (it.ReadBytes(&type, 1)) { |
359 DCHECK((cur_dict && !cur_list) || (cur_list && !cur_dict)); | 361 DCHECK((cur_dict && !cur_list) || (cur_list && !cur_dict)); |
360 switch (*type) { | 362 switch (*type) { |
361 case kTypeStartDict: { | 363 case kTypeStartDict: { |
362 auto new_dict = new DictionaryValue(); | 364 auto new_dict = new DictionaryValue(); |
363 if (cur_dict) { | 365 if (cur_dict) { |
364 cur_dict->SetWithoutPathExpansion(ReadKeyName(it), | 366 cur_dict->SetWithoutPathExpansion(ReadKeyName(it), |
365 make_scoped_ptr(new_dict)); | 367 WrapUnique(new_dict)); |
366 stack.push_back(cur_dict); | 368 stack.push_back(cur_dict); |
367 cur_dict = new_dict; | 369 cur_dict = new_dict; |
368 } else { | 370 } else { |
369 cur_list->Append(make_scoped_ptr(new_dict)); | 371 cur_list->Append(WrapUnique(new_dict)); |
370 stack.push_back(cur_list); | 372 stack.push_back(cur_list); |
371 cur_list = nullptr; | 373 cur_list = nullptr; |
372 cur_dict = new_dict; | 374 cur_dict = new_dict; |
373 } | 375 } |
374 } break; | 376 } break; |
375 | 377 |
376 case kTypeEndArray: | 378 case kTypeEndArray: |
377 case kTypeEndDict: { | 379 case kTypeEndDict: { |
378 if (stack.back()->GetAsDictionary(&cur_dict)) { | 380 if (stack.back()->GetAsDictionary(&cur_dict)) { |
379 cur_list = nullptr; | 381 cur_list = nullptr; |
380 } else if (stack.back()->GetAsList(&cur_list)) { | 382 } else if (stack.back()->GetAsList(&cur_list)) { |
381 cur_dict = nullptr; | 383 cur_dict = nullptr; |
382 } | 384 } |
383 stack.pop_back(); | 385 stack.pop_back(); |
384 } break; | 386 } break; |
385 | 387 |
386 case kTypeStartArray: { | 388 case kTypeStartArray: { |
387 auto new_list = new ListValue(); | 389 auto new_list = new ListValue(); |
388 if (cur_dict) { | 390 if (cur_dict) { |
389 cur_dict->SetWithoutPathExpansion(ReadKeyName(it), | 391 cur_dict->SetWithoutPathExpansion(ReadKeyName(it), |
390 make_scoped_ptr(new_list)); | 392 WrapUnique(new_list)); |
391 stack.push_back(cur_dict); | 393 stack.push_back(cur_dict); |
392 cur_dict = nullptr; | 394 cur_dict = nullptr; |
393 cur_list = new_list; | 395 cur_list = new_list; |
394 } else { | 396 } else { |
395 cur_list->Append(make_scoped_ptr(new_list)); | 397 cur_list->Append(WrapUnique(new_list)); |
396 stack.push_back(cur_list); | 398 stack.push_back(cur_list); |
397 cur_list = new_list; | 399 cur_list = new_list; |
398 } | 400 } |
399 } break; | 401 } break; |
400 | 402 |
401 case kTypeBool: { | 403 case kTypeBool: { |
402 bool value; | 404 bool value; |
403 CHECK(it.ReadBool(&value)); | 405 CHECK(it.ReadBool(&value)); |
404 if (cur_dict) { | 406 if (cur_dict) { |
405 cur_dict->SetBooleanWithoutPathExpansion(ReadKeyName(it), value); | 407 cur_dict->SetBooleanWithoutPathExpansion(ReadKeyName(it), value); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 | 467 |
466 /* allocated size */ | 468 /* allocated size */ |
467 bits::Align(pickle_.GetTotalAllocatedSize(), kPickleHeapAlign), | 469 bits::Align(pickle_.GetTotalAllocatedSize(), kPickleHeapAlign), |
468 | 470 |
469 /* resident size */ | 471 /* resident size */ |
470 bits::Align(pickle_.size(), kPickleHeapAlign)); | 472 bits::Align(pickle_.size(), kPickleHeapAlign)); |
471 } | 473 } |
472 | 474 |
473 } // namespace trace_event | 475 } // namespace trace_event |
474 } // namespace base | 476 } // namespace base |
OLD | NEW |