Diff
Modified: trunk/Source/WebCore/ChangeLog (143217 => 143218)
--- trunk/Source/WebCore/ChangeLog 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/ChangeLog 2013-02-18 15:46:06 UTC (rev 143218)
@@ -1,3 +1,32 @@
+2013-02-18 Ilya Tikhonovsky <[email protected]>
+
+ Web Inspector: Native Memory Instrumentation: Generate meta information for HeapSnapshot parser.
+ https://bugs.webkit.org/show_bug.cgi?id=110104
+
+ Reviewed by Yury Semikhatsky.
+
+ The format of Native heap snapshot is slightly different so it should provide its own meta information.
+
+
+ * inspector/HeapGraphSerializer.cpp:
+ (WebCore::HeapGraphSerializer::HeapGraphSerializer):
+ (WebCore::HeapGraphSerializer::finish):
+ (WebCore::HeapGraphSerializer::reportMemoryUsage):
+ (WebCore::HeapGraphSerializer::registerTypeString):
+ (WebCore):
+ * inspector/HeapGraphSerializer.h:
+ (HeapGraphSerializer):
+ * inspector/Inspector.json:
+ * inspector/InspectorMemoryAgent.cpp:
+ (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
+ (WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):
+ * inspector/InspectorMemoryAgent.h:
+ (InspectorMemoryAgent):
+ * inspector/front-end/HeapSnapshot.js:
+ (WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
+ * inspector/front-end/NativeHeapSnapshot.js:
+ (WebInspector.NativeHeapSnapshot):
+
2013-02-18 Carlos Garcia Campos <[email protected]>
[GTK] Force single header includes in GObject DOM bindings
Modified: trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp (143217 => 143218)
--- trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp 2013-02-18 15:46:06 UTC (rev 143218)
@@ -50,6 +50,7 @@
, m_nodeEdgesCount(0)
, m_nodes(Nodes::create())
, m_baseToRealNodeIdMap(BaseToRealNodeIdMap::create())
+ , m_typeStrings(InspectorObject::create())
, m_leafCount(0)
{
ASSERT(m_client);
@@ -57,10 +58,12 @@
memset(m_edgeTypes, 0, sizeof(m_edgeTypes));
- m_edgeTypes[WTF::PointerMember] = addString("weak");
- m_edgeTypes[WTF::OwnPtrMember] = addString("ownRef");
- m_edgeTypes[WTF::RefPtrMember] = addString("countRef");
+ m_edgeTypes[WTF::PointerMember] = registerTypeString("weak");
+ m_edgeTypes[WTF::OwnPtrMember] = m_edgeTypes[WTF::RefPtrMember] = registerTypeString("property");
+ // FIXME: It is used as a magic constant for 'object' node type.
+ registerTypeString("object");
+
m_unknownClassNameId = addString("unknown");
}
@@ -155,21 +158,55 @@
m_baseToRealNodeIdMap->addItem(toNodeId(real));
}
-void HeapGraphSerializer::finish()
+PassRefPtr<InspectorObject> HeapGraphSerializer::finish()
{
addRootNode();
pushUpdate();
+ String metaString =
+ "{"
+ "\"node_fields\":["
+ "\"type\","
+ "\"name\","
+ "\"id\","
+ "\"self_size\","
+ "\"edge_count\""
+ "],"
+ "\"node_types\":["
+ "[]," // FIXME: It is a fallback for Heap Snapshot parser. In case of Native Heap Snapshot it is a plain string id.
+ "\"string\","
+ "\"number\","
+ "\"number\","
+ "\"number\""
+ "],"
+ "\"edge_fields\":["
+ "\"type\","
+ "\"name_or_index\","
+ "\"to_node\""
+ "],"
+ "\"edge_types\":["
+ "[],"
+ "\"string_or_number\","
+ "\"node\""
+ "]"
+ "}";
+
+ RefPtr<InspectorValue> metaValue = InspectorValue::parseJSON(metaString);
+ RefPtr<InspectorObject> meta;
+ metaValue->asObject(&meta);
+ ASSERT(meta);
+ meta->setObject("type_strings", m_typeStrings);
+ return meta.release();
}
void HeapGraphSerializer::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
{
MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Inspector);
- info.addMember(m_stringToIndex, "stringToIndex");
- info.addMember(m_strings, "strings");
- info.addMember(m_edges, "edges");
- info.addMember(m_nodes, "nodes");
- info.addMember(m_baseToRealNodeIdMap, "baseToRealNodeIdMap");
- info.addMember(m_roots, "roots");
+ info.ignoreMember(m_stringToIndex);
+ info.ignoreMember(m_strings);
+ info.ignoreMember(m_edges);
+ info.ignoreMember(m_nodes);
+ info.ignoreMember(m_baseToRealNodeIdMap);
+ info.ignoreMember(m_roots);
}
int HeapGraphSerializer::addString(const String& string)
@@ -182,6 +219,13 @@
return result.iterator->value;
}
+int HeapGraphSerializer::registerTypeString(const String& string)
+{
+ int stringId = addString(string);
+ m_typeStrings->setNumber(string, stringId);
+ return stringId;
+}
+
int HeapGraphSerializer::toNodeId(const void* to)
{
if (!to)
Modified: trunk/Source/WebCore/inspector/HeapGraphSerializer.h (143217 => 143218)
--- trunk/Source/WebCore/inspector/HeapGraphSerializer.h 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/HeapGraphSerializer.h 2013-02-18 15:46:06 UTC (rev 143218)
@@ -60,7 +60,7 @@
void reportLeaf(const WTF::MemoryObjectInfo&, const char*);
void reportBaseAddress(const void*, const void*);
- void finish();
+ PassRefPtr<InspectorObject> finish();
void reportMemoryUsage(MemoryObjectInfo*) const;
@@ -72,6 +72,7 @@
int addString(const String&);
void addRootNode();
+ int registerTypeString(const String&);
void reportEdgeImpl(const int toNodeId, const char* name, int memberType);
int reportNodeImpl(const WTF::MemoryObjectInfo&, int edgesCount);
@@ -100,6 +101,7 @@
Address2NodeId m_address2NodeIdMap;
Vector<const void*> m_roots;
+ RefPtr<InspectorObject> m_typeStrings;
size_t m_edgeTypes[WTF::LastMemberTypeEntry];
int m_unknownClassNameId;
Modified: trunk/Source/WebCore/inspector/Inspector.json (143217 => 143218)
--- trunk/Source/WebCore/inspector/Inspector.json 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/Inspector.json 2013-02-18 15:46:06 UTC (rev 143218)
@@ -77,7 +77,8 @@
{ "name": "reportGraph", "type": "boolean", "optional": true, "description": "Whether native memory graph should be reported in addition to aggregated statistics." }
],
"returns": [
- { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"}
+ { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"},
+ { "name": "graphMetaInformation", "type": "object", "optional": true, "description": "An object describing structures of nodes and edges in the graph."}
]
}
],
Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp (143217 => 143218)
--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp 2013-02-18 15:46:06 UTC (rev 143218)
@@ -307,10 +307,10 @@
getProcessMemoryDistributionImpl(false, memoryInfo);
}
-void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory)
+void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory, RefPtr<InspectorObject>& graphMetaInformation)
{
TypeNameToSizeMap memoryInfo;
- getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
+ graphMetaInformation = getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
MemoryUsageStatsGenerator statsGenerator;
RefPtr<InspectorMemoryBlocks> children = InspectorMemoryBlocks::create();
@@ -348,8 +348,9 @@
}
-void InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
+PassRefPtr<InspectorObject> InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
{
+ RefPtr<InspectorObject> meta;
OwnPtr<HeapGraphSerializer> graphSerializer;
OwnPtr<FrontendWrapper> frontendWrapper;
@@ -374,7 +375,7 @@
memoryInstrumentation.addRootObject(memoryInstrumentationClient);
if (graphSerializer) {
memoryInstrumentation.addRootObject(graphSerializer.get());
- graphSerializer->finish();
+ meta = graphSerializer->finish();
graphSerializer.release(); // Release it earlier than frontendWrapper
frontendWrapper.release();
}
@@ -384,6 +385,7 @@
*memoryInfo = memoryInstrumentationClient.sizesMap();
addPlatformComponentsInfo(memoryInfo);
addMemoryInstrumentationDebugData(&memoryInstrumentationClient, memoryInfo);
+ return meta.release();
}
InspectorMemoryAgent::InspectorMemoryAgent(InstrumentingAgents* instrumentingAgents, InspectorClient* client, InspectorCompositeState* state, Page* page)
Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.h (143217 => 143218)
--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.h 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.h 2013-02-18 15:46:06 UTC (rev 143218)
@@ -60,7 +60,7 @@
virtual ~InspectorMemoryAgent();
virtual void getDOMCounters(ErrorString*, int* documents, int* nodes, int* jsEventListeners);
- virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& processMemory);
+ virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& out_processMemory, RefPtr<InspectorObject>& graphMetaInformation);
virtual void reportMemoryUsage(MemoryObjectInfo*) const;
@@ -72,7 +72,7 @@
private:
InspectorMemoryAgent(InstrumentingAgents*, InspectorClient*, InspectorCompositeState*, Page*);
- void getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
+ PassRefPtr<InspectorObject> getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
InspectorClient* m_inspectorClient;
Page* m_page;
Modified: trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js (143217 => 143218)
--- trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js 2013-02-18 15:46:06 UTC (rev 143218)
@@ -1026,8 +1026,21 @@
}
}
- if (postOrderIndex !== nodeCount)
+ if (postOrderIndex !== nodeCount) {
+ var dumpNode = this.rootNode();
+ for (var i = 0; i < nodeCount; ++i) {
+ if (painted[i] !== black) {
+ dumpNode.nodeIndex = i * nodeFieldCount;
+ console.log(JSON.stringify(dumpNode.serialize()));
+ var retainers = dumpNode.retainers();
+ while (retainers) {
+ console.log("edgeName: " + retainers.item().name() + " nodeClassName: " + retainers.item().node().className());
+ retainers = retainers.item().node().retainers();
+ }
+ }
+ }
throw new Error("Postordering failed. " + (nodeCount - postOrderIndex) + " hanging nodes");
+ }
return {postOrderIndex2NodeOrdinal: postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};
},
Modified: trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js (143217 => 143218)
--- trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js 2013-02-18 15:46:06 UTC (rev 143218)
@@ -35,7 +35,9 @@
WebInspector.NativeHeapSnapshot = function(profile)
{
WebInspector.HeapSnapshot.call(this, profile);
- this._nodeObjectType = 3;
+ this._nodeObjectType = this._metaNode.type_strings["object"];
+ this._edgeWeakType = this._metaNode.type_strings["weak"];
+ this._edgeElementType = this._metaNode.type_strings["property"];
}
WebInspector.NativeHeapSnapshot.prototype = {
Modified: trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js (143217 => 143218)
--- trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js 2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js 2013-02-18 15:46:06 UTC (rev 143218)
@@ -267,62 +267,16 @@
* @param {?string} error
* @param {?MemoryAgent.MemoryBlock} memoryBlock
*/
- function didReceiveMemorySnapshot(error, memoryBlock)
+ function didReceiveMemorySnapshot(error, memoryBlock, graphMetaInformation)
{
this.isTemporary = false;
this.sidebarElement.subtitle = Number.bytesToString(/** @type{number} */(memoryBlock.size));
- var meta = {
- "node_fields": [
- "type",
- "name",
- "id",
- "self_size",
- "edge_count"
- ],
- "node_types": [
- [
- "hidden",
- "array",
- "string",
- "object",
- "code",
- "closure",
- "regexp",
- "number",
- "native",
- "synthetic"
- ],
- "string",
- "number",
- "number",
- "number",
- ],
- "edge_fields": [
- "type",
- "name_or_index",
- "to_node"
- ],
- "edge_types": [
- [
- "context",
- "element",
- "property",
- "internal",
- "hidden",
- "shortcut",
- "weak"
- ],
- "string_or_number",
- "node"
- ]
- };
+ var edgeFieldCount = graphMetaInformation.edge_fields.length;
+ var nodeFieldCount = graphMetaInformation.node_fields.length;
+ var nodeIdFieldOffset = graphMetaInformation.node_fields.indexOf("id");
+ var toNodeIdFieldOffset = graphMetaInformation.edge_fields.indexOf("to_node");
- var edgeFieldCount = meta.edge_fields.length;
- var nodeFieldCount = meta.node_fields.length;
- var nodeIdFieldOffset = meta.node_fields.indexOf("id");
- var toNodeIdFieldOffset = meta.edge_fields.indexOf("to_node");
-
var baseToRealNodeIdMap = {};
for (var i = 0; i < this._baseToRealNodeId.length; i += 2)
baseToRealNodeIdMap[this._baseToRealNodeId[i]] = this._baseToRealNodeId[i + 1];
@@ -341,7 +295,7 @@
var heapSnapshot = {
"snapshot": {
- "meta": meta,
+ "meta": graphMetaInformation,
node_count: this._nodes.length / nodeFieldCount,
edge_count: this._edges.length / edgeFieldCount,
root_index: this._nodes.length - nodeFieldCount