| Index: tool/input_sdk/private/debugger.dart
|
| diff --git a/tool/input_sdk/private/debugger.dart b/tool/input_sdk/private/debugger.dart
|
| index 4c29b9e1bd8bd7ec86c03646c9243abfe96dd8e4..ed6450550e965282b8e7d18041a041ba0c8738ae 100644
|
| --- a/tool/input_sdk/private/debugger.dart
|
| +++ b/tool/input_sdk/private/debugger.dart
|
| @@ -126,11 +126,48 @@ class MapEntry {
|
| }
|
|
|
| class IterableSpan {
|
| - IterableSpan({this.start, this.end, this.iterable});
|
| + IterableSpan(this.start, this.end, this.iterable);
|
|
|
| final int start;
|
| final int end;
|
| final Iterable iterable;
|
| + int get length => end - start;
|
| +
|
| + /// Using length - .5, a list of length 10000 results in a
|
| + /// maxPowerOfSubsetSize of 1, so the list will be broken up into 100,
|
| + /// 100-length subsets. A list of length 10001 results in a
|
| + /// maxPowerOfSubsetSize of 2, so the list will be broken up into 1
|
| + /// 10000-length subset and 1 1-length subset.
|
| + int get maxPowerOfSubsetSize =>
|
| + (log(length - .5) / log(_maxSpanLength)).truncate();
|
| + int get subsetSize => pow(_maxSpanLength, maxPowerOfSubsetSize);
|
| +
|
| + Map<int, dynamic> asMap() =>
|
| + iterable.skip(start).take(length).toList().asMap();
|
| +
|
| + List<NameValuePair> children() {
|
| + var ret = <NameValuePair>[];
|
| + if (length <= _maxSpanLength) {
|
| + asMap().forEach((i, element) {
|
| + ret.add(
|
| + new NameValuePair(name: (i + start).toString(), value: element));
|
| + });
|
| + } else {
|
| + for (var i = start; i < end; i += subsetSize) {
|
| + var subSpan = new IterableSpan(i, min(end, subsetSize + i), iterable);
|
| + if (subSpan.length == 1) {
|
| + ret.add(new NameValuePair(
|
| + name: i.toString(), value: iterable.elementAt(i)));
|
| + } else {
|
| + ret.add(new NameValuePair(
|
| + name: '[${i}...${subSpan.end - 1}]',
|
| + value: subSpan,
|
| + hideName: true));
|
| + }
|
| + }
|
| + }
|
| + return ret;
|
| + }
|
| }
|
|
|
| class ClassMetadata {
|
| @@ -218,6 +255,8 @@ class JsonMLFormatter {
|
| // DartFormatter.
|
| DartFormatter _simpleFormatter;
|
|
|
| + bool customFormattersOn = false;
|
| +
|
| JsonMLFormatter(this._simpleFormatter);
|
|
|
| void setMaxSpanLengthForTestingOnly(int spanLength) {
|
| @@ -225,6 +264,7 @@ class JsonMLFormatter {
|
| }
|
|
|
| header(object, config) {
|
| + customFormattersOn = true;
|
| if (config == JsonMLConfig.skipDart || isNativeJavaScriptObject(object)) {
|
| return null;
|
| }
|
| @@ -517,8 +557,7 @@ class IterableFormatter extends ObjectFormatter {
|
| // TODO(jacobr): handle large Iterables better.
|
| // TODO(jacobr): consider only using numeric indices
|
| var ret = new LinkedHashSet<NameValuePair>();
|
| - ret.addAll(childrenHelper(
|
| - new IterableSpan(start: 0, end: object.length, iterable: object)));
|
| + ret.addAll((new IterableSpan(0, object.length, object)).children());
|
| // TODO(jacobr): provide a link to show regular class properties here.
|
| // required for subclasses of iterable, etc.
|
| addMetadataChildren(object, ret);
|
| @@ -625,50 +664,12 @@ class IterableSpanFormatter implements Formatter {
|
| accept(object) => object is IterableSpan;
|
|
|
| String preview(object) {
|
| - IterableSpan entry = object;
|
| return '[${object.start}...${object.end-1}]';
|
| }
|
|
|
| bool hasChildren(object) => true;
|
|
|
| - List<NameValuePair> children(object) => childrenHelper(object);
|
| -}
|
| -
|
| -List<NameValuePair> childrenHelper(IterableSpan span) {
|
| - var length = span.end - span.start;
|
| - var ret = new List<NameValuePair>();
|
| - if (length <= _maxSpanLength) {
|
| - for (var i = span.start; i < span.end; i++) {
|
| - /// TODO(bmilligan): Stop using elementAt if it becomes a performance
|
| - /// bottleneck in the future.
|
| - ret.add(new NameValuePair(
|
| - name: i.toString(), value: span.iterable.elementAt(i)));
|
| - }
|
| - } else {
|
| - /// Using length - .5, a list of length 10000 results in a
|
| - /// maxPowerOfSubsetSize of 1, so the list will be broken up into 100,
|
| - /// 100-length subsets. A list of length 10001 results in a
|
| - /// maxPowerOfSubsetSize of 2, so the list will be broken up into 1
|
| - /// 10000-length subset and 1 1-length subset.
|
| - var maxPowerOfSubsetSize =
|
| - (log(length - .5) / log(_maxSpanLength)).truncate();
|
| - var subsetSize = pow(_maxSpanLength, maxPowerOfSubsetSize);
|
| - for (var i = span.start; i < span.end; i += subsetSize) {
|
| - var endIndex = min(span.end, subsetSize + i);
|
| - if (endIndex - i == 1)
|
| - ret.add(new NameValuePair(
|
| - name: i.toString(), value: span.iterable.elementAt(i)));
|
| - else {
|
| - var entryWrapper =
|
| - new IterableSpan(start: i, end: endIndex, iterable: span.iterable);
|
| - ret.add(new NameValuePair(
|
| - name: '[${i}...${endIndex - 1}]',
|
| - value: entryWrapper,
|
| - hideName: true));
|
| - }
|
| - }
|
| - }
|
| - return ret;
|
| + List<NameValuePair> children(object) => object.children();
|
| }
|
|
|
| /// This entry point is automatically invoked by the code generated by
|
|
|