Index: runtime/observatory/lib/object_graph.dart |
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart |
deleted file mode 100644 |
index ec6cdae5f6fc52b94c9c5518cb82947de6d1d4fb..0000000000000000000000000000000000000000 |
--- a/runtime/observatory/lib/object_graph.dart |
+++ /dev/null |
@@ -1,120 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library object_graph; |
- |
-import 'dart:typed_data'; |
- |
-import 'dominator_tree.dart'; |
- |
-// Port of dart::ReadStream from vm/datastream.h. |
-class ReadStream { |
- int _cur = 0; |
- final ByteData _data; |
- |
- ReadStream(this._data); |
- |
- int get pendingBytes => _data.lengthInBytes - _cur; |
- |
- int readUnsigned() { |
- int result = 0; |
- int shift = 0; |
- while (_data.getUint8(_cur) <= maxUnsignedDataPerByte) { |
- result |= _data.getUint8(_cur) << shift; |
- shift += dataBitsPerByte; |
- ++_cur; |
- } |
- result |= (_data.getUint8(_cur) & byteMask) << shift; |
- ++_cur; |
- return result; |
- } |
- |
- static const int dataBitsPerByte = 7; |
- static const int byteMask = (1 << dataBitsPerByte) - 1; |
- static const int maxUnsignedDataPerByte = byteMask; |
-} |
- |
-class ObjectVertex { |
- // Never null. The isolate root has id 0. |
- final int _id; |
- // null for VM-heap objects. |
- int _shallowSize; |
- int get shallowSize => _shallowSize; |
- int _retainedSize; |
- int get retainedSize => _retainedSize; |
- // null for VM-heap objects. |
- int _classId; |
- int get classId => _classId; |
- final List<ObjectVertex> succ = new List<ObjectVertex>(); |
- ObjectVertex(this._id) : _retainedSize = 0; |
- String toString() => '$_id,$_shallowSize,$succ'; |
-} |
- |
-// See implementation of ObjectGraph::Serialize for format. |
-class ObjectGraph { |
- final Map<int, ObjectVertex> _idToVertex = new Map<int, ObjectVertex>(); |
- |
- ObjectVertex _asVertex(int id) { |
- return _idToVertex.putIfAbsent(id, () => new ObjectVertex(id)); |
- } |
- |
- void _addFrom(ReadStream stream) { |
- ObjectVertex obj = _asVertex(stream.readUnsigned()); |
- obj._shallowSize = stream.readUnsigned(); |
- obj._classId = stream.readUnsigned(); |
- int last = stream.readUnsigned(); |
- while (last != 0) { |
- obj.succ.add(_asVertex(last)); |
- last = stream.readUnsigned(); |
- } |
- } |
- |
- ObjectGraph(ReadStream reader) { |
- while (reader.pendingBytes > 0) { |
- _addFrom(reader); |
- } |
- _computeRetainedSizes(); |
- } |
- |
- Iterable<ObjectVertex> get vertices => _idToVertex.values; |
- |
- ObjectVertex get root => _asVertex(0); |
- |
- void _computeRetainedSizes() { |
- // The retained size for an object is the sum of the shallow sizes of |
- // all its descendants in the dominator tree (including itself). |
- var d = new Dominator(); |
- for (ObjectVertex u in vertices) { |
- if (u.shallowSize != null) { |
- u._retainedSize = u.shallowSize; |
- d.addEdges(u, u.succ.where((ObjectVertex v) => v.shallowSize != null)); |
- } |
- } |
- d.computeDominatorTree(root); |
- // Compute all retained sizes "bottom up", starting from the leaves. |
- // Keep track of number of remaining children of each vertex. |
- var degree = new Map<ObjectVertex, int>(); |
- for (ObjectVertex u in vertices) { |
- var v = d.dominator(u); |
- if (v != null) { |
- degree[v] = 1 + degree.putIfAbsent(v, () => 0); |
- } |
- } |
- var leaves = new List<ObjectVertex>(); |
- for (ObjectVertex u in vertices) { |
- if (!degree.containsKey(u)) { |
- leaves.add(u); |
- } |
- } |
- while (!leaves.isEmpty) { |
- var v = leaves.removeLast(); |
- var u = d.dominator(v); |
- if (u == null) continue; |
- u._retainedSize += v._retainedSize; |
- if (--degree[u] == 0) { |
- leaves.add(u); |
- } |
- } |
- } |
-} |