| Index: runtime/lib/mirrors_impl.dart
|
| diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
|
| index b8fb3f9ca00511caa07e487461dc778d8c4c99a3..bbe7d67128033a988f6a5eb511a1cf20615cc4b1 100644
|
| --- a/runtime/lib/mirrors_impl.dart
|
| +++ b/runtime/lib/mirrors_impl.dart
|
| @@ -6,6 +6,49 @@
|
|
|
| import "dart:collection";
|
|
|
| +final emptyList = new UnmodifiableListView([]);
|
| +final emptyMap = new _UnmodifiableMapView({});
|
| +
|
| +// Copied from js_mirrors, in turn copied from the package
|
| +// "unmodifiable_collection".
|
| +// TODO(14314): Move to dart:collection.
|
| +class _UnmodifiableMapView<K, V> implements Map<K, V> {
|
| + Map<K, V> _source;
|
| + _UnmodifiableMapView(Map<K, V> source) : _source = source;
|
| +
|
| + static void _throw() {
|
| + throw new UnsupportedError("Cannot modify an unmodifiable Map");
|
| + }
|
| +
|
| + int get length => _source.length;
|
| +
|
| + bool get isEmpty => _source.isEmpty;
|
| +
|
| + bool get isNotEmpty => _source.isNotEmpty;
|
| +
|
| + V operator [](K key) => _source[key];
|
| +
|
| + bool containsKey(K key) => _source.containsKey(key);
|
| +
|
| + bool containsValue(V value) => _source.containsValue(value);
|
| +
|
| + void forEach(void f(K key, V value)) => _source.forEach(f);
|
| +
|
| + Iterable<K> get keys => _source.keys;
|
| +
|
| + Iterable<V> get values => _source.values;
|
| +
|
| + void operator []=(K key, V value) => _throw();
|
| +
|
| + V putIfAbsent(K key, V ifAbsent()) { _throw(); }
|
| +
|
| + void addAll(Map<K, V> other) => _throw();
|
| +
|
| + V remove(K key) { _throw(); }
|
| +
|
| + void clear() => _throw();
|
| +}
|
| +
|
| // These values are allowed to be passed directly over the wire.
|
| bool _isSimpleValue(var value) {
|
| return (value == null || value is num || value is String || value is bool);
|
| @@ -18,11 +61,13 @@ Map _filterMap(Map<Symbol, dynamic> old_map, bool filter(Symbol key, value)) {
|
| new_map[key] = value;
|
| }
|
| });
|
| - return new_map;
|
| + return new _UnmodifiableMapView(new_map);
|
| }
|
|
|
| -Map _makeMemberMap(List mirrors) => new Map<Symbol, dynamic>.fromIterable(
|
| - mirrors, key: (e) => e.simpleName);
|
| +Map _makeMemberMap(List mirrors) {
|
| + return new _UnmodifiableMapView(
|
| + new Map<Symbol, dynamic>.fromIterable(mirrors, key: (e) => e.simpleName));
|
| +}
|
|
|
| String _n(Symbol symbol) => _symbol_dev.Symbol.getName(symbol);
|
|
|
| @@ -510,8 +555,8 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
|
| _superinterfaces = isOriginalDeclaration
|
| ? _nativeInterfaces(_reflectedType)
|
| : _nativeInterfacesInstantiated(_reflectedType);
|
| - _superinterfaces = _superinterfaces
|
| - .map((i) => reflectType(i)).toList(growable:false);
|
| + _superinterfaces =
|
| + new UnmodifiableListView(_superinterfaces.map(reflectType));
|
| }
|
| return _superinterfaces;
|
| }
|
| @@ -621,8 +666,8 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
|
| List<TypeVariableMirror> _typeVariables = null;
|
| List<TypeVariableMirror> get typeVariables {
|
| if (_typeVariables == null) {
|
| + if (_isAnonymousMixinApplication) return _typeVariables = emptyList;
|
| _typeVariables = new List<TypeVariableMirror>();
|
| - if (_isAnonymousMixinApplication) return _typeVariables;
|
|
|
| List params = _ClassMirror_type_variables(_reflectee);
|
| var mirror;
|
| @@ -631,6 +676,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
|
| params[i + 1], params[i], this);
|
| _typeVariables.add(mirror);
|
| }
|
| + _typeVariables = new UnmodifiableListView(_typeVariables);
|
| }
|
| return _typeVariables;
|
| }
|
| @@ -639,10 +685,10 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
|
| List<TypeMirror> get typeArguments {
|
| if(_typeArguments == null) {
|
| if(_isGenericDeclaration || _isAnonymousMixinApplication) {
|
| - _typeArguments = new List<TypeMirror>();
|
| + _typeArguments = emptyList;
|
| } else {
|
| _typeArguments =
|
| - new List<TypeMirror>.from(_computeTypeArguments(_reflectedType));
|
| + new UnmodifiableListView(_computeTypeArguments(_reflectedType));
|
| }
|
| }
|
| return _typeArguments;
|
| @@ -700,7 +746,7 @@ class _LocalClassMirrorImpl extends _LocalObjectMirrorImpl
|
| List<InstanceMirror> get metadata {
|
| // Get the metadata objects, convert them into InstanceMirrors using
|
| // reflect() and then make them into a Dart list.
|
| - return _metadata(_reflectee).map(reflect).toList(growable:false);
|
| + return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
|
| }
|
|
|
| bool operator ==(other) {
|
| @@ -798,18 +844,18 @@ class _LocalFunctionTypeMirrorImpl extends _LocalClassMirrorImpl
|
| _parameters.forEach((p) {
|
| p._type = p.type._instantiateInContextOf(reflectType(_instantiator));
|
| });
|
| + _parameters = new UnmodifiableListView(_parameters);
|
| }
|
| return _parameters;
|
| }
|
|
|
| bool get isOriginalDeclaration => true;
|
| get originalDeclaration => this;
|
| - get typeVariables => [];
|
| - get typeArguments => [];
|
| - get metadata => [];
|
| -
|
| - Map<Symbol, Mirror> get members => new Map<Symbol,Mirror>();
|
| - Map<Symbol, MethodMirror> get constructors => new Map<Symbol,MethodMirror>();
|
| + get typeVariables => emptyList;
|
| + get typeArguments => emptyList;
|
| + get metadata => emptyList;
|
| + Map<Symbol, Mirror> get members => emptyMap;
|
| + Map<Symbol, MethodMirror> get constructors => emptyMap;
|
|
|
| String toString() => "FunctionTypeMirror on '${_n(simpleName)}'";
|
|
|
| @@ -843,7 +889,7 @@ abstract class _LocalDeclarationMirrorImpl extends _LocalMirrorImpl
|
| List<InstanceMirror> get metadata {
|
| // Get the metadata objects, convert them into InstanceMirrors using
|
| // reflect() and then make them into a Dart list.
|
| - return _metadata(_reflectee).map(reflect).toList(growable:false);
|
| + return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
|
| }
|
|
|
| bool operator ==(other) {
|
| @@ -889,8 +935,8 @@ class _LocalTypeVariableMirrorImpl extends _LocalDeclarationMirrorImpl
|
| bool get hasReflectedType => false;
|
| Type get reflectedType => throw new UnsupportedError() ;
|
|
|
| - List<TypeVariableMirror> get typeVariables => new UnmodifiableListView<TypeVariableMirror>();
|
| - List<TypeMirror> get typeArguments => new UnmodifiableListView<TypeMirror>();
|
| + List<TypeVariableMirror> get typeVariables => emptyList;
|
| + List<TypeMirror> get typeArguments => emptyList;
|
|
|
| bool get isOriginalDeclaration => true;
|
| TypeMirror get originalDeclaration => this;
|
| @@ -995,10 +1041,10 @@ class _LocalTypedefMirrorImpl extends _LocalDeclarationMirrorImpl
|
| List<TypeMirror> get typeArguments {
|
| if(_typeArguments == null) {
|
| if(_isGenericDeclaration) {
|
| - _typeArguments = new List<TypeMirror>();
|
| + _typeArguments = emptyList;
|
| } else {
|
| - _typeArguments =
|
| - new List<TypeMirror>.from(_LocalClassMirrorImpl._computeTypeArguments(_reflectedType));
|
| + _typeArguments = new UnmodifiableListView(
|
| + _LocalClassMirrorImpl._computeTypeArguments(_reflectedType));
|
| }
|
| }
|
| return _typeArguments;
|
| @@ -1075,8 +1121,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl
|
| Map<Symbol, ClassMirror> _classes;
|
| Map<Symbol, ClassMirror> get classes {
|
| if (_classes == null) {
|
| - _classes = _filterMap(members,
|
| - (key, value) => (value is ClassMirror));
|
| + _classes = _filterMap(members, (key, value) => (value is ClassMirror));
|
| }
|
| return _classes;
|
| }
|
| @@ -1117,7 +1162,7 @@ class _LocalLibraryMirrorImpl extends _LocalObjectMirrorImpl
|
| List<InstanceMirror> get metadata {
|
| // Get the metadata objects, convert them into InstanceMirrors using
|
| // reflect() and then make them into a Dart list.
|
| - return _metadata(_reflectee).map(reflect).toList(growable:false);
|
| + return new UnmodifiableListView(_metadata(_reflectee).map(reflect));
|
| }
|
|
|
| bool operator ==(other) {
|
| @@ -1209,6 +1254,7 @@ class _LocalMethodMirrorImpl extends _LocalDeclarationMirrorImpl
|
| List<ParameterMirror> get parameters {
|
| if (_parameters == null) {
|
| _parameters = _MethodMirror_parameters(_reflectee);
|
| + _parameters = new UnmodifiableListView(_parameters);
|
| }
|
| return _parameters;
|
| }
|
| @@ -1344,8 +1390,8 @@ class _LocalParameterMirrorImpl extends _LocalVariableMirrorImpl
|
| bool get hasDefaultValue => _defaultValueReflectee != null;
|
|
|
| List<InstanceMirror> get metadata {
|
| - if ( _unmirroredMetadata == null) return const [];
|
| - return _unmirroredMetadata.map(reflect).toList(growable:false);
|
| + if ( _unmirroredMetadata == null) return emptyList;
|
| + return new UnmodifiableListView(_unmirroredMetadata.map(reflect));
|
| }
|
|
|
| TypeMirror _type = null;
|
| @@ -1372,7 +1418,7 @@ class _SpecialTypeMirrorImpl extends _LocalMirrorImpl
|
| final Symbol simpleName;
|
| final bool isTopLevel = true;
|
| // Fixed length 0, therefore immutable.
|
| - final List<InstanceMirror> metadata = new List(0);
|
| + final List<InstanceMirror> metadata = emptyList;
|
|
|
| SourceLocation get location {
|
| throw new UnimplementedError('TypeMirror.location is not implemented');
|
|
|