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

Unified Diff: runtime/lib/mirrors_impl.dart

Issue 375043003: Revert r37059 and dependent r37589. This effectively reduced the size of the getter and setter cach… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 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 13bb7a992d10f9789422ee65b04f5fb45146d5ed..b1206cd8bd7a40871a2cfb9daf8d33b162eaff90 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,8 +4,7 @@
// VM-specific implementation of the dart:mirrors library.
-import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
-import "dart:_internal" show LRUMap;
+import "dart:collection";
final emptyList = new UnmodifiableListView([]);
final emptyMap = new UnmodifiableMapView({});
@@ -299,15 +298,21 @@ class _LocalInstanceMirror extends _LocalObjectMirror
return identityHashCode(_reflectee) ^ 0x36363636;
}
- 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);
+ // 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 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;
@@ -326,7 +331,12 @@ 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));
@@ -345,6 +355,9 @@ 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;
@@ -363,7 +376,12 @@ 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