| Index: src/profiler/sampling-heap-profiler.h
|
| diff --git a/src/profiler/sampling-heap-profiler.h b/src/profiler/sampling-heap-profiler.h
|
| index 1f98bec849f80f7f068c8e903d6b6b8e190f79e2..9aee282c8aff3da185df0aaea3b732989ab92cdf 100644
|
| --- a/src/profiler/sampling-heap-profiler.h
|
| +++ b/src/profiler/sampling-heap-profiler.h
|
| @@ -48,50 +48,50 @@ class SamplingHeapProfiler {
|
|
|
| StringsStorage* names() const { return names_; }
|
|
|
| - class FunctionInfo {
|
| + class AllocationNode;
|
| +
|
| + struct Sample {
|
| public:
|
| - FunctionInfo(SharedFunctionInfo* shared, StringsStorage* names);
|
| - explicit FunctionInfo(const char* name)
|
| - : name_(name),
|
| - script_name_(""),
|
| - script_id_(v8::UnboundScript::kNoScriptId),
|
| - start_position_(0) {}
|
| -
|
| - const char* get_name() const { return name_; }
|
| - const char* get_script_name() const { return script_name_; }
|
| - int get_script_id() const { return script_id_; }
|
| - int get_start_position() const { return start_position_; }
|
| + Sample(size_t size_, AllocationNode* owner_, Local<Value> local_,
|
| + SamplingHeapProfiler* profiler_)
|
| + : size(size_),
|
| + owner(owner_),
|
| + global(Global<Value>(
|
| + reinterpret_cast<v8::Isolate*>(profiler_->isolate_), local_)),
|
| + profiler(profiler_) {}
|
| + ~Sample() { global.Reset(); }
|
| + const size_t size;
|
| + AllocationNode* const owner;
|
| + Global<Value> global;
|
| + SamplingHeapProfiler* const profiler;
|
|
|
| private:
|
| - const char* const name_;
|
| - const char* script_name_;
|
| - int script_id_;
|
| - const int start_position_;
|
| + DISALLOW_COPY_AND_ASSIGN(Sample);
|
| };
|
|
|
| - class SampledAllocation {
|
| + class AllocationNode {
|
| public:
|
| - SampledAllocation(SamplingHeapProfiler* sampling_heap_profiler,
|
| - Isolate* isolate, Local<Value> local, size_t size,
|
| - int max_frames);
|
| - ~SampledAllocation() {
|
| - for (auto info : stack_) {
|
| - delete info;
|
| + AllocationNode(const char* const name, int script_id,
|
| + const int start_position)
|
| + : script_id_(script_id),
|
| + script_position_(start_position),
|
| + name_(name) {}
|
| + ~AllocationNode() {
|
| + for (auto child : children_) {
|
| + delete child;
|
| }
|
| - global_.Reset(); // drop the reference.
|
| }
|
| - size_t get_size() const { return size_; }
|
| - const std::vector<FunctionInfo*>& get_stack() const { return stack_; }
|
|
|
| private:
|
| - static void OnWeakCallback(const WeakCallbackInfo<SampledAllocation>& data);
|
| + std::map<size_t, unsigned int> allocations_;
|
| + std::vector<AllocationNode*> children_;
|
| + const int script_id_;
|
| + const int script_position_;
|
| + const char* const name_;
|
|
|
| - SamplingHeapProfiler* const sampling_heap_profiler_;
|
| - Global<Value> global_;
|
| - std::vector<FunctionInfo*> stack_;
|
| - const size_t size_;
|
| + friend class SamplingHeapProfiler;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(SampledAllocation);
|
| + DISALLOW_COPY_AND_ASSIGN(AllocationNode);
|
| };
|
|
|
| private:
|
| @@ -99,23 +99,29 @@ class SamplingHeapProfiler {
|
|
|
| void SampleObject(Address soon_object, size_t size);
|
|
|
| + static void OnWeakCallback(const WeakCallbackInfo<Sample>& data);
|
| +
|
| // Methods that construct v8::AllocationProfile.
|
| - v8::AllocationProfile::Node* AddStack(
|
| - AllocationProfile* profile, const std::map<int, Script*>& scripts,
|
| - const std::vector<FunctionInfo*>& stack);
|
| - v8::AllocationProfile::Node* FindOrAddChildNode(
|
| - AllocationProfile* profile, const std::map<int, Script*>& scripts,
|
| - v8::AllocationProfile::Node* parent, FunctionInfo* function_info);
|
| - v8::AllocationProfile::Node* AllocateNode(
|
| - AllocationProfile* profile, const std::map<int, Script*>& scripts,
|
| - FunctionInfo* function_info);
|
| +
|
| + // Translates the provided AllocationNode *node* returning an equivalent
|
| + // AllocationProfile::Node. The newly created AllocationProfile::Node is added
|
| + // to the provided AllocationProfile *profile*. Line numbers, column numbers,
|
| + // and script names are resolved using *scripts* which maps all currently
|
| + // loaded scripts keyed by their script id.
|
| + v8::AllocationProfile::Node* TranslateAllocationNode(
|
| + AllocationProfile* profile, SamplingHeapProfiler::AllocationNode* node,
|
| + const std::map<int, Script*>& scripts);
|
| + AllocationNode* AddStack();
|
| + AllocationNode* FindOrAddChildNode(AllocationNode* parent, const char* name,
|
| + int script_id, int start_position);
|
|
|
| Isolate* const isolate_;
|
| Heap* const heap_;
|
| base::SmartPointer<SamplingAllocationObserver> new_space_observer_;
|
| base::SmartPointer<SamplingAllocationObserver> other_spaces_observer_;
|
| StringsStorage* const names_;
|
| - std::set<SampledAllocation*> samples_;
|
| + AllocationNode profile_root_;
|
| + std::set<Sample*> samples_;
|
| const int stack_depth_;
|
|
|
| friend class SamplingAllocationObserver;
|
|
|