Index: base/trace_event/heap_profiler_stack_frame_deduplicator.cc |
diff --git a/base/trace_event/heap_profiler_stack_frame_deduplicator.cc b/base/trace_event/heap_profiler_stack_frame_deduplicator.cc |
index 95685250cd23a9dd42e61ebc43e41cfb622f244d..401da3ff6641408e488ed4e4631611452cdb6f80 100644 |
--- a/base/trace_event/heap_profiler_stack_frame_deduplicator.cc |
+++ b/base/trace_event/heap_profiler_stack_frame_deduplicator.cc |
@@ -4,6 +4,7 @@ |
#include "base/trace_event/heap_profiler_stack_frame_deduplicator.h" |
+#include <inttypes.h> |
#include <stddef.h> |
#include <string> |
@@ -16,16 +17,19 @@ |
namespace base { |
namespace trace_event { |
-StackFrameDeduplicator::FrameNode::FrameNode(StackFrame frame, |
+StackFrameDeduplicator::FrameNode::FrameNode(StackFrameType frame_type, |
+ StackFrame frame, |
int parent_frame_index) |
- : frame(frame), parent_frame_index(parent_frame_index) {} |
+ : frame_type(frame_type), frame(frame), |
+ parent_frame_index(parent_frame_index) {} |
StackFrameDeduplicator::FrameNode::FrameNode(const FrameNode& other) = default; |
StackFrameDeduplicator::FrameNode::~FrameNode() {} |
StackFrameDeduplicator::StackFrameDeduplicator() {} |
StackFrameDeduplicator::~StackFrameDeduplicator() {} |
-int StackFrameDeduplicator::Insert(const StackFrame* beginFrame, |
+int StackFrameDeduplicator::Insert(StackFrameType frame_type, |
+ const StackFrame* beginFrame, |
const StackFrame* endFrame) { |
int frame_index = -1; |
std::map<StackFrame, int>* nodes = &roots_; |
@@ -38,7 +42,7 @@ int StackFrameDeduplicator::Insert(const StackFrame* beginFrame, |
if (node == nodes->end()) { |
// There is no tree node for this frame yet, create it. The parent node |
// is the node associated with the previous frame. |
- FrameNode frame_node(frame, frame_index); |
+ FrameNode frame_node(frame_type, frame, frame_index); |
// The new frame node will be appended, so its index is the current size |
// of the vector. |
@@ -78,7 +82,18 @@ void StackFrameDeduplicator::AppendAsTraceFormat(std::string* out) const { |
out->append(stringify_buffer); |
scoped_ptr<TracedValue> frame_node_value(new TracedValue); |
- frame_node_value->SetString("name", frame_node->frame); |
+ switch (frame_node->frame_type) { |
+ case STACK_FRAME_TYPE_SYMBOL: |
+ frame_node_value->SetString( |
+ "name", static_cast<const char*>(frame_node->frame)); |
+ break; |
+ case STACK_FRAME_TYPE_PC: |
+ SStringPrintf(&stringify_buffer, |
+ "pc:%" PRIxPTR, |
+ reinterpret_cast<uintptr_t>(frame_node->frame)); |
+ frame_node_value->SetString("name", stringify_buffer); |
+ break; |
+ } |
if (frame_node->parent_frame_index >= 0) { |
SStringPrintf(&stringify_buffer, "%d", frame_node->parent_frame_index); |
frame_node_value->SetString("parent", stringify_buffer); |