151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek// Copyright (c) 2014 The Chromium Authors. All rights reserved.
24241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// Use of this source code is governed by a BSD-style license that can be
34241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// found in the LICENSE file.
44241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
54241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "base/debug/trace_event_argument.h"
64241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
74241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "base/json/json_writer.h"
84241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "base/values.h"
94241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
1051125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremeneknamespace base {
1151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremeneknamespace debug {
12b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin
13b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey YasskinTracedValue::TracedValue() : root_(new DictionaryValue()) {
14b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin  stack_.push_back(root_.get());
15b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin}
164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
174241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted KremenekTracedValue::~TracedValue() {
184241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek  DCHECK_EQ(1u, stack_.size());
195a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis}
205a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
214241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekvoid TracedValue::SetInteger(const char* name, int value) {
224a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  GetCurrentDictionary()->SetInteger(name, value);
231309f9a3b225ea846e5822691c39a77423125505Ted Kremenek}
2463bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek
254241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekvoid TracedValue::SetDouble(const char* name, double value) {
264241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek  GetCurrentDictionary()->SetDouble(name, value);
27f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek}
284241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
29ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenekvoid TracedValue::SetBoolean(const char* name, bool value) {
304a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  GetCurrentDictionary()->SetBoolean(name, value);
314a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
3263bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek
335fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenekvoid TracedValue::SetString(const char* name, const std::string& value) {
3418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  GetCurrentDictionary()->SetString(name, value);
35626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek}
364241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
374241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekvoid TracedValue::SetValue(const char* name, Value* value) {
384a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  GetCurrentDictionary()->Set(name, value);
3911062b118476368fa5b294954713e5df97d8599fTed Kremenek}
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
419ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekvoid TracedValue::BeginDictionary(const char* name) {
425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis  DictionaryValue* dictionary = new DictionaryValue();
435fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek  GetCurrentDictionary()->Set(name, dictionary);
4411062b118476368fa5b294954713e5df97d8599fTed Kremenek  stack_.push_back(dictionary);
45cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek}
46cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
47cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenekvoid TracedValue::BeginArray(const char* name) {
48cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek  ListValue* array = new ListValue();
49cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek  GetCurrentDictionary()->Set(name, array);
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  stack_.push_back(array);
51bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu}
52bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu
53bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xuvoid TracedValue::EndDictionary() {
54c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu  DCHECK_GT(stack_.size(), 1u);
5538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu  DCHECK(GetCurrentDictionary());
56d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  stack_.pop_back();
57a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaks}
58d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis
59d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidisvoid TracedValue::AppendInteger(int value) {
60d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis  GetCurrentArray()->AppendInteger(value);
61e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek}
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
631833d284346b9fa11aae4e6aa07381347c04745cJordan Rosevoid TracedValue::AppendDouble(double value) {
641833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  GetCurrentArray()->AppendDouble(value);
651833d284346b9fa11aae4e6aa07381347c04745cJordan Rose}
661833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
671833d284346b9fa11aae4e6aa07381347c04745cJordan Rosevoid TracedValue::AppendBoolean(bool value) {
681833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  GetCurrentArray()->AppendBoolean(value);
691833d284346b9fa11aae4e6aa07381347c04745cJordan Rose}
701833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
711833d284346b9fa11aae4e6aa07381347c04745cJordan Rosevoid TracedValue::AppendString(const std::string& value) {
724c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  GetCurrentArray()->AppendString(value);
7346e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose}
7446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose
7546e778145c56cd9b42cb399795a294b29cb78b62Jordan Rosevoid TracedValue::BeginArray() {
761833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  ListValue* array = new ListValue();
774c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek  GetCurrentArray()->Append(array);
78d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek  stack_.push_back(array);
794c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek}
8046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose
8146e778145c56cd9b42cb399795a294b29cb78b62Jordan Rosevoid TracedValue::BeginDictionary() {
8246e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose  DictionaryValue* dictionary = new DictionaryValue();
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  GetCurrentArray()->Append(dictionary);
8446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose  stack_.push_back(dictionary);
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
8646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid TracedValue::EndArray() {
885d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek  DCHECK_GT(stack_.size(), 1u);
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DCHECK(GetCurrentArray());
9046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose  stack_.pop_back();
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
921833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
931833d284346b9fa11aae4e6aa07381347c04745cJordan RoseDictionaryValue* TracedValue::GetCurrentDictionary() {
941833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  DCHECK(!stack_.empty());
959c378f705405d37f49795d5e915989de774fe11fTed Kremenek  DictionaryValue* dictionary = NULL;
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  stack_.back()->GetAsDictionary(&dictionary);
971833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  DCHECK(dictionary);
981833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  return dictionary;
991833d284346b9fa11aae4e6aa07381347c04745cJordan Rose}
1001833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
1011833d284346b9fa11aae4e6aa07381347c04745cJordan RoseListValue* TracedValue::GetCurrentArray() {
102d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek  DCHECK(!stack_.empty());
103d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek  ListValue* list = NULL;
1041833d284346b9fa11aae4e6aa07381347c04745cJordan Rose  stack_.back()->GetAsList(&list);
105b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek  DCHECK(list);
10646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose  return list;
107f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek}
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid TracedValue::AppendAsTraceFormat(std::string* out) const {
1104a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  std::string tmp;
1114a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  JSONWriter::Write(stack_.front(), &tmp);
1124a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek  *out += tmp;
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  DCHECK_EQ(1u, stack_.size()) << tmp;
1144323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek}
1158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}  // namespace debug
1174a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}  // namespace base
1184c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek