@@ -93,40 +93,65 @@ Map<String, dynamic> treemapFromJson(Object inputJson,
93
93
collapseSingleChildPathNodes: collapseSingleChildPathNodes);
94
94
}
95
95
96
+ /// Convert the given [ProgramInfo] object into a treemap in either
97
+ /// [TreemapFormat.collapsed] or [TreemapFormat.simplified] format.
98
+ ///
99
+ /// See [treemapFromJson] for the schema of the returned map object.
100
+ Map <String , dynamic > treemapFromInfo (ProgramInfo info,
101
+ {TreemapFormat format = TreemapFormat .collapsed,
102
+ bool collapseSingleChildPathNodes = true }) {
103
+ final root = {'n' : '' , 'children' : {}, 'k' : kindPath, 'maxDepth' : 0 };
104
+ _treemapFromInfo (root, info, format: format);
105
+ return _flatten (root,
106
+ collapseSingleChildPathNodes: collapseSingleChildPathNodes);
107
+ }
108
+
109
+ void _treemapFromInfo (Map <String , dynamic > root, ProgramInfo info,
110
+ {TreemapFormat format = TreemapFormat .simplified}) {
111
+ if (format != TreemapFormat .collapsed && format != TreemapFormat .simplified) {
112
+ throw ArgumentError (
113
+ 'can only build simplified or collapsed formats from the program info' ,
114
+ );
115
+ }
116
+
117
+ int cumulativeSize (ProgramInfoNode node) {
118
+ return (node.size ?? 0 ) +
119
+ node.children.values
120
+ .fold <int >(0 , (sum, child) => sum + cumulativeSize (child));
121
+ }
122
+
123
+ void recurse (ProgramInfoNode node, String path, Map <String , dynamic > root,
124
+ TreemapFormat format) {
125
+ if (node.children.isEmpty ||
126
+ (node.type == NodeType .functionNode &&
127
+ format == TreemapFormat .simplified)) {
128
+ // For simple format we remove information about nested functions from
129
+ // the output.
130
+ _addSymbol (root, path, node.name, cumulativeSize (node));
131
+ return ;
132
+ }
133
+
134
+ path = path != '' ? '$path /${node .name }' : node.name;
135
+ _addSymbol (root, path, '<self>' , node.size);
136
+ for (var child in node.children.values) {
137
+ recurse (child, path, root, format);
138
+ }
139
+ }
140
+
141
+ _addSymbol (root, '' , info.root.name, info.root.size);
142
+ for (var child in info.root.children.values) {
143
+ recurse (child, '' , root, format);
144
+ }
145
+ }
146
+
96
147
void _treemapFromSnapshot (Map <String , dynamic > root, v8_profile.Snapshot snap,
97
148
{TreemapFormat format = TreemapFormat .objectType}) {
98
149
final info = v8_profile.toProgramInfo (snap);
99
150
100
151
// For collapsed and simple formats there is no need to traverse snapshot
101
152
// nodes. Just recurse into [ProgramInfo] structure instead.
102
153
if (format == TreemapFormat .collapsed || format == TreemapFormat .simplified) {
103
- int cumulativeSize (ProgramInfoNode node) {
104
- return (node.size ?? 0 ) +
105
- node.children.values
106
- .fold <int >(0 , (sum, child) => sum + cumulativeSize (child));
107
- }
108
-
109
- void recurse (ProgramInfoNode node, String path) {
110
- if (node.children.isEmpty ||
111
- (node.type == NodeType .functionNode &&
112
- format == TreemapFormat .simplified)) {
113
- // For simple format we remove information about nested functions from
114
- // the output.
115
- _addSymbol (root, path, node.name, cumulativeSize (node));
116
- return ;
117
- }
118
-
119
- path = path != '' ? '$path /${node .name }' : node.name;
120
- _addSymbol (root, path, '<self>' , node.size);
121
- for (var child in node.children.values) {
122
- recurse (child, path);
123
- }
124
- }
125
-
126
- _addSymbol (root, '' , info.root.name, info.root.size);
127
- for (var child in info.root.children.values) {
128
- recurse (child, '' );
129
- }
154
+ _treemapFromInfo (root, info, format: format);
130
155
return ;
131
156
}
132
157
0 commit comments