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 "base/bits.h" | 7 #include "base/bits.h" |
8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "base/trace_event/trace_event_memory_overhead.h" | 9 #include "base/trace_event/trace_event_memory_overhead.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 #define DCHECK_CONTAINER_STACK_DEPTH_EQ(x) do {} while (0) | 35 #define DCHECK_CONTAINER_STACK_DEPTH_EQ(x) do {} while (0) |
36 #define DEBUG_PUSH_CONTAINER(x) do {} while (0) | 36 #define DEBUG_PUSH_CONTAINER(x) do {} while (0) |
37 #define DEBUG_POP_CONTAINER() do {} while (0) | 37 #define DEBUG_POP_CONTAINER() do {} while (0) |
38 #endif | 38 #endif |
39 | 39 |
40 inline void WriteKeyNameAsRawPtr(Pickle& pickle, const char* ptr) { | 40 inline void WriteKeyNameAsRawPtr(Pickle& pickle, const char* ptr) { |
41 pickle.WriteBytes(&kTypeCStr, 1); | 41 pickle.WriteBytes(&kTypeCStr, 1); |
42 pickle.WriteUInt64(static_cast<uint64>(reinterpret_cast<uintptr_t>(ptr))); | 42 pickle.WriteUInt64(static_cast<uint64>(reinterpret_cast<uintptr_t>(ptr))); |
43 } | 43 } |
44 | 44 |
45 inline void WriteKeyNameAsStdString(Pickle& pickle, const std::string& str) { | 45 inline void WriteKeyNameWithCopy(Pickle& pickle, base::StringPiece str) { |
46 pickle.WriteBytes(&kTypeString, 1); | 46 pickle.WriteBytes(&kTypeString, 1); |
47 pickle.WriteString(str); | 47 pickle.WriteString(str); |
48 } | 48 } |
49 | 49 |
50 std::string ReadKeyName(PickleIterator& pickle_iterator) { | 50 std::string ReadKeyName(PickleIterator& pickle_iterator) { |
51 const char* type = nullptr; | 51 const char* type = nullptr; |
52 bool res = pickle_iterator.ReadBytes(&type, 1); | 52 bool res = pickle_iterator.ReadBytes(&type, 1); |
53 std::string key_name; | 53 std::string key_name; |
54 if (res && *type == kTypeCStr) { | 54 if (res && *type == kTypeCStr) { |
55 uint64 ptr_value = 0; | 55 uint64 ptr_value = 0; |
(...skipping 22 matching lines...) Expand all Loading... |
78 DCHECK_CONTAINER_STACK_DEPTH_EQ(0u); | 78 DCHECK_CONTAINER_STACK_DEPTH_EQ(0u); |
79 } | 79 } |
80 | 80 |
81 void TracedValue::SetInteger(const char* name, int value) { | 81 void TracedValue::SetInteger(const char* name, int value) { |
82 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 82 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
83 pickle_.WriteBytes(&kTypeInt, 1); | 83 pickle_.WriteBytes(&kTypeInt, 1); |
84 pickle_.WriteInt(value); | 84 pickle_.WriteInt(value); |
85 WriteKeyNameAsRawPtr(pickle_, name); | 85 WriteKeyNameAsRawPtr(pickle_, name); |
86 } | 86 } |
87 | 87 |
88 void TracedValue::SetIntegerWithCopiedName(const std::string& name, int value) { | 88 void TracedValue::SetIntegerWithCopiedName(base::StringPiece name, int value) { |
89 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 89 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
90 pickle_.WriteBytes(&kTypeInt, 1); | 90 pickle_.WriteBytes(&kTypeInt, 1); |
91 pickle_.WriteInt(value); | 91 pickle_.WriteInt(value); |
92 WriteKeyNameAsStdString(pickle_, name); | 92 WriteKeyNameWithCopy(pickle_, name); |
93 } | 93 } |
94 | 94 |
95 void TracedValue::SetDouble(const char* name, double value) { | 95 void TracedValue::SetDouble(const char* name, double value) { |
96 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 96 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
97 pickle_.WriteBytes(&kTypeDouble, 1); | 97 pickle_.WriteBytes(&kTypeDouble, 1); |
98 pickle_.WriteDouble(value); | 98 pickle_.WriteDouble(value); |
99 WriteKeyNameAsRawPtr(pickle_, name); | 99 WriteKeyNameAsRawPtr(pickle_, name); |
100 } | 100 } |
101 | 101 |
102 void TracedValue::SetDoubleWithCopiedName(const std::string& name, | 102 void TracedValue::SetDoubleWithCopiedName(base::StringPiece name, |
103 double value) { | 103 double value) { |
104 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 104 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
105 pickle_.WriteBytes(&kTypeDouble, 1); | 105 pickle_.WriteBytes(&kTypeDouble, 1); |
106 pickle_.WriteDouble(value); | 106 pickle_.WriteDouble(value); |
107 WriteKeyNameAsStdString(pickle_, name); | 107 WriteKeyNameWithCopy(pickle_, name); |
108 } | 108 } |
109 | 109 |
110 void TracedValue::SetBoolean(const char* name, bool value) { | 110 void TracedValue::SetBoolean(const char* name, bool value) { |
111 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 111 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
112 pickle_.WriteBytes(&kTypeBool, 1); | 112 pickle_.WriteBytes(&kTypeBool, 1); |
113 pickle_.WriteBool(value); | 113 pickle_.WriteBool(value); |
114 WriteKeyNameAsRawPtr(pickle_, name); | 114 WriteKeyNameAsRawPtr(pickle_, name); |
115 } | 115 } |
116 | 116 |
117 void TracedValue::SetBooleanWithCopiedName(const std::string& name, | 117 void TracedValue::SetBooleanWithCopiedName(base::StringPiece name, |
118 bool value) { | 118 bool value) { |
119 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 119 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
120 pickle_.WriteBytes(&kTypeBool, 1); | 120 pickle_.WriteBytes(&kTypeBool, 1); |
121 pickle_.WriteBool(value); | 121 pickle_.WriteBool(value); |
122 WriteKeyNameAsStdString(pickle_, name); | 122 WriteKeyNameWithCopy(pickle_, name); |
123 } | 123 } |
124 | 124 |
125 void TracedValue::SetString(const char* name, const std::string& value) { | 125 void TracedValue::SetString(const char* name, base::StringPiece value) { |
126 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 126 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
127 pickle_.WriteBytes(&kTypeString, 1); | 127 pickle_.WriteBytes(&kTypeString, 1); |
128 pickle_.WriteString(value); | 128 pickle_.WriteString(value); |
129 WriteKeyNameAsRawPtr(pickle_, name); | 129 WriteKeyNameAsRawPtr(pickle_, name); |
130 } | 130 } |
131 | 131 |
132 void TracedValue::SetStringWithCopiedName(const std::string& name, | 132 void TracedValue::SetStringWithCopiedName(base::StringPiece name, |
133 const std::string& value) { | 133 base::StringPiece value) { |
134 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 134 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
135 pickle_.WriteBytes(&kTypeString, 1); | 135 pickle_.WriteBytes(&kTypeString, 1); |
136 pickle_.WriteString(value); | 136 pickle_.WriteString(value); |
137 WriteKeyNameAsStdString(pickle_, name); | 137 WriteKeyNameWithCopy(pickle_, name); |
138 } | 138 } |
139 | 139 |
140 void TracedValue::SetValue(const char* name, const TracedValue& value) { | 140 void TracedValue::SetValue(const char* name, const TracedValue& value) { |
141 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 141 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
142 BeginDictionary(name); | 142 BeginDictionary(name); |
143 pickle_.WriteBytes(value.pickle_.payload(), | 143 pickle_.WriteBytes(value.pickle_.payload(), |
144 static_cast<int>(value.pickle_.payload_size())); | 144 static_cast<int>(value.pickle_.payload_size())); |
145 EndDictionary(); | 145 EndDictionary(); |
146 } | 146 } |
147 | 147 |
148 void TracedValue::SetValueWithCopiedName(const std::string& name, | 148 void TracedValue::SetValueWithCopiedName(base::StringPiece name, |
149 const TracedValue& value) { | 149 const TracedValue& value) { |
150 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 150 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
151 BeginDictionaryWithCopiedName(name); | 151 BeginDictionaryWithCopiedName(name); |
152 pickle_.WriteBytes(value.pickle_.payload(), | 152 pickle_.WriteBytes(value.pickle_.payload(), |
153 static_cast<int>(value.pickle_.payload_size())); | 153 static_cast<int>(value.pickle_.payload_size())); |
154 EndDictionary(); | 154 EndDictionary(); |
155 } | 155 } |
156 | 156 |
157 void TracedValue::BeginDictionary(const char* name) { | 157 void TracedValue::BeginDictionary(const char* name) { |
158 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 158 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
159 DEBUG_PUSH_CONTAINER(kStackTypeDict); | 159 DEBUG_PUSH_CONTAINER(kStackTypeDict); |
160 pickle_.WriteBytes(&kTypeStartDict, 1); | 160 pickle_.WriteBytes(&kTypeStartDict, 1); |
161 WriteKeyNameAsRawPtr(pickle_, name); | 161 WriteKeyNameAsRawPtr(pickle_, name); |
162 } | 162 } |
163 | 163 |
164 void TracedValue::BeginDictionaryWithCopiedName(const std::string& name) { | 164 void TracedValue::BeginDictionaryWithCopiedName(base::StringPiece name) { |
165 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 165 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
166 DEBUG_PUSH_CONTAINER(kStackTypeDict); | 166 DEBUG_PUSH_CONTAINER(kStackTypeDict); |
167 pickle_.WriteBytes(&kTypeStartDict, 1); | 167 pickle_.WriteBytes(&kTypeStartDict, 1); |
168 WriteKeyNameAsStdString(pickle_, name); | 168 WriteKeyNameWithCopy(pickle_, name); |
169 } | 169 } |
170 | 170 |
171 void TracedValue::BeginArray(const char* name) { | 171 void TracedValue::BeginArray(const char* name) { |
172 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 172 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
173 DEBUG_PUSH_CONTAINER(kStackTypeArray); | 173 DEBUG_PUSH_CONTAINER(kStackTypeArray); |
174 pickle_.WriteBytes(&kTypeStartArray, 1); | 174 pickle_.WriteBytes(&kTypeStartArray, 1); |
175 WriteKeyNameAsRawPtr(pickle_, name); | 175 WriteKeyNameAsRawPtr(pickle_, name); |
176 } | 176 } |
177 | 177 |
178 void TracedValue::BeginArrayWithCopiedName(const std::string& name) { | 178 void TracedValue::BeginArrayWithCopiedName(base::StringPiece name) { |
179 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 179 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
180 DEBUG_PUSH_CONTAINER(kStackTypeArray); | 180 DEBUG_PUSH_CONTAINER(kStackTypeArray); |
181 pickle_.WriteBytes(&kTypeStartArray, 1); | 181 pickle_.WriteBytes(&kTypeStartArray, 1); |
182 WriteKeyNameAsStdString(pickle_, name); | 182 WriteKeyNameWithCopy(pickle_, name); |
183 } | 183 } |
184 | 184 |
185 void TracedValue::EndDictionary() { | 185 void TracedValue::EndDictionary() { |
186 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 186 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
187 DEBUG_POP_CONTAINER(); | 187 DEBUG_POP_CONTAINER(); |
188 pickle_.WriteBytes(&kTypeEndDict, 1); | 188 pickle_.WriteBytes(&kTypeEndDict, 1); |
189 } | 189 } |
190 | 190 |
191 void TracedValue::AppendInteger(int value) { | 191 void TracedValue::AppendInteger(int value) { |
192 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 192 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
193 pickle_.WriteBytes(&kTypeInt, 1); | 193 pickle_.WriteBytes(&kTypeInt, 1); |
194 pickle_.WriteInt(value); | 194 pickle_.WriteInt(value); |
195 } | 195 } |
196 | 196 |
197 void TracedValue::AppendDouble(double value) { | 197 void TracedValue::AppendDouble(double value) { |
198 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 198 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
199 pickle_.WriteBytes(&kTypeDouble, 1); | 199 pickle_.WriteBytes(&kTypeDouble, 1); |
200 pickle_.WriteDouble(value); | 200 pickle_.WriteDouble(value); |
201 } | 201 } |
202 | 202 |
203 void TracedValue::AppendBoolean(bool value) { | 203 void TracedValue::AppendBoolean(bool value) { |
204 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 204 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
205 pickle_.WriteBytes(&kTypeBool, 1); | 205 pickle_.WriteBytes(&kTypeBool, 1); |
206 pickle_.WriteBool(value); | 206 pickle_.WriteBool(value); |
207 } | 207 } |
208 | 208 |
209 void TracedValue::AppendString(const std::string& value) { | 209 void TracedValue::AppendString(base::StringPiece value) { |
210 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 210 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
211 pickle_.WriteBytes(&kTypeString, 1); | 211 pickle_.WriteBytes(&kTypeString, 1); |
212 pickle_.WriteString(value); | 212 pickle_.WriteString(value); |
213 } | 213 } |
214 | 214 |
215 void TracedValue::BeginArray() { | 215 void TracedValue::BeginArray() { |
216 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 216 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
217 DEBUG_PUSH_CONTAINER(kStackTypeArray); | 217 DEBUG_PUSH_CONTAINER(kStackTypeArray); |
218 pickle_.WriteBytes(&kTypeStartArray, 1); | 218 pickle_.WriteBytes(&kTypeStartArray, 1); |
219 } | 219 } |
220 | 220 |
221 void TracedValue::BeginDictionary() { | 221 void TracedValue::BeginDictionary() { |
222 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 222 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
223 DEBUG_PUSH_CONTAINER(kStackTypeDict); | 223 DEBUG_PUSH_CONTAINER(kStackTypeDict); |
224 pickle_.WriteBytes(&kTypeStartDict, 1); | 224 pickle_.WriteBytes(&kTypeStartDict, 1); |
225 } | 225 } |
226 | 226 |
227 void TracedValue::EndArray() { | 227 void TracedValue::EndArray() { |
228 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); | 228 DCHECK_CURRENT_CONTAINER_IS(kStackTypeArray); |
229 DEBUG_POP_CONTAINER(); | 229 DEBUG_POP_CONTAINER(); |
230 pickle_.WriteBytes(&kTypeEndArray, 1); | 230 pickle_.WriteBytes(&kTypeEndArray, 1); |
231 } | 231 } |
232 | 232 |
233 void TracedValue::SetValue(const char* name, scoped_ptr<base::Value> value) { | 233 void TracedValue::SetValue(const char* name, scoped_ptr<base::Value> value) { |
234 SetBaseValueWithCopiedName(name, *value); | 234 SetBaseValueWithCopiedName(name, *value); |
235 } | 235 } |
236 | 236 |
237 void TracedValue::SetBaseValueWithCopiedName(const std::string& name, | 237 void TracedValue::SetBaseValueWithCopiedName(base::StringPiece name, |
238 const base::Value& value) { | 238 const base::Value& value) { |
239 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); | 239 DCHECK_CURRENT_CONTAINER_IS(kStackTypeDict); |
240 switch (value.GetType()) { | 240 switch (value.GetType()) { |
241 case base::Value::TYPE_NULL: | 241 case base::Value::TYPE_NULL: |
242 case base::Value::TYPE_BINARY: | 242 case base::Value::TYPE_BINARY: |
243 NOTREACHED(); | 243 NOTREACHED(); |
244 break; | 244 break; |
245 | 245 |
246 case base::Value::TYPE_BOOLEAN: { | 246 case base::Value::TYPE_BOOLEAN: { |
247 bool bool_value; | 247 bool bool_value; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 | 461 |
462 /* allocated size */ | 462 /* allocated size */ |
463 bits::Align(pickle_.GetTotalAllocatedSize(), kPickleHeapAlign), | 463 bits::Align(pickle_.GetTotalAllocatedSize(), kPickleHeapAlign), |
464 | 464 |
465 /* resident size */ | 465 /* resident size */ |
466 bits::Align(pickle_.size(), kPickleHeapAlign)); | 466 bits::Align(pickle_.size(), kPickleHeapAlign)); |
467 } | 467 } |
468 | 468 |
469 } // namespace trace_event | 469 } // namespace trace_event |
470 } // namespace base | 470 } // namespace base |
OLD | NEW |