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

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

Issue 62373008: - Reverting mirror changes. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 1 month 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
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 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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 265
266 int get hashCode { 266 int get hashCode {
267 // Avoid hash collisions with the reflectee. This constant is in Smi range 267 // Avoid hash collisions with the reflectee. This constant is in Smi range
268 // and happens to be the inner padding from RFC 2104. 268 // and happens to be the inner padding from RFC 2104.
269 return identityHashCode(_reflectee) ^ 0x36363636; 269 return identityHashCode(_reflectee) ^ 0x36363636;
270 } 270 }
271 271
272 Function operator [](Symbol selector) { 272 Function operator [](Symbol selector) {
273 bool found = false; 273 bool found = false;
274 for (ClassMirror c = type; c != null; c = c.superclass) { 274 for (ClassMirror c = type; c != null; c = c.superclass) {
275 var target = c._methods[selector]; 275 var target = c.methods[selector];
276 if (target != null && !target.isStatic && target.isRegularMethod) { 276 if (target != null && !target.isStatic && target.isRegularMethod) {
277 found = true; 277 found = true;
278 break; 278 break;
279 } 279 }
280 } 280 }
281 if (!found) { 281 if (!found) {
282 throw new ArgumentError( 282 throw new ArgumentError(
283 "${MirrorSystem.getName(type.simpleName)} has no instance method " 283 "${MirrorSystem.getName(type.simpleName)} has no instance method "
284 "${MirrorSystem.getName(selector)}"); 284 "${MirrorSystem.getName(selector)}");
285 } 285 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 arguments[argumentIndex++] = value; 357 arguments[argumentIndex++] = value;
358 names[nameIndex++] = _n(name); 358 names[nameIndex++] = _n(name);
359 }); 359 });
360 } 360 }
361 361
362 // It is tempting to implement this in terms of Function.apply, but then 362 // It is tempting to implement this in terms of Function.apply, but then
363 // lazy compilation errors would be fatal. 363 // lazy compilation errors would be fatal.
364 return reflect(_apply(arguments, names)); 364 return reflect(_apply(arguments, names));
365 } 365 }
366 366
367 Future<InstanceMirror> applyAsync(List positionalArguments,
368 [Map<Symbol, dynamic> namedArguments]) {
369 return new Future(() {
370 return this.apply(_unwrapAsyncPositionals(positionalArguments),
371 _unwrapAsyncNamed(namedArguments));
372 });
373 }
374
367 InstanceMirror findInContext(Symbol name, {ifAbsent: null}) { 375 InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
368 List<String> parts = _n(name).split(".").toList(growable: false); 376 List<String> parts = _n(name).split(".").toList(growable: false);
369 if (parts.length > 3) { 377 if (parts.length > 3) {
370 throw new ArgumentError("Invalid symbol: ${name}"); 378 throw new ArgumentError("Invalid symbol: ${name}");
371 } 379 }
372 List tuple = _computeFindInContext(_reflectee, parts); 380 List tuple = _computeFindInContext(_reflectee, parts);
373 if (tuple.length == 0) { 381 if (tuple.length == 0) {
374 throw new UnsupportedError( 382 throw new UnsupportedError(
375 "ClosureMirror.findInContext not yet supported"); 383 "ClosureMirror.findInContext not yet supported");
376 } 384 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 // The reflectee is not a mixin application. 520 // The reflectee is not a mixin application.
513 _mixin = this; 521 _mixin = this;
514 } else { 522 } else {
515 _mixin = reflectType(mixinType); 523 _mixin = reflectType(mixinType);
516 } 524 }
517 } 525 }
518 } 526 }
519 return _mixin; 527 return _mixin;
520 } 528 }
521 529
522 Map<Symbol, DeclarationMirror> _cachedDeclarations; 530 Map<Symbol, DeclarationMirror> _declarations;
523 Map<Symbol, DeclarationMirror> get declarations { 531 Map<Symbol, DeclarationMirror> get declarations {
524 if (_cachedDeclarations != null) return _cachedDeclarations; 532 if (_declarations != null) return _declarations;
525 var decls = new Map<Symbol, DeclarationMirror>(); 533 var decls = new Map<Symbol, DeclarationMirror>();
526 decls.addAll(_members); 534 decls.addAll(members);
527 decls.addAll(_constructors); 535 decls.addAll(constructors);
528 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); 536 typeVariables.forEach((tv) => decls[tv.simpleName] = tv);
529 return _cachedDeclarations = 537 return _declarations =
530 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls); 538 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls);
531 } 539 }
532 540
533 Map<Symbol, Mirror> _cachedMembers; 541 Map<Symbol, Mirror> _members;
534 Map<Symbol, Mirror> get _members { 542 Map<Symbol, Mirror> get members {
535 if (_cachedMembers == null) { 543 if (_members == null) {
536 var whoseMembers = _isMixinTypedef ? _trueSuperclass : this; 544 var whoseMembers = _isMixinTypedef ? _trueSuperclass : this;
537 _cachedMembers = _makeMemberMap(mixin._computeMembers(whoseMembers._reflec tee)); 545 _members = _makeMemberMap(mixin._computeMembers(whoseMembers._reflectee));
538 } 546 }
539 return _cachedMembers; 547 return _members;
540 } 548 }
541 549
542 Map<Symbol, MethodMirror> _cachedConstructors; 550 Map<Symbol, MethodMirror> _methods;
543 Map<Symbol, MethodMirror> get _constructors { 551 Map<Symbol, MethodMirror> get methods {
544 if (_cachedConstructors == null) { 552 if (_methods == null) {
553 _methods = _filterMap(
554 members,
555 (key, value) => (value is MethodMirror && value.isRegularMethod));
556 }
557 return _methods;
558 }
559
560 Map<Symbol, MethodMirror> _getters;
561 Map<Symbol, MethodMirror> get getters {
562 if (_getters == null) {
563 _getters = _filterMap(
564 members,
565 (key, value) => (value is MethodMirror && value.isGetter));
566 }
567 return _getters;
568 }
569
570 Map<Symbol, MethodMirror> _setters;
571 Map<Symbol, MethodMirror> get setters {
572 if (_setters == null) {
573 _setters = _filterMap(
574 members,
575 (key, value) => (value is MethodMirror && value.isSetter));
576 }
577 return _setters;
578 }
579
580 Map<Symbol, VariableMirror> _variables;
581 Map<Symbol, VariableMirror> get variables {
582 if (_variables == null) {
583 _variables = _filterMap(
584 members,
585 (key, value) => (value is VariableMirror));
586 }
587 return _variables;
588 }
589
590 Map<Symbol, MethodMirror> _constructors;
591 Map<Symbol, MethodMirror> get constructors {
592 if (_constructors == null) {
545 var constructorsList = _computeConstructors(_reflectee); 593 var constructorsList = _computeConstructors(_reflectee);
546 var stringName = _n(simpleName); 594 var stringName = _n(simpleName);
547 constructorsList.forEach((c) => c._patchConstructorName(stringName)); 595 constructorsList.forEach((c) => c._patchConstructorName(stringName));
548 _cachedConstructors = _makeMemberMap(constructorsList); 596 _constructors = _makeMemberMap(constructorsList);
549 } 597 }
550 return _cachedConstructors; 598 return _constructors;
551 }
552
553 get _methods {
554 var result = new Map();
555 declarations.forEach((k, v) {
556 if (v is MethodMirror && !v.isConstructor) result[k] = v;
557 });
558 return result;
559 } 599 }
560 600
561 bool get _isAnonymousMixinApplication { 601 bool get _isAnonymousMixinApplication {
562 if (_isMixinTypedef) return false; // Named mixin application. 602 if (_isMixinTypedef) return false; // Named mixin application.
563 if (mixin == this) return false; // Not a mixin application. 603 if (mixin == this) return false; // Not a mixin application.
564 return true; 604 return true;
565 } 605 }
566 606
567 List<TypeVariableMirror> _typeVariables; 607 List<TypeVariableMirror> _typeVariables = null;
568 List<TypeVariableMirror> get typeVariables { 608 List<TypeVariableMirror> get typeVariables {
569 if (_typeVariables == null) { 609 if (_typeVariables == null) {
570 if (_isAnonymousMixinApplication) return _typeVariables = emptyList; 610 if (_isAnonymousMixinApplication) return _typeVariables = emptyList;
571 _typeVariables = new List<TypeVariableMirror>(); 611 _typeVariables = new List<TypeVariableMirror>();
572 612
573 List params = _ClassMirror_type_variables(_reflectee); 613 List params = _ClassMirror_type_variables(_reflectee);
574 ClassMirror owner = originalDeclaration; 614 ClassMirror owner = originalDeclaration;
575 var mirror; 615 var mirror;
576 for (var i = 0; i < params.length; i += 2) { 616 for (var i = 0; i < params.length; i += 2) {
577 mirror = new _LocalTypeVariableMirrorImpl( 617 mirror = new _LocalTypeVariableMirrorImpl(
578 params[i + 1], params[i], owner); 618 params[i + 1], params[i], owner);
579 _typeVariables.add(mirror); 619 _typeVariables.add(mirror);
580 } 620 }
581 _typeVariables = new UnmodifiableListView(_typeVariables); 621 _typeVariables = new UnmodifiableListView(_typeVariables);
582 } 622 }
583 return _typeVariables; 623 return _typeVariables;
584 } 624 }
585 625
586 List<TypeMirror> _typeArguments; 626 List<TypeMirror> _typeArguments = null;
587 List<TypeMirror> get typeArguments { 627 List<TypeMirror> get typeArguments {
588 if(_typeArguments == null) { 628 if(_typeArguments == null) {
589 if(_isGenericDeclaration || _isAnonymousMixinApplication) { 629 if(_isGenericDeclaration || _isAnonymousMixinApplication) {
590 _typeArguments = emptyList; 630 _typeArguments = emptyList;
591 } else { 631 } else {
592 _typeArguments = 632 _typeArguments =
593 new UnmodifiableListView(_computeTypeArguments(_reflectedType)); 633 new UnmodifiableListView(_computeTypeArguments(_reflectedType));
594 } 634 }
595 } 635 }
596 return _typeArguments; 636 return _typeArguments;
597 } 637 }
598 638
599 bool get isOriginalDeclaration => !_isGeneric || _isGenericDeclaration; 639 bool get isOriginalDeclaration => !_isGeneric || _isGenericDeclaration;
600 640
601 ClassMirror get originalDeclaration { 641 ClassMirror get originalDeclaration {
602 if (isOriginalDeclaration) { 642 if (isOriginalDeclaration) {
603 return this; 643 return this;
604 } else { 644 } else {
605 return reflectClass(_reflectedType); 645 return reflectClass(_reflectedType);
606 } 646 }
607 } 647 }
608 648
609 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'"; 649 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'";
610 650
611 Function operator [](Symbol selector) { 651 Function operator [](Symbol selector) {
612 var target = _methods[selector]; 652 var target = methods[selector];
613 if (target == null || !target.isStatic || !target.isRegularMethod) { 653 if (target == null || !target.isStatic || !target.isRegularMethod) {
614 throw new ArgumentError( 654 throw new ArgumentError(
615 "${MirrorSystem.getName(simpleName)} has no static method " 655 "${MirrorSystem.getName(simpleName)} has no static method "
616 "${MirrorSystem.getName(selector)}"); 656 "${MirrorSystem.getName(selector)}");
617 } 657 }
618 return new _InvocationTrampoline(this, selector); 658 return new _InvocationTrampoline(this, selector);
619 } 659 }
620 660
621 InstanceMirror newInstance(Symbol constructorName, 661 InstanceMirror newInstance(Symbol constructorName,
622 List positionalArguments, 662 List positionalArguments,
(...skipping 15 matching lines...) Expand all
638 }); 678 });
639 } 679 }
640 680
641 return reflect(_invokeConstructor(_reflectee, 681 return reflect(_invokeConstructor(_reflectee,
642 _reflectedType, 682 _reflectedType,
643 _n(constructorName), 683 _n(constructorName),
644 arguments, 684 arguments,
645 names)); 685 names));
646 } 686 }
647 687
688 Future<InstanceMirror> newInstanceAsync(Symbol constructorName,
689 List positionalArguments,
690 [Map<Symbol, dynamic> namedArguments]) {
691 return new Future(() {
692 return this.newInstance(constructorName,
693 _unwrapAsyncPositionals(positionalArguments),
694 _unwrapAsyncNamed(namedArguments));
695 });
696 }
697
648 List<InstanceMirror> get metadata { 698 List<InstanceMirror> get metadata {
649 // Get the metadata objects, convert them into InstanceMirrors using 699 // Get the metadata objects, convert them into InstanceMirrors using
650 // reflect() and then make them into a Dart list. 700 // reflect() and then make them into a Dart list.
651 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); 701 return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
652 } 702 }
653 703
654 bool operator ==(other) { 704 bool operator ==(other) {
655 return this.runtimeType == other.runtimeType && 705 return this.runtimeType == other.runtimeType &&
656 this._reflectee == other._reflectee && 706 this._reflectee == other._reflectee &&
657 this._reflectedType == other._reflectedType && 707 this._reflectedType == other._reflectedType &&
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 1049
1000 // Always false for libraries. 1050 // Always false for libraries.
1001 final bool isTopLevel = false; 1051 final bool isTopLevel = false;
1002 1052
1003 SourceLocation get location { 1053 SourceLocation get location {
1004 throw new UnimplementedError('LibraryMirror.location is not implemented'); 1054 throw new UnimplementedError('LibraryMirror.location is not implemented');
1005 } 1055 }
1006 1056
1007 final Uri uri; 1057 final Uri uri;
1008 1058
1009 Map<Symbol, DeclarationMirror> _cachedDeclarations; 1059 Map<Symbol, DeclarationMirror> _declarations;
1010 Map<Symbol, DeclarationMirror> get declarations { 1060 Map<Symbol, DeclarationMirror> get declarations {
1011 if (_cachedDeclarations != null) return _cachedDeclarations; 1061 if (_declarations != null) return _declarations;
1012 return _cachedDeclarations = 1062 return _declarations =
1013 new _UnmodifiableMapView<Symbol, DeclarationMirror>( 1063 new _UnmodifiableMapView<Symbol, DeclarationMirror>(members);
1014 _makeMemberMap(_computeMembers(_reflectee)));
1015 } 1064 }
1016 1065
1017 get _functions { 1066 Map<Symbol, Mirror> _members;
1018 var result = new Map(); 1067 Map<Symbol, Mirror> get members {
1019 declarations.forEach((k, v) { 1068 if (_members == null) {
1020 if (v is MethodMirror) result[k] = v; 1069 _members = _makeMemberMap(_computeMembers(_reflectee));
1021 }); 1070 }
1022 return result; 1071 return _members;
1072 }
1073
1074 Map<Symbol, ClassMirror> _types;
1075 Map<Symbol, TypeMirror> get types {
1076 if (_types == null) {
1077 _types = _filterMap(members, (key, value) => (value is TypeMirror));
1078 }
1079 return _types;
1080 }
1081
1082 Map<Symbol, ClassMirror> _classes;
1083 Map<Symbol, ClassMirror> get classes {
1084 if (_classes == null) {
1085 _classes = _filterMap(members, (key, value) => (value is ClassMirror));
1086 }
1087 return _classes;
1088 }
1089
1090 Map<Symbol, MethodMirror> _functions;
1091 Map<Symbol, MethodMirror> get functions {
1092 if (_functions == null) {
1093 _functions = _filterMap(members, (key, value) => (value is MethodMirror));
1094 }
1095 return _functions;
1096 }
1097
1098 Map<Symbol, MethodMirror> _getters;
1099 Map<Symbol, MethodMirror> get getters {
1100 if (_getters == null) {
1101 _getters = _filterMap(functions, (key, value) => (value.isGetter));
1102 }
1103 return _getters;
1104 }
1105
1106 Map<Symbol, MethodMirror> _setters;
1107 Map<Symbol, MethodMirror> get setters {
1108 if (_setters == null) {
1109 _setters = _filterMap(functions, (key, value) => (value.isSetter));
1110 }
1111 return _setters;
1112 }
1113
1114 Map<Symbol, VariableMirror> _variables;
1115 Map<Symbol, VariableMirror> get variables {
1116 if (_variables == null) {
1117 _variables = _filterMap(members,
1118 (key, value) => (value is VariableMirror));
1119 }
1120 return _variables;
1023 } 1121 }
1024 1122
1025 List<InstanceMirror> get metadata { 1123 List<InstanceMirror> get metadata {
1026 // Get the metadata objects, convert them into InstanceMirrors using 1124 // Get the metadata objects, convert them into InstanceMirrors using
1027 // reflect() and then make them into a Dart list. 1125 // reflect() and then make them into a Dart list.
1028 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); 1126 return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
1029 } 1127 }
1030 1128
1031 bool operator ==(other) { 1129 bool operator ==(other) {
1032 return this.runtimeType == other.runtimeType && 1130 return this.runtimeType == other.runtimeType &&
1033 this._reflectee == other._reflectee; 1131 this._reflectee == other._reflectee;
1034 } 1132 }
1035 1133
1036 int get hashCode => simpleName.hashCode; 1134 int get hashCode => simpleName.hashCode;
1037 1135
1038 String toString() => "LibraryMirror on '${_n(simpleName)}'"; 1136 String toString() => "LibraryMirror on '${_n(simpleName)}'";
1039 1137
1040 Function operator [](Symbol selector) { 1138 Function operator [](Symbol selector) {
1041 var target = _functions[selector]; 1139 var target = functions[selector];
1042 if (target == null || !target.isRegularMethod) { 1140 if (target == null || !target.isRegularMethod) {
1043 throw new ArgumentError( 1141 throw new ArgumentError(
1044 "${MirrorSystem.getName(simpleName)} has no top-level method " 1142 "${MirrorSystem.getName(simpleName)} has no top-level method "
1045 "${MirrorSystem.getName(selector)}"); 1143 "${MirrorSystem.getName(selector)}");
1046 } 1144 }
1047 return new _InvocationTrampoline(this, selector); 1145 return new _InvocationTrampoline(this, selector);
1048 } 1146 }
1049 1147
1050 _invoke(reflectee, memberName, arguments, argumentNames) 1148 _invoke(reflectee, memberName, arguments, argumentNames)
1051 native 'LibraryMirror_invoke'; 1149 native 'LibraryMirror_invoke';
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 if (typeMirror == null) { 1468 if (typeMirror == null) {
1371 typeMirror = makeLocalTypeMirror(key); 1469 typeMirror = makeLocalTypeMirror(key);
1372 _instanitationCache[key] = typeMirror; 1470 _instanitationCache[key] = typeMirror;
1373 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { 1471 if (typeMirror is ClassMirror && !typeMirror._isGeneric) {
1374 _declarationCache[key] = typeMirror; 1472 _declarationCache[key] = typeMirror;
1375 } 1473 }
1376 } 1474 }
1377 return typeMirror; 1475 return typeMirror;
1378 } 1476 }
1379 } 1477 }
OLDNEW
« no previous file with comments | « pkg/unittest/lib/mirror_matchers.dart ('k') | runtime/tests/vm/dart/mirrored_compilation_error_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698