| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 | 118 |
| 119 TypeMirror get voidType { | 119 TypeMirror get voidType { |
| 120 if (_voidType == null) { | 120 if (_voidType == null) { |
| 121 _voidType = new _SpecialTypeMirrorImpl('void'); | 121 _voidType = new _SpecialTypeMirrorImpl('void'); |
| 122 } | 122 } |
| 123 return _voidType; | 123 return _voidType; |
| 124 } | 124 } |
| 125 | 125 |
| 126 final Map<String, FunctionTypeMirror> _functionTypes; | 126 final Map<String, FunctionTypeMirror> _functionTypes; |
| 127 FunctionTypeMirror _lookupFunctionTypeMirror( | 127 FunctionTypeMirror _lookupFunctionTypeMirror( |
| 128 reflectee, |
| 128 TypeMirror returnType, | 129 TypeMirror returnType, |
| 129 List<ParameterMirror> parameters) { | 130 List<ParameterMirror> parameters) { |
| 130 var sigString = _makeSignatureString(returnType, parameters); | 131 var sigString = _makeSignatureString(returnType, parameters); |
| 131 var mirror = _functionTypes[sigString]; | 132 var mirror = _functionTypes[sigString]; |
| 132 if (mirror == null) { | 133 if (mirror == null) { |
| 133 mirror = new _LocalFunctionTypeMirrorImpl(null, | 134 mirror = new _LocalFunctionTypeMirrorImpl(reflectee, |
| 134 sigString, | 135 sigString, |
| 135 returnType, | 136 returnType, |
| 136 parameters); | 137 parameters); |
| 137 _functionTypes[sigString] = mirror; | 138 _functionTypes[sigString] = mirror; |
| 138 } | 139 } |
| 139 return mirror; | 140 return mirror; |
| 140 } | 141 } |
| 141 | 142 |
| 142 String toString() => "MirrorSystem for isolate '${isolate.debugName}'"; | 143 String toString() => "MirrorSystem for isolate '${isolate.debugName}'"; |
| 143 } | 144 } |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 } | 390 } |
| 390 | 391 |
| 391 final String libraryUrl; | 392 final String libraryUrl; |
| 392 final Symbol typeName; | 393 final Symbol typeName; |
| 393 } | 394 } |
| 394 | 395 |
| 395 class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl | 396 class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl |
| 396 implements ClassMirror { | 397 implements ClassMirror { |
| 397 _LocalClassMirrorImpl(reflectee, | 398 _LocalClassMirrorImpl(reflectee, |
| 398 String simpleName, | 399 String simpleName, |
| 399 this.isClass, | |
| 400 this._owner, | |
| 401 this._superclass, | |
| 402 this._superinterfaces, | |
| 403 this._defaultFactory, | |
| 404 Map<String, Mirror> typeVariables) | 400 Map<String, Mirror> typeVariables) |
| 405 : this._simpleName = _s(simpleName), | 401 : this._simpleName = _s(simpleName), |
| 406 this.typeVariables = _convertStringToSymbolMap(typeVariables), | 402 this.typeVariables = _convertStringToSymbolMap(typeVariables), |
| 407 super(reflectee); | 403 super(reflectee); |
| 408 | 404 |
| 409 Symbol _simpleName; | 405 Symbol _simpleName; |
| 410 Symbol get simpleName { | 406 Symbol get simpleName { |
| 411 // dynamic, void and the function types have their names set eagerly in the | 407 // dynamic, void and the function types have their names set eagerly in the |
| 412 // constructor. | 408 // constructor. |
| 413 if(_simpleName == null) { | 409 if(_simpleName == null) { |
| 414 _simpleName = _s(_name(_reflectee)); | 410 _simpleName = _s(_name(_reflectee)); |
| 415 } | 411 } |
| 416 return _simpleName; | 412 return _simpleName; |
| 417 } | 413 } |
| 418 | 414 |
| 419 Symbol _qualifiedName = null; | 415 Symbol _qualifiedName = null; |
| 420 Symbol get qualifiedName { | 416 Symbol get qualifiedName { |
| 421 if (_qualifiedName == null) { | 417 if (_qualifiedName == null) { |
| 422 _qualifiedName = _computeQualifiedName(owner, simpleName); | 418 _qualifiedName = _computeQualifiedName(owner, simpleName); |
| 423 } | 419 } |
| 424 return _qualifiedName; | 420 return _qualifiedName; |
| 425 } | 421 } |
| 426 | 422 |
| 427 var _owner; | 423 var _owner; |
| 428 DeclarationMirror get owner { | 424 DeclarationMirror get owner { |
| 429 if (_owner == null) { | 425 if (_owner == null) { |
| 430 _owner = _library(_reflectee); | 426 _owner = _library(_reflectee); |
| 431 } | 427 } |
| 432 if (_owner is! Mirror) { | |
| 433 _owner = _owner.resolve(mirrors); | |
| 434 } | |
| 435 return _owner; | 428 return _owner; |
| 436 } | 429 } |
| 437 | 430 |
| 438 bool get isPrivate => _n(simpleName).startsWith('_'); | 431 bool get isPrivate => _n(simpleName).startsWith('_'); |
| 439 | 432 |
| 440 final bool isTopLevel = true; | 433 final bool isTopLevel = true; |
| 441 | 434 |
| 442 SourceLocation get location { | 435 SourceLocation get location { |
| 443 throw new UnimplementedError( | 436 throw new UnimplementedError( |
| 444 'ClassMirror.location is not implemented'); | 437 'ClassMirror.location is not implemented'); |
| 445 } | 438 } |
| 446 | 439 |
| 447 final bool isClass; | 440 // TODO(rmacnak): Remove these left-overs from the days of separate interfaces |
| 441 // once we send out a breaking change. |
| 442 bool get isClass => true; |
| 443 ClassMirror get defaultFactory => null; |
| 448 | 444 |
| 449 var _superclass; | 445 var _superclass; |
| 450 ClassMirror get superclass { | 446 ClassMirror get superclass { |
| 451 if (_superclass == null) { | 447 if (_superclass == null) { |
| 452 Type supertype = _supertype(_reflectee); | 448 Type supertype = _supertype(_reflectee); |
| 453 if (supertype == null) { | 449 if (supertype == null) { |
| 454 // Object has no superclass. | 450 // Object has no superclass. |
| 455 return null; | 451 return null; |
| 456 } | 452 } |
| 457 _superclass = reflectClass(supertype); | 453 _superclass = reflectClass(supertype); |
| 458 } | 454 } |
| 459 if (_superclass is! Mirror) { | 455 if (_superclass is! Mirror) { |
| 460 _superclass = _superclass.resolve(mirrors); | 456 _superclass = _superclass.resolve(mirrors); |
| 461 } | 457 } |
| 462 return _superclass; | 458 return _superclass; |
| 463 } | 459 } |
| 464 | 460 |
| 465 var _superinterfaces; | 461 var _superinterfaces; |
| 466 List<ClassMirror> get superinterfaces { | 462 List<ClassMirror> get superinterfaces { |
| 467 if (_superinterfaces.length > 0 && | 463 if (_superinterfaces == null) { |
| 468 _superinterfaces[0] is! Mirror) { | 464 _superinterfaces = _interfaces(_reflectee) |
| 469 List<ClassMirror> resolved = new List<ClassMirror>(); | 465 .map((i) => reflectClass(i)).toList(growable:false); |
| 470 for (int i = 0; i < _superinterfaces.length; i++) { | |
| 471 resolved.add(_superinterfaces[i].resolve(mirrors)); | |
| 472 } | |
| 473 _superinterfaces = resolved; | |
| 474 } | 466 } |
| 475 return _superinterfaces; | 467 return _superinterfaces; |
| 476 } | 468 } |
| 477 | 469 |
| 478 var _defaultFactory; | |
| 479 ClassMirror get defaultFactory { | |
| 480 if (_defaultFactory != null && _defaultFactory is! Mirror) { | |
| 481 _defaultFactory = _defaultFactory.resolve(mirrors); | |
| 482 } | |
| 483 return _defaultFactory; | |
| 484 } | |
| 485 | |
| 486 Map<Symbol, Mirror> _members; | 470 Map<Symbol, Mirror> _members; |
| 487 | 471 |
| 488 Map<Symbol, Mirror> get members { | 472 Map<Symbol, Mirror> get members { |
| 489 if (_members == null) { | 473 if (_members == null) { |
| 490 _members = _makeMemberMap(_computeMembers(_reflectee)); | 474 _members = _makeMemberMap(_computeMembers(_reflectee)); |
| 491 } | 475 } |
| 492 return _members; | 476 return _members; |
| 493 } | 477 } |
| 494 | 478 |
| 495 Map<Symbol, MethodMirror> _methods = null; | 479 Map<Symbol, MethodMirror> _methods = null; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 throw new UnimplementedError( | 537 throw new UnimplementedError( |
| 554 'ClassMirror.isOriginalDeclaration is not implemented'); | 538 'ClassMirror.isOriginalDeclaration is not implemented'); |
| 555 } | 539 } |
| 556 | 540 |
| 557 ClassMirror get genericDeclaration { | 541 ClassMirror get genericDeclaration { |
| 558 throw new UnimplementedError( | 542 throw new UnimplementedError( |
| 559 'ClassMirror.originalDeclaration is not implemented'); | 543 'ClassMirror.originalDeclaration is not implemented'); |
| 560 } | 544 } |
| 561 | 545 |
| 562 String toString() { | 546 String toString() { |
| 563 String prettyName = isClass ? 'ClassMirror' : 'TypeMirror'; | 547 return "ClassMirror on '${_n(simpleName)}'"; |
| 564 return "$prettyName on '${_n(simpleName)}'"; | |
| 565 } | 548 } |
| 566 | 549 |
| 567 InstanceMirror newInstance(Symbol constructorName, | 550 InstanceMirror newInstance(Symbol constructorName, |
| 568 List positionalArguments, | 551 List positionalArguments, |
| 569 [Map<Symbol, dynamic> namedArguments]) { | 552 [Map<Symbol, dynamic> namedArguments]) { |
| 570 if (namedArguments != null) { | 553 if (namedArguments != null) { |
| 571 throw new UnimplementedError( | 554 throw new UnimplementedError( |
| 572 'named argument support is not implemented'); | 555 'named argument support is not implemented'); |
| 573 } | 556 } |
| 574 return reflect(_invokeConstructor(_reflectee, | 557 return reflect(_invokeConstructor(_reflectee, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 602 | 585 |
| 603 static _name(reflectee) | 586 static _name(reflectee) |
| 604 native "ClassMirror_name"; | 587 native "ClassMirror_name"; |
| 605 | 588 |
| 606 static _library(reflectee) | 589 static _library(reflectee) |
| 607 native "ClassMirror_library"; | 590 native "ClassMirror_library"; |
| 608 | 591 |
| 609 static _supertype(reflectee) | 592 static _supertype(reflectee) |
| 610 native "ClassMirror_supertype"; | 593 native "ClassMirror_supertype"; |
| 611 | 594 |
| 595 static _interfaces(reflectee) |
| 596 native "ClassMirror_interfaces"; |
| 597 |
| 612 _computeMembers(reflectee) | 598 _computeMembers(reflectee) |
| 613 native "ClassMirror_members"; | 599 native "ClassMirror_members"; |
| 614 | 600 |
| 615 _computeConstructors(reflectee) | 601 _computeConstructors(reflectee) |
| 616 native "ClassMirror_constructors"; | 602 native "ClassMirror_constructors"; |
| 617 | 603 |
| 618 _invoke(reflectee, memberName, positionalArguments) | 604 _invoke(reflectee, memberName, positionalArguments) |
| 619 native 'ClassMirror_invoke'; | 605 native 'ClassMirror_invoke'; |
| 620 | 606 |
| 621 _invokeGetter(reflectee, getterName) | 607 _invokeGetter(reflectee, getterName) |
| 622 native 'ClassMirror_invokeGetter'; | 608 native 'ClassMirror_invokeGetter'; |
| 623 | 609 |
| 624 _invokeSetter(reflectee, setterName, value) | 610 _invokeSetter(reflectee, setterName, value) |
| 625 native 'ClassMirror_invokeSetter'; | 611 native 'ClassMirror_invokeSetter'; |
| 626 | 612 |
| 627 static _invokeConstructor(reflectee, constructorName, positionalArguments) | 613 static _invokeConstructor(reflectee, constructorName, positionalArguments) |
| 628 native 'ClassMirror_invokeConstructor'; | 614 native 'ClassMirror_invokeConstructor'; |
| 629 } | 615 } |
| 630 | 616 |
| 631 class _LazyFunctionTypeMirror { | 617 class _LazyFunctionTypeMirror { |
| 632 _LazyFunctionTypeMirror(this.returnType, this.parameters) {} | 618 _LazyFunctionTypeMirror(this.reflectee, this.returnType, this.parameters) {} |
| 633 | 619 |
| 634 ClassMirror resolve(MirrorSystem mirrors) { | 620 ClassMirror resolve(MirrorSystem mirrors) { |
| 635 return mirrors._lookupFunctionTypeMirror(returnType.resolve(mirrors), | 621 return mirrors._lookupFunctionTypeMirror(reflectee, |
| 622 returnType.resolve(mirrors), |
| 636 parameters); | 623 parameters); |
| 637 } | 624 } |
| 638 | 625 |
| 626 final reflectee; |
| 639 final returnType; | 627 final returnType; |
| 640 final List<ParameterMirror> parameters; | 628 final List<ParameterMirror> parameters; |
| 641 } | 629 } |
| 642 | 630 |
| 643 class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl | 631 class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl |
| 644 implements FunctionTypeMirror { | 632 implements FunctionTypeMirror { |
| 645 _LocalFunctionTypeMirrorImpl(reflectee, | 633 _LocalFunctionTypeMirrorImpl(reflectee, |
| 646 simpleName, | 634 simpleName, |
| 647 this._returnType, | 635 this._returnType, |
| 648 this.parameters) | 636 this.parameters) |
| 649 : super(reflectee, | 637 : super(reflectee, |
| 650 simpleName, | 638 simpleName, |
| 651 true, | |
| 652 null, | |
| 653 new _LazyTypeMirror('dart:core', 'Object'), | |
| 654 [ new _LazyTypeMirror('dart:core', 'Function') ], | |
| 655 null, | |
| 656 const {}); | 639 const {}); |
| 657 | 640 |
| 658 Map<Symbol, Mirror> get members => new Map<Symbol,Mirror>(); | 641 Map<Symbol, Mirror> get members => new Map<Symbol,Mirror>(); |
| 659 Map<Symbol, MethodMirror> get constructors => new Map<Symbol,MethodMirror>(); | 642 Map<Symbol, MethodMirror> get constructors => new Map<Symbol,MethodMirror>(); |
| 660 | 643 |
| 661 var _returnType; | 644 var _returnType; |
| 662 TypeMirror get returnType { | 645 TypeMirror get returnType { |
| 663 if (_returnType is! Mirror) { | 646 if (_returnType is! Mirror) { |
| 664 _returnType = _returnType.resolve(mirrors); | 647 _returnType = _returnType.resolve(mirrors); |
| 665 } | 648 } |
| (...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1233 static Expando<ClassMirror> _classMirrorCache = new Expando("ClassMirror"); | 1216 static Expando<ClassMirror> _classMirrorCache = new Expando("ClassMirror"); |
| 1234 static ClassMirror reflectClass(Type key) { | 1217 static ClassMirror reflectClass(Type key) { |
| 1235 var classMirror = _classMirrorCache[key]; | 1218 var classMirror = _classMirrorCache[key]; |
| 1236 if (classMirror == null) { | 1219 if (classMirror == null) { |
| 1237 classMirror = makeLocalClassMirror(key); | 1220 classMirror = makeLocalClassMirror(key); |
| 1238 _classMirrorCache[key] = classMirror; | 1221 _classMirrorCache[key] = classMirror; |
| 1239 } | 1222 } |
| 1240 return classMirror; | 1223 return classMirror; |
| 1241 } | 1224 } |
| 1242 } | 1225 } |
| OLD | NEW |