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