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

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
Index: runtime/lib/mirrors_impl.dart
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index e3f87bac601879b3c0b7766bb715ad79eb80289b..e99b23f4e947c440a46980c13b964f474221bbcb 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({});
@@ -224,30 +226,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}'";
}
@@ -1305,7 +1305,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;
@@ -1313,7 +1313,7 @@ class _LocalLibraryDependencyMirror
final List<InstanceMirror> metadata;
_LocalLibraryDependencyMirror(this.sourceLibrary,
- this.targetLibrary,
+ this._targetMirrorOrPrefix,
this.combinators,
prefixString,
this.isImport,
@@ -1323,6 +1323,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 {
@@ -1593,8 +1616,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;
@@ -1616,17 +1637,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;
}

Powered by Google App Engine
This is Rietveld 408576698