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 // These values are allowed to be passed directly over the wire. | 7 // These values are allowed to be passed directly over the wire. |
8 bool _isSimpleValue(var value) { | 8 bool _isSimpleValue(var value) { |
9 return (value == null || value is num || value is String || value is bool); | 9 return (value == null || value is num || value is String || value is bool); |
10 } | 10 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 var result = new Map<Uri, LibraryMirror>(); | 66 var result = new Map<Uri, LibraryMirror>(); |
67 map.forEach((String url, LibraryMirror mirror) { | 67 map.forEach((String url, LibraryMirror mirror) { |
68 result[Uri.parse(url)] = mirror; | 68 result[Uri.parse(url)] = mirror; |
69 }); | 69 }); |
70 return result; | 70 return result; |
71 } | 71 } |
72 | 72 |
73 List<InstanceMirror> _metadata(mirror) | 73 List<InstanceMirror> _metadata(mirror) |
74 native 'Mirrors_metadata'; | 74 native 'Mirrors_metadata'; |
75 | 75 |
| 76 // This will verify the argument types, unwrap them, and ensure we have a fixed |
| 77 // array. |
| 78 List _unwarpAsyncPositionals(wrappedArgs){ |
| 79 List unwrappedArgs = new List(wrappedArgs.length); |
| 80 for(int i = 0; i < wrappedArgs.length; i++){ |
| 81 var wrappedArg = wrappedArgs[i]; |
| 82 if(_isSimpleValue(wrappedArg)) { |
| 83 unwrappedArgs[i] = wrappedArg; |
| 84 } else if(wrappedArg is InstanceMirror) { |
| 85 unwrappedArgs[i] = wrappedArg._reflectee; |
| 86 } else { |
| 87 throw "positional argument $i ($arg) was not a simple value or InstanceMir
ror"; |
| 88 } |
| 89 } |
| 90 return unwrappedArgs; |
| 91 } |
76 | 92 |
77 class _LocalMirrorSystemImpl extends MirrorSystem { | 93 class _LocalMirrorSystemImpl extends MirrorSystem { |
78 // Change parameter back to "this.libraries" when native code is changed. | 94 // Change parameter back to "this.libraries" when native code is changed. |
79 _LocalMirrorSystemImpl(Map<String, LibraryMirror> libraries, this.isolate) | 95 _LocalMirrorSystemImpl(Map<String, LibraryMirror> libraries, this.isolate) |
80 : this.libraries = _createLibrariesMap(libraries), | 96 : this.libraries = _createLibrariesMap(libraries), |
81 _functionTypes = new Map<String, FunctionTypeMirror>(); | 97 _functionTypes = new Map<String, FunctionTypeMirror>(); |
82 | 98 |
83 final Map<Uri, LibraryMirror> libraries; | 99 final Map<Uri, LibraryMirror> libraries; |
84 final IsolateMirror isolate; | 100 final IsolateMirror isolate; |
85 | 101 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 | 174 |
159 // For now, all VMObjects hold a VMReference. We could consider | 175 // For now, all VMObjects hold a VMReference. We could consider |
160 // storing the Object reference itself here if the object is a Dart | 176 // storing the Object reference itself here if the object is a Dart |
161 // language objects (except for objects of type VMReference, of | 177 // language objects (except for objects of type VMReference, of |
162 // course). | 178 // course). |
163 VMReference _reference; | 179 VMReference _reference; |
164 } | 180 } |
165 | 181 |
166 abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl | 182 abstract class _LocalObjectMirrorImpl extends _LocalVMObjectMirrorImpl |
167 implements ObjectMirror { | 183 implements ObjectMirror { |
168 _LocalObjectMirrorImpl(ref) : super(ref) {} | 184 _LocalObjectMirrorImpl(this._reflectee, ref) : super(ref) {} |
| 185 |
| 186 final _reflectee; // May be a MirrorReference or an ordinary object. |
169 | 187 |
170 InstanceMirror invoke(Symbol memberName, | 188 InstanceMirror invoke(Symbol memberName, |
171 List positionalArguments, | 189 List positionalArguments, |
172 [Map<Symbol, dynamic> namedArguments]) { | 190 [Map<Symbol, dynamic> namedArguments]) { |
173 if (namedArguments != null) { | 191 if (namedArguments != null) { |
174 throw new UnimplementedError( | 192 throw new UnimplementedError( |
175 'named argument support is not implemented'); | 193 'named argument support is not implemented'); |
176 } | 194 } |
177 return _invoke(this, _n(memberName), positionalArguments, false); | 195 return reflect(this._invoke(_reflectee, |
| 196 _n(memberName), |
| 197 positionalArguments.toList(growable:false))); |
178 } | 198 } |
179 | 199 |
180 InstanceMirror getField(Symbol fieldName) { | 200 InstanceMirror getField(Symbol memberName) { |
181 return _getField(this, _n(fieldName)); | 201 return reflect(this._invokeGetter(_reflectee, |
| 202 _n(memberName))); |
182 } | 203 } |
183 | 204 |
184 InstanceMirror setField(Symbol fieldName, Object arg) { | 205 InstanceMirror setField(Symbol memberName, Object value) { |
185 return _setField(this, _n(fieldName), arg, false); | 206 return reflect(this._invokeSetter(_reflectee, |
| 207 _n(memberName), |
| 208 value)); |
186 } | 209 } |
187 | 210 |
188 Future<InstanceMirror> invokeAsync(Symbol memberName, | 211 Future<InstanceMirror> invokeAsync(Symbol memberName, |
189 List positionalArguments, | 212 List positionalArguments, |
190 [Map<Symbol, dynamic> namedArguments]) { | 213 [Map<Symbol, dynamic> namedArguments]) { |
191 if (namedArguments != null) { | 214 if (namedArguments != null) { |
192 throw new UnimplementedError( | 215 throw new UnimplementedError( |
193 'named argument support is not implemented'); | 216 'named argument support is not implemented'); |
194 } | 217 } |
195 // Walk the arguments and make sure they are legal. | 218 |
196 for (int i = 0; i < positionalArguments.length; i++) { | |
197 var arg = positionalArguments[i]; | |
198 _validateArgument(i, arg); | |
199 } | |
200 try { | 219 try { |
201 return new Future<InstanceMirror>.value( | 220 var result = this._invoke(_reflectee, |
202 _invoke(this, _n(memberName), positionalArguments, true)); | 221 _n(memberName), |
203 } catch (exception, s) { | 222 _unwarpAsyncPositionals(positionalArguments)); |
204 return new Future<InstanceMirror>.error(exception, s); | 223 return new Future.value(reflect(result)); |
| 224 } on MirroredError catch(e) { |
| 225 return new Future.error(e); |
205 } | 226 } |
206 } | 227 } |
207 | 228 |
208 Future<InstanceMirror> getFieldAsync(Symbol fieldName) { | 229 Future<InstanceMirror> getFieldAsync(Symbol memberName) { |
209 try { | 230 try { |
210 return new Future<InstanceMirror>.value(_getField(this, _n(fieldName))); | 231 var result = this._invokeGetter(_reflectee, |
211 } catch (exception, s) { | 232 _n(memberName)); |
212 return new Future<InstanceMirror>.error(exception, s); | 233 return new Future.value(reflect(result)); |
| 234 } on MirroredError catch(e) { |
| 235 return new Future.error(e); |
213 } | 236 } |
214 } | 237 } |
215 | 238 |
216 Future<InstanceMirror> setFieldAsync(Symbol fieldName, Object arg) { | 239 Future<InstanceMirror> setFieldAsync(Symbol memberName, Object value) { |
217 _validateArgument(0, arg); | 240 try { |
| 241 var unwrappedValue; |
| 242 if(_isSimpleValue(value)) { |
| 243 unwrappedValue = value; |
| 244 } else if(wrappedArg is InstanceMirror) { |
| 245 unwrappedValue = value._reflectee; |
| 246 } else { |
| 247 throw "setter argument ($value) must be a simple value or InstanceMirror
"; |
| 248 } |
218 | 249 |
219 try { | 250 var result = this._invokeSetter(_reflectee, |
220 return new Future<InstanceMirror>.value( | 251 _n(memberName), |
221 _setField(this, _n(fieldName), arg, true)); | 252 unwrappedValue); |
222 } catch (exception, s) { | 253 return new Future.value(reflect(result)); |
223 return new Future<InstanceMirror>.error(exception, s); | 254 } on MirroredError catch(e) { |
| 255 return new Future.error(e); |
224 } | 256 } |
225 } | 257 } |
226 | 258 |
227 static _validateArgument(int i, Object arg) | 259 static _validateArgument(int i, Object arg) |
228 { | 260 { |
229 if (arg is Mirror) { | 261 if (arg is Mirror) { |
230 if (arg is! InstanceMirror) { | 262 if (arg is! InstanceMirror) { |
231 throw new MirrorException( | 263 throw new MirrorException( |
232 'positional argument $i ($arg) was not an InstanceMirror'); | 264 'positional argument $i ($arg) was not an InstanceMirror'); |
233 } | 265 } |
234 } else if (!_isSimpleValue(arg)) { | 266 } else if (!_isSimpleValue(arg)) { |
235 throw new MirrorException( | 267 throw new MirrorException( |
236 'positional argument $i ($arg) was not a simple value'); | 268 'positional argument $i ($arg) was not a simple value'); |
237 } | 269 } |
238 } | 270 } |
239 | |
240 static _invoke(ref, memberName, positionalArguments, async) | |
241 native 'LocalObjectMirrorImpl_invoke'; | |
242 | |
243 static _getField(ref, fieldName) // same for sync and async versions | |
244 native 'LocalObjectMirrorImpl_getField'; | |
245 | |
246 static _setField(ref, fieldName, value, async) | |
247 native 'LocalObjectMirrorImpl_setField'; | |
248 } | 271 } |
249 | 272 |
250 class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl | 273 class _LocalInstanceMirrorImpl extends _LocalObjectMirrorImpl |
251 implements InstanceMirror { | 274 implements InstanceMirror { |
252 // TODO(ahe): This is a hack, see delegate below. | 275 // TODO(ahe): This is a hack, see delegate below. |
253 static Function _invokeOnClosure; | 276 static Function _invokeOnClosure; |
254 | 277 |
255 _LocalInstanceMirrorImpl(ref, | 278 _LocalInstanceMirrorImpl(ref, |
256 this._type, | 279 this._type, |
257 this._reflectee) : super(ref) {} | 280 reflectee) : super(reflectee, ref) {} |
258 | 281 |
259 var _type; | 282 var _type; |
260 ClassMirror get type { | 283 ClassMirror get type { |
261 if (_type is! Mirror) { | 284 if (_type is! Mirror) { |
262 _type = _type.resolve(mirrors); | 285 _type = _type.resolve(mirrors); |
263 } | 286 } |
264 return _type; | 287 return _type; |
265 } | 288 } |
266 | 289 |
267 // LocalInstanceMirrors always reflect local instances | 290 // LocalInstanceMirrors always reflect local instances |
268 bool hasReflectee = true; | 291 bool hasReflectee = true; |
269 | 292 |
270 var _reflectee; | |
271 get reflectee => _reflectee; | 293 get reflectee => _reflectee; |
272 | 294 |
273 delegate(Invocation invocation) { | 295 delegate(Invocation invocation) { |
274 if (_invokeOnClosure == null) { | 296 if (_invokeOnClosure == null) { |
275 // TODO(ahe): This is a total hack. We're using the mirror | 297 // TODO(ahe): This is a total hack. We're using the mirror |
276 // system to access a private field in a different library. For | 298 // system to access a private field in a different library. For |
277 // some reason, that works. On the other hand, calling a | 299 // some reason, that works. On the other hand, calling a |
278 // private method does not work. | 300 // private method does not work. |
| 301 |
279 _LocalInstanceMirrorImpl mirror = | 302 _LocalInstanceMirrorImpl mirror = |
280 _Mirrors.makeLocalInstanceMirror(invocation); | 303 _Mirrors.makeLocalInstanceMirror(invocation); |
281 _invokeOnClosure = | 304 _invokeOnClosure = |
282 _LocalObjectMirrorImpl._getField(mirror.type, '_invokeOnClosure') | 305 reflectClass(invocation.runtimeType).getField(const Symbol('_invokeOnC
losure')).reflectee; |
283 .reflectee; | |
284 } | 306 } |
285 return _invokeOnClosure(reflectee, invocation); | 307 return _invokeOnClosure(reflectee, invocation); |
286 } | 308 } |
287 | 309 |
288 String toString() => 'InstanceMirror on ${Error.safeToString(_reflectee)}'; | 310 String toString() => 'InstanceMirror on ${Error.safeToString(_reflectee)}'; |
| 311 |
| 312 _invoke(reflectee, functionName, positionalArguments) |
| 313 native 'InstanceMirror_invoke'; |
| 314 |
| 315 _invokeGetter(reflectee, getterName) |
| 316 native 'InstanceMirror_invokeGetter'; |
| 317 |
| 318 _invokeSetter(reflectee, setterName, value) |
| 319 native 'InstanceMirror_invokeSetter'; |
289 } | 320 } |
290 | 321 |
291 class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl | 322 class _LocalClosureMirrorImpl extends _LocalInstanceMirrorImpl |
292 implements ClosureMirror { | 323 implements ClosureMirror { |
293 _LocalClosureMirrorImpl(ref, | 324 _LocalClosureMirrorImpl(ref, |
294 type, | 325 type, |
295 reflectee, | 326 reflectee, |
296 this.function) : super(ref, type, reflectee) {} | 327 this.function) : super(ref, type, reflectee) {} |
297 | 328 |
298 final MethodMirror function; | 329 final MethodMirror function; |
299 | 330 |
300 String get source { | 331 String get source { |
301 throw new UnimplementedError( | 332 throw new UnimplementedError( |
302 'ClosureMirror.source is not implemented'); | 333 'ClosureMirror.source is not implemented'); |
303 } | 334 } |
304 | 335 |
305 InstanceMirror apply(List<Object> positionalArguments, | 336 InstanceMirror apply(List<Object> positionalArguments, |
306 [Map<Symbol, Object> namedArguments]) { | 337 [Map<Symbol, Object> namedArguments]) { |
307 if (namedArguments != null) { | 338 if (namedArguments != null) { |
308 throw new UnimplementedError( | 339 throw new UnimplementedError( |
309 'named argument support is not implemented'); | 340 'named argument support is not implemented'); |
310 } | 341 } |
311 return _apply(this, positionalArguments, false); | 342 // It is tempting to implement this in terms of Function.apply, but then |
| 343 // lazy compilation errors would be fatal. |
| 344 return reflect(_apply(_reflectee, |
| 345 positionalArguments.toList(growable:false))); |
312 } | 346 } |
313 | 347 |
314 Future<InstanceMirror> applyAsync(List<Object> positionalArguments, | 348 Future<InstanceMirror> applyAsync(List positionalArguments, |
315 [Map<Symbol, Object> namedArguments]) { | 349 [Map<Symbol, dynamic> namedArguments]) { |
316 if (namedArguments != null) { | 350 if (namedArguments != null) { |
317 throw new UnimplementedError( | 351 throw new UnimplementedError( |
318 'named argument support is not implemented'); | 352 'named argument support is not implemented'); |
319 } | 353 } |
320 // Walk the arguments and make sure they are legal. | 354 |
321 for (int i = 0; i < positionalArguments.length; i++) { | |
322 var arg = positionalArguments[i]; | |
323 _LocalObjectMirrorImpl._validateArgument(i, arg); | |
324 } | |
325 try { | 355 try { |
326 return new Future<InstanceMirror>.value( | 356 var result = _apply(_reflectee, |
327 _apply(this, positionalArguments, true)); | 357 _unwarpAsyncPositionals(positionalArguments)); |
328 } catch (exception) { | 358 return new Future.value(reflect(result)); |
329 return new Future<InstanceMirror>.error(exception); | 359 } on MirroredError catch(e) { |
| 360 return new Future.error(e); |
330 } | 361 } |
331 } | 362 } |
332 | 363 |
| 364 |
| 365 |
333 Future<InstanceMirror> findInContext(Symbol name) { | 366 Future<InstanceMirror> findInContext(Symbol name) { |
334 throw new UnimplementedError( | 367 throw new UnimplementedError( |
335 'ClosureMirror.findInContext() is not implemented'); | 368 'ClosureMirror.findInContext() is not implemented'); |
336 } | 369 } |
337 | 370 |
338 static _apply(ref, positionalArguments, async) | 371 static _apply(reflectee, positionalArguments) |
339 native 'LocalClosureMirrorImpl_apply'; | 372 native 'ClosureMirror_apply'; |
340 | 373 |
341 String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'"; | 374 String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'"; |
342 } | 375 } |
343 | 376 |
344 class _LazyTypeMirror { | 377 class _LazyTypeMirror { |
345 _LazyTypeMirror(String this.libraryUrl, String typeName) | 378 _LazyTypeMirror(String this.libraryUrl, String typeName) |
346 : this.typeName = _s(typeName); | 379 : this.typeName = _s(typeName); |
347 | 380 |
348 TypeMirror resolve(MirrorSystem mirrors) { | 381 TypeMirror resolve(MirrorSystem mirrors) { |
349 if (libraryUrl == null) { | 382 if (libraryUrl == null) { |
(...skipping 13 matching lines...) Expand all Loading... |
363 } | 396 } |
364 return resolved; | 397 return resolved; |
365 } | 398 } |
366 | 399 |
367 final String libraryUrl; | 400 final String libraryUrl; |
368 final Symbol typeName; | 401 final Symbol typeName; |
369 } | 402 } |
370 | 403 |
371 class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl | 404 class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
372 implements ClassMirror { | 405 implements ClassMirror { |
373 _LocalClassMirrorImpl(this._reflectee, | 406 _LocalClassMirrorImpl(reflectee, |
374 ref, | 407 ref, |
375 String simpleName, | 408 String simpleName, |
376 this.isClass, | 409 this.isClass, |
377 this._owner, | 410 this._owner, |
378 this._superclass, | 411 this._superclass, |
379 this._superinterfaces, | 412 this._superinterfaces, |
380 this._defaultFactory, | 413 this._defaultFactory, |
381 Map<String, Mirror> members, | 414 Map<String, Mirror> members, |
382 Map<String, Mirror> constructors, | 415 Map<String, Mirror> constructors, |
383 Map<String, Mirror> typeVariables) | 416 Map<String, Mirror> typeVariables) |
384 : this._simpleName = _s(simpleName), | 417 : this._simpleName = _s(simpleName), |
385 this.members = _convertStringToSymbolMap(members), | 418 this.members = _convertStringToSymbolMap(members), |
386 this.constructors = _convertStringToSymbolMap(constructors), | 419 this.constructors = _convertStringToSymbolMap(constructors), |
387 this.typeVariables = _convertStringToSymbolMap(typeVariables), | 420 this.typeVariables = _convertStringToSymbolMap(typeVariables), |
388 super(ref); | 421 super(reflectee, ref); |
389 | |
390 final _MirrorReference _reflectee; | |
391 | 422 |
392 Symbol _simpleName; | 423 Symbol _simpleName; |
393 Symbol get simpleName { | 424 Symbol get simpleName { |
394 // dynamic, void and the function types have their names set eagerly in the | 425 // dynamic, void and the function types have their names set eagerly in the |
395 // constructor. | 426 // constructor. |
396 if(_simpleName == null) { | 427 if(_simpleName == null) { |
397 _simpleName = _s(_ClassMirror_name(_reflectee)); | 428 _simpleName = _s(_name(_reflectee)); |
398 } | 429 } |
399 return _simpleName; | 430 return _simpleName; |
400 } | 431 } |
401 | 432 |
402 Symbol _qualifiedName = null; | 433 Symbol _qualifiedName = null; |
403 Symbol get qualifiedName { | 434 Symbol get qualifiedName { |
404 if (_qualifiedName == null) { | 435 if (_qualifiedName == null) { |
405 _qualifiedName = _computeQualifiedName(owner, simpleName); | 436 _qualifiedName = _computeQualifiedName(owner, simpleName); |
406 } | 437 } |
407 return _qualifiedName; | 438 return _qualifiedName; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 return "$prettyName on '${_n(simpleName)}'"; | 552 return "$prettyName on '${_n(simpleName)}'"; |
522 } | 553 } |
523 | 554 |
524 InstanceMirror newInstance(Symbol constructorName, | 555 InstanceMirror newInstance(Symbol constructorName, |
525 List positionalArguments, | 556 List positionalArguments, |
526 [Map<Symbol, dynamic> namedArguments]) { | 557 [Map<Symbol, dynamic> namedArguments]) { |
527 if (namedArguments != null) { | 558 if (namedArguments != null) { |
528 throw new UnimplementedError( | 559 throw new UnimplementedError( |
529 'named argument support is not implemented'); | 560 'named argument support is not implemented'); |
530 } | 561 } |
531 return _invokeConstructor(this, | 562 return reflect(_invokeConstructor(_reflectee, |
532 _n(constructorName), | 563 _n(constructorName), |
533 positionalArguments, | 564 positionalArguments.toList(growable:false)
)); |
534 false); | |
535 } | 565 } |
536 | 566 |
537 Future<InstanceMirror> newInstanceAsync(Symbol constructorName, | 567 Future<InstanceMirror> newInstanceAsync(Symbol constructorName, |
538 List positionalArguments, | 568 List positionalArguments, |
539 [Map<Symbol, dynamic> namedArguments])
{ | 569 [Map<Symbol, dynamic> namedArguments])
{ |
540 if (namedArguments != null) { | 570 if (namedArguments != null) { |
541 throw new UnimplementedError( | 571 throw new UnimplementedError( |
542 'named argument support is not implemented'); | 572 'named argument support is not implemented'); |
543 } | 573 } |
544 // Walk the arguments and make sure they are legal. | 574 |
545 for (int i = 0; i < positionalArguments.length; i++) { | |
546 var arg = positionalArguments[i]; | |
547 _LocalObjectMirrorImpl._validateArgument(i, arg); | |
548 } | |
549 try { | 575 try { |
550 return new Future<InstanceMirror>.value( | 576 var result = _invokeConstructor(_reflectee, |
551 _invokeConstructor(this, | 577 _n(constructorName), |
552 _n(constructorName), | 578 _unwarpAsyncPositionals(positionalArgument
s)); |
553 positionalArguments, | 579 return new Future.value(reflect(result)); |
554 true)); | 580 } on MirroredError catch(e) { |
555 } catch (exception) { | 581 return new Future.error(e); |
556 return new Future<InstanceMirror>.error(exception); | |
557 } | 582 } |
558 } | 583 } |
559 | 584 |
560 // get the metadata objects, convert them into InstanceMirrors using | 585 // get the metadata objects, convert them into InstanceMirrors using |
561 // reflect() and then make them into a Dart list | 586 // reflect() and then make them into a Dart list |
562 List<InstanceMirror> get metadata => _metadata(this).map(reflect).toList(); | 587 List<InstanceMirror> get metadata => _metadata(this).map(reflect).toList(); |
563 | 588 |
564 static _invokeConstructor(ref, constructorName, positionalArguments, async) | |
565 native 'LocalClassMirrorImpl_invokeConstructor'; | |
566 | 589 |
567 static String _ClassMirror_name(reflectee) | 590 static _name(reflectee) |
568 native "ClassMirror_name"; | 591 native "ClassMirror_name"; |
| 592 |
| 593 _invoke(reflectee, memberName, positionalArguments) |
| 594 native 'ClassMirror_invoke'; |
| 595 |
| 596 _invokeGetter(reflectee, getterName) |
| 597 native 'ClassMirror_invokeGetter'; |
| 598 |
| 599 _invokeSetter(reflectee, setterName, value) |
| 600 native 'ClassMirror_invokeSetter'; |
| 601 |
| 602 static _invokeConstructor(reflectee, constructorName, positionalArguments) |
| 603 native 'ClassMirror_invokeConstructor'; |
569 } | 604 } |
570 | 605 |
571 class _LazyFunctionTypeMirror { | 606 class _LazyFunctionTypeMirror { |
572 _LazyFunctionTypeMirror(this.returnType, this.parameters) {} | 607 _LazyFunctionTypeMirror(this.returnType, this.parameters) {} |
573 | 608 |
574 ClassMirror resolve(MirrorSystem mirrors) { | 609 ClassMirror resolve(MirrorSystem mirrors) { |
575 return mirrors._lookupFunctionTypeMirror(returnType.resolve(mirrors), | 610 return mirrors._lookupFunctionTypeMirror(returnType.resolve(mirrors), |
576 parameters); | 611 parameters); |
577 } | 612 } |
578 | 613 |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 | 761 |
727 LibraryMirror resolve(MirrorSystem mirrors) { | 762 LibraryMirror resolve(MirrorSystem mirrors) { |
728 return mirrors.libraries[Uri.parse(libraryUrl)]; | 763 return mirrors.libraries[Uri.parse(libraryUrl)]; |
729 } | 764 } |
730 | 765 |
731 final String libraryUrl; | 766 final String libraryUrl; |
732 } | 767 } |
733 | 768 |
734 class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl | 769 class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl |
735 implements LibraryMirror { | 770 implements LibraryMirror { |
736 _LocalLibraryMirrorImpl(ref, | 771 _LocalLibraryMirrorImpl(reflectee, |
| 772 ref, |
737 String simpleName, | 773 String simpleName, |
738 String url, | 774 String url, |
739 Map<String, Mirror> members) | 775 Map<String, Mirror> members) |
740 : this.simpleName = _s(simpleName), | 776 : this.simpleName = _s(simpleName), |
741 this.members = _convertStringToSymbolMap(members), | 777 this.members = _convertStringToSymbolMap(members), |
742 this.uri = Uri.parse(url), | 778 this.uri = Uri.parse(url), |
743 super(ref); | 779 super(reflectee, ref); |
744 | 780 |
745 final Symbol simpleName; | 781 final Symbol simpleName; |
746 | 782 |
747 // The simple name and the qualified name are the same for a library. | 783 // The simple name and the qualified name are the same for a library. |
748 Symbol get qualifiedName => simpleName; | 784 Symbol get qualifiedName => simpleName; |
749 | 785 |
750 // Always null for libraries. | 786 // Always null for libraries. |
751 final DeclarationMirror owner = null; | 787 final DeclarationMirror owner = null; |
752 | 788 |
753 // Always false for libraries. | 789 // Always false for libraries. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 (key, value) => (value is VariableMirror)); | 844 (key, value) => (value is VariableMirror)); |
809 } | 845 } |
810 return _variables; | 846 return _variables; |
811 } | 847 } |
812 | 848 |
813 // get the metadata objects, convert them into InstanceMirrors using | 849 // get the metadata objects, convert them into InstanceMirrors using |
814 // reflect() and then make them into a Dart list | 850 // reflect() and then make them into a Dart list |
815 List<InstanceMirror> get metadata => _metadata(this).map(reflect).toList(); | 851 List<InstanceMirror> get metadata => _metadata(this).map(reflect).toList(); |
816 | 852 |
817 String toString() => "LibraryMirror on '${_n(simpleName)}'"; | 853 String toString() => "LibraryMirror on '${_n(simpleName)}'"; |
| 854 |
| 855 _invoke(reflectee, memberName, positionalArguments) |
| 856 native 'LibraryMirror_invoke'; |
| 857 |
| 858 _invokeGetter(reflectee, getterName) |
| 859 native 'LibraryMirror_invokeGetter'; |
| 860 |
| 861 _invokeSetter(reflectee, setterName, value) |
| 862 native 'LibraryMirror_invokeSetter'; |
818 } | 863 } |
819 | 864 |
820 class _LocalMethodMirrorImpl extends _LocalMirrorImpl | 865 class _LocalMethodMirrorImpl extends _LocalMirrorImpl |
821 implements MethodMirror { | 866 implements MethodMirror { |
822 _LocalMethodMirrorImpl(this._reflectee, | 867 _LocalMethodMirrorImpl(this._reflectee, |
823 this._owner, | 868 this._owner, |
824 this.parameters, | 869 this.parameters, |
825 this._returnType, | 870 this._returnType, |
826 this.isStatic, | 871 this.isStatic, |
827 this.isAbstract, | 872 this.isAbstract, |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 } | 1126 } |
1082 | 1127 |
1083 // Creates a new local ClassMirror. | 1128 // Creates a new local ClassMirror. |
1084 static ClassMirror makeLocalClassMirror(Type key) | 1129 static ClassMirror makeLocalClassMirror(Type key) |
1085 native "Mirrors_makeLocalClassMirror"; | 1130 native "Mirrors_makeLocalClassMirror"; |
1086 | 1131 |
1087 static ClassMirror reflectClass(Type key) { | 1132 static ClassMirror reflectClass(Type key) { |
1088 return makeLocalClassMirror(key); | 1133 return makeLocalClassMirror(key); |
1089 } | 1134 } |
1090 } | 1135 } |
OLD | NEW |