| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 // VM-specific implementation of the dart:mirrors library. | 5 // VM-specific implementation of the dart:mirrors library. |
| 6 | 6 |
| 7 import "dart:collection"; | 7 import "dart:collection"; |
| 8 | 8 |
| 9 final emptyList = new UnmodifiableListView([]); | 9 final emptyList = new UnmodifiableListView([]); |
| 10 final emptyMap = new _UnmodifiableMapView({}); | 10 final emptyMap = new _UnmodifiableMapView({}); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 final String debugName; | 148 final String debugName; |
| 149 final LibraryMirror rootLibrary; | 149 final LibraryMirror rootLibrary; |
| 150 | 150 |
| 151 _LocalIsolateMirror(this.debugName, this.rootLibrary); | 151 _LocalIsolateMirror(this.debugName, this.rootLibrary); |
| 152 | 152 |
| 153 bool get isCurrent => true; | 153 bool get isCurrent => true; |
| 154 | 154 |
| 155 String toString() => "IsolateMirror on '$debugName'"; | 155 String toString() => "IsolateMirror on '$debugName'"; |
| 156 } | 156 } |
| 157 | 157 |
| 158 class _InvocationTrampoline implements Function { | |
| 159 final ObjectMirror _receiver; | |
| 160 final Symbol _selector; | |
| 161 _InvocationTrampoline(this._receiver, this._selector); | |
| 162 noSuchMethod(Invocation msg) { | |
| 163 if (msg.memberName != #call) return super.noSuchMethod(msg); | |
| 164 return _receiver.invoke(_selector, | |
| 165 msg.positionalArguments, | |
| 166 msg.namedArguments); | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 class _SyntheticAccessor implements MethodMirror { | 158 class _SyntheticAccessor implements MethodMirror { |
| 171 final DeclarationMirror owner; | 159 final DeclarationMirror owner; |
| 172 final Symbol simpleName; | 160 final Symbol simpleName; |
| 173 final bool isGetter; | 161 final bool isGetter; |
| 174 final bool isStatic; | 162 final bool isStatic; |
| 175 final bool isTopLevel; | 163 final bool isTopLevel; |
| 176 final _target; | 164 final _target; |
| 177 | 165 |
| 178 _SyntheticAccessor(this.owner, | 166 _SyntheticAccessor(this.owner, |
| 179 this.simpleName, | 167 this.simpleName, |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 return other is _LocalInstanceMirror && | 302 return other is _LocalInstanceMirror && |
| 315 identical(_reflectee, other._reflectee); | 303 identical(_reflectee, other._reflectee); |
| 316 } | 304 } |
| 317 | 305 |
| 318 int get hashCode { | 306 int get hashCode { |
| 319 // Avoid hash collisions with the reflectee. This constant is in Smi range | 307 // Avoid hash collisions with the reflectee. This constant is in Smi range |
| 320 // and happens to be the inner padding from RFC 2104. | 308 // and happens to be the inner padding from RFC 2104. |
| 321 return identityHashCode(_reflectee) ^ 0x36363636; | 309 return identityHashCode(_reflectee) ^ 0x36363636; |
| 322 } | 310 } |
| 323 | 311 |
| 324 Function operator [](Symbol selector) { | |
| 325 bool found = false; | |
| 326 for (ClassMirror c = type; c != null; c = c.superclass) { | |
| 327 var target = c._methods[selector]; | |
| 328 if (target != null && !target.isStatic && target.isRegularMethod) { | |
| 329 found = true; | |
| 330 break; | |
| 331 } | |
| 332 } | |
| 333 if (!found) { | |
| 334 throw new ArgumentError( | |
| 335 "${MirrorSystem.getName(type.simpleName)} has no instance method " | |
| 336 "${MirrorSystem.getName(selector)}"); | |
| 337 } | |
| 338 return new _InvocationTrampoline(this, selector); | |
| 339 } | |
| 340 | |
| 341 // TODO(16539): Make these weak or soft. | 312 // TODO(16539): Make these weak or soft. |
| 342 static var _getFieldClosures = new HashMap(); | 313 static var _getFieldClosures = new HashMap(); |
| 343 static var _setFieldClosures = new HashMap(); | 314 static var _setFieldClosures = new HashMap(); |
| 344 static var _getFieldCallCounts = new HashMap(); | 315 static var _getFieldCallCounts = new HashMap(); |
| 345 static var _setFieldCallCounts = new HashMap(); | 316 static var _setFieldCallCounts = new HashMap(); |
| 346 static const _closureThreshold = 20; | 317 static const _closureThreshold = 20; |
| 347 | 318 |
| 348 _getFieldSlow(unwrapped) { | 319 _getFieldSlow(unwrapped) { |
| 349 // Slow path factored out to give the fast path a better chance at being | 320 // Slow path factored out to give the fast path a better chance at being |
| 350 // inlined. | 321 // inlined. |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 ClassMirror get originalDeclaration { | 778 ClassMirror get originalDeclaration { |
| 808 if (isOriginalDeclaration) { | 779 if (isOriginalDeclaration) { |
| 809 return this; | 780 return this; |
| 810 } else { | 781 } else { |
| 811 return reflectClass(_reflectedType); | 782 return reflectClass(_reflectedType); |
| 812 } | 783 } |
| 813 } | 784 } |
| 814 | 785 |
| 815 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'"; | 786 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'"; |
| 816 | 787 |
| 817 Function operator [](Symbol selector) { | |
| 818 var target = _methods[selector]; | |
| 819 if (target == null || !target.isStatic || !target.isRegularMethod) { | |
| 820 throw new ArgumentError( | |
| 821 "${MirrorSystem.getName(simpleName)} has no static method " | |
| 822 "${MirrorSystem.getName(selector)}"); | |
| 823 } | |
| 824 return new _InvocationTrampoline(this, selector); | |
| 825 } | |
| 826 | |
| 827 InstanceMirror newInstance(Symbol constructorName, | 788 InstanceMirror newInstance(Symbol constructorName, |
| 828 List positionalArguments, | 789 List positionalArguments, |
| 829 [Map<Symbol, dynamic> namedArguments]) { | 790 [Map<Symbol, dynamic> namedArguments]) { |
| 830 // Native code will add the 1 or 2 implicit arguments depending on whether | 791 // Native code will add the 1 or 2 implicit arguments depending on whether |
| 831 // we end up invoking a factory or constructor respectively. | 792 // we end up invoking a factory or constructor respectively. |
| 832 int numPositionalArguments = positionalArguments.length; | 793 int numPositionalArguments = positionalArguments.length; |
| 833 int numNamedArguments = namedArguments != null ? namedArguments.length : 0; | 794 int numNamedArguments = namedArguments != null ? namedArguments.length : 0; |
| 834 int numArguments = numPositionalArguments + numNamedArguments; | 795 int numArguments = numPositionalArguments + numNamedArguments; |
| 835 List arguments = new List(numArguments); | 796 List arguments = new List(numArguments); |
| 836 arguments.setRange(0, numPositionalArguments, positionalArguments); | 797 arguments.setRange(0, numPositionalArguments, positionalArguments); |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 } | 1211 } |
| 1251 | 1212 |
| 1252 Map<Symbol, Mirror> _cachedMembers; | 1213 Map<Symbol, Mirror> _cachedMembers; |
| 1253 Map<Symbol, Mirror> get _members { | 1214 Map<Symbol, Mirror> get _members { |
| 1254 if (_cachedMembers == null) { | 1215 if (_cachedMembers == null) { |
| 1255 _cachedMembers = _makeMemberMap(_computeMembers(_reflectee)); | 1216 _cachedMembers = _makeMemberMap(_computeMembers(_reflectee)); |
| 1256 } | 1217 } |
| 1257 return _cachedMembers; | 1218 return _cachedMembers; |
| 1258 } | 1219 } |
| 1259 | 1220 |
| 1260 Map<Symbol, MethodMirror> _cachedFunctions; | |
| 1261 Map<Symbol, MethodMirror> get _functions { | |
| 1262 if (_cachedFunctions == null) { | |
| 1263 _cachedFunctions = _filterMap(_members, (key, value) => (value is MethodMi
rror)); | |
| 1264 } | |
| 1265 return _cachedFunctions; | |
| 1266 } | |
| 1267 | |
| 1268 List<InstanceMirror> get metadata { | 1221 List<InstanceMirror> get metadata { |
| 1269 // Get the metadata objects, convert them into InstanceMirrors using | 1222 // Get the metadata objects, convert them into InstanceMirrors using |
| 1270 // reflect() and then make them into a Dart list. | 1223 // reflect() and then make them into a Dart list. |
| 1271 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); | 1224 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); |
| 1272 } | 1225 } |
| 1273 | 1226 |
| 1274 bool operator ==(other) { | 1227 bool operator ==(other) { |
| 1275 return this.runtimeType == other.runtimeType && | 1228 return this.runtimeType == other.runtimeType && |
| 1276 this._reflectee == other._reflectee; | 1229 this._reflectee == other._reflectee; |
| 1277 } | 1230 } |
| 1278 | 1231 |
| 1279 int get hashCode => simpleName.hashCode; | 1232 int get hashCode => simpleName.hashCode; |
| 1280 | 1233 |
| 1281 String toString() => "LibraryMirror on '${_n(simpleName)}'"; | 1234 String toString() => "LibraryMirror on '${_n(simpleName)}'"; |
| 1282 | 1235 |
| 1283 Function operator [](Symbol selector) { | |
| 1284 var target = _functions[selector]; | |
| 1285 if (target == null || !target.isRegularMethod) { | |
| 1286 throw new ArgumentError( | |
| 1287 "${MirrorSystem.getName(simpleName)} has no top-level method " | |
| 1288 "${MirrorSystem.getName(selector)}"); | |
| 1289 } | |
| 1290 return new _InvocationTrampoline(this, selector); | |
| 1291 } | |
| 1292 | |
| 1293 var _cachedLibraryDependencies; | 1236 var _cachedLibraryDependencies; |
| 1294 get libraryDependencies { | 1237 get libraryDependencies { |
| 1295 if (_cachedLibraryDependencies == null) { | 1238 if (_cachedLibraryDependencies == null) { |
| 1296 _cachedLibraryDependencies = _libraryDependencies(_reflectee); | 1239 _cachedLibraryDependencies = _libraryDependencies(_reflectee); |
| 1297 } | 1240 } |
| 1298 return _cachedLibraryDependencies; | 1241 return _cachedLibraryDependencies; |
| 1299 } | 1242 } |
| 1300 | 1243 |
| 1301 _libraryDependencies(reflectee) | 1244 _libraryDependencies(reflectee) |
| 1302 native 'LibraryMirror_libraryDependencies'; | 1245 native 'LibraryMirror_libraryDependencies'; |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 if (typeMirror == null) { | 1630 if (typeMirror == null) { |
| 1688 typeMirror = makeLocalTypeMirror(key); | 1631 typeMirror = makeLocalTypeMirror(key); |
| 1689 _instanitationCache[key] = typeMirror; | 1632 _instanitationCache[key] = typeMirror; |
| 1690 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1633 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
| 1691 _declarationCache[key] = typeMirror; | 1634 _declarationCache[key] = typeMirror; |
| 1692 } | 1635 } |
| 1693 } | 1636 } |
| 1694 return typeMirror; | 1637 return typeMirror; |
| 1695 } | 1638 } |
| 1696 } | 1639 } |
| OLD | NEW |