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); |