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

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

Issue 63063002: Remove implementations of mirror methods not in the API from the VM. Update tests. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: tabs 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
375 InstanceMirror findInContext(Symbol name, {ifAbsent: null}) { 367 InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
376 List<String> parts = _n(name).split(".").toList(growable: false); 368 List<String> parts = _n(name).split(".").toList(growable: false);
377 if (parts.length > 3) { 369 if (parts.length > 3) {
378 throw new ArgumentError("Invalid symbol: ${name}"); 370 throw new ArgumentError("Invalid symbol: ${name}");
379 } 371 }
380 List tuple = _computeFindInContext(_reflectee, parts); 372 List tuple = _computeFindInContext(_reflectee, parts);
381 if (tuple.length == 0) { 373 if (tuple.length == 0) {
382 throw new UnsupportedError( 374 throw new UnsupportedError(
383 "ClosureMirror.findInContext not yet supported"); 375 "ClosureMirror.findInContext not yet supported");
384 } 376 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 // The reflectee is not a mixin application. 512 // The reflectee is not a mixin application.
521 _mixin = this; 513 _mixin = this;
522 } else { 514 } else {
523 _mixin = reflectType(mixinType); 515 _mixin = reflectType(mixinType);
524 } 516 }
525 } 517 }
526 } 518 }
527 return _mixin; 519 return _mixin;
528 } 520 }
529 521
530 Map<Symbol, DeclarationMirror> _declarations; 522 Map<Symbol, DeclarationMirror> _cachedDeclarations;
531 Map<Symbol, DeclarationMirror> get declarations { 523 Map<Symbol, DeclarationMirror> get declarations {
532 if (_declarations != null) return _declarations; 524 if (_cachedDeclarations != null) return _cachedDeclarations;
533 var decls = new Map<Symbol, DeclarationMirror>(); 525 var decls = new Map<Symbol, DeclarationMirror>();
534 decls.addAll(members); 526 decls.addAll(_members);
535 decls.addAll(constructors); 527 decls.addAll(_constructors);
536 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); 528 typeVariables.forEach((tv) => decls[tv.simpleName] = tv);
537 return _declarations = 529 return _cachedDeclarations =
538 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls); 530 new _UnmodifiableMapView<Symbol, DeclarationMirror>(decls);
539 } 531 }
540 532
541 Map<Symbol, Mirror> _members; 533 Map<Symbol, Mirror> _cachedMembers;
542 Map<Symbol, Mirror> get members { 534 Map<Symbol, Mirror> get _members {
543 if (_members == null) { 535 if (_cachedMembers == null) {
544 var whoseMembers = _isMixinTypedef ? _trueSuperclass : this; 536 var whoseMembers = _isMixinTypedef ? _trueSuperclass : this;
545 _members = _makeMemberMap(mixin._computeMembers(whoseMembers._reflectee)); 537 _cachedMembers = _makeMemberMap(mixin._computeMembers(whoseMembers._reflec tee));
546 } 538 }
547 return _members; 539 return _cachedMembers;
548 } 540 }
549 541
550 Map<Symbol, MethodMirror> _methods; 542 Map<Symbol, MethodMirror> _cachedConstructors;
551 Map<Symbol, MethodMirror> get methods { 543 Map<Symbol, MethodMirror> get _constructors {
552 if (_methods == null) { 544 if (_cachedConstructors == 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) {
593 var constructorsList = _computeConstructors(_reflectee); 545 var constructorsList = _computeConstructors(_reflectee);
594 var stringName = _n(simpleName); 546 var stringName = _n(simpleName);
595 constructorsList.forEach((c) => c._patchConstructorName(stringName)); 547 constructorsList.forEach((c) => c._patchConstructorName(stringName));
596 _constructors = _makeMemberMap(constructorsList); 548 _cachedConstructors = _makeMemberMap(constructorsList);
597 } 549 }
598 return _constructors; 550 return _cachedConstructors;
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;
599 } 559 }
600 560
601 bool get _isAnonymousMixinApplication { 561 bool get _isAnonymousMixinApplication {
602 if (_isMixinTypedef) return false; // Named mixin application. 562 if (_isMixinTypedef) return false; // Named mixin application.
603 if (mixin == this) return false; // Not a mixin application. 563 if (mixin == this) return false; // Not a mixin application.
604 return true; 564 return true;
605 } 565 }
606 566
607 List<TypeVariableMirror> _typeVariables = null; 567 List<TypeVariableMirror> _typeVariables;
608 List<TypeVariableMirror> get typeVariables { 568 List<TypeVariableMirror> get typeVariables {
609 if (_typeVariables == null) { 569 if (_typeVariables == null) {
610 if (_isAnonymousMixinApplication) return _typeVariables = emptyList; 570 if (_isAnonymousMixinApplication) return _typeVariables = emptyList;
611 _typeVariables = new List<TypeVariableMirror>(); 571 _typeVariables = new List<TypeVariableMirror>();
612 572
613 List params = _ClassMirror_type_variables(_reflectee); 573 List params = _ClassMirror_type_variables(_reflectee);
614 ClassMirror owner = originalDeclaration; 574 ClassMirror owner = originalDeclaration;
615 var mirror; 575 var mirror;
616 for (var i = 0; i < params.length; i += 2) { 576 for (var i = 0; i < params.length; i += 2) {
617 mirror = new _LocalTypeVariableMirrorImpl( 577 mirror = new _LocalTypeVariableMirrorImpl(
618 params[i + 1], params[i], owner); 578 params[i + 1], params[i], owner);
619 _typeVariables.add(mirror); 579 _typeVariables.add(mirror);
620 } 580 }
621 _typeVariables = new UnmodifiableListView(_typeVariables); 581 _typeVariables = new UnmodifiableListView(_typeVariables);
622 } 582 }
623 return _typeVariables; 583 return _typeVariables;
624 } 584 }
625 585
626 List<TypeMirror> _typeArguments = null; 586 List<TypeMirror> _typeArguments;
627 List<TypeMirror> get typeArguments { 587 List<TypeMirror> get typeArguments {
628 if(_typeArguments == null) { 588 if(_typeArguments == null) {
629 if(_isGenericDeclaration || _isAnonymousMixinApplication) { 589 if(_isGenericDeclaration || _isAnonymousMixinApplication) {
630 _typeArguments = emptyList; 590 _typeArguments = emptyList;
631 } else { 591 } else {
632 _typeArguments = 592 _typeArguments =
633 new UnmodifiableListView(_computeTypeArguments(_reflectedType)); 593 new UnmodifiableListView(_computeTypeArguments(_reflectedType));
634 } 594 }
635 } 595 }
636 return _typeArguments; 596 return _typeArguments;
637 } 597 }
638 598
639 bool get isOriginalDeclaration => !_isGeneric || _isGenericDeclaration; 599 bool get isOriginalDeclaration => !_isGeneric || _isGenericDeclaration;
640 600
641 ClassMirror get originalDeclaration { 601 ClassMirror get originalDeclaration {
642 if (isOriginalDeclaration) { 602 if (isOriginalDeclaration) {
643 return this; 603 return this;
644 } else { 604 } else {
645 return reflectClass(_reflectedType); 605 return reflectClass(_reflectedType);
646 } 606 }
647 } 607 }
648 608
649 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'"; 609 String toString() => "ClassMirror on '${MirrorSystem.getName(simpleName)}'";
650 610
651 Function operator [](Symbol selector) { 611 Function operator [](Symbol selector) {
652 var target = methods[selector]; 612 var target = _methods[selector];
653 if (target == null || !target.isStatic || !target.isRegularMethod) { 613 if (target == null || !target.isStatic || !target.isRegularMethod) {
654 throw new ArgumentError( 614 throw new ArgumentError(
655 "${MirrorSystem.getName(simpleName)} has no static method " 615 "${MirrorSystem.getName(simpleName)} has no static method "
656 "${MirrorSystem.getName(selector)}"); 616 "${MirrorSystem.getName(selector)}");
657 } 617 }
658 return new _InvocationTrampoline(this, selector); 618 return new _InvocationTrampoline(this, selector);
659 } 619 }
660 620
661 InstanceMirror newInstance(Symbol constructorName, 621 InstanceMirror newInstance(Symbol constructorName,
662 List positionalArguments, 622 List positionalArguments,
(...skipping 15 matching lines...) Expand all
678 }); 638 });
679 } 639 }
680 640
681 return reflect(_invokeConstructor(_reflectee, 641 return reflect(_invokeConstructor(_reflectee,
682 _reflectedType, 642 _reflectedType,
683 _n(constructorName), 643 _n(constructorName),
684 arguments, 644 arguments,
685 names)); 645 names));
686 } 646 }
687 647
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
698 List<InstanceMirror> get metadata { 648 List<InstanceMirror> get metadata {
699 // Get the metadata objects, convert them into InstanceMirrors using 649 // Get the metadata objects, convert them into InstanceMirrors using
700 // reflect() and then make them into a Dart list. 650 // reflect() and then make them into a Dart list.
701 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); 651 return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
702 } 652 }
703 653
704 bool operator ==(other) { 654 bool operator ==(other) {
705 return this.runtimeType == other.runtimeType && 655 return this.runtimeType == other.runtimeType &&
706 this._reflectee == other._reflectee && 656 this._reflectee == other._reflectee &&
707 this._reflectedType == other._reflectedType && 657 this._reflectedType == other._reflectedType &&
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 999
1050 // Always false for libraries. 1000 // Always false for libraries.
1051 final bool isTopLevel = false; 1001 final bool isTopLevel = false;
1052 1002
1053 SourceLocation get location { 1003 SourceLocation get location {
1054 throw new UnimplementedError('LibraryMirror.location is not implemented'); 1004 throw new UnimplementedError('LibraryMirror.location is not implemented');
1055 } 1005 }
1056 1006
1057 final Uri uri; 1007 final Uri uri;
1058 1008
1059 Map<Symbol, DeclarationMirror> _declarations; 1009 Map<Symbol, DeclarationMirror> _cachedDeclarations;
1060 Map<Symbol, DeclarationMirror> get declarations { 1010 Map<Symbol, DeclarationMirror> get declarations {
1061 if (_declarations != null) return _declarations; 1011 if (_cachedDeclarations != null) return _cachedDeclarations;
1062 return _declarations = 1012 return _cachedDeclarations =
1063 new _UnmodifiableMapView<Symbol, DeclarationMirror>(members); 1013 new _UnmodifiableMapView<Symbol, DeclarationMirror>(
1014 _makeMemberMap(_computeMembers(_reflectee)));
1064 } 1015 }
1065 1016
1066 Map<Symbol, Mirror> _members; 1017 get _functions {
1067 Map<Symbol, Mirror> get members { 1018 var result = new Map();
1068 if (_members == null) { 1019 declarations.forEach((k, v) {
1069 _members = _makeMemberMap(_computeMembers(_reflectee)); 1020 if (v is MethodMirror) result[k] = v;
1070 } 1021 });
1071 return _members; 1022 return result;
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;
1121 } 1023 }
1122 1024
1123 List<InstanceMirror> get metadata { 1025 List<InstanceMirror> get metadata {
1124 // Get the metadata objects, convert them into InstanceMirrors using 1026 // Get the metadata objects, convert them into InstanceMirrors using
1125 // reflect() and then make them into a Dart list. 1027 // reflect() and then make them into a Dart list.
1126 return new UnmodifiableListView(_metadata(_reflectee).map(reflect)); 1028 return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
1127 } 1029 }
1128 1030
1129 bool operator ==(other) { 1031 bool operator ==(other) {
1130 return this.runtimeType == other.runtimeType && 1032 return this.runtimeType == other.runtimeType &&
1131 this._reflectee == other._reflectee; 1033 this._reflectee == other._reflectee;
1132 } 1034 }
1133 1035
1134 int get hashCode => simpleName.hashCode; 1036 int get hashCode => simpleName.hashCode;
1135 1037
1136 String toString() => "LibraryMirror on '${_n(simpleName)}'"; 1038 String toString() => "LibraryMirror on '${_n(simpleName)}'";
1137 1039
1138 Function operator [](Symbol selector) { 1040 Function operator [](Symbol selector) {
1139 var target = functions[selector]; 1041 var target = _functions[selector];
1140 if (target == null || !target.isRegularMethod) { 1042 if (target == null || !target.isRegularMethod) {
1141 throw new ArgumentError( 1043 throw new ArgumentError(
1142 "${MirrorSystem.getName(simpleName)} has no top-level method " 1044 "${MirrorSystem.getName(simpleName)} has no top-level method "
1143 "${MirrorSystem.getName(selector)}"); 1045 "${MirrorSystem.getName(selector)}");
1144 } 1046 }
1145 return new _InvocationTrampoline(this, selector); 1047 return new _InvocationTrampoline(this, selector);
1146 } 1048 }
1147 1049
1148 _invoke(reflectee, memberName, arguments, argumentNames) 1050 _invoke(reflectee, memberName, arguments, argumentNames)
1149 native 'LibraryMirror_invoke'; 1051 native 'LibraryMirror_invoke';
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 if (typeMirror == null) { 1370 if (typeMirror == null) {
1469 typeMirror = makeLocalTypeMirror(key); 1371 typeMirror = makeLocalTypeMirror(key);
1470 _instanitationCache[key] = typeMirror; 1372 _instanitationCache[key] = typeMirror;
1471 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { 1373 if (typeMirror is ClassMirror && !typeMirror._isGeneric) {
1472 _declarationCache[key] = typeMirror; 1374 _declarationCache[key] = typeMirror;
1473 } 1375 }
1474 } 1376 }
1475 return typeMirror; 1377 return typeMirror;
1476 } 1378 }
1477 } 1379 }
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