| Index: runtime/lib/mirrors_impl.dart
|
| diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
|
| index b1206cd8bd7a40871a2cfb9daf8d33b162eaff90..13bb7a992d10f9789422ee65b04f5fb45146d5ed 100644
|
| --- a/runtime/lib/mirrors_impl.dart
|
| +++ b/runtime/lib/mirrors_impl.dart
|
| @@ -4,7 +4,8 @@
|
|
|
| // VM-specific implementation of the dart:mirrors library.
|
|
|
| -import "dart:collection";
|
| +import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
|
| +import "dart:_internal" show LRUMap;
|
|
|
| final emptyList = new UnmodifiableListView([]);
|
| final emptyMap = new UnmodifiableMapView({});
|
| @@ -298,21 +299,15 @@ class _LocalInstanceMirror extends _LocalObjectMirror
|
| return identityHashCode(_reflectee) ^ 0x36363636;
|
| }
|
|
|
| - // TODO(18445): Use an LRU cache.
|
| - static var _getFieldClosures = new HashMap();
|
| - static var _setFieldClosures = new HashMap();
|
| - static var _getFieldCallCounts = new HashMap();
|
| - static var _setFieldCallCounts = new HashMap();
|
| + static var _getFieldClosures = new LRUMap.withShift(7);
|
| + static var _setFieldClosures = new LRUMap.withShift(7);
|
| + static var _getFieldCallCounts = new LRUMap.withShift(8);
|
| + static var _setFieldCallCounts = new LRUMap.withShift(8);
|
| static const _closureThreshold = 20;
|
| - static const _cacheSizeLimit = 255;
|
|
|
| _getFieldSlow(unwrapped) {
|
| // Slow path factored out to give the fast path a better chance at being
|
| // inlined.
|
| - if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
|
| - // Prevent unbounded cache growth.
|
| - _getFieldCallCounts = new HashMap();
|
| - }
|
| var callCount = _getFieldCallCounts[unwrapped];
|
| if (callCount == null) {
|
| callCount = 0;
|
| @@ -331,12 +326,7 @@ class _LocalInstanceMirror extends _LocalObjectMirror
|
| var privateKey = unwrapped.substring(atPosition);
|
| f = _eval('(x) => x.$withoutKey', privateKey);
|
| }
|
| - if (_getFieldClosures.length == _cacheSizeLimit) {
|
| - // Prevent unbounded cache growth.
|
| - _getFieldClosures = new HashMap();
|
| - }
|
| _getFieldClosures[unwrapped] = f;
|
| - _getFieldCallCounts.remove(unwrapped); // We won't look for this again.
|
| return reflect(f(_reflectee));
|
| }
|
| var result = reflect(_invokeGetter(_reflectee, unwrapped));
|
| @@ -355,9 +345,6 @@ class _LocalInstanceMirror extends _LocalObjectMirror
|
| _setFieldSlow(unwrapped, arg) {
|
| // Slow path factored out to give the fast path a better chance at being
|
| // inlined.
|
| - if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
|
| - _setFieldCallCounts = new HashMap();
|
| - }
|
| var callCount = _setFieldCallCounts[unwrapped];
|
| if (callCount == null) {
|
| callCount = 0;
|
| @@ -376,12 +363,7 @@ class _LocalInstanceMirror extends _LocalObjectMirror
|
| var privateKey = unwrapped.substring(atPosition);
|
| f = _eval('(x, v) => x.$withoutKey = v', privateKey);
|
| }
|
| - if (_setFieldClosures.length == _cacheSizeLimit) {
|
| - // Prevent unbounded cache growth.
|
| - _setFieldClosures = new HashMap();
|
| - }
|
| _setFieldClosures[unwrapped] = f;
|
| - _setFieldCallCounts.remove(unwrapped);
|
| return reflect(f(_reflectee, arg));
|
| }
|
| _invokeSetter(_reflectee, unwrapped, arg);
|
|
|