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

Unified Diff: runtime/lib/mirrors_impl.dart

Issue 1095903002: Deal with deferred loading in the VM mirrors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 8 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 | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('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 c2476371f57ce4b4ea78f1f093097569c9a32e47..36bf895d00e30915e4e6cfe0975c91facff1db8b 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -5,7 +5,9 @@
// VM-specific implementation of the dart:mirrors library.
import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+import "dart:async" show Future;
+var dirty = false;
final emptyList = new UnmodifiableListView([]);
final emptyMap = new UnmodifiableMapView({});
@@ -218,30 +220,28 @@ class _AccessorCache {
}
}
-
class _LocalMirrorSystem extends MirrorSystem {
- final Map<Uri, LibraryMirror> libraries;
- final IsolateMirror isolate;
-
- _LocalMirrorSystem(List<LibraryMirror> libraries, this.isolate)
- : this.libraries = new Map<Uri, LibraryMirror>.fromIterable(
- libraries, key: (e) => e.uri);
+ final TypeMirror dynamicType = new _SpecialTypeMirror('dynamic');
+ final TypeMirror voidType = new _SpecialTypeMirror('void');
- TypeMirror _dynamicType = null;
- TypeMirror get dynamicType {
- if (_dynamicType == null) {
- _dynamicType = new _SpecialTypeMirror('dynamic');
+ var _libraries;
+ Map<Uri, LibraryMirror> get libraries {
+ if ((_libraries == null) || dirty) {
+ _libraries = new Map<Uri, LibraryMirror>.fromIterable(
+ _computeLibraries(), key: (e) => e.uri);
}
- return _dynamicType;
+ return _libraries;
}
+ static _computeLibraries() native "MirrorSystem_libraries";
- TypeMirror _voidType = null;
- TypeMirror get voidType {
- if (_voidType == null) {
- _voidType = new _SpecialTypeMirror('void');
+ var _isolate;
+ IsolateMirror get isolate {
+ if (_isolate == null) {
+ _isolate = _computeIsolate();
}
- return _voidType;
+ return _isolate;
}
+ static _computeIsolate() native "MirrorSystem_isolate";
String toString() => "MirrorSystem for isolate '${isolate.debugName}'";
}
@@ -1295,7 +1295,7 @@ class _LocalLibraryMirror extends _LocalObjectMirror implements LibraryMirror {
class _LocalLibraryDependencyMirror
extends _LocalMirror implements LibraryDependencyMirror {
final LibraryMirror sourceLibrary;
- final LibraryMirror targetLibrary;
+ var _targetMirrorOrPrefix;
final List<CombinatorMirror> combinators;
final Symbol prefix;
final bool isImport;
@@ -1303,7 +1303,7 @@ class _LocalLibraryDependencyMirror
final List<InstanceMirror> metadata;
_LocalLibraryDependencyMirror(this.sourceLibrary,
- this.targetLibrary,
+ this._targetMirrorOrPrefix,
this.combinators,
prefixString,
this.isImport,
@@ -1313,6 +1313,29 @@ class _LocalLibraryDependencyMirror
metadata = new UnmodifiableListView(unwrappedMetadata.map(reflect));
bool get isExport => !isImport;
+
+ LibraryMirror get targetLibrary {
+ if (_targetMirrorOrPrefix is _LocalLibraryMirror) {
+ return _targetMirrorOrPrefix;
+ }
+ var mirrorOrNull = _tryUpgradePrefix(_targetMirrorOrPrefix);
+ if (mirrorOrNull != null) {
+ _targetMirrorOrPrefix = mirrorOrNull;
+ }
+ return mirrorOrNull;
+ }
+
+ Future<LibraryMirror> loadLibrary() {
+ if (_targetMirrorOrPrefix is _LocalLibraryMirror) {
+ return new Future.value(_targetMirrorOrPrefix);
+ }
+ var savedPrefix = _targetMirrorOrPrefix;
+ return savedPrefix.loadLibrary().then((_) {
+ return _tryUpgradePrefix(savedPrefix);
+ });
+ }
+
+ static _tryUpgradePrefix(libraryPrefix) native "LibraryMirror_fromPrefix";
}
class _LocalCombinatorMirror extends _LocalMirror implements CombinatorMirror {
@@ -1581,8 +1604,6 @@ class _SpecialTypeMirror extends _LocalMirror
Symbol get qualifiedName => simpleName;
- // TODO(11955): Remove once dynamicType and voidType are canonical objects in
- // the object store.
bool operator ==(other) {
if (other is! _SpecialTypeMirror) {
return false;
@@ -1604,17 +1625,8 @@ class _SpecialTypeMirror extends _LocalMirror
}
class _Mirrors {
- static MirrorSystem _currentMirrorSystem = null;
-
- // Creates a new local MirrorSystem.
- static MirrorSystem makeLocalMirrorSystem()
- native 'Mirrors_makeLocalMirrorSystem';
-
- // The MirrorSystem for the current isolate.
+ static MirrorSystem _currentMirrorSystem = new _LocalMirrorSystem();
static MirrorSystem currentMirrorSystem() {
- if (_currentMirrorSystem == null) {
- _currentMirrorSystem = makeLocalMirrorSystem();
- }
return _currentMirrorSystem;
}
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698