16ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Copyright 2010 the V8 project authors. All rights reserved.
26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Redistribution and use in source and binary forms, with or without
36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// modification, are permitted provided that the following conditions are
46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// met:
56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions of source code must retain the above copyright
76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       notice, this list of conditions and the following disclaimer.
86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Redistributions in binary form must reproduce the above
96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       copyright notice, this list of conditions and the following
106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       disclaimer in the documentation and/or other materials provided
116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       with the distribution.
126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//     * Neither the name of Google Inc. nor the names of its
136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       contributors may be used to endorse or promote products derived
146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//       from this software without specific prior written permission.
156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//
166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_V8_PROFILER_H_
296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8_V8_PROFILER_H_
306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "v8.h"
326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef _WIN32
346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Setup for Windows DLL export/import. See v8.h in this directory for
356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// information on how to build/use V8 as a DLL.
366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  build configuration to ensure that at most one of these is set
396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef BUILDING_V8_SHARED
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8EXPORT __declspec(dllexport)
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#elif USING_V8_SHARED
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8EXPORT __declspec(dllimport)
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else
466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8EXPORT
476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else  // _WIN32
506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Setup for Linux shared library export. See v8.h in this directory for
526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// information on how to build/use V8 as shared library.
536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(V8_SHARED)
546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8EXPORT __attribute__ ((visibility("default")))
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else  // defined(__GNUC__) && (__GNUC__ >= 4)
566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8EXPORT
576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // defined(__GNUC__) && (__GNUC__ >= 4)
586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // _WIN32
606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block/**
636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Profiler support for the V8 JavaScript engine.
646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */
656ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 {
666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block/**
696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * CpuProfileNode represents a node in a call graph.
706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */
716ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass V8EXPORT CpuProfileNode {
726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns function name (empty string for anonymous functions.) */
746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<String> GetFunctionName() const;
756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns resource name for script from where the function originates. */
776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<String> GetScriptResourceName() const;
786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Returns the number, 1-based, of the line where the function originates.
816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * kNoLineNumberInfo if no line number information is available.
826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int GetLineNumber() const;
846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Returns total (self + children) execution time of the function,
876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * in milliseconds, estimated by samples count.
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double GetTotalTime() const;
906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Returns self execution time of the function, in milliseconds,
936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * estimated by samples count.
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double GetSelfTime() const;
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns the count of samples where function exists. */
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double GetTotalSamplesCount() const;
996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns the count of samples where function was currently executing. */
1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double GetSelfSamplesCount() const;
1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns function entry UID. */
1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned GetCallUid() const;
1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns child nodes count of the node. */
1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int GetChildrenCount() const;
1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Retrieves a child node by index. */
1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  const CpuProfileNode* GetChild(int index) const;
1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block/**
1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * CpuProfile contains a CPU profile in a form of two call trees:
1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block *  - top-down (from main() down to functions that do all the work);
1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block *  - bottom-up call graph (in backward direction).
1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */
1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass V8EXPORT CpuProfile {
1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns CPU profile UID (assigned by the profiler.) */
1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  unsigned GetUid() const;
1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns CPU profile title. */
1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Handle<String> GetTitle() const;
1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns the root node of the bottom up call tree. */
1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  const CpuProfileNode* GetBottomUpRoot() const;
1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns the root node of the top down call tree. */
1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  const CpuProfileNode* GetTopDownRoot() const;
13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
13544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Deletes the profile and removes it from CpuProfiler's list.
13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * All pointers to nodes previously returned become invalid.
13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Profiles with the same uid but obtained using different
13944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * security token are not deleted, but become inaccessible
14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * using FindProfile method. It is embedder's responsibility
14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * to call Delete on these profiles.
14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
14344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Delete();
1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block/**
1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Interface for controlling CPU profiling.
1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block */
1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass V8EXPORT CpuProfiler {
1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public:
1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
153f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * A note on security tokens usage. As scripts from different
154f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * origins can run inside a single V8 instance, it is possible to
155f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * have functions from different security contexts intermixed in a
156f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * single CPU profile. To avoid exposing function names belonging to
157f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * other contexts, filtering by security token is performed while
158f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * obtaining profiling results.
159f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   */
160f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
161f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  /**
1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Returns the number of profiles collected (doesn't include
1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * profiles that are being collected at the moment of call.)
1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static int GetProfilesCount();
1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns a profile by index. */
168f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static const CpuProfile* GetProfile(
169f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      int index,
170f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      Handle<Value> security_token = Handle<Value>());
1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /** Returns a profile by uid. */
173f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static const CpuProfile* FindProfile(
174f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      unsigned uid,
175f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      Handle<Value> security_token = Handle<Value>());
1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Starts collecting CPU profile. Title may be an empty string. It
1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * is allowed to have several profiles being collected at
1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * once. Attempts to start collecting several profiles with the same
181f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * title are silently ignored. While collecting a profile, functions
182f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * from all security contexts are included in it. The token-based
183f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke   * filtering is only performed when querying for a profile.
1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  static void StartProfiling(Handle<String> title);
1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  /**
1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * Stops collecting CPU profile with a given title and returns it.
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   * If the title given is empty, finishes the last profile started.
1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block   */
191f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  static const CpuProfile* StopProfiling(
192f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      Handle<String> title,
193f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke      Handle<Value> security_token = Handle<Value>());
19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Deletes all existing profiles, also cancelling all profiling
19744f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * activity.  All previously returned pointers to profiles and their
19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * contents become invalid after this call.
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DeleteAllProfiles();
2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block};
2026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2049dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenclass HeapGraphNode;
2059dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2069dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2079dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen/**
2089dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * HeapSnapshotEdge represents a directed connection between heap
209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch * graph nodes: from retainers to retained nodes.
2109dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen */
2119dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenclass V8EXPORT HeapGraphEdge {
2129dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen public:
2139dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  enum Type {
214756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    kContextVariable = 0,  // A variable from a function context.
215756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    kElement = 1,          // An element of an array.
216756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    kProperty = 2,         // A named object property.
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    kInternal = 3,         // A link that can't be accessed from JS,
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           // thus, its name isn't a real property name
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           // (e.g. parts of a ConsString).
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    kHidden = 4,           // A link that is needed for proper sizes
2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           // calculation, but may be hidden from user.
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kShortcut = 5,         // A link that must not be followed during
2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                           // sizes calculation.
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kWeak = 6              // A weak reference (ignored by the GC).
2259dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  };
2269dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2279dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns edge type (see HeapGraphEdge::Type). */
2289dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Type GetType() const;
2299dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2309dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /**
2319dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   * Returns edge name. This can be a variable name, an element index, or
2329dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   * a property name.
2339dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   */
2349dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Handle<Value> GetName() const;
2359dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2369dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns origin node. */
2379dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  const HeapGraphNode* GetFromNode() const;
2389dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2399dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns destination node. */
2409dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  const HeapGraphNode* GetToNode() const;
2419dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen};
2429dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2439dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2449dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen/**
2459dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * HeapGraphNode represents a node in a heap graph.
2469dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen */
2479dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenclass V8EXPORT HeapGraphNode {
2489dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen public:
2499dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  enum Type {
25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kHidden = 0,      // Hidden node, may be filtered when shown to user.
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kArray = 1,       // An array of elements.
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kString = 2,      // A string.
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kObject = 3,      // A JS object (except for arrays and strings).
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kCode = 4,        // Compiled code.
25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kClosure = 5,     // Function closure.
25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kRegExp = 6,      // RegExp.
25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    kHeapNumber = 7,  // Number stored in the heap.
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNative = 8,      // Native object (not from V8 heap).
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kSynthetic = 9    // Synthetic object, usualy used for grouping
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                      // snapshot items together.
2619dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  };
2629dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2639dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns node type (see HeapGraphNode::Type). */
2649dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Type GetType() const;
2659dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2669dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /**
2679dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   * Returns node name. Depending on node's type this can be the name
2689dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   * of the constructor (for objects), the name of the function (for
2699dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   * closures), string value, or an empty string (for compiled code).
2709dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   */
2719dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Handle<String> GetName() const;
2729dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2733bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  /**
2743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch   * Returns node id. For the same heap object, the id remains the same
2753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch   * across all snapshots.
2763bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch   */
2773bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  uint64_t GetId() const;
2783bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
2799dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns node's own size, in bytes. */
2809dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  int GetSelfSize() const;
2819dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2829dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /**
283756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick   * Returns node's retained size, in bytes. That is, self + sizes of
284756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick   * the objects that are reachable only from this object. In other
285756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick   * words, the size of memory that will be reclaimed having this node
286756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick   * collected.
2879dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen   */
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int GetRetainedSize() const;
2899dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2909dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns child nodes count of the node. */
2919dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  int GetChildrenCount() const;
2929dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2939dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Retrieves a child by index. */
2949dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  const HeapGraphEdge* GetChild(int index) const;
2959dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2969dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns retainer nodes count of the node. */
2979dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  int GetRetainersCount() const;
2989dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
2999dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns a retainer by index. */
3009dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  const HeapGraphEdge* GetRetainer(int index) const;
3019dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  /**
3038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang   * Returns a dominator node. This is the node that participates in every
3048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang   * path from the snapshot root to the current node.
3058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang   */
3068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  const HeapGraphNode* GetDominatorNode() const;
30769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
30869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  /**
30969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch   * Finds and returns a value from the heap corresponding to this node,
31069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch   * if the value is still reachable.
31169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch   */
31269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Handle<Value> GetHeapValue() const;
3139dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen};
3149dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3159dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3169dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen/**
3179dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * HeapSnapshots record the state of the JS heap at some moment.
3189dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen */
3199dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenclass V8EXPORT HeapSnapshot {
3209dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen public:
321791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  enum Type {
3223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kFull = 0  // Heap snapshot with all instances and references.
3230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  };
3240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  enum SerializationFormat {
3250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    kJSON = 0  // See format description near 'Serialize' method.
326791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  };
327791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
328791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  /** Returns heap snapshot type. */
329791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  Type GetType() const;
330791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
3319dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns heap snapshot UID (assigned by the profiler.) */
3329dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  unsigned GetUid() const;
3339dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3349dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns heap snapshot title. */
3359dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  Handle<String> GetTitle() const;
3369dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3379dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns the root node of the heap graph. */
3383bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  const HeapGraphNode* GetRoot() const;
3393bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  /** Returns a node by its id. */
341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const HeapGraphNode* GetNodeById(uint64_t id) const;
342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  /** Returns total nodes count in the snapshot. */
3443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int GetNodesCount() const;
3453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  /** Returns a node by index. */
3473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  const HeapGraphNode* GetNode(int index) const;
3483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
349791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  /**
35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Deletes the snapshot and removes it from HeapProfiler's list.
35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * All pointers to nodes, edges and paths previously returned become
35244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * invalid.
353791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block   */
35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Delete();
3550d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
3560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  /**
3570d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * Prepare a serialized representation of the snapshot. The result
3580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * is written into the stream provided in chunks of specified size.
3590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * The total length of the serialized snapshot is unknown in
360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch   * advance, it can be roughly equal to JS heap size (that means,
3610d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * it can be really big - tens of megabytes).
3620d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *
3630d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * For the JSON format, heap contents are represented as an object
3640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * with the following structure:
3650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *
3660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *  {
3670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *    snapshot: {title: "...", uid: nnn},
3680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *    nodes: [
3690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *      meta-info (JSON string),
3700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *      nodes themselves
3710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *    ],
3720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *    strings: [strings]
3730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *  }
3740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   *
3750d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * Outgoing node links are stored after each node. Nodes reference strings
3760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   * and other nodes by their indexes in corresponding arrays.
3770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen   */
3780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  void Serialize(OutputStream* stream, SerializationFormat format) const;
3799dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen};
3809dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
3819dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
38244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RetainedObjectInfo;
38344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3849dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen/**
3859dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen * Interface for controlling heap profiling.
3869dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen */
3879dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenclass V8EXPORT HeapProfiler {
3889dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen public:
38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
39044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Callback function invoked for obtaining RetainedObjectInfo for
39144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * the given JavaScript wrapper object. It is prohibited to enter V8
39244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * while the callback is running: only getters on the handle and
39344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * GetPointerFromInternalField on the objects are allowed.
39444f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
39544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  typedef RetainedObjectInfo* (*WrapperInfoCallback)
39644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      (uint16_t class_id, Handle<Value> wrapper);
39744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3989dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns the number of snapshots taken. */
3999dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  static int GetSnapshotsCount();
4009dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
4019dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns a snapshot by index. */
4029dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  static const HeapSnapshot* GetSnapshot(int index);
4039dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
4049dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  /** Returns a profile by uid. */
4059dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  static const HeapSnapshot* FindSnapshot(unsigned uid);
4069dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
407791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  /**
408791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block   * Takes a heap snapshot and returns it. Title may be an empty string.
409791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block   * See HeapSnapshot::Type for types description.
410791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block   */
411791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  static const HeapSnapshot* TakeSnapshot(
412791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      Handle<String> title,
413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      HeapSnapshot::Type type = HeapSnapshot::kFull,
414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ActivityControl* control = NULL);
41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Deletes all snapshots taken. All previously returned pointers to
41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * snapshots and their contents become invalid after this call.
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DeleteAllSnapshots();
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /** Binds a callback to embedder's class ID. */
42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void DefineWrapperClass(
42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      uint16_t class_id,
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      WrapperInfoCallback callback);
42644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Default value of persistent handle class ID. Must not be used to
42944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * define a class. Can be used to reset a class of a persistent
43044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * handle.
43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const uint16_t kPersistentHandleNoClassId = 0;
4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  /** Returns the number of currently existing persistent handles. */
4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static int GetPersistentHandleCount();
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block/**
44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Interface for providing information about embedder's objects
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block * held by global handles. This information is reported in two ways:
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block *
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block *  1. When calling AddObjectGroup, an embedder may pass
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block *     RetainedObjectInfo instance describing the group.  To collect
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block *     this information while taking a heap snapshot, V8 calls GC
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block *     prologue and epilogue callbacks.
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block *
44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block *  2. When a heap snapshot is collected, V8 additionally
44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block *     requests RetainedObjectInfos for persistent handles that
45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block *     were not previously reported via AddObjectGroup.
45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block *
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block * Thus, if an embedder wants to provide information about native
45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block * objects for heap snapshots, he can do it in a GC prologue
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block * handler, and / or by assigning wrapper class ids in the following way:
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block *
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block *  1. Bind a callback to class id by calling DefineWrapperClass.
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block *  2. Call SetWrapperClassId on certain persistent handles.
45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block *
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block * V8 takes ownership of RetainedObjectInfo instances passed to it and
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block * keeps them alive only during snapshot collection. Afterwards, they
46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block * are freed by calling the Dispose class function.
46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block */
46344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass V8EXPORT RetainedObjectInfo {  // NOLINT
46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /** Called by V8 when it no longer needs an instance. */
46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void Dispose() = 0;
46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /** Returns whether two instances are equivalent. */
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool IsEquivalent(RetainedObjectInfo* other) = 0;
47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
47244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Returns hash value for the instance. Equivalent instances
47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * must have the same hash value.
47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual intptr_t GetHash() = 0;
47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * Returns human-readable label. It must be a null-terminated UTF-8
47944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * encoded string. V8 copies its contents during a call to GetLabel.
48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual const char* GetLabel() = 0;
48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /**
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * Returns human-readable group label. It must be a null-terminated UTF-8
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * encoded string. V8 copies its contents during a call to GetGroupLabel.
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * Heap snapshot generator will collect all the group names, create
4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * top level entries with these names and attach the objects to the
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * corresponding top level group objects. There is a default
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * implementation which is required because embedders don't have their
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   * own implementation yet.
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   */
4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual const char* GetGroupLabel() { return GetLabel(); }
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  /**
49544f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * Returns element count in case if a global handle retains
49644f0eee88ff00398ff7f715fab053374d808c90dSteve Block   * a subgraph by holding one of its nodes.
49744f0eee88ff00398ff7f715fab053374d808c90dSteve Block   */
49844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual intptr_t GetElementCount() { return -1; }
49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /** Returns embedder's object size in bytes. */
50144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual intptr_t GetSizeInBytes() { return -1; }
50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RetainedObjectInfo() {}
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual ~RetainedObjectInfo() {}
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RetainedObjectInfo(const RetainedObjectInfo&);
50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RetainedObjectInfo& operator=(const RetainedObjectInfo&);
5109dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen};
5119dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
5129dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen
5136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}  // namespace v8
5146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
5156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
5166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef V8EXPORT
5176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
5186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
5196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif  // V8_V8_PROFILER_H_
520