| Index: runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
|
| ===================================================================
|
| --- runtime/bin/vmservice/client/lib/src/elements/heap_map.dart (revision 37317)
|
| +++ runtime/bin/vmservice/client/lib/src/elements/heap_map.dart (working copy)
|
| @@ -61,6 +61,9 @@
|
| static final _freeColor = [255, 255, 255, 255];
|
| static final _pageSeparationColor = [0, 0, 0, 255];
|
| static const _PAGE_SEPARATION_HEIGHT = 4;
|
| + // Many browsers will not display a very tall canvas.
|
| + // TODO(koda): Improve interface for huge heaps.
|
| + static const _MAX_CANVAS_HEIGHT = 6000;
|
|
|
| @observable String status;
|
| @published ServiceMap fragmentation;
|
| @@ -165,7 +168,7 @@
|
| _pageHeight = _PAGE_SEPARATION_HEIGHT +
|
| fragmentation['page_size_bytes'] ~/
|
| fragmentation['unit_size_bytes'] ~/ width;
|
| - var height = _pageHeight * pages.length;
|
| + var height = min(_pageHeight * pages.length, _MAX_CANVAS_HEIGHT);
|
| _fragmentationData =
|
| _fragmentationCanvas.context2D.createImageData(width, height);
|
| _fragmentationCanvas.width = _fragmentationData.width;
|
| @@ -178,10 +181,11 @@
|
| void _renderPages(int startPage) {
|
| var pages = fragmentation['pages'];
|
| status = 'Loaded $startPage of ${pages.length} pages';
|
| - if (startPage >= pages.length) {
|
| + var startY = startPage * _pageHeight;
|
| + var endY = startY + _pageHeight;
|
| + if (startPage >= pages.length || endY > _fragmentationData.height) {
|
| return;
|
| }
|
| - var startY = startPage * _pageHeight;
|
| var pixel = new PixelReference(_fragmentationData, new Point(0, startY));
|
| var objects = pages[startPage]['objects'];
|
| for (var i = 0; i < objects.length; i += 2) {
|
| @@ -193,7 +197,6 @@
|
| pixel = pixel.next();
|
| }
|
| }
|
| - var endY = startY + _pageHeight;
|
| while (pixel.point.y < endY) {
|
| pixel.color = _pageSeparationColor;
|
| pixel = pixel.next();
|
|
|