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