| 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 |