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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 | 42 |
43 V putIfAbsent(K key, V ifAbsent()) { _throw(); } | 43 V putIfAbsent(K key, V ifAbsent()) { _throw(); } |
44 | 44 |
45 void addAll(Map<K, V> other) => _throw(); | 45 void addAll(Map<K, V> other) => _throw(); |
46 | 46 |
47 V remove(K key) { _throw(); } | 47 V remove(K key) { _throw(); } |
48 | 48 |
49 void clear() => _throw(); | 49 void clear() => _throw(); |
50 } | 50 } |
51 | 51 |
52 // These values are allowed to be passed directly over the wire. | 52 class _InternalMirrorError { |
53 bool _isSimpleValue(var value) { | 53 const _InternalError(String this._msg); |
54 return (value == null || value is num || value is String || value is bool); | 54 String toString() => _msg; |
| 55 final String _msg; |
55 } | 56 } |
56 | 57 |
57 Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) { | 58 Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) { |
58 Map new_map = new Map<Symbol, dynamic>(); | 59 Map new_map = new Map<Symbol, dynamic>(); |
59 old_map.forEach((key, value) { | 60 old_map.forEach((key, value) { |
60 if (filter(key, value)) { | 61 if (filter(key, value)) { |
61 new_map[key] = value; | 62 new_map[key] = value; |
62 } | 63 } |
63 }); | 64 }); |
64 return new _UnmodifiableMapView(new_map); | 65 return new _UnmodifiableMapView(new_map); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 return reflect(this._invokeGetter(_reflectee, | 210 return reflect(this._invokeGetter(_reflectee, |
210 _n(memberName))); | 211 _n(memberName))); |
211 } | 212 } |
212 | 213 |
213 InstanceMirror setField(Symbol memberName, Object value) { | 214 InstanceMirror setField(Symbol memberName, Object value) { |
214 this._invokeSetter(_reflectee, | 215 this._invokeSetter(_reflectee, |
215 _n(memberName), | 216 _n(memberName), |
216 value); | 217 value); |
217 return reflect(value); | 218 return reflect(value); |
218 } | 219 } |
219 | |
220 static _validateArgument(int i, Object arg) | |
221 { | |
222 if (arg is Mirror) { | |
223 if (arg is! InstanceMirror) { | |
224 throw new MirrorException( | |
225 'positional argument $i ($arg) was not an InstanceMirror'); | |
226 } | |
227 } else if (!_isSimpleValue(arg)) { | |
228 throw new MirrorException( | |
229 'positional argument $i ($arg) was not a simple value'); | |
230 } | |
231 } | |
232 } | 220 } |
233 | 221 |
234 class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl | 222 class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl |
235 implements InstanceMirror { | 223 implements InstanceMirror { |
236 // TODO(ahe): This is a hack, see delegate below. | 224 // TODO(ahe): This is a hack, see delegate below. |
237 static Function _invokeOnClosure; | 225 static Function _invokeOnClosure; |
238 | 226 |
239 _LocalInstanceMirrorImpl(reflectee) : super(reflectee); | 227 _LocalInstanceMirrorImpl(reflectee) : super(reflectee); |
240 | 228 |
241 ClassMirror _type; | 229 ClassMirror _type; |
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1245 bool get isRegularMethod => !isGetter && !isSetter && !isConstructor; | 1233 bool get isRegularMethod => !isGetter && !isSetter && !isConstructor; |
1246 | 1234 |
1247 Symbol _constructorName = null; | 1235 Symbol _constructorName = null; |
1248 Symbol get constructorName { | 1236 Symbol get constructorName { |
1249 if (_constructorName == null) { | 1237 if (_constructorName == null) { |
1250 if (!isConstructor) { | 1238 if (!isConstructor) { |
1251 _constructorName = _s(''); | 1239 _constructorName = _s(''); |
1252 } else { | 1240 } else { |
1253 var parts = MirrorSystem.getName(simpleName).split('.'); | 1241 var parts = MirrorSystem.getName(simpleName).split('.'); |
1254 if (parts.length > 2) { | 1242 if (parts.length > 2) { |
1255 throw new MirrorException( | 1243 throw new _InternalMirrorError( |
1256 'Internal error in MethodMirror.constructorName: ' | 1244 'Internal error in MethodMirror.constructorName: ' |
1257 'malformed name <$simpleName>'); | 1245 'malformed name <$simpleName>'); |
1258 } else if (parts.length == 2) { | 1246 } else if (parts.length == 2) { |
1259 _constructorName = _s(parts[1]); | 1247 _constructorName = _s(parts[1]); |
1260 } else { | 1248 } else { |
1261 _constructorName = _s(''); | 1249 _constructorName = _s(''); |
1262 } | 1250 } |
1263 } | 1251 } |
1264 } | 1252 } |
1265 return _constructorName; | 1253 return _constructorName; |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1480 if (typeMirror == null) { | 1468 if (typeMirror == null) { |
1481 typeMirror = makeLocalTypeMirror(key); | 1469 typeMirror = makeLocalTypeMirror(key); |
1482 _instanitationCache[key] = typeMirror; | 1470 _instanitationCache[key] = typeMirror; |
1483 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1471 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
1484 _declarationCache[key] = typeMirror; | 1472 _declarationCache[key] = typeMirror; |
1485 } | 1473 } |
1486 } | 1474 } |
1487 return typeMirror; | 1475 return typeMirror; |
1488 } | 1476 } |
1489 } | 1477 } |
OLD | NEW |