| Index: pkg/analyzer/lib/src/summary/flat_buffers.dart
|
| diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
|
| index 555f1ba62b3979af0596c155a7738a341e2ed13b..9fb2950ca6aaa573f5f1494cdee75080f5b40f72 100644
|
| --- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
|
| +++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
|
| @@ -501,27 +501,28 @@ class StringReader extends Reader<String> {
|
| /**
|
| * An abstract reader for tables.
|
| */
|
| -abstract class TableReader<T extends TableReader<T>> extends Reader<T> {
|
| +abstract class TableReader<T> extends Reader<T> {
|
| const TableReader();
|
|
|
| @override
|
| int get size => 4;
|
|
|
| /**
|
| - * Return the [Reader] for reading fields of the object at [bp].
|
| + * Return the object at [bp].
|
| */
|
| - T createReader(BufferPointer bp);
|
| + T createObject(BufferPointer bp);
|
|
|
| @override
|
| T read(BufferPointer bp) {
|
| bp = bp.derefObject();
|
| - return createReader(bp);
|
| + return createObject(bp);
|
| }
|
| }
|
|
|
| class _FbList<E> extends Object with ListMixin<E> implements List<E> {
|
| final Reader<E> elementReader;
|
| final BufferPointer bp;
|
| + List<E> cache;
|
|
|
| _FbList(this.elementReader, this.bp);
|
|
|
| @@ -534,8 +535,14 @@ class _FbList<E> extends Object with ListMixin<E> implements List<E> {
|
|
|
| @override
|
| E operator [](int i) {
|
| - BufferPointer ref = bp._advance(4 + elementReader.size * i);
|
| - return elementReader.read(ref);
|
| + cache ??= new List<E>(length);
|
| + E item = cache[i];
|
| + if (item == null) {
|
| + BufferPointer ref = bp._advance(4 + elementReader.size * i);
|
| + item = elementReader.read(ref);
|
| + cache[i] = item;
|
| + }
|
| + return item;
|
| }
|
|
|
| @override
|
|
|