Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3068)

Unified Diff: pkg/analyzer/lib/src/summary/flat_buffers.dart

Issue 1579663002: Cache values of fields and lists in summary implementations. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/format.dart » ('j') | pkg/analyzer/lib/src/summary/resynthesize.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698