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

Unified Diff: runtime/lib/mirrors_impl.dart

Issue 268783006: Implement an LRU cache in dart:_internal and use it for the getter/setter caches in the VM's mirror… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 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
« no previous file with comments | « no previous file | sdk/lib/internal/internal.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « no previous file | sdk/lib/internal/internal.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698