HeapSnapshotBuilder.h [plain text]
#pragma once
#include <functional>
#include <wtf/Lock.h>
#include <wtf/Vector.h>
#include <wtf/text/UniquedStringImpl.h>
#include <wtf/text/WTFString.h>
namespace JSC {
class HeapProfiler;
class HeapSnapshot;
class JSCell;
struct HeapSnapshotNode {
HeapSnapshotNode(JSCell* cell, unsigned identifier)
: cell(cell)
, identifier(identifier)
{ }
JSCell* cell;
unsigned identifier;
};
enum class EdgeType : uint8_t {
Internal, Property, Index, Variable, };
struct HeapSnapshotEdge {
HeapSnapshotEdge(JSCell* fromCell, JSCell* toCell)
: type(EdgeType::Internal)
{
from.cell = fromCell;
to.cell = toCell;
}
HeapSnapshotEdge(JSCell* fromCell, JSCell* toCell, EdgeType type, UniquedStringImpl* name)
: type(type)
{
ASSERT(type == EdgeType::Property || type == EdgeType::Variable);
from.cell = fromCell;
to.cell = toCell;
u.name = name;
}
HeapSnapshotEdge(JSCell* fromCell, JSCell* toCell, uint32_t index)
: type(EdgeType::Index)
{
from.cell = fromCell;
to.cell = toCell;
u.index = index;
}
union {
JSCell *cell;
unsigned identifier;
} from;
union {
JSCell *cell;
unsigned identifier;
} to;
union {
UniquedStringImpl* name;
uint32_t index;
} u;
EdgeType type;
};
class JS_EXPORT_PRIVATE HeapSnapshotBuilder {
WTF_MAKE_FAST_ALLOCATED;
public:
HeapSnapshotBuilder(HeapProfiler&);
~HeapSnapshotBuilder();
static unsigned nextAvailableObjectIdentifier;
static unsigned getNextObjectIdentifier();
static void resetNextAvailableObjectIdentifier();
void buildSnapshot();
void appendNode(JSCell*);
void appendEdge(JSCell* from, JSCell* to);
void appendPropertyNameEdge(JSCell* from, JSCell* to, UniquedStringImpl* propertyName);
void appendVariableNameEdge(JSCell* from, JSCell* to, UniquedStringImpl* variableName);
void appendIndexEdge(JSCell* from, JSCell* to, uint32_t index);
String json();
String json(std::function<bool (const HeapSnapshotNode&)> allowNodeCallback);
private:
bool hasExistingNodeForCell(JSCell*);
HeapProfiler& m_profiler;
Lock m_buildingNodeMutex;
std::unique_ptr<HeapSnapshot> m_snapshot;
Lock m_buildingEdgeMutex;
Vector<HeapSnapshotEdge> m_edges;
};
}