Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: runtime/lib/mirrors_impl.dart

Issue 21010005: Ensure FunctionTypeMirrors have a proper reflectee and implement ClassMirror.superinterfaces with i… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « runtime/lib/mirrors.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698