diff options
Diffstat (limited to 'WebCore/bindings/v8/ScriptHeapSnapshot.cpp')
-rw-r--r-- | WebCore/bindings/v8/ScriptHeapSnapshot.cpp | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/WebCore/bindings/v8/ScriptHeapSnapshot.cpp b/WebCore/bindings/v8/ScriptHeapSnapshot.cpp index c35d508..885d039 100644 --- a/WebCore/bindings/v8/ScriptHeapSnapshot.cpp +++ b/WebCore/bindings/v8/ScriptHeapSnapshot.cpp @@ -33,7 +33,6 @@ #include "InspectorValues.h" #include "V8Binding.h" -#include <v8.h> #include <v8-profiler.h> #include <wtf/PassRefPtr.h> #include <wtf/RefPtr.h> @@ -51,29 +50,50 @@ unsigned int ScriptHeapSnapshot::uid() const return m_snapshot->GetUid(); } -namespace { - -class OutputStreamAdapter : public v8::OutputStream { -public: - OutputStreamAdapter(ScriptHeapSnapshot::OutputStream* output) - : m_output(output) { } - void EndOfStream() { m_output->Close(); } - int GetChunkSize() { return 10240; } - WriteResult WriteAsciiChunk(char* data, int size) - { - m_output->Write(String(data, size)); - return kContinue; +static PassRefPtr<InspectorObject> buildInspectorObjectFor(const v8::HeapGraphNode* root) +{ + v8::HandleScope scope; + RefPtr<InspectorObject> result = InspectorObject::create(); + RefPtr<InspectorObject> lowLevels = InspectorObject::create(); + RefPtr<InspectorObject> entries = InspectorObject::create(); + RefPtr<InspectorObject> children = InspectorObject::create(); + for (int i = 0, count = root->GetChildrenCount(); i < count; ++i) { + const v8::HeapGraphNode* node = root->GetChild(i)->GetToNode(); + if (node->GetType() == v8::HeapGraphNode::kInternal) { + RefPtr<InspectorObject> lowLevel = InspectorObject::create(); + lowLevel->setNumber("count", node->GetInstancesCount()); + lowLevel->setNumber("size", node->GetSelfSize()); + lowLevel->setString("type", toWebCoreString(node->GetName())); + lowLevels->setObject(toWebCoreString(node->GetName()), lowLevel); + } else if (node->GetInstancesCount()) { + RefPtr<InspectorObject> entry = InspectorObject::create(); + entry->setString("constructorName", toWebCoreString(node->GetName())); + entry->setNumber("count", node->GetInstancesCount()); + entry->setNumber("size", node->GetSelfSize()); + entries->setObject(toWebCoreString(node->GetName()), entry); + } else { + RefPtr<InspectorObject> entry = InspectorObject::create(); + entry->setString("constructorName", toWebCoreString(node->GetName())); + for (int j = 0, count = node->GetChildrenCount(); j < count; ++j) { + const v8::HeapGraphEdge* v8Edge = node->GetChild(j); + const v8::HeapGraphNode* v8Child = v8Edge->GetToNode(); + RefPtr<InspectorObject> child = InspectorObject::create(); + child->setString("constructorName", toWebCoreString(v8Child->GetName())); + child->setNumber("count", v8Edge->GetName()->ToInteger()->Value()); + entry->setObject(String::number(reinterpret_cast<unsigned long long>(v8Child)), child); + } + children->setObject(String::number(reinterpret_cast<unsigned long long>(node)), entry); + } } -private: - ScriptHeapSnapshot::OutputStream* m_output; -}; - -} // namespace + result->setObject("lowlevels", lowLevels); + result->setObject("entries", entries); + result->setObject("children", children); + return result.release(); +} -void ScriptHeapSnapshot::writeJSON(ScriptHeapSnapshot::OutputStream* stream) +PassRefPtr<InspectorObject> ScriptHeapSnapshot::buildInspectorObjectForHead() const { - OutputStreamAdapter outputStream(stream); - m_snapshot->Serialize(&outputStream, v8::HeapSnapshot::kJSON); + return buildInspectorObjectFor(m_snapshot->GetRoot()); } } // namespace WebCore |