Chromium Code Reviews| Index: sdk/lib/_internal/compiler/js_lib/constant_map.dart |
| diff --git a/sdk/lib/_internal/compiler/js_lib/constant_map.dart b/sdk/lib/_internal/compiler/js_lib/constant_map.dart |
| index e716cf14bf97d1e11e686f414fac5db8dbe281e6..c4c977a027b4dedaf67a11931a0f97d2d1c66e54 100644 |
| --- a/sdk/lib/_internal/compiler/js_lib/constant_map.dart |
| +++ b/sdk/lib/_internal/compiler/js_lib/constant_map.dart |
| @@ -4,7 +4,47 @@ |
| part of _js_helper; |
| +class ConstantMapView<K, V> extends UnmodifiableMapView |
| + implements ConstantMap { |
| + ConstantMapView(Map base) : super(base); |
|
sra1
2015/05/07 19:24:42
indentation
|
| +} |
| + |
| abstract class ConstantMap<K, V> implements Map<K, V> { |
| + // Used to create unmodifiable maps from other maps. |
| + factory ConstantMap.from(Map other) { |
|
sra1
2015/05/07 19:24:41
Under what conditions can you return 'other'?
Or c
|
| + List keys = other.keys.toList(); |
| + bool allStrings = true; |
| + for (var k in keys) { |
| + if (k is! String) { |
| + allStrings = false; |
| + break; |
| + } |
| + } |
| + if (allStrings) { |
| + bool containsProto = false; |
| + var protoValue = null; |
| + var object = JS('=Object', '{}'); |
| + int length = 0; |
| + for (var k in keys) { |
| + var v = other[k]; |
| + if (k != "__proto__") { |
|
sra1
2015/05/07 19:24:42
Use single quotes for consistency with rest of fil
|
| + if (!jsHasOwnProperty(object, k)) length++; |
| + JS("void", "#[#] = #", object, k, v); |
|
sra1
2015/05/07 19:24:42
ditto
|
| + } else { |
| + containsProto = true; |
| + protoValue = v; |
| + } |
| + } |
| + if (containsProto) { |
| + length++; |
| + return new ConstantProtoMap<K, V>._(length, object, keys, protoValue); |
| + } |
| + return new ConstantStringMap<K, V>._(length, object, keys); |
| + } |
| + // TODO(lrn): Make a proper unmodifiable map implementation. |
| + return new ConstantMapView<K, V>(new Map.from(other)); |
| + } |
| + |
| const ConstantMap._(); |
| bool get isEmpty => length == 0; |
| @@ -13,7 +53,7 @@ abstract class ConstantMap<K, V> implements Map<K, V> { |
| String toString() => Maps.mapToString(this); |
| - _throwUnmodifiable() { |
| + static _throwUnmodifiable() { |
| throw new UnsupportedError("Cannot modify unmodifiable Map"); |
| } |
| void operator []=(K key, V val) => _throwUnmodifiable(); |
| @@ -26,8 +66,8 @@ abstract class ConstantMap<K, V> implements Map<K, V> { |
| class ConstantStringMap<K, V> extends ConstantMap<K, V> |
| implements _symbol_dev.EfficientLength { |
| - // This constructor is not used. The instantiation is shortcut by the |
| - // compiler. It is here to make the uninitialized final fields legal. |
| + // This constructor is not used for actual compile-time constants. |
| + // The instantiation of constant maps is shortcut by the compiler. |
| const ConstantStringMap._(this.length, this._jsObject, this._keys) |
| : super._(); |