1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/traced_value.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <inttypes.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include <atomic>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker #include <utility>
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include "base/bits.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/containers/circular_deque.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/json/json_writer.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/json/string_escape.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/pickle.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event_impl.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event_memory_overhead.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_log.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker namespace base {
30*6777b538SAndroid Build Coastguard Worker namespace trace_event {
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker namespace {
33*6777b538SAndroid Build Coastguard Worker const char kTypeStartDict = '{';
34*6777b538SAndroid Build Coastguard Worker const char kTypeEndDict = '}';
35*6777b538SAndroid Build Coastguard Worker const char kTypeStartArray = '[';
36*6777b538SAndroid Build Coastguard Worker const char kTypeEndArray = ']';
37*6777b538SAndroid Build Coastguard Worker const char kTypeBool = 'b';
38*6777b538SAndroid Build Coastguard Worker const char kTypeInt = 'i';
39*6777b538SAndroid Build Coastguard Worker const char kTypeDouble = 'd';
40*6777b538SAndroid Build Coastguard Worker const char kTypeString = 's';
41*6777b538SAndroid Build Coastguard Worker const char kTypeCStr = '*'; // only used for key names
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker std::atomic<TracedValue::WriterFactoryCallback> g_writer_factory_callback;
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker #ifndef NDEBUG
46*6777b538SAndroid Build Coastguard Worker const bool kStackTypeDict = false;
47*6777b538SAndroid Build Coastguard Worker const bool kStackTypeArray = true;
48*6777b538SAndroid Build Coastguard Worker #define DCHECK_CURRENT_CONTAINER_IS(x) DCHECK_EQ(x, nesting_stack_.back())
49*6777b538SAndroid Build Coastguard Worker #define DCHECK_CONTAINER_STACK_DEPTH_EQ(x) DCHECK_EQ(x, nesting_stack_.size())
50*6777b538SAndroid Build Coastguard Worker #define DEBUG_PUSH_CONTAINER(x) nesting_stack_.push_back(x)
51*6777b538SAndroid Build Coastguard Worker #define DEBUG_POP_CONTAINER() nesting_stack_.pop_back()
52*6777b538SAndroid Build Coastguard Worker #else
53*6777b538SAndroid Build Coastguard Worker #define DCHECK_CURRENT_CONTAINER_IS(x) \
54*6777b538SAndroid Build Coastguard Worker do { \
55*6777b538SAndroid Build Coastguard Worker } while (0)
56*6777b538SAndroid Build Coastguard Worker #define DCHECK_CONTAINER_STACK_DEPTH_EQ(x) \
57*6777b538SAndroid Build Coastguard Worker do { \
58*6777b538SAndroid Build Coastguard Worker } while (0)
59*6777b538SAndroid Build Coastguard Worker #define DEBUG_PUSH_CONTAINER(x) \
60*6777b538SAndroid Build Coastguard Worker do { \
61*6777b538SAndroid Build Coastguard Worker } while (0)
62*6777b538SAndroid Build Coastguard Worker #define DEBUG_POP_CONTAINER() \
63*6777b538SAndroid Build Coastguard Worker do { \
64*6777b538SAndroid Build Coastguard Worker } while (0)
65*6777b538SAndroid Build Coastguard Worker #endif
66*6777b538SAndroid Build Coastguard Worker
WriteKeyNameAsRawPtr(Pickle & pickle,const char * ptr)67*6777b538SAndroid Build Coastguard Worker inline void WriteKeyNameAsRawPtr(Pickle& pickle, const char* ptr) {
68*6777b538SAndroid Build Coastguard Worker pickle.WriteBytes(as_bytes(make_span(&kTypeCStr, 1u)));
69*6777b538SAndroid Build Coastguard Worker pickle.WriteUInt64(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr)));
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
WriteKeyNameWithCopy(Pickle & pickle,std::string_view str)72*6777b538SAndroid Build Coastguard Worker inline void WriteKeyNameWithCopy(Pickle& pickle, std::string_view str) {
73*6777b538SAndroid Build Coastguard Worker pickle.WriteBytes(as_bytes(make_span(&kTypeString, 1u)));
74*6777b538SAndroid Build Coastguard Worker pickle.WriteString(str);
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
ReadKeyName(PickleIterator & pickle_iterator)77*6777b538SAndroid Build Coastguard Worker std::string ReadKeyName(PickleIterator& pickle_iterator) {
78*6777b538SAndroid Build Coastguard Worker const char* type = nullptr;
79*6777b538SAndroid Build Coastguard Worker bool res = pickle_iterator.ReadBytes(&type, 1);
80*6777b538SAndroid Build Coastguard Worker std::string key_name;
81*6777b538SAndroid Build Coastguard Worker if (res && *type == kTypeCStr) {
82*6777b538SAndroid Build Coastguard Worker uint64_t ptr_value = 0;
83*6777b538SAndroid Build Coastguard Worker res = pickle_iterator.ReadUInt64(&ptr_value);
84*6777b538SAndroid Build Coastguard Worker key_name = reinterpret_cast<const char*>(static_cast<uintptr_t>(ptr_value));
85*6777b538SAndroid Build Coastguard Worker } else if (res && *type == kTypeString) {
86*6777b538SAndroid Build Coastguard Worker res = pickle_iterator.ReadString(&key_name);
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker DCHECK(res);
89*6777b538SAndroid Build Coastguard Worker return key_name;
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker class PickleWriter final : public TracedValue::Writer {
93*6777b538SAndroid Build Coastguard Worker public:
PickleWriter(size_t capacity)94*6777b538SAndroid Build Coastguard Worker explicit PickleWriter(size_t capacity) {
95*6777b538SAndroid Build Coastguard Worker if (capacity) {
96*6777b538SAndroid Build Coastguard Worker pickle_.Reserve(capacity);
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
IsPickleWriter() const100*6777b538SAndroid Build Coastguard Worker bool IsPickleWriter() const override { return true; }
IsProtoWriter() const101*6777b538SAndroid Build Coastguard Worker bool IsProtoWriter() const override { return false; }
102*6777b538SAndroid Build Coastguard Worker
SetInteger(const char * name,int value)103*6777b538SAndroid Build Coastguard Worker void SetInteger(const char* name, int value) override {
104*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeInt, 1u)));
105*6777b538SAndroid Build Coastguard Worker pickle_.WriteInt(value);
106*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
107*6777b538SAndroid Build Coastguard Worker }
108*6777b538SAndroid Build Coastguard Worker
SetIntegerWithCopiedName(std::string_view name,int value)109*6777b538SAndroid Build Coastguard Worker void SetIntegerWithCopiedName(std::string_view name, int value) override {
110*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeInt, 1u)));
111*6777b538SAndroid Build Coastguard Worker pickle_.WriteInt(value);
112*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker
SetDouble(const char * name,double value)115*6777b538SAndroid Build Coastguard Worker void SetDouble(const char* name, double value) override {
116*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeDouble, 1u)));
117*6777b538SAndroid Build Coastguard Worker pickle_.WriteDouble(value);
118*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker
SetDoubleWithCopiedName(std::string_view name,double value)121*6777b538SAndroid Build Coastguard Worker void SetDoubleWithCopiedName(std::string_view name, double value) override {
122*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeDouble, 1u)));
123*6777b538SAndroid Build Coastguard Worker pickle_.WriteDouble(value);
124*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker
SetBoolean(const char * name,bool value)127*6777b538SAndroid Build Coastguard Worker void SetBoolean(const char* name, bool value) override {
128*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeBool, 1u)));
129*6777b538SAndroid Build Coastguard Worker pickle_.WriteBool(value);
130*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker
SetBooleanWithCopiedName(std::string_view name,bool value)133*6777b538SAndroid Build Coastguard Worker void SetBooleanWithCopiedName(std::string_view name, bool value) override {
134*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeBool, 1u)));
135*6777b538SAndroid Build Coastguard Worker pickle_.WriteBool(value);
136*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
137*6777b538SAndroid Build Coastguard Worker }
138*6777b538SAndroid Build Coastguard Worker
SetString(const char * name,std::string_view value)139*6777b538SAndroid Build Coastguard Worker void SetString(const char* name, std::string_view value) override {
140*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeString, 1u)));
141*6777b538SAndroid Build Coastguard Worker pickle_.WriteString(value);
142*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker
SetStringWithCopiedName(std::string_view name,std::string_view value)145*6777b538SAndroid Build Coastguard Worker void SetStringWithCopiedName(std::string_view name,
146*6777b538SAndroid Build Coastguard Worker std::string_view value) override {
147*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeString, 1u)));
148*6777b538SAndroid Build Coastguard Worker pickle_.WriteString(value);
149*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker
SetValue(const char * name,Writer * value)152*6777b538SAndroid Build Coastguard Worker void SetValue(const char* name, Writer* value) override {
153*6777b538SAndroid Build Coastguard Worker CHECK(value->IsPickleWriter());
154*6777b538SAndroid Build Coastguard Worker const PickleWriter* pickle_writer = static_cast<const PickleWriter*>(value);
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker BeginDictionary(name);
157*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(pickle_writer->pickle_.payload_bytes());
158*6777b538SAndroid Build Coastguard Worker EndDictionary();
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker
SetValueWithCopiedName(std::string_view name,Writer * value)161*6777b538SAndroid Build Coastguard Worker void SetValueWithCopiedName(std::string_view name, Writer* value) override {
162*6777b538SAndroid Build Coastguard Worker CHECK(value->IsPickleWriter());
163*6777b538SAndroid Build Coastguard Worker const PickleWriter* pickle_writer = static_cast<const PickleWriter*>(value);
164*6777b538SAndroid Build Coastguard Worker
165*6777b538SAndroid Build Coastguard Worker BeginDictionaryWithCopiedName(name);
166*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(pickle_writer->pickle_.payload_bytes());
167*6777b538SAndroid Build Coastguard Worker EndDictionary();
168*6777b538SAndroid Build Coastguard Worker }
169*6777b538SAndroid Build Coastguard Worker
BeginArray()170*6777b538SAndroid Build Coastguard Worker void BeginArray() override {
171*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartArray, 1u)));
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker
BeginDictionary()174*6777b538SAndroid Build Coastguard Worker void BeginDictionary() override {
175*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartDict, 1u)));
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker
BeginDictionary(const char * name)178*6777b538SAndroid Build Coastguard Worker void BeginDictionary(const char* name) override {
179*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartDict, 1u)));
180*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
BeginDictionaryWithCopiedName(std::string_view name)183*6777b538SAndroid Build Coastguard Worker void BeginDictionaryWithCopiedName(std::string_view name) override {
184*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartDict, 1u)));
185*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
186*6777b538SAndroid Build Coastguard Worker }
187*6777b538SAndroid Build Coastguard Worker
BeginArray(const char * name)188*6777b538SAndroid Build Coastguard Worker void BeginArray(const char* name) override {
189*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartArray, 1u)));
190*6777b538SAndroid Build Coastguard Worker WriteKeyNameAsRawPtr(pickle_, name);
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker
BeginArrayWithCopiedName(std::string_view name)193*6777b538SAndroid Build Coastguard Worker void BeginArrayWithCopiedName(std::string_view name) override {
194*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeStartArray, 1u)));
195*6777b538SAndroid Build Coastguard Worker WriteKeyNameWithCopy(pickle_, name);
196*6777b538SAndroid Build Coastguard Worker }
197*6777b538SAndroid Build Coastguard Worker
EndDictionary()198*6777b538SAndroid Build Coastguard Worker void EndDictionary() override {
199*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeEndDict, 1u)));
200*6777b538SAndroid Build Coastguard Worker }
EndArray()201*6777b538SAndroid Build Coastguard Worker void EndArray() override {
202*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeEndArray, 1u)));
203*6777b538SAndroid Build Coastguard Worker }
204*6777b538SAndroid Build Coastguard Worker
AppendInteger(int value)205*6777b538SAndroid Build Coastguard Worker void AppendInteger(int value) override {
206*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeInt, 1u)));
207*6777b538SAndroid Build Coastguard Worker pickle_.WriteInt(value);
208*6777b538SAndroid Build Coastguard Worker }
209*6777b538SAndroid Build Coastguard Worker
AppendDouble(double value)210*6777b538SAndroid Build Coastguard Worker void AppendDouble(double value) override {
211*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeDouble, 1u)));
212*6777b538SAndroid Build Coastguard Worker pickle_.WriteDouble(value);
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker
AppendBoolean(bool value)215*6777b538SAndroid Build Coastguard Worker void AppendBoolean(bool value) override {
216*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeBool, 1u)));
217*6777b538SAndroid Build Coastguard Worker pickle_.WriteBool(value);
218*6777b538SAndroid Build Coastguard Worker }
219*6777b538SAndroid Build Coastguard Worker
AppendString(std::string_view value)220*6777b538SAndroid Build Coastguard Worker void AppendString(std::string_view value) override {
221*6777b538SAndroid Build Coastguard Worker pickle_.WriteBytes(as_bytes(make_span(&kTypeString, 1u)));
222*6777b538SAndroid Build Coastguard Worker pickle_.WriteString(value);
223*6777b538SAndroid Build Coastguard Worker }
224*6777b538SAndroid Build Coastguard Worker
AppendAsTraceFormat(std::string * out) const225*6777b538SAndroid Build Coastguard Worker void AppendAsTraceFormat(std::string* out) const override {
226*6777b538SAndroid Build Coastguard Worker struct State {
227*6777b538SAndroid Build Coastguard Worker enum Type { kTypeDict, kTypeArray };
228*6777b538SAndroid Build Coastguard Worker Type type;
229*6777b538SAndroid Build Coastguard Worker bool needs_comma;
230*6777b538SAndroid Build Coastguard Worker };
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker auto maybe_append_key_name = [](State current_state, PickleIterator* it,
233*6777b538SAndroid Build Coastguard Worker std::string* out) {
234*6777b538SAndroid Build Coastguard Worker if (current_state.type == State::kTypeDict) {
235*6777b538SAndroid Build Coastguard Worker EscapeJSONString(ReadKeyName(*it), true, out);
236*6777b538SAndroid Build Coastguard Worker out->append(":");
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker };
239*6777b538SAndroid Build Coastguard Worker
240*6777b538SAndroid Build Coastguard Worker base::circular_deque<State> state_stack;
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker out->append("{");
243*6777b538SAndroid Build Coastguard Worker state_stack.push_back({State::kTypeDict});
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker PickleIterator it(pickle_);
246*6777b538SAndroid Build Coastguard Worker for (const char* type; it.ReadBytes(&type, 1);) {
247*6777b538SAndroid Build Coastguard Worker switch (*type) {
248*6777b538SAndroid Build Coastguard Worker case kTypeEndDict:
249*6777b538SAndroid Build Coastguard Worker out->append("}");
250*6777b538SAndroid Build Coastguard Worker state_stack.pop_back();
251*6777b538SAndroid Build Coastguard Worker continue;
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker case kTypeEndArray:
254*6777b538SAndroid Build Coastguard Worker out->append("]");
255*6777b538SAndroid Build Coastguard Worker state_stack.pop_back();
256*6777b538SAndroid Build Coastguard Worker continue;
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker // Use an index so it will stay valid across resizes.
260*6777b538SAndroid Build Coastguard Worker size_t current_state_index = state_stack.size() - 1;
261*6777b538SAndroid Build Coastguard Worker if (state_stack[current_state_index].needs_comma) {
262*6777b538SAndroid Build Coastguard Worker out->append(",");
263*6777b538SAndroid Build Coastguard Worker }
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker switch (*type) {
266*6777b538SAndroid Build Coastguard Worker case kTypeStartDict: {
267*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
268*6777b538SAndroid Build Coastguard Worker out->append("{");
269*6777b538SAndroid Build Coastguard Worker state_stack.push_back({State::kTypeDict});
270*6777b538SAndroid Build Coastguard Worker break;
271*6777b538SAndroid Build Coastguard Worker }
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker case kTypeStartArray: {
274*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
275*6777b538SAndroid Build Coastguard Worker out->append("[");
276*6777b538SAndroid Build Coastguard Worker state_stack.push_back({State::kTypeArray});
277*6777b538SAndroid Build Coastguard Worker break;
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker case kTypeBool: {
281*6777b538SAndroid Build Coastguard Worker TraceEvent::TraceValue json_value;
282*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadBool(&json_value.as_bool));
283*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
284*6777b538SAndroid Build Coastguard Worker json_value.AppendAsJSON(TRACE_VALUE_TYPE_BOOL, out);
285*6777b538SAndroid Build Coastguard Worker break;
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker case kTypeInt: {
289*6777b538SAndroid Build Coastguard Worker int value;
290*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadInt(&value));
291*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
292*6777b538SAndroid Build Coastguard Worker TraceEvent::TraceValue json_value;
293*6777b538SAndroid Build Coastguard Worker json_value.as_int = value;
294*6777b538SAndroid Build Coastguard Worker json_value.AppendAsJSON(TRACE_VALUE_TYPE_INT, out);
295*6777b538SAndroid Build Coastguard Worker break;
296*6777b538SAndroid Build Coastguard Worker }
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker case kTypeDouble: {
299*6777b538SAndroid Build Coastguard Worker TraceEvent::TraceValue json_value;
300*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadDouble(&json_value.as_double));
301*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
302*6777b538SAndroid Build Coastguard Worker json_value.AppendAsJSON(TRACE_VALUE_TYPE_DOUBLE, out);
303*6777b538SAndroid Build Coastguard Worker break;
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Worker case kTypeString: {
307*6777b538SAndroid Build Coastguard Worker std::string value;
308*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadString(&value));
309*6777b538SAndroid Build Coastguard Worker maybe_append_key_name(state_stack[current_state_index], &it, out);
310*6777b538SAndroid Build Coastguard Worker TraceEvent::TraceValue json_value;
311*6777b538SAndroid Build Coastguard Worker json_value.as_string = value.c_str();
312*6777b538SAndroid Build Coastguard Worker json_value.AppendAsJSON(TRACE_VALUE_TYPE_STRING, out);
313*6777b538SAndroid Build Coastguard Worker break;
314*6777b538SAndroid Build Coastguard Worker }
315*6777b538SAndroid Build Coastguard Worker
316*6777b538SAndroid Build Coastguard Worker default:
317*6777b538SAndroid Build Coastguard Worker NOTREACHED();
318*6777b538SAndroid Build Coastguard Worker }
319*6777b538SAndroid Build Coastguard Worker
320*6777b538SAndroid Build Coastguard Worker state_stack[current_state_index].needs_comma = true;
321*6777b538SAndroid Build Coastguard Worker }
322*6777b538SAndroid Build Coastguard Worker
323*6777b538SAndroid Build Coastguard Worker out->append("}");
324*6777b538SAndroid Build Coastguard Worker state_stack.pop_back();
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Worker DCHECK(state_stack.empty());
327*6777b538SAndroid Build Coastguard Worker }
328*6777b538SAndroid Build Coastguard Worker
EstimateTraceMemoryOverhead(TraceEventMemoryOverhead * overhead)329*6777b538SAndroid Build Coastguard Worker void EstimateTraceMemoryOverhead(
330*6777b538SAndroid Build Coastguard Worker TraceEventMemoryOverhead* overhead) override {
331*6777b538SAndroid Build Coastguard Worker overhead->Add(TraceEventMemoryOverhead::kTracedValue,
332*6777b538SAndroid Build Coastguard Worker /* allocated size */
333*6777b538SAndroid Build Coastguard Worker pickle_.GetTotalAllocatedSize(),
334*6777b538SAndroid Build Coastguard Worker /* resident size */
335*6777b538SAndroid Build Coastguard Worker pickle_.size());
336*6777b538SAndroid Build Coastguard Worker }
337*6777b538SAndroid Build Coastguard Worker
ToBaseValue() const338*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::Value> ToBaseValue() const {
339*6777b538SAndroid Build Coastguard Worker base::Value root(base::Value::Type::DICT);
340*6777b538SAndroid Build Coastguard Worker Value* cur_dict = &root;
341*6777b538SAndroid Build Coastguard Worker Value* cur_list = nullptr;
342*6777b538SAndroid Build Coastguard Worker std::vector<Value*> stack;
343*6777b538SAndroid Build Coastguard Worker PickleIterator it(pickle_);
344*6777b538SAndroid Build Coastguard Worker const char* type;
345*6777b538SAndroid Build Coastguard Worker
346*6777b538SAndroid Build Coastguard Worker while (it.ReadBytes(&type, 1)) {
347*6777b538SAndroid Build Coastguard Worker DCHECK((cur_dict && !cur_list) || (cur_list && !cur_dict));
348*6777b538SAndroid Build Coastguard Worker switch (*type) {
349*6777b538SAndroid Build Coastguard Worker case kTypeStartDict: {
350*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
351*6777b538SAndroid Build Coastguard Worker stack.push_back(cur_dict);
352*6777b538SAndroid Build Coastguard Worker cur_dict = cur_dict->GetDict().Set(ReadKeyName(it),
353*6777b538SAndroid Build Coastguard Worker Value(Value::Type::DICT));
354*6777b538SAndroid Build Coastguard Worker } else {
355*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(Value(Value::Type::DICT));
356*6777b538SAndroid Build Coastguard Worker // Update |cur_dict| to point to the newly added dictionary.
357*6777b538SAndroid Build Coastguard Worker cur_dict = &cur_list->GetList().back();
358*6777b538SAndroid Build Coastguard Worker stack.push_back(cur_list);
359*6777b538SAndroid Build Coastguard Worker cur_list = nullptr;
360*6777b538SAndroid Build Coastguard Worker }
361*6777b538SAndroid Build Coastguard Worker } break;
362*6777b538SAndroid Build Coastguard Worker
363*6777b538SAndroid Build Coastguard Worker case kTypeEndArray:
364*6777b538SAndroid Build Coastguard Worker case kTypeEndDict: {
365*6777b538SAndroid Build Coastguard Worker if (stack.back()->is_dict()) {
366*6777b538SAndroid Build Coastguard Worker cur_dict = stack.back();
367*6777b538SAndroid Build Coastguard Worker cur_list = nullptr;
368*6777b538SAndroid Build Coastguard Worker } else if (stack.back()->is_list()) {
369*6777b538SAndroid Build Coastguard Worker cur_list = stack.back();
370*6777b538SAndroid Build Coastguard Worker cur_dict = nullptr;
371*6777b538SAndroid Build Coastguard Worker }
372*6777b538SAndroid Build Coastguard Worker stack.pop_back();
373*6777b538SAndroid Build Coastguard Worker } break;
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker case kTypeStartArray: {
376*6777b538SAndroid Build Coastguard Worker Value::List new_list;
377*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
378*6777b538SAndroid Build Coastguard Worker stack.push_back(cur_dict);
379*6777b538SAndroid Build Coastguard Worker cur_list =
380*6777b538SAndroid Build Coastguard Worker cur_dict->GetDict().Set(ReadKeyName(it), std::move(new_list));
381*6777b538SAndroid Build Coastguard Worker cur_dict = nullptr;
382*6777b538SAndroid Build Coastguard Worker } else {
383*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(std::move(new_list));
384*6777b538SAndroid Build Coastguard Worker stack.push_back(cur_list);
385*6777b538SAndroid Build Coastguard Worker // |cur_list| is invalidated at this point by the Append, so it
386*6777b538SAndroid Build Coastguard Worker // needs to be reset.
387*6777b538SAndroid Build Coastguard Worker cur_list = &cur_list->GetList().back();
388*6777b538SAndroid Build Coastguard Worker }
389*6777b538SAndroid Build Coastguard Worker } break;
390*6777b538SAndroid Build Coastguard Worker
391*6777b538SAndroid Build Coastguard Worker case kTypeBool: {
392*6777b538SAndroid Build Coastguard Worker bool value;
393*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadBool(&value));
394*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
395*6777b538SAndroid Build Coastguard Worker cur_dict->GetDict().Set(ReadKeyName(it), value);
396*6777b538SAndroid Build Coastguard Worker } else {
397*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(value);
398*6777b538SAndroid Build Coastguard Worker }
399*6777b538SAndroid Build Coastguard Worker } break;
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker case kTypeInt: {
402*6777b538SAndroid Build Coastguard Worker int value;
403*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadInt(&value));
404*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
405*6777b538SAndroid Build Coastguard Worker cur_dict->GetDict().Set(ReadKeyName(it), value);
406*6777b538SAndroid Build Coastguard Worker } else {
407*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(value);
408*6777b538SAndroid Build Coastguard Worker }
409*6777b538SAndroid Build Coastguard Worker } break;
410*6777b538SAndroid Build Coastguard Worker
411*6777b538SAndroid Build Coastguard Worker case kTypeDouble: {
412*6777b538SAndroid Build Coastguard Worker TraceEvent::TraceValue trace_value;
413*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadDouble(&trace_value.as_double));
414*6777b538SAndroid Build Coastguard Worker Value base_value;
415*6777b538SAndroid Build Coastguard Worker if (!std::isfinite(trace_value.as_double)) {
416*6777b538SAndroid Build Coastguard Worker // base::Value doesn't support nan and infinity values. Use strings
417*6777b538SAndroid Build Coastguard Worker // for them instead. This follows the same convention in
418*6777b538SAndroid Build Coastguard Worker // AppendAsTraceFormat(), supported by TraceValue::Append*().
419*6777b538SAndroid Build Coastguard Worker std::string value_string;
420*6777b538SAndroid Build Coastguard Worker trace_value.AppendAsString(TRACE_VALUE_TYPE_DOUBLE, &value_string);
421*6777b538SAndroid Build Coastguard Worker base_value = Value(value_string);
422*6777b538SAndroid Build Coastguard Worker } else {
423*6777b538SAndroid Build Coastguard Worker base_value = Value(trace_value.as_double);
424*6777b538SAndroid Build Coastguard Worker }
425*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
426*6777b538SAndroid Build Coastguard Worker cur_dict->GetDict().Set(ReadKeyName(it), std::move(base_value));
427*6777b538SAndroid Build Coastguard Worker } else {
428*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(std::move(base_value));
429*6777b538SAndroid Build Coastguard Worker }
430*6777b538SAndroid Build Coastguard Worker } break;
431*6777b538SAndroid Build Coastguard Worker
432*6777b538SAndroid Build Coastguard Worker case kTypeString: {
433*6777b538SAndroid Build Coastguard Worker std::string value;
434*6777b538SAndroid Build Coastguard Worker CHECK(it.ReadString(&value));
435*6777b538SAndroid Build Coastguard Worker if (cur_dict) {
436*6777b538SAndroid Build Coastguard Worker cur_dict->GetDict().Set(ReadKeyName(it), std::move(value));
437*6777b538SAndroid Build Coastguard Worker } else {
438*6777b538SAndroid Build Coastguard Worker cur_list->GetList().Append(std::move(value));
439*6777b538SAndroid Build Coastguard Worker }
440*6777b538SAndroid Build Coastguard Worker } break;
441*6777b538SAndroid Build Coastguard Worker
442*6777b538SAndroid Build Coastguard Worker default:
443*6777b538SAndroid Build Coastguard Worker NOTREACHED();
444*6777b538SAndroid Build Coastguard Worker }
445*6777b538SAndroid Build Coastguard Worker }
446*6777b538SAndroid Build Coastguard Worker DCHECK(stack.empty());
447*6777b538SAndroid Build Coastguard Worker return base::Value::ToUniquePtrValue(std::move(root));
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker
450*6777b538SAndroid Build Coastguard Worker private:
451*6777b538SAndroid Build Coastguard Worker Pickle pickle_;
452*6777b538SAndroid Build Coastguard Worker };
453*6777b538SAndroid Build Coastguard Worker
CreateWriter(size_t capacity)454*6777b538SAndroid Build Coastguard Worker std::unique_ptr<TracedValue::Writer> CreateWriter(size_t capacity) {
455*6777b538SAndroid Build Coastguard Worker TracedValue::WriterFactoryCallback callback =
456*6777b538SAndroid Build Coastguard Worker g_writer_factory_callback.load(std::memory_order_relaxed);
457*6777b538SAndroid Build Coastguard Worker if (callback) {
458*6777b538SAndroid Build Coastguard Worker return callback(capacity);
459*6777b538SAndroid Build Coastguard Worker }
460*6777b538SAndroid Build Coastguard Worker
461*6777b538SAndroid Build Coastguard Worker return std::make_unique<PickleWriter>(capacity);
462*6777b538SAndroid Build Coastguard Worker }
463*6777b538SAndroid Build Coastguard Worker
464*6777b538SAndroid Build Coastguard Worker } // namespace
465*6777b538SAndroid Build Coastguard Worker
AppendToProto(ProtoAppender * appender)466*6777b538SAndroid Build Coastguard Worker bool TracedValue::Writer::AppendToProto(ProtoAppender* appender) {
467*6777b538SAndroid Build Coastguard Worker return false;
468*6777b538SAndroid Build Coastguard Worker }
469*6777b538SAndroid Build Coastguard Worker
470*6777b538SAndroid Build Coastguard Worker // static
SetWriterFactoryCallback(WriterFactoryCallback callback)471*6777b538SAndroid Build Coastguard Worker void TracedValue::SetWriterFactoryCallback(WriterFactoryCallback callback) {
472*6777b538SAndroid Build Coastguard Worker g_writer_factory_callback.store(callback);
473*6777b538SAndroid Build Coastguard Worker }
474*6777b538SAndroid Build Coastguard Worker
TracedValue(size_t capacity)475*6777b538SAndroid Build Coastguard Worker TracedValue::TracedValue(size_t capacity)
476*6777b538SAndroid Build Coastguard Worker : TracedValue(capacity, /*forced_json*/ false) {}
477*6777b538SAndroid Build Coastguard Worker
TracedValue(size_t capacity,bool forced_json)478*6777b538SAndroid Build Coastguard Worker TracedValue::TracedValue(size_t capacity, bool forced_json) {
479*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeDict);
480*6777b538SAndroid Build Coastguard Worker
481*6777b538SAndroid Build Coastguard Worker writer_ = forced_json ? std::make_unique<PickleWriter>(capacity)
482*6777b538SAndroid Build Coastguard Worker : CreateWriter(capacity);
483*6777b538SAndroid Build Coastguard Worker }
484*6777b538SAndroid Build Coastguard Worker
~TracedValue()485*6777b538SAndroid Build Coastguard Worker TracedValue::~TracedValue() {
486*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
487*6777b538SAndroid Build Coastguard Worker DEBUG_POP_CONTAINER();
488*6777b538SAndroid Build Coastguard Worker DCHECK_CONTAINER_STACK_DEPTH_EQ(0u);
489*6777b538SAndroid Build Coastguard Worker }
490*6777b538SAndroid Build Coastguard Worker
SetInteger(const char * name,int value)491*6777b538SAndroid Build Coastguard Worker void TracedValue::SetInteger(const char* name, int value) {
492*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
493*6777b538SAndroid Build Coastguard Worker writer_->SetInteger(name, value);
494*6777b538SAndroid Build Coastguard Worker }
495*6777b538SAndroid Build Coastguard Worker
SetIntegerWithCopiedName(std::string_view name,int value)496*6777b538SAndroid Build Coastguard Worker void TracedValue::SetIntegerWithCopiedName(std::string_view name, int value) {
497*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
498*6777b538SAndroid Build Coastguard Worker writer_->SetIntegerWithCopiedName(name, value);
499*6777b538SAndroid Build Coastguard Worker }
500*6777b538SAndroid Build Coastguard Worker
SetDouble(const char * name,double value)501*6777b538SAndroid Build Coastguard Worker void TracedValue::SetDouble(const char* name, double value) {
502*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
503*6777b538SAndroid Build Coastguard Worker writer_->SetDouble(name, value);
504*6777b538SAndroid Build Coastguard Worker }
505*6777b538SAndroid Build Coastguard Worker
SetDoubleWithCopiedName(std::string_view name,double value)506*6777b538SAndroid Build Coastguard Worker void TracedValue::SetDoubleWithCopiedName(std::string_view name, double value) {
507*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
508*6777b538SAndroid Build Coastguard Worker writer_->SetDoubleWithCopiedName(name, value);
509*6777b538SAndroid Build Coastguard Worker }
510*6777b538SAndroid Build Coastguard Worker
SetBoolean(const char * name,bool value)511*6777b538SAndroid Build Coastguard Worker void TracedValue::SetBoolean(const char* name, bool value) {
512*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
513*6777b538SAndroid Build Coastguard Worker writer_->SetBoolean(name, value);
514*6777b538SAndroid Build Coastguard Worker }
515*6777b538SAndroid Build Coastguard Worker
SetBooleanWithCopiedName(std::string_view name,bool value)516*6777b538SAndroid Build Coastguard Worker void TracedValue::SetBooleanWithCopiedName(std::string_view name, bool value) {
517*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
518*6777b538SAndroid Build Coastguard Worker writer_->SetBooleanWithCopiedName(name, value);
519*6777b538SAndroid Build Coastguard Worker }
520*6777b538SAndroid Build Coastguard Worker
SetString(const char * name,std::string_view value)521*6777b538SAndroid Build Coastguard Worker void TracedValue::SetString(const char* name, std::string_view value) {
522*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
523*6777b538SAndroid Build Coastguard Worker writer_->SetString(name, value);
524*6777b538SAndroid Build Coastguard Worker }
525*6777b538SAndroid Build Coastguard Worker
SetStringWithCopiedName(std::string_view name,std::string_view value)526*6777b538SAndroid Build Coastguard Worker void TracedValue::SetStringWithCopiedName(std::string_view name,
527*6777b538SAndroid Build Coastguard Worker std::string_view value) {
528*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
529*6777b538SAndroid Build Coastguard Worker writer_->SetStringWithCopiedName(name, value);
530*6777b538SAndroid Build Coastguard Worker }
531*6777b538SAndroid Build Coastguard Worker
SetValue(const char * name,TracedValue * value)532*6777b538SAndroid Build Coastguard Worker void TracedValue::SetValue(const char* name, TracedValue* value) {
533*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
534*6777b538SAndroid Build Coastguard Worker writer_->SetValue(name, value->writer_.get());
535*6777b538SAndroid Build Coastguard Worker }
536*6777b538SAndroid Build Coastguard Worker
SetValueWithCopiedName(std::string_view name,TracedValue * value)537*6777b538SAndroid Build Coastguard Worker void TracedValue::SetValueWithCopiedName(std::string_view name,
538*6777b538SAndroid Build Coastguard Worker TracedValue* value) {
539*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
540*6777b538SAndroid Build Coastguard Worker writer_->SetValueWithCopiedName(name, value->writer_.get());
541*6777b538SAndroid Build Coastguard Worker }
542*6777b538SAndroid Build Coastguard Worker
543*6777b538SAndroid Build Coastguard Worker namespace {
544*6777b538SAndroid Build Coastguard Worker
545*6777b538SAndroid Build Coastguard Worker // TODO(altimin): Add native support for pointers for nested values in
546*6777b538SAndroid Build Coastguard Worker // DebugAnnotation proto.
PointerToString(const void * value)547*6777b538SAndroid Build Coastguard Worker std::string PointerToString(const void* value) {
548*6777b538SAndroid Build Coastguard Worker return base::StringPrintf(
549*6777b538SAndroid Build Coastguard Worker "0x%" PRIx64, static_cast<uint64_t>(reinterpret_cast<uintptr_t>(value)));
550*6777b538SAndroid Build Coastguard Worker }
551*6777b538SAndroid Build Coastguard Worker
552*6777b538SAndroid Build Coastguard Worker } // namespace
553*6777b538SAndroid Build Coastguard Worker
SetPointer(const char * name,const void * value)554*6777b538SAndroid Build Coastguard Worker void TracedValue::SetPointer(const char* name, const void* value) {
555*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
556*6777b538SAndroid Build Coastguard Worker writer_->SetString(name, PointerToString(value));
557*6777b538SAndroid Build Coastguard Worker }
558*6777b538SAndroid Build Coastguard Worker
SetPointerWithCopiedName(std::string_view name,const void * value)559*6777b538SAndroid Build Coastguard Worker void TracedValue::SetPointerWithCopiedName(std::string_view name,
560*6777b538SAndroid Build Coastguard Worker const void* value) {
561*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
562*6777b538SAndroid Build Coastguard Worker writer_->SetStringWithCopiedName(name, PointerToString(value));
563*6777b538SAndroid Build Coastguard Worker }
564*6777b538SAndroid Build Coastguard Worker
BeginDictionary(const char * name)565*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginDictionary(const char* name) {
566*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
567*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeDict);
568*6777b538SAndroid Build Coastguard Worker writer_->BeginDictionary(name);
569*6777b538SAndroid Build Coastguard Worker }
570*6777b538SAndroid Build Coastguard Worker
BeginDictionaryWithCopiedName(std::string_view name)571*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginDictionaryWithCopiedName(std::string_view name) {
572*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
573*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeDict);
574*6777b538SAndroid Build Coastguard Worker writer_->BeginDictionaryWithCopiedName(name);
575*6777b538SAndroid Build Coastguard Worker }
576*6777b538SAndroid Build Coastguard Worker
BeginArray(const char * name)577*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginArray(const char* name) {
578*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
579*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeArray);
580*6777b538SAndroid Build Coastguard Worker writer_->BeginArray(name);
581*6777b538SAndroid Build Coastguard Worker }
582*6777b538SAndroid Build Coastguard Worker
BeginArrayWithCopiedName(std::string_view name)583*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginArrayWithCopiedName(std::string_view name) {
584*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
585*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeArray);
586*6777b538SAndroid Build Coastguard Worker writer_->BeginArrayWithCopiedName(name);
587*6777b538SAndroid Build Coastguard Worker }
588*6777b538SAndroid Build Coastguard Worker
AppendInteger(int value)589*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendInteger(int value) {
590*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
591*6777b538SAndroid Build Coastguard Worker writer_->AppendInteger(value);
592*6777b538SAndroid Build Coastguard Worker }
593*6777b538SAndroid Build Coastguard Worker
AppendDouble(double value)594*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendDouble(double value) {
595*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
596*6777b538SAndroid Build Coastguard Worker writer_->AppendDouble(value);
597*6777b538SAndroid Build Coastguard Worker }
598*6777b538SAndroid Build Coastguard Worker
AppendBoolean(bool value)599*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendBoolean(bool value) {
600*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
601*6777b538SAndroid Build Coastguard Worker writer_->AppendBoolean(value);
602*6777b538SAndroid Build Coastguard Worker }
603*6777b538SAndroid Build Coastguard Worker
AppendString(std::string_view value)604*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendString(std::string_view value) {
605*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
606*6777b538SAndroid Build Coastguard Worker writer_->AppendString(value);
607*6777b538SAndroid Build Coastguard Worker }
608*6777b538SAndroid Build Coastguard Worker
AppendPointer(const void * value)609*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendPointer(const void* value) {
610*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
611*6777b538SAndroid Build Coastguard Worker writer_->AppendString(PointerToString(value));
612*6777b538SAndroid Build Coastguard Worker }
613*6777b538SAndroid Build Coastguard Worker
BeginArray()614*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginArray() {
615*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
616*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeArray);
617*6777b538SAndroid Build Coastguard Worker writer_->BeginArray();
618*6777b538SAndroid Build Coastguard Worker }
619*6777b538SAndroid Build Coastguard Worker
BeginDictionary()620*6777b538SAndroid Build Coastguard Worker void TracedValue::BeginDictionary() {
621*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
622*6777b538SAndroid Build Coastguard Worker DEBUG_PUSH_CONTAINER(kStackTypeDict);
623*6777b538SAndroid Build Coastguard Worker writer_->BeginDictionary();
624*6777b538SAndroid Build Coastguard Worker }
625*6777b538SAndroid Build Coastguard Worker
EndArray()626*6777b538SAndroid Build Coastguard Worker void TracedValue::EndArray() {
627*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray);
628*6777b538SAndroid Build Coastguard Worker DEBUG_POP_CONTAINER();
629*6777b538SAndroid Build Coastguard Worker writer_->EndArray();
630*6777b538SAndroid Build Coastguard Worker }
631*6777b538SAndroid Build Coastguard Worker
EndDictionary()632*6777b538SAndroid Build Coastguard Worker void TracedValue::EndDictionary() {
633*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
634*6777b538SAndroid Build Coastguard Worker DEBUG_POP_CONTAINER();
635*6777b538SAndroid Build Coastguard Worker writer_->EndDictionary();
636*6777b538SAndroid Build Coastguard Worker }
637*6777b538SAndroid Build Coastguard Worker
ToBaseValue() const638*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::Value> TracedValue::ToBaseValue() const {
639*6777b538SAndroid Build Coastguard Worker DCHECK(writer_->IsPickleWriter());
640*6777b538SAndroid Build Coastguard Worker return static_cast<const PickleWriter*>(writer_.get())->ToBaseValue();
641*6777b538SAndroid Build Coastguard Worker }
642*6777b538SAndroid Build Coastguard Worker
AppendAsTraceFormat(std::string * out) const643*6777b538SAndroid Build Coastguard Worker void TracedValue::AppendAsTraceFormat(std::string* out) const {
644*6777b538SAndroid Build Coastguard Worker DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict);
645*6777b538SAndroid Build Coastguard Worker DCHECK_CONTAINER_STACK_DEPTH_EQ(1u);
646*6777b538SAndroid Build Coastguard Worker
647*6777b538SAndroid Build Coastguard Worker writer_->AppendAsTraceFormat(out);
648*6777b538SAndroid Build Coastguard Worker }
649*6777b538SAndroid Build Coastguard Worker
AppendToProto(ProtoAppender * appender) const650*6777b538SAndroid Build Coastguard Worker bool TracedValue::AppendToProto(ProtoAppender* appender) const {
651*6777b538SAndroid Build Coastguard Worker return writer_->AppendToProto(appender);
652*6777b538SAndroid Build Coastguard Worker }
653*6777b538SAndroid Build Coastguard Worker
EstimateTraceMemoryOverhead(TraceEventMemoryOverhead * overhead)654*6777b538SAndroid Build Coastguard Worker void TracedValue::EstimateTraceMemoryOverhead(
655*6777b538SAndroid Build Coastguard Worker TraceEventMemoryOverhead* overhead) {
656*6777b538SAndroid Build Coastguard Worker writer_->EstimateTraceMemoryOverhead(overhead);
657*6777b538SAndroid Build Coastguard Worker }
658*6777b538SAndroid Build Coastguard Worker
Array(const std::initializer_list<ArrayItem> items)659*6777b538SAndroid Build Coastguard Worker TracedValue::Array::Array(const std::initializer_list<ArrayItem> items) {
660*6777b538SAndroid Build Coastguard Worker items_ = std::move(items);
661*6777b538SAndroid Build Coastguard Worker }
662*6777b538SAndroid Build Coastguard Worker
Array(TracedValue::Array && other)663*6777b538SAndroid Build Coastguard Worker TracedValue::Array::Array(TracedValue::Array&& other) {
664*6777b538SAndroid Build Coastguard Worker items_ = std::move(other.items_);
665*6777b538SAndroid Build Coastguard Worker }
666*6777b538SAndroid Build Coastguard Worker
WriteToValue(TracedValue * value) const667*6777b538SAndroid Build Coastguard Worker void TracedValue::Array::WriteToValue(TracedValue* value) const {
668*6777b538SAndroid Build Coastguard Worker for (const auto& item : items_) {
669*6777b538SAndroid Build Coastguard Worker item.WriteToValue(value);
670*6777b538SAndroid Build Coastguard Worker }
671*6777b538SAndroid Build Coastguard Worker }
672*6777b538SAndroid Build Coastguard Worker
Dictionary(const std::initializer_list<DictionaryItem> items)673*6777b538SAndroid Build Coastguard Worker TracedValue::Dictionary::Dictionary(
674*6777b538SAndroid Build Coastguard Worker const std::initializer_list<DictionaryItem> items) {
675*6777b538SAndroid Build Coastguard Worker items_ = items;
676*6777b538SAndroid Build Coastguard Worker }
677*6777b538SAndroid Build Coastguard Worker
Dictionary(TracedValue::Dictionary && other)678*6777b538SAndroid Build Coastguard Worker TracedValue::Dictionary::Dictionary(TracedValue::Dictionary&& other) {
679*6777b538SAndroid Build Coastguard Worker items_ = std::move(other.items_);
680*6777b538SAndroid Build Coastguard Worker }
681*6777b538SAndroid Build Coastguard Worker
WriteToValue(TracedValue * value) const682*6777b538SAndroid Build Coastguard Worker void TracedValue::Dictionary::WriteToValue(TracedValue* value) const {
683*6777b538SAndroid Build Coastguard Worker for (const auto& item : items_) {
684*6777b538SAndroid Build Coastguard Worker item.WriteToValue(value);
685*6777b538SAndroid Build Coastguard Worker }
686*6777b538SAndroid Build Coastguard Worker }
687*6777b538SAndroid Build Coastguard Worker
ValueHolder(int value)688*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(int value) {
689*6777b538SAndroid Build Coastguard Worker kept_value_.int_value = value;
690*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kIntType;
691*6777b538SAndroid Build Coastguard Worker }
692*6777b538SAndroid Build Coastguard Worker
ValueHolder(double value)693*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(double value) {
694*6777b538SAndroid Build Coastguard Worker kept_value_.double_value = value;
695*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kDoubleType;
696*6777b538SAndroid Build Coastguard Worker }
697*6777b538SAndroid Build Coastguard Worker
ValueHolder(bool value)698*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(bool value) {
699*6777b538SAndroid Build Coastguard Worker kept_value_.bool_value = value;
700*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kBoolType;
701*6777b538SAndroid Build Coastguard Worker }
702*6777b538SAndroid Build Coastguard Worker
ValueHolder(std::string_view value)703*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(std::string_view value) {
704*6777b538SAndroid Build Coastguard Worker kept_value_.string_piece_value = value;
705*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kStringPieceType;
706*6777b538SAndroid Build Coastguard Worker }
707*6777b538SAndroid Build Coastguard Worker
ValueHolder(std::string value)708*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(std::string value) {
709*6777b538SAndroid Build Coastguard Worker new (&kept_value_.std_string_value) std::string(std::move(value));
710*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kStdStringType;
711*6777b538SAndroid Build Coastguard Worker }
712*6777b538SAndroid Build Coastguard Worker
ValueHolder(void * value)713*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(void* value) {
714*6777b538SAndroid Build Coastguard Worker kept_value_.void_ptr_value = value;
715*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kVoidPtrType;
716*6777b538SAndroid Build Coastguard Worker }
717*6777b538SAndroid Build Coastguard Worker
ValueHolder(const char * value)718*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(const char* value) {
719*6777b538SAndroid Build Coastguard Worker kept_value_.string_piece_value = value;
720*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kStringPieceType;
721*6777b538SAndroid Build Coastguard Worker }
722*6777b538SAndroid Build Coastguard Worker
ValueHolder(TracedValue::Dictionary & value)723*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(TracedValue::Dictionary& value) {
724*6777b538SAndroid Build Coastguard Worker new (&kept_value_.dictionary_value) TracedValue::Dictionary(std::move(value));
725*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kDictionaryType;
726*6777b538SAndroid Build Coastguard Worker }
727*6777b538SAndroid Build Coastguard Worker
ValueHolder(TracedValue::Array & value)728*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(TracedValue::Array& value) {
729*6777b538SAndroid Build Coastguard Worker new (&kept_value_.array_value) TracedValue::Array(std::move(value));
730*6777b538SAndroid Build Coastguard Worker kept_value_type_ = KeptValueType::kArrayType;
731*6777b538SAndroid Build Coastguard Worker }
732*6777b538SAndroid Build Coastguard Worker
ValueHolder(TracedValue::ValueHolder && other)733*6777b538SAndroid Build Coastguard Worker TracedValue::ValueHolder::ValueHolder(TracedValue::ValueHolder&& other) {
734*6777b538SAndroid Build Coastguard Worker // Remember to call a destructor if necessary.
735*6777b538SAndroid Build Coastguard Worker if (kept_value_type_ == KeptValueType::kStdStringType) {
736*6777b538SAndroid Build Coastguard Worker delete (&kept_value_.std_string_value);
737*6777b538SAndroid Build Coastguard Worker }
738*6777b538SAndroid Build Coastguard Worker switch (other.kept_value_type_) {
739*6777b538SAndroid Build Coastguard Worker case KeptValueType::kIntType: {
740*6777b538SAndroid Build Coastguard Worker kept_value_.int_value = other.kept_value_.int_value;
741*6777b538SAndroid Build Coastguard Worker break;
742*6777b538SAndroid Build Coastguard Worker }
743*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDoubleType: {
744*6777b538SAndroid Build Coastguard Worker kept_value_.double_value = other.kept_value_.double_value;
745*6777b538SAndroid Build Coastguard Worker break;
746*6777b538SAndroid Build Coastguard Worker }
747*6777b538SAndroid Build Coastguard Worker case KeptValueType::kBoolType: {
748*6777b538SAndroid Build Coastguard Worker kept_value_.bool_value = other.kept_value_.bool_value;
749*6777b538SAndroid Build Coastguard Worker break;
750*6777b538SAndroid Build Coastguard Worker }
751*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStringPieceType: {
752*6777b538SAndroid Build Coastguard Worker kept_value_.string_piece_value = other.kept_value_.string_piece_value;
753*6777b538SAndroid Build Coastguard Worker break;
754*6777b538SAndroid Build Coastguard Worker }
755*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStdStringType: {
756*6777b538SAndroid Build Coastguard Worker new (&kept_value_.std_string_value)
757*6777b538SAndroid Build Coastguard Worker std::string(std::move(other.kept_value_.std_string_value));
758*6777b538SAndroid Build Coastguard Worker break;
759*6777b538SAndroid Build Coastguard Worker }
760*6777b538SAndroid Build Coastguard Worker case KeptValueType::kVoidPtrType: {
761*6777b538SAndroid Build Coastguard Worker kept_value_.void_ptr_value = other.kept_value_.void_ptr_value;
762*6777b538SAndroid Build Coastguard Worker break;
763*6777b538SAndroid Build Coastguard Worker }
764*6777b538SAndroid Build Coastguard Worker case KeptValueType::kArrayType: {
765*6777b538SAndroid Build Coastguard Worker new (&kept_value_.array_value)
766*6777b538SAndroid Build Coastguard Worker TracedValue::Array(std::move(other.kept_value_.array_value));
767*6777b538SAndroid Build Coastguard Worker break;
768*6777b538SAndroid Build Coastguard Worker }
769*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDictionaryType: {
770*6777b538SAndroid Build Coastguard Worker new (&kept_value_.dictionary_value) TracedValue::Dictionary(
771*6777b538SAndroid Build Coastguard Worker std::move(other.kept_value_.dictionary_value));
772*6777b538SAndroid Build Coastguard Worker break;
773*6777b538SAndroid Build Coastguard Worker }
774*6777b538SAndroid Build Coastguard Worker }
775*6777b538SAndroid Build Coastguard Worker kept_value_type_ = other.kept_value_type_;
776*6777b538SAndroid Build Coastguard Worker }
777*6777b538SAndroid Build Coastguard Worker
WriteToValue(TracedValue * value) const778*6777b538SAndroid Build Coastguard Worker void TracedValue::ValueHolder::WriteToValue(TracedValue* value) const {
779*6777b538SAndroid Build Coastguard Worker switch (kept_value_type_) {
780*6777b538SAndroid Build Coastguard Worker case KeptValueType::kIntType: {
781*6777b538SAndroid Build Coastguard Worker value->AppendInteger(kept_value_.int_value);
782*6777b538SAndroid Build Coastguard Worker break;
783*6777b538SAndroid Build Coastguard Worker }
784*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDoubleType: {
785*6777b538SAndroid Build Coastguard Worker value->AppendDouble(kept_value_.double_value);
786*6777b538SAndroid Build Coastguard Worker break;
787*6777b538SAndroid Build Coastguard Worker }
788*6777b538SAndroid Build Coastguard Worker case KeptValueType::kBoolType: {
789*6777b538SAndroid Build Coastguard Worker value->AppendBoolean(kept_value_.bool_value);
790*6777b538SAndroid Build Coastguard Worker break;
791*6777b538SAndroid Build Coastguard Worker }
792*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStringPieceType: {
793*6777b538SAndroid Build Coastguard Worker value->AppendString(kept_value_.string_piece_value);
794*6777b538SAndroid Build Coastguard Worker break;
795*6777b538SAndroid Build Coastguard Worker }
796*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStdStringType: {
797*6777b538SAndroid Build Coastguard Worker value->AppendString(kept_value_.std_string_value);
798*6777b538SAndroid Build Coastguard Worker break;
799*6777b538SAndroid Build Coastguard Worker }
800*6777b538SAndroid Build Coastguard Worker case KeptValueType::kVoidPtrType: {
801*6777b538SAndroid Build Coastguard Worker value->AppendPointer(kept_value_.void_ptr_value);
802*6777b538SAndroid Build Coastguard Worker break;
803*6777b538SAndroid Build Coastguard Worker }
804*6777b538SAndroid Build Coastguard Worker case KeptValueType::kArrayType: {
805*6777b538SAndroid Build Coastguard Worker value->BeginArray();
806*6777b538SAndroid Build Coastguard Worker kept_value_.array_value.WriteToValue(value);
807*6777b538SAndroid Build Coastguard Worker value->EndArray();
808*6777b538SAndroid Build Coastguard Worker break;
809*6777b538SAndroid Build Coastguard Worker }
810*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDictionaryType: {
811*6777b538SAndroid Build Coastguard Worker value->BeginDictionary();
812*6777b538SAndroid Build Coastguard Worker kept_value_.dictionary_value.WriteToValue(value);
813*6777b538SAndroid Build Coastguard Worker value->EndDictionary();
814*6777b538SAndroid Build Coastguard Worker break;
815*6777b538SAndroid Build Coastguard Worker }
816*6777b538SAndroid Build Coastguard Worker }
817*6777b538SAndroid Build Coastguard Worker }
818*6777b538SAndroid Build Coastguard Worker
WriteToValue(const char * name,TracedValue * value) const819*6777b538SAndroid Build Coastguard Worker void TracedValue::ValueHolder::WriteToValue(const char* name,
820*6777b538SAndroid Build Coastguard Worker TracedValue* value) const {
821*6777b538SAndroid Build Coastguard Worker switch (kept_value_type_) {
822*6777b538SAndroid Build Coastguard Worker case KeptValueType::kIntType: {
823*6777b538SAndroid Build Coastguard Worker value->SetInteger(name, kept_value_.int_value);
824*6777b538SAndroid Build Coastguard Worker break;
825*6777b538SAndroid Build Coastguard Worker }
826*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDoubleType: {
827*6777b538SAndroid Build Coastguard Worker value->SetDouble(name, kept_value_.double_value);
828*6777b538SAndroid Build Coastguard Worker break;
829*6777b538SAndroid Build Coastguard Worker }
830*6777b538SAndroid Build Coastguard Worker case KeptValueType::kBoolType: {
831*6777b538SAndroid Build Coastguard Worker value->SetBoolean(name, kept_value_.bool_value);
832*6777b538SAndroid Build Coastguard Worker break;
833*6777b538SAndroid Build Coastguard Worker }
834*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStringPieceType: {
835*6777b538SAndroid Build Coastguard Worker value->SetString(name, kept_value_.string_piece_value);
836*6777b538SAndroid Build Coastguard Worker break;
837*6777b538SAndroid Build Coastguard Worker }
838*6777b538SAndroid Build Coastguard Worker case KeptValueType::kStdStringType: {
839*6777b538SAndroid Build Coastguard Worker value->SetString(name, kept_value_.std_string_value);
840*6777b538SAndroid Build Coastguard Worker break;
841*6777b538SAndroid Build Coastguard Worker }
842*6777b538SAndroid Build Coastguard Worker case KeptValueType::kVoidPtrType: {
843*6777b538SAndroid Build Coastguard Worker value->SetPointer(name, kept_value_.void_ptr_value);
844*6777b538SAndroid Build Coastguard Worker break;
845*6777b538SAndroid Build Coastguard Worker }
846*6777b538SAndroid Build Coastguard Worker case KeptValueType::kArrayType: {
847*6777b538SAndroid Build Coastguard Worker value->BeginArray(name);
848*6777b538SAndroid Build Coastguard Worker kept_value_.array_value.WriteToValue(value);
849*6777b538SAndroid Build Coastguard Worker value->EndArray();
850*6777b538SAndroid Build Coastguard Worker break;
851*6777b538SAndroid Build Coastguard Worker }
852*6777b538SAndroid Build Coastguard Worker case KeptValueType::kDictionaryType: {
853*6777b538SAndroid Build Coastguard Worker value->BeginDictionary(name);
854*6777b538SAndroid Build Coastguard Worker kept_value_.dictionary_value.WriteToValue(value);
855*6777b538SAndroid Build Coastguard Worker value->EndDictionary();
856*6777b538SAndroid Build Coastguard Worker break;
857*6777b538SAndroid Build Coastguard Worker }
858*6777b538SAndroid Build Coastguard Worker }
859*6777b538SAndroid Build Coastguard Worker }
860*6777b538SAndroid Build Coastguard Worker
WriteToValue(TracedValue * value) const861*6777b538SAndroid Build Coastguard Worker void TracedValue::ArrayItem::WriteToValue(TracedValue* value) const {
862*6777b538SAndroid Build Coastguard Worker ValueHolder::WriteToValue(value);
863*6777b538SAndroid Build Coastguard Worker }
864*6777b538SAndroid Build Coastguard Worker
WriteToValue(TracedValue * value) const865*6777b538SAndroid Build Coastguard Worker void TracedValue::DictionaryItem::WriteToValue(TracedValue* value) const {
866*6777b538SAndroid Build Coastguard Worker ValueHolder::WriteToValue(name_, value);
867*6777b538SAndroid Build Coastguard Worker }
868*6777b538SAndroid Build Coastguard Worker
Build(const std::initializer_list<DictionaryItem> items)869*6777b538SAndroid Build Coastguard Worker std::unique_ptr<TracedValue> TracedValue::Build(
870*6777b538SAndroid Build Coastguard Worker const std::initializer_list<DictionaryItem> items) {
871*6777b538SAndroid Build Coastguard Worker std::unique_ptr<TracedValue> value(new TracedValue());
872*6777b538SAndroid Build Coastguard Worker for (const auto& item : items) {
873*6777b538SAndroid Build Coastguard Worker item.WriteToValue(value.get());
874*6777b538SAndroid Build Coastguard Worker }
875*6777b538SAndroid Build Coastguard Worker return value;
876*6777b538SAndroid Build Coastguard Worker }
877*6777b538SAndroid Build Coastguard Worker
ToJSON() const878*6777b538SAndroid Build Coastguard Worker std::string TracedValueJSON::ToJSON() const {
879*6777b538SAndroid Build Coastguard Worker std::string result;
880*6777b538SAndroid Build Coastguard Worker AppendAsTraceFormat(&result);
881*6777b538SAndroid Build Coastguard Worker return result;
882*6777b538SAndroid Build Coastguard Worker }
883*6777b538SAndroid Build Coastguard Worker
ToFormattedJSON() const884*6777b538SAndroid Build Coastguard Worker std::string TracedValueJSON::ToFormattedJSON() const {
885*6777b538SAndroid Build Coastguard Worker std::string str;
886*6777b538SAndroid Build Coastguard Worker base::JSONWriter::WriteWithOptions(
887*6777b538SAndroid Build Coastguard Worker *ToBaseValue(),
888*6777b538SAndroid Build Coastguard Worker base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION |
889*6777b538SAndroid Build Coastguard Worker base::JSONWriter::OPTIONS_PRETTY_PRINT,
890*6777b538SAndroid Build Coastguard Worker &str);
891*6777b538SAndroid Build Coastguard Worker return str;
892*6777b538SAndroid Build Coastguard Worker }
893*6777b538SAndroid Build Coastguard Worker
ArrayScope(TracedValue * value)894*6777b538SAndroid Build Coastguard Worker TracedValue::ArrayScope::ArrayScope(TracedValue* value) : value_(value) {}
895*6777b538SAndroid Build Coastguard Worker
~ArrayScope()896*6777b538SAndroid Build Coastguard Worker TracedValue::ArrayScope::~ArrayScope() {
897*6777b538SAndroid Build Coastguard Worker value_->EndArray();
898*6777b538SAndroid Build Coastguard Worker }
899*6777b538SAndroid Build Coastguard Worker
AppendArrayScoped()900*6777b538SAndroid Build Coastguard Worker TracedValue::ArrayScope TracedValue::AppendArrayScoped() {
901*6777b538SAndroid Build Coastguard Worker BeginArray();
902*6777b538SAndroid Build Coastguard Worker return TracedValue::ArrayScope(this);
903*6777b538SAndroid Build Coastguard Worker }
904*6777b538SAndroid Build Coastguard Worker
BeginArrayScoped(const char * name)905*6777b538SAndroid Build Coastguard Worker TracedValue::ArrayScope TracedValue::BeginArrayScoped(const char* name) {
906*6777b538SAndroid Build Coastguard Worker BeginArray(name);
907*6777b538SAndroid Build Coastguard Worker return TracedValue::ArrayScope(this);
908*6777b538SAndroid Build Coastguard Worker }
909*6777b538SAndroid Build Coastguard Worker
BeginArrayScopedWithCopiedName(std::string_view name)910*6777b538SAndroid Build Coastguard Worker TracedValue::ArrayScope TracedValue::BeginArrayScopedWithCopiedName(
911*6777b538SAndroid Build Coastguard Worker std::string_view name) {
912*6777b538SAndroid Build Coastguard Worker BeginArrayWithCopiedName(name);
913*6777b538SAndroid Build Coastguard Worker return TracedValue::ArrayScope(this);
914*6777b538SAndroid Build Coastguard Worker }
915*6777b538SAndroid Build Coastguard Worker
DictionaryScope(TracedValue * value)916*6777b538SAndroid Build Coastguard Worker TracedValue::DictionaryScope::DictionaryScope(TracedValue* value)
917*6777b538SAndroid Build Coastguard Worker : value_(value) {}
918*6777b538SAndroid Build Coastguard Worker
~DictionaryScope()919*6777b538SAndroid Build Coastguard Worker TracedValue::DictionaryScope::~DictionaryScope() {
920*6777b538SAndroid Build Coastguard Worker value_->EndDictionary();
921*6777b538SAndroid Build Coastguard Worker }
922*6777b538SAndroid Build Coastguard Worker
AppendDictionaryScoped()923*6777b538SAndroid Build Coastguard Worker TracedValue::DictionaryScope TracedValue::AppendDictionaryScoped() {
924*6777b538SAndroid Build Coastguard Worker BeginDictionary();
925*6777b538SAndroid Build Coastguard Worker return TracedValue::DictionaryScope(this);
926*6777b538SAndroid Build Coastguard Worker }
927*6777b538SAndroid Build Coastguard Worker
BeginDictionaryScoped(const char * name)928*6777b538SAndroid Build Coastguard Worker TracedValue::DictionaryScope TracedValue::BeginDictionaryScoped(
929*6777b538SAndroid Build Coastguard Worker const char* name) {
930*6777b538SAndroid Build Coastguard Worker BeginDictionary(name);
931*6777b538SAndroid Build Coastguard Worker return TracedValue::DictionaryScope(this);
932*6777b538SAndroid Build Coastguard Worker }
933*6777b538SAndroid Build Coastguard Worker
BeginDictionaryScopedWithCopiedName(std::string_view name)934*6777b538SAndroid Build Coastguard Worker TracedValue::DictionaryScope TracedValue::BeginDictionaryScopedWithCopiedName(
935*6777b538SAndroid Build Coastguard Worker std::string_view name) {
936*6777b538SAndroid Build Coastguard Worker BeginDictionaryWithCopiedName(name);
937*6777b538SAndroid Build Coastguard Worker return TracedValue::DictionaryScope(this);
938*6777b538SAndroid Build Coastguard Worker }
939*6777b538SAndroid Build Coastguard Worker
940*6777b538SAndroid Build Coastguard Worker } // namespace trace_event
941*6777b538SAndroid Build Coastguard Worker } // namespace base
942