Index: dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart b/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
index 88e9bbaf26ed332b6b967eabf579690a04b958af..fda0709db1ee6cafdc2bc44eb7073bc6d25f4daf 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart |
@@ -7,7 +7,7 @@ |
import 'dart:_foreign_helper' show JS; |
import 'dart:_collection-dev' as _symbol_dev; |
import 'dart:_js_helper' show createInvocationMirror; |
-import 'dart:_interceptors' show getInterceptor; |
+import 'dart:_interceptors' show Interceptor; |
patch class MirrorSystem { |
patch static String getName(Symbol symbol) => _n(symbol); |
@@ -61,7 +61,9 @@ class _LibraryMirror extends _ObjectMirror implements LibraryMirror { |
var result = new Map<Symbol, ClassMirror>(); |
for (int i = 0; i < _classes.length; i += 2) { |
Symbol symbol = _s(_classes[i]); |
- result[symbol] = _reflectClass(symbol, _classes[i + 1]); |
+ _ClassMirror cls = _reflectClass(symbol, _classes[i + 1]); |
+ result[symbol] = cls; |
+ cls._owner = this; |
} |
return result; |
} |
@@ -205,6 +207,8 @@ class _ClassMirror extends _ObjectMirror implements ClassMirror { |
final Symbol simpleName; |
final _jsConstructor; |
final String _fields; |
+ // Set as side-effect of accessing _LibraryMirror.classes. |
+ _LibraryMirror _owner; |
_ClassMirror(this.simpleName, this._jsConstructor, this._fields); |
@@ -254,6 +258,26 @@ class _ClassMirror extends _ObjectMirror implements ClassMirror { |
constructorName, positionalArguments, namedArguments)); |
} |
+ DeclarationMirror get owner { |
+ if (_owner == null) { |
+ if (_jsConstructor is Interceptor) { |
+ _owner = __reflectClass(Object).owner; |
+ } else { |
+ for (var list in _MirrorSystem.librariesByName.values) { |
+ for (_LibraryMirror library in list) { |
+ // This will set _owner field on all clasess as a side |
+ // effect. This gives us a fast path to reflect on a |
+ // class without parsing reflection data. |
+ library.classes; |
+ } |
+ } |
+ } |
+ if (_owner == null) { |
+ throw new StateError('Class "${_n(simpleName)}" has no owner'); |
+ } |
+ } |
+ return _owner; |
+ } |
String toString() => 'ClassMirror(${_n(simpleName)})'; |
} |