| Index: runtime/lib/literal_factory.dart
|
| ===================================================================
|
| --- runtime/lib/literal_factory.dart (revision 1775)
|
| +++ runtime/lib/literal_factory.dart (working copy)
|
| @@ -1,11 +1,37 @@
|
| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
| -// Immutable map class for compiler generated map literals.
|
|
|
| -class _LiteralMapFactory {
|
| - // [elements] contains n key-value pairs. The keys are at position
|
| - // 2*n, the values at position 2*n+1.
|
| +// Factory class constructing mutable List and Map objects from parser generated
|
| +// list and map literals.
|
| +
|
| +class _LiteralFactory {
|
| + // [elements] contains elements that are not yet type checked.
|
| + factory List<E>.fromLiteral(int location,
|
| + String element_type,
|
| + List elements) {
|
| + var len = elements.length;
|
| + var list = new GrowableObjectArray<E>.withCapacity(len);
|
| + for (int i = 0; i < len; i++) {
|
| + // In checked mode only, rethrow a potential type error with a more user
|
| + // friendly error message.
|
| + try {
|
| + list.backingArray[i] = elements[i];
|
| + } catch (TypeError error) {
|
| + TypeError._throwNew(location,
|
| + elements[i],
|
| + element_type,
|
| + "list literal element at index ${i}");
|
| + }
|
| + }
|
| + list.length = len;
|
| + return list;
|
| + }
|
| +
|
| + // [elements] contains n key-value pairs.
|
| + // The keys are at position 2*n and are already type checked by the parser
|
| + // in checked mode.
|
| + // The values are at position 2*n+1 and are not yet type checked.
|
| factory Map<K, V>.fromLiteral(int location,
|
| String value_type,
|
| List elements) {
|
| @@ -13,13 +39,16 @@
|
| var len = elements.length;
|
| for (int i = 1; i < len; i += 2) {
|
| // The type of the key has been checked in the parser already.
|
| - if (elements[i] is !V) {
|
| + // In checked mode only, rethrow a potential type error with a more user
|
| + // friendly error message.
|
| + try {
|
| + map[elements[i - 1]] = elements[i];
|
| + } catch (TypeError error) {
|
| TypeError._throwNew(location,
|
| elements[i],
|
| value_type,
|
| "map literal value at index ${i ~/ 2}");
|
| }
|
| - map[elements[i-1]] = elements[i];
|
| }
|
| return map;
|
| }
|
|
|