diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 4b0c556..d029594 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -2106,7 +2106,29 @@
           in a completion suggestion.
         </p>
         
-      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">CLASS</dt><dt class="value">CLASS_ALIAS</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">IMPORT</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY_PREFIX</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">METHOD_NAME</dt><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
+      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">IMPORT</dt><dt class="value">IDENTIFIER</dt><dd>
+            
+            <p>
+              The element identifier should be inserted at the completion location.
+              For example "someMethod" in import 'myLib.dart' show someMethod; .
+              For suggestions of this kind, the element attribute is defined 
+              and the completion field is the element's identifier.
+            </p>
+          </dd><dt class="value">INVOCATION</dt><dd>
+            
+            <p>
+              The element is being invoked at the completion location.
+              For example, "someMethod" in x.someMethod(); .
+              For suggestions of this kind, the element attribute is defined 
+              and the completion field is the element's identifier.
+            </p>
+          </dd><dt class="value">KEYWORD</dt><dd>
+            
+            <p>
+              A keyword is being suggested.
+              For suggestions of this kind, the completion is the keyword.
+            </p>
+          </dd><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_Element">Element: object</a></dt><dd>
         <p>
           Information about an element (something that can be declared
           in code).
diff --git a/pkg/analysis_server/lib/src/analysis_logger.dart b/pkg/analysis_server/lib/src/analysis_logger.dart
index 8700cf3..477fb37 100644
--- a/pkg/analysis_server/lib/src/analysis_logger.dart
+++ b/pkg/analysis_server/lib/src/analysis_logger.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:logging/logging.dart' as logging;
+import 'package:analyzer/src/generated/java_engine.dart';
 
 /**
  * Instances of the class [AnalysisLogger] translate from the analysis engine's
@@ -18,22 +19,30 @@
   final logging.Logger baseLogger = new logging.Logger('analysis.server');
 
   @override
-  void logError(String message) {
-    baseLogger.severe(message);
+  void logError(String message, [CaughtException exception]) {
+    if (exception == null) {
+      baseLogger.severe(message);
+    } else {
+      baseLogger.severe(message, exception.exception, exception.stackTrace);
+    }
   }
 
   @override
-  void logError2(String message, Exception exception) {
+  void logError2(String message, Object exception) {
     baseLogger.severe(message, exception);
   }
 
   @override
-  void logInformation(String message) {
-    baseLogger.info(message);
+  void logInformation(String message, [CaughtException exception]) {
+    if (exception == null) {
+      baseLogger.info(message);
+    } else {
+      baseLogger.info(message, exception.exception, exception.stackTrace);
+    }
   }
 
   @override
-  void logInformation2(String message, Exception exception) {
+  void logInformation2(String message, Object exception) {
     baseLogger.info(message, exception);
   }
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 2ad03fd..7abc951 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -435,8 +435,9 @@
           channel.sendResponse(exception.response);
           return;
         } catch (exception, stackTrace) {
-          RequestError error =
-              new RequestError(RequestErrorCode.SERVER_ERROR, exception);
+          RequestError error = new RequestError(
+              RequestErrorCode.SERVER_ERROR,
+              exception.toString());
           if (stackTrace != null) {
             error.stackTrace = stackTrace.toString();
           }
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index cc0274d..730f4ec 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -80,9 +80,11 @@
 
   @override
   void close() {
-    if (!_closed.isCompleted) {
-      _closed.complete();
-    }
+    output.flush().then((_) {
+      if (!_closed.isCompleted) {
+        _closed.complete();
+      }
+    });
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index a21ec59..faf949d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -163,29 +163,25 @@
     Element element = node.staticElement;
     ConstructorName constructorName = node.constructorName;
     if (element != null && constructorName != null) {
-      ClassElement classElement = element.enclosingElement;
+      // if a synthetic constructor, navigate to the class
       if (element.isSynthetic) {
+        ClassElement classElement = element.enclosingElement;
         element = classElement;
-        computer._addRegion_nodeStart_nodeStart(
-            node,
-            node.argumentList,
+      }
+      // "new ", excluding last character
+      computer._addRegion_nodeStart_nodeStart(
+          node,
+          constructorName.type,
+          element,
+          excludeLastChar: true);
+      // "ClassName<TypeA, TypeB>"
+      _safelyVisit(constructorName.type);
+      // optional ".name"
+      if (constructorName.period != null) {
+        computer._addRegion_tokenStart_nodeEnd(
+            constructorName.period,
+            constructorName,
             element);
-      } else {
-        // "new ", excluding last character
-        computer._addRegion_nodeStart_nodeStart(
-            node,
-            constructorName.type,
-            element,
-            excludeLastChar: true);
-        // "ClassName"
-        computer._addRegionForNode(constructorName.type, classElement);
-        // optional ".name"
-        if (constructorName.period != null) {
-          computer._addRegion_tokenStart_nodeEnd(
-              constructorName.period,
-              constructorName,
-              element);
-        }
       }
     }
     _safelyVisit(node.argumentList);
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 2447fcd..6f815d1 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -239,20 +239,23 @@
     List<Resource> children = folder.getChildren();
     for (Resource child in children) {
       String path = child.path;
-      // ignore if wasn't previously excluded
-      bool wasExcluded =
-          _isExcludedBy(oldExcludedPaths, path) &&
-          !_isExcludedBy(excludedPaths, path);
-      if (!wasExcluded) {
-        continue;
-      }
       // add files, recurse into folders
       if (child is File) {
-        if (_shouldFileBeAnalyzed(child)) {
-          Source source = child.createSource();
-          changeSet.addedSource(source);
-          info.sources[path] = source;
+        // ignore if should not be analyzed at all
+        if (!_shouldFileBeAnalyzed(child)) {
+          continue;
         }
+        // ignore if was not excluded
+        bool wasExcluded =
+            _isExcludedBy(oldExcludedPaths, path) &&
+            !_isExcludedBy(excludedPaths, path);
+        if (!wasExcluded) {
+          continue;
+        }
+        // do add the file
+        Source source = child.createSource();
+        changeSet.addedSource(source);
+        info.sources[path] = source;
       } else if (child is Folder) {
         if (child.shortName == PACKAGES_NAME) {
           continue;
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index ccc138d..87020a8 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -5561,71 +5561,48 @@
  *
  * enum {
  *   ARGUMENT_LIST
- *   CLASS
- *   CLASS_ALIAS
- *   CONSTRUCTOR
- *   FIELD
- *   FUNCTION
- *   FUNCTION_TYPE_ALIAS
- *   GETTER
  *   IMPORT
+ *   IDENTIFIER
+ *   INVOCATION
  *   KEYWORD
- *   LABEL
- *   LIBRARY_PREFIX
- *   LOCAL_VARIABLE
- *   METHOD
- *   METHOD_NAME
  *   NAMED_ARGUMENT
  *   OPTIONAL_ARGUMENT
  *   PARAMETER
- *   SETTER
- *   TOP_LEVEL_VARIABLE
- *   TYPE_PARAMETER
  * }
  */
 class CompletionSuggestionKind implements Enum {
   static const ARGUMENT_LIST = const CompletionSuggestionKind._("ARGUMENT_LIST");
 
-  static const CLASS = const CompletionSuggestionKind._("CLASS");
-
-  static const CLASS_ALIAS = const CompletionSuggestionKind._("CLASS_ALIAS");
-
-  static const CONSTRUCTOR = const CompletionSuggestionKind._("CONSTRUCTOR");
-
-  static const FIELD = const CompletionSuggestionKind._("FIELD");
-
-  static const FUNCTION = const CompletionSuggestionKind._("FUNCTION");
-
-  static const FUNCTION_TYPE_ALIAS = const CompletionSuggestionKind._("FUNCTION_TYPE_ALIAS");
-
-  static const GETTER = const CompletionSuggestionKind._("GETTER");
-
   static const IMPORT = const CompletionSuggestionKind._("IMPORT");
 
+  /**
+   * The element identifier should be inserted at the completion location. For
+   * example "someMethod" in import 'myLib.dart' show someMethod; . For
+   * suggestions of this kind, the element attribute is defined and the
+   * completion field is the element's identifier.
+   */
+  static const IDENTIFIER = const CompletionSuggestionKind._("IDENTIFIER");
+
+  /**
+   * The element is being invoked at the completion location. For example,
+   * "someMethod" in x.someMethod(); . For suggestions of this kind, the
+   * element attribute is defined and the completion field is the element's
+   * identifier.
+   */
+  static const INVOCATION = const CompletionSuggestionKind._("INVOCATION");
+
+  /**
+   * A keyword is being suggested. For suggestions of this kind, the completion
+   * is the keyword.
+   */
   static const KEYWORD = const CompletionSuggestionKind._("KEYWORD");
 
-  static const LABEL = const CompletionSuggestionKind._("LABEL");
-
-  static const LIBRARY_PREFIX = const CompletionSuggestionKind._("LIBRARY_PREFIX");
-
-  static const LOCAL_VARIABLE = const CompletionSuggestionKind._("LOCAL_VARIABLE");
-
-  static const METHOD = const CompletionSuggestionKind._("METHOD");
-
-  static const METHOD_NAME = const CompletionSuggestionKind._("METHOD_NAME");
-
   static const NAMED_ARGUMENT = const CompletionSuggestionKind._("NAMED_ARGUMENT");
 
   static const OPTIONAL_ARGUMENT = const CompletionSuggestionKind._("OPTIONAL_ARGUMENT");
 
   static const PARAMETER = const CompletionSuggestionKind._("PARAMETER");
 
-  static const SETTER = const CompletionSuggestionKind._("SETTER");
-
-  static const TOP_LEVEL_VARIABLE = const CompletionSuggestionKind._("TOP_LEVEL_VARIABLE");
-
-  static const TYPE_PARAMETER = const CompletionSuggestionKind._("TYPE_PARAMETER");
-
   final String name;
 
   const CompletionSuggestionKind._(this.name);
@@ -5634,46 +5611,20 @@
     switch (name) {
       case "ARGUMENT_LIST":
         return ARGUMENT_LIST;
-      case "CLASS":
-        return CLASS;
-      case "CLASS_ALIAS":
-        return CLASS_ALIAS;
-      case "CONSTRUCTOR":
-        return CONSTRUCTOR;
-      case "FIELD":
-        return FIELD;
-      case "FUNCTION":
-        return FUNCTION;
-      case "FUNCTION_TYPE_ALIAS":
-        return FUNCTION_TYPE_ALIAS;
-      case "GETTER":
-        return GETTER;
       case "IMPORT":
         return IMPORT;
+      case "IDENTIFIER":
+        return IDENTIFIER;
+      case "INVOCATION":
+        return INVOCATION;
       case "KEYWORD":
         return KEYWORD;
-      case "LABEL":
-        return LABEL;
-      case "LIBRARY_PREFIX":
-        return LIBRARY_PREFIX;
-      case "LOCAL_VARIABLE":
-        return LOCAL_VARIABLE;
-      case "METHOD":
-        return METHOD;
-      case "METHOD_NAME":
-        return METHOD_NAME;
       case "NAMED_ARGUMENT":
         return NAMED_ARGUMENT;
       case "OPTIONAL_ARGUMENT":
         return OPTIONAL_ARGUMENT;
       case "PARAMETER":
         return PARAMETER;
-      case "SETTER":
-        return SETTER;
-      case "TOP_LEVEL_VARIABLE":
-        return TOP_LEVEL_VARIABLE;
-      case "TYPE_PARAMETER":
-        return TYPE_PARAMETER;
     }
     throw new Exception('Illegal enum value: $name');
   }
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index 91fe13b..f9b26b1 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -6,11 +6,15 @@
 
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math';
 
+import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
+import 'analysis_server.dart';
 
 /**
  * Instances of the class [GetHandler] handle GET requests.
@@ -22,6 +26,30 @@
   static const String STATUS_PATH = '/status';
 
   /**
+   * The path used to request the list of source files in a certain cache
+   * state.
+   */
+  static const String CACHE_STATE_PATH = '/cache_state';
+
+  /**
+   * Query parameter used to represent the cache state to search for, when
+   * accessing [CACHE_STATE_PATH].
+   */
+  static const String STATE_QUERY_PARAM = 'state';
+
+  /**
+   * Query parameter used to represent the context to search for, when
+   * accessing [CACHE_STATE_PATH].
+   */
+  static const String CONTEXT_QUERY_PARAM = 'context';
+
+  /**
+   * Query parameter used to represent the descriptor to search for, when
+   * accessing [CACHE_STATE_PATH].
+   */
+  static const String DESCRIPTOR_QUERY_PARAM = 'descriptor';
+
+  /**
    * The socket server whose status is to be reported on.
    */
   SocketServer _server;
@@ -43,12 +71,100 @@
     String path = request.uri.path;
     if (path == STATUS_PATH) {
       _returnServerStatus(request);
+    } else if (path == CACHE_STATE_PATH) {
+      _returnCacheState(request);
     } else {
       _returnUnknownRequest(request);
     }
   }
 
   /**
+   * Create a link to [path] with query parameters [params], with inner HTML
+   * [innerHtml].
+   */
+  String _makeLink(String path, Map<String, String> params, String innerHtml) {
+    Uri uri = new Uri(path: path, queryParameters: params);
+    return '<a href="${HTML_ESCAPE.convert(uri.toString())}">$innerHtml</a>';
+  }
+
+  /**
+   * Return a response indicating the set of source files in a certain cache
+   * state.
+   */
+  void _returnCacheState(HttpRequest request) {
+    // Figure out what CacheState is being searched for.
+    String stateQueryParam = request.uri.queryParameters[STATE_QUERY_PARAM];
+    if (stateQueryParam == null) {
+      return _returnFailure(request,
+          'Query parameter $STATE_QUERY_PARAM required');
+    }
+    CacheState stateFilter = null;
+    for (CacheState value in CacheState.values) {
+      if (value.toString() == stateQueryParam) {
+        stateFilter = value;
+      }
+    }
+    if (stateFilter == null) {
+      return _returnFailure(request,
+          'Query parameter $STATE_QUERY_PARAM is invalid');
+    }
+
+    // Figure out which context is being searched for.
+    String contextFilter = request.uri.queryParameters[CONTEXT_QUERY_PARAM];
+    if (contextFilter == null) {
+      return _returnFailure(request,
+          'Query parameter $CONTEXT_QUERY_PARAM required');
+    }
+
+    // Figure out which descriptor is being searched for.
+    String descriptorFilter =
+        request.uri.queryParameters[DESCRIPTOR_QUERY_PARAM];
+    if (descriptorFilter == null) {
+      return _returnFailure(request,
+          'Query parameter $DESCRIPTOR_QUERY_PARAM required');
+    }
+
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
+      return _returnFailure(request, 'Analysis server not running');
+    }
+    HttpResponse response = request.response;
+    response.statusCode = HttpStatus.OK;
+    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
+    response.write('<html>');
+    response.write('<head>');
+    response.write('<title>Dart Analysis Server - Search result</title>');
+    response.write('</head>');
+    response.write('<body>');
+    response.write('<h1>');
+    response.write('Files with state ${HTML_ESCAPE.convert(stateQueryParam)}');
+    response.write(' for descriptor ${HTML_ESCAPE.convert(descriptorFilter)}');
+    response.write(' in context ${HTML_ESCAPE.convert(contextFilter)}');
+    response.write('</h1>');
+    response.write('<ul>');
+    int count = 0;
+    analysisServer.folderMap.forEach((Folder folder,
+                                      AnalysisContextImpl context) {
+      if (folder.path != contextFilter) {
+        return;
+      }
+      context.visitCacheItems((Source source, SourceEntry dartEntry,
+                               DataDescriptor rowDesc, CacheState state) {
+        if (state != stateFilter || rowDesc.toString() != descriptorFilter) {
+          return;
+        }
+        response.write('<li>${HTML_ESCAPE.convert(source.fullName)}</li>');
+        count++;
+      });
+    });
+    response.write('</ul>');
+    response.write('<p>$count files found</p>');
+    response.write('</body>');
+    response.write('</html>');
+    response.close();
+  }
+
+  /**
    * Return a response indicating the status of the analysis server.
    */
   void _returnServerStatus(HttpRequest request) {
@@ -58,62 +174,70 @@
     response.write('<html>');
     response.write('<head>');
     response.write('<title>Dart Analysis Server - Status</title>');
+    response.write('<style>');
+    response.write('td.right {text-align: right;}');
+    response.write('</style>');
     response.write('</head>');
     response.write('<body>');
     response.write('<h1>Analysis Server</h1>');
-    if (_server.analysisServer == null) {
+    AnalysisServer analysisServer = _server.analysisServer;
+    if (analysisServer == null) {
       response.write('<p>Not running</p>');
     } else {
-      response.write('<p>Running</p>');
+      if (analysisServer.statusAnalyzing) {
+        response.write('<p>Running (analyzing)</p>');
+      } else {
+        response.write('<p>Running (not analyzing)</p>');
+      }
       response.write('<h1>Analysis Contexts</h1>');
       response.write('<h2>Summary</h2>');
       response.write('<table>');
-      _writeRow(
-          response,
-          ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
-          true);
-      _server.analysisServer.folderMap.forEach((Folder folder, AnalysisContextImpl context) {
+      List headerRowText = ['Context'];
+      headerRowText.addAll(CacheState.values);
+      _writeRow(response, headerRowText, header: true);
+      Map<Folder, AnalysisContext> folderMap = analysisServer.folderMap;
+      List<Folder> folders = folderMap.keys.toList();
+      folders.sort((Folder first, Folder second)
+          => first.shortName.compareTo(second.shortName));
+      folders.forEach((Folder folder) {
+        AnalysisContextImpl context = folderMap[folder];
         String key = folder.shortName;
         AnalysisContextStatistics statistics = context.statistics;
-        int errorCount = 0;
-        int flushedCount = 0;
-        int inProcessCount = 0;
-        int invalidCount = 0;
-        int validCount = 0;
+        Map<CacheState, int> totals = <CacheState, int>{};
+        for (CacheState state in CacheState.values) {
+          totals[state] = 0;
+        }
         statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
-          errorCount += row.errorCount;
-          flushedCount += row.flushedCount;
-          inProcessCount += row.inProcessCount;
-          invalidCount += row.invalidCount;
-          validCount += row.validCount;
+          for (CacheState state in CacheState.values) {
+            totals[state] += row.getCount(state);
+          }
         });
-        _writeRow(response, [
-            '<a href="#context_${HTML_ESCAPE.convert(key)}">$key</a>',
-            errorCount,
-            flushedCount,
-            inProcessCount,
-            invalidCount,
-            validCount]);
+        List rowText = ['<a href="#context_${HTML_ESCAPE.convert(key)}">$key</a>'];
+        for (CacheState state in CacheState.values) {
+          rowText.add(totals[state]);
+        }
+        _writeRow(response, rowText, classes: [null, "right"]);
       });
       response.write('</table>');
-      _server.analysisServer.folderMap.forEach((Folder folder, AnalysisContextImpl context) {
+      folders.forEach((Folder folder) {
+        AnalysisContextImpl context = folderMap[folder];
         String key = folder.shortName;
         response.write('<h2><a name="context_${HTML_ESCAPE.convert(key)}">Analysis Context: $key</a></h2>');
         AnalysisContextStatistics statistics = context.statistics;
         response.write('<table>');
-        _writeRow(
-            response,
-            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
-            true);
+        _writeRow(response, headerRowText, header: true);
         statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
-          _writeRow(
-              response,
-              [row.name,
-               row.errorCount,
-               row.flushedCount,
-               row.inProcessCount,
-               row.invalidCount,
-               row.validCount]);
+          List rowText = [row.name];
+          for (CacheState state in CacheState.values) {
+            String text = row.getCount(state).toString();
+            Map<String, String> params = <String, String>{
+              STATE_QUERY_PARAM: state.toString(),
+              CONTEXT_QUERY_PARAM: folder.path,
+              DESCRIPTOR_QUERY_PARAM: row.name
+            };
+            rowText.add(_makeLink(CACHE_STATE_PATH, params, text));
+          }
+          _writeRow(response, rowText, classes: [null, "right"]);
         });
         response.write('</table>');
         List<CaughtException> exceptions = statistics.exceptions;
@@ -146,26 +270,51 @@
     response.close();
   }
 
+  void _returnFailure(HttpRequest request, String message) {
+    HttpResponse response = request.response;
+    response.statusCode = HttpStatus.OK;
+    response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
+    response.write('<html>');
+    response.write('<head>');
+    response.write('<title>Dart Analysis Server - Failure</title>');
+    response.write('</head>');
+    response.write('<body>');
+    response.write(HTML_ESCAPE.convert(message));
+    response.write('</body>');
+    response.write('</html>');
+    response.close();
+  }
+
   /**
    * Write a single row within a table to the given [response] object. The row
    * will have one cell for each of the [columns], and will be a header row if
    * [header] is `true`.
    */
-  void _writeRow(HttpResponse response, List<Object> columns, [bool header = false]) {
+  void _writeRow(HttpResponse response, List<Object> columns,
+        {bool header : false, List<String> classes}) {
     response.write('<tr>');
-    columns.forEach((Object value) {
-      if (header) {
-        response.write('<th>');
-      } else {
-        response.write('<td>');
+    int count = columns.length;
+    int maxClassIndex = classes == null ? 0 : classes.length - 1;
+    for (int i = 0; i < count; i++) {
+      String classAttribute = '';
+      if (classes != null) {
+        String className = classes[min(i, maxClassIndex)];
+        if (className != null) {
+          classAttribute = ' class="$className"';
+        }
       }
-      response.write(value);
+      if (header) {
+        response.write('<th$classAttribute>');
+      } else {
+        response.write('<td$classAttribute>');
+      }
+      response.write(columns[i]);
       if (header) {
         response.write('</th>');
       } else {
         response.write('</td>');
       }
-    });
+    };
     response.write('</tr>');
   }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index c97e96c..971e527 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -89,61 +89,6 @@
 
 
 /**
- * Construct from an analyzer engine element kind.
- */
-CompletionSuggestionKind
-    newCompletionSuggestionKind_fromElementKind(engine.ElementKind kind) {
-  //    ElementKind.ANGULAR_FORMATTER,
-  //    ElementKind.ANGULAR_COMPONENT,
-  //    ElementKind.ANGULAR_CONTROLLER,
-  //    ElementKind.ANGULAR_DIRECTIVE,
-  //    ElementKind.ANGULAR_PROPERTY,
-  //    ElementKind.ANGULAR_SCOPE_PROPERTY,
-  //    ElementKind.ANGULAR_SELECTOR,
-  //    ElementKind.ANGULAR_VIEW,
-  if (kind == engine.ElementKind.CLASS) return CompletionSuggestionKind.CLASS;
-  //    ElementKind.COMPILATION_UNIT,
-  if (kind ==
-      engine.ElementKind.CONSTRUCTOR) return CompletionSuggestionKind.CONSTRUCTOR;
-  //    ElementKind.DYNAMIC,
-  //    ElementKind.EMBEDDED_HTML_SCRIPT,
-  //    ElementKind.ERROR,
-  //    ElementKind.EXPORT,
-  //    ElementKind.EXTERNAL_HTML_SCRIPT,
-  if (kind == engine.ElementKind.FIELD) return CompletionSuggestionKind.FIELD;
-  if (kind ==
-      engine.ElementKind.FUNCTION) return CompletionSuggestionKind.FUNCTION;
-  if (kind ==
-      engine.ElementKind.FUNCTION_TYPE_ALIAS) return
-          CompletionSuggestionKind.FUNCTION_TYPE_ALIAS;
-  if (kind == engine.ElementKind.GETTER) return CompletionSuggestionKind.GETTER;
-  //    ElementKind.HTML,
-  if (kind == engine.ElementKind.IMPORT) return CompletionSuggestionKind.IMPORT;
-  //    ElementKind.LABEL,
-  //    ElementKind.LIBRARY,
-  if (kind ==
-      engine.ElementKind.LOCAL_VARIABLE) return
-          CompletionSuggestionKind.LOCAL_VARIABLE;
-  if (kind == engine.ElementKind.METHOD) return CompletionSuggestionKind.METHOD;
-  //    ElementKind.NAME,
-  if (kind ==
-      engine.ElementKind.PARAMETER) return CompletionSuggestionKind.PARAMETER;
-  //    ElementKind.POLYMER_ATTRIBUTE,
-  //    ElementKind.POLYMER_TAG_DART,
-  //    ElementKind.POLYMER_TAG_HTML,
-  //    ElementKind.PREFIX,
-  if (kind == engine.ElementKind.SETTER) return CompletionSuggestionKind.SETTER;
-  if (kind ==
-      engine.ElementKind.TOP_LEVEL_VARIABLE) return
-          CompletionSuggestionKind.TOP_LEVEL_VARIABLE;
-  //    ElementKind.TYPE_PARAMETER,
-  //    ElementKind.UNIVERSE
-  throw new ArgumentError('Unknown CompletionSuggestionKind for: $kind');
-}
-
-
-
-/**
  * Construct based on a value from the analyzer engine.
  */
 ElementKind newElementKind_fromEngine(engine.ElementKind kind) {
diff --git a/pkg/analysis_server/lib/src/services/completion/combinator_computer.dart b/pkg/analysis_server/lib/src/services/completion/combinator_computer.dart
new file mode 100644
index 0000000..d2ae886
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/combinator_computer.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, 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.
+
+library services.completion.computer.dart.combinator;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol_server.dart' hide Element,
+    ElementKind;
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A computer for calculating `completion.getSuggestions` request results
+ * for the import combinators show and hide.
+ */
+
+class CombinatorComputer extends DartCompletionComputer {
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    return false;
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) {
+    return request.node.accept(new _CombinatorAstVisitor(request));
+  }
+}
+
+/**
+ * A visitor for determining which imported classes and top level variables
+ * should be suggested and building those suggestions.
+ */
+class _CombinatorAstVisitor extends GeneralizingAstVisitor<Future<bool>> {
+  final DartCompletionRequest request;
+
+  _CombinatorAstVisitor(this.request);
+
+  @override
+  Future<bool> visitCombinator(Combinator node) {
+    return _addCombinatorSuggestions(node);
+  }
+
+  @override
+  Future<bool> visitNode(AstNode node) {
+    return new Future.value(false);
+  }
+
+  @override
+  Future<bool> visitSimpleIdentifier(SimpleIdentifier node) {
+    return node.parent.accept(this);
+  }
+
+  Future _addCombinatorSuggestions(Combinator node) {
+    var directive = node.getAncestor((parent) => parent is NamespaceDirective);
+    if (directive is NamespaceDirective) {
+      LibraryElement library = directive.uriElement;
+      LibraryElementSuggestionBuilder.suggestionsFor(
+          request,
+          CompletionSuggestionKind.IDENTIFIER,
+          library);
+      return new Future.value(true);
+    }
+    return new Future.value(false);
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index e96fccb..d30a83a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/combinator_computer.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_computer.dart';
 import 'package:analysis_server/src/services/completion/invocation_computer.dart';
@@ -93,7 +94,7 @@
       int count = computers.length;
       computers.forEach((c) {
         c.computeFull(request).then((bool changed) {
-          var last = --count == 0;
+          bool last = --count == 0;
           if (changed || last) {
             sendResults(last);
           }
@@ -110,6 +111,7 @@
       computers = [
           new KeywordComputer(),
           new LocalComputer(),
+          new CombinatorComputer(),
           new ImportedComputer(),
           new InvocationComputer()];
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
index 2cfbc81..73f972b 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -39,7 +39,7 @@
 }
 
 /**
- * A visitor for determining which imported class and top level variable
+ * A visitor for determining which imported classes and top level variables
  * should be suggested and building those suggestions.
  */
 class _ImportedVisitor extends GeneralizingAstVisitor<Future<bool>> {
@@ -79,11 +79,6 @@
   }
 
   @override
-  Future<bool> visitCombinator(Combinator node) {
-    return _addCombinatorSuggestions(node);
-  }
-
-  @override
   Future<bool> visitExpression(Expression node) {
     return _addImportedElementSuggestions(node, excludeVoidReturn: true);
   }
@@ -100,9 +95,21 @@
   }
 
   @override
+  Future<bool> visitFormalParameterList(FormalParameterList node) {
+    Token leftParen = node.leftParenthesis;
+    if (leftParen != null && request.offset > leftParen.offset) {
+      Token rightParen = node.rightParenthesis;
+      if (rightParen == null || request.offset <= rightParen.offset) {
+        return _addImportedElementSuggestions(node);
+      }
+    }
+    return new Future.value(false);
+  }
+
+  @override
   Future<bool> visitForStatement(ForStatement node) {
-    Token leftParenthesis = node.leftParenthesis;
-    if (leftParenthesis != null && request.offset >= leftParenthesis.end) {
+    Token leftParen = node.leftParenthesis;
+    if (leftParen != null && request.offset >= leftParen.end) {
       return _addImportedElementSuggestions(node);
     }
     return new Future.value(false);
@@ -190,17 +197,6 @@
     return new Future.value(false);
   }
 
-  Future _addCombinatorSuggestions(Combinator node) {
-    var directive = node.getAncestor((parent) => parent is NamespaceDirective);
-    if (directive is NamespaceDirective) {
-      LibraryElement library = directive.uriElement;
-      LibraryElementSuggestionBuilder.suggestionsFor(request, library);
-      return new Future.value(true);
-    }
-
-    return new Future.value(false);
-  }
-
   void _addElementSuggestion(Element element, bool typesOnly,
       bool excludeVoidReturn, CompletionRelevance relevance) {
 
@@ -219,13 +215,10 @@
       return;
     }
 
-    CompletionSuggestionKind kind =
-        newCompletionSuggestionKind_fromElementKind(element.kind);
-
     String completion = element.displayName;
     CompletionSuggestion suggestion = new CompletionSuggestion(
-        kind,
-        relevance,
+        CompletionSuggestionKind.INVOCATION,
+        element.isDeprecated ? CompletionRelevance.LOW : relevance,
         completion,
         completion.length,
         0,
@@ -381,7 +374,7 @@
     String completion = importElem.prefix.displayName;
     if (completion != null && completion.length > 0) {
       CompletionSuggestion suggestion = new CompletionSuggestion(
-          CompletionSuggestionKind.LIBRARY_PREFIX,
+          CompletionSuggestionKind.INVOCATION,
           CompletionRelevance.DEFAULT,
           completion,
           completion.length,
diff --git a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
index 3669bd4..9b91205 100644
--- a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
@@ -12,6 +12,8 @@
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 
+import '../../protocol_server.dart' show CompletionSuggestionKind;
+
 /**
  * A computer for calculating invocation / access suggestions
  * `completion.getSuggestions` request results.
@@ -140,7 +142,10 @@
     if (element != null) {
       InterfaceType type = element.type;
       if (type != null) {
-        ClassElementSuggestionBuilder.staticSuggestionsFor(request, type.element);
+        ClassElementSuggestionBuilder.suggestionsFor(
+            request,
+            type.element,
+            staticOnly: true);
       }
     }
     return new Future.value(false);
@@ -163,7 +168,10 @@
           if (directive.prefix.name == element.name) {
             // Suggest elements from the imported library
             LibraryElement library = directive.uriElement;
-            LibraryElementSuggestionBuilder.suggestionsFor(request, library);
+            LibraryElementSuggestionBuilder.suggestionsFor(
+                request,
+                CompletionSuggestionKind.INVOCATION,
+                library);
             modified = true;
           }
         }
diff --git a/pkg/analysis_server/lib/src/services/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
index 8e0ba88..82d34ff 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -133,11 +133,9 @@
       } else if (declaration is TopLevelVariableDeclaration) {
         _addTopLevelVarSuggestions(declaration.variables);
       } else if (declaration is ClassTypeAlias) {
-        CompletionSuggestion suggestion = _addSuggestion(
-            declaration.name,
-            CompletionSuggestionKind.CLASS_ALIAS,
-            null,
-            null);
+        bool isDeprecated = _isDeprecated(declaration);
+        CompletionSuggestion suggestion =
+            _addSuggestion(declaration.name, null, null, isDeprecated);
         if (suggestion != null) {
           suggestion.element = _createElement(
               protocol.ElementKind.CLASS_TYPE_ALIAS,
@@ -145,22 +143,21 @@
               null,
               NO_RETURN_TYPE,
               true,
-              _isDeprecated(declaration.metadata));
+              isDeprecated);
         }
       } else if (declaration is FunctionTypeAlias) {
-        CompletionSuggestion suggestion = _addSuggestion(
-            declaration.name,
-            CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
-            declaration.returnType,
-            null);
+        bool isDeprecated = _isDeprecated(declaration);
+        CompletionSuggestion suggestion =
+            _addSuggestion(declaration.name, declaration.returnType, null, isDeprecated);
         if (suggestion != null) {
+          // TODO (danrubel) determine parameters and return type
           suggestion.element = _createElement(
               protocol.ElementKind.FUNCTION_TYPE_ALIAS,
               declaration.name,
-              null, // TODO (danrubel) determine parameters
-              NO_RETURN_TYPE, // TODO (danrubel) determine return type
+              null,
+              NO_RETURN_TYPE,
               true,
-              _isDeprecated(declaration.metadata));
+              isDeprecated);
         }
       }
     });
@@ -308,8 +305,9 @@
   }
 
   void _addClassSuggestion(ClassDeclaration declaration) {
+    bool isDeprecated = _isDeprecated(declaration);
     CompletionSuggestion suggestion =
-        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS, null, null);
+        _addSuggestion(declaration.name, null, null, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.CLASS,
@@ -317,7 +315,7 @@
           null,
           NO_RETURN_TYPE,
           declaration.isAbstract,
-          _isDeprecated(declaration.metadata));
+          isDeprecated);
     }
   }
 
@@ -325,13 +323,14 @@
     if (typesOnly) {
       return;
     }
-    bool isDeprecated = _isDeprecated(fieldDecl.metadata);
+    bool isDeprecated = _isDeprecated(fieldDecl);
     fieldDecl.fields.variables.forEach((VariableDeclaration varDecl) {
+      bool isSingleFieldDeprecated = isDeprecated || _isDeprecated(varDecl);
       CompletionSuggestion suggestion = _addSuggestion(
           varDecl.name,
-          CompletionSuggestionKind.GETTER,
           fieldDecl.fields.type,
-          node);
+          node,
+          isSingleFieldDeprecated);
       if (suggestion != null) {
         suggestion.element = _createElement(
             protocol.ElementKind.GETTER,
@@ -339,7 +338,7 @@
             '()',
             fieldDecl.fields.type,
             false,
-            isDeprecated || _isDeprecated(varDecl.metadata));
+            isSingleFieldDeprecated);
       }
     });
   }
@@ -351,11 +350,9 @@
     if (excludeVoidReturn && _isVoid(declaration.returnType)) {
       return;
     }
-    CompletionSuggestion suggestion = _addSuggestion(
-        declaration.name,
-        CompletionSuggestionKind.FUNCTION,
-        declaration.returnType,
-        null);
+    bool isDeprecated = _isDeprecated(declaration);
+    CompletionSuggestion suggestion =
+        _addSuggestion(declaration.name, declaration.returnType, null, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.FUNCTION,
@@ -363,7 +360,7 @@
           declaration.functionExpression.parameters.toSource(),
           declaration.returnType,
           false,
-          _isDeprecated(declaration.metadata));
+          isDeprecated);
     }
   }
 
@@ -372,7 +369,7 @@
       return;
     }
     CompletionSuggestion suggestion =
-        _addSuggestion(id, CompletionSuggestionKind.LOCAL_VARIABLE, returnType, null);
+        _addSuggestion(id, returnType, null, false);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.LOCAL_VARIABLE,
@@ -389,29 +386,26 @@
       return;
     }
     protocol.ElementKind kind;
-    CompletionSuggestionKind csKind;
     String parameters;
     if (classMbr.isGetter) {
       kind = protocol.ElementKind.GETTER;
-      csKind = CompletionSuggestionKind.GETTER;
       parameters = '()';
     } else if (classMbr.isSetter) {
       if (excludeVoidReturn) {
         return;
       }
       kind = protocol.ElementKind.SETTER;
-      csKind = CompletionSuggestionKind.SETTER;
       parameters = '(${classMbr.returnType.toSource()} value)';
     } else {
       if (excludeVoidReturn && _isVoid(classMbr.returnType)) {
         return;
       }
       kind = protocol.ElementKind.METHOD;
-      csKind = CompletionSuggestionKind.METHOD;
       parameters = classMbr.parameters.toSource();
     }
+    bool isDeprecated = _isDeprecated(classMbr);
     CompletionSuggestion suggestion =
-        _addSuggestion(classMbr.name, csKind, classMbr.returnType, node);
+        _addSuggestion(classMbr.name, classMbr.returnType, node, isDeprecated);
     if (suggestion != null) {
       suggestion.element = _createElement(
           kind,
@@ -419,7 +413,7 @@
           parameters,
           classMbr.returnType,
           classMbr.isAbstract,
-          _isDeprecated(classMbr.metadata));
+          isDeprecated);
     }
   }
 
@@ -453,7 +447,7 @@
       return;
     }
     CompletionSuggestion suggestion =
-        _addSuggestion(identifier, CompletionSuggestionKind.PARAMETER, type, null);
+        _addSuggestion(identifier, type, null, false);
     if (suggestion != null) {
       suggestion.element = _createElement(
           protocol.ElementKind.PARAMETER,
@@ -465,14 +459,14 @@
     }
   }
 
-  CompletionSuggestion _addSuggestion(SimpleIdentifier id,
-      CompletionSuggestionKind kind, TypeName typeName, ClassDeclaration classDecl) {
+  CompletionSuggestion _addSuggestion(SimpleIdentifier id, TypeName typeName,
+      ClassDeclaration classDecl, bool isDeprecated) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0 && completion != '_') {
         CompletionSuggestion suggestion = new CompletionSuggestion(
-            kind,
-            CompletionRelevance.DEFAULT,
+            CompletionSuggestionKind.INVOCATION,
+            isDeprecated ? CompletionRelevance.LOW : CompletionRelevance.DEFAULT,
             completion,
             completion.length,
             0,
@@ -508,13 +502,11 @@
       return;
     }
     if (varList != null) {
-      bool isDeprecated = _isDeprecated(varList.metadata);
+      bool isDeprecated = _isDeprecated(varList);
       varList.variables.forEach((VariableDeclaration varDecl) {
-        CompletionSuggestion suggestion = _addSuggestion(
-            varDecl.name,
-            CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
-            varList.type,
-            null);
+        bool isSingleVarDeprecated = isDeprecated || _isDeprecated(varDecl);
+        CompletionSuggestion suggestion =
+            _addSuggestion(varDecl.name, varList.type, null, isSingleVarDeprecated);
         if (suggestion != null) {
           suggestion.element = _createElement(
               protocol.ElementKind.TOP_LEVEL_VARIABLE,
@@ -522,7 +514,7 @@
               null,
               varList.type,
               false,
-              isDeprecated || _isDeprecated(varDecl.metadata));
+              isSingleVarDeprecated);
         }
       });
     }
@@ -542,8 +534,8 @@
    * Create a new protocol Element for inclusion in a completion suggestion.
    */
   protocol.Element _createElement(protocol.ElementKind kind,
-      SimpleIdentifier id, String parameters, TypeName returnType,
-      bool isAbstract, bool isDeprecated) {
+      SimpleIdentifier id, String parameters, TypeName returnType, bool isAbstract,
+      bool isDeprecated) {
     String name = id.name;
     int flags = protocol.Element.makeFlags(
         isAbstract: isAbstract,
@@ -557,13 +549,21 @@
         returnType: _nameForType(returnType));
   }
 
+
   /**
    * Return `true` if the @deprecated annotation is present
    */
-  bool _isDeprecated(NodeList<Annotation> metadata) =>
-      metadata != null &&
-          metadata.any(
-              (Annotation a) => a.name is SimpleIdentifier && a.name.name == 'deprecated');
+  bool _isDeprecated(AnnotatedNode node) {
+    if (node != null) {
+      NodeList<Annotation> metadata = node.metadata;
+      if (metadata != null) {
+        return metadata.any((Annotation a) {
+          return a.name is SimpleIdentifier && a.name.name == 'deprecated';
+        });
+      }
+    }
+    return false;
+  }
 
   bool _isVoid(TypeName returnType) {
     if (returnType != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index 391ac2a..d98c968 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -96,9 +96,8 @@
 class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder {
   final bool staticOnly;
 
-  ClassElementSuggestionBuilder(DartCompletionRequest request, {bool staticOnly:
-      false})
-      : super(request),
+  ClassElementSuggestionBuilder(DartCompletionRequest request, bool staticOnly)
+      : super(request, CompletionSuggestionKind.INVOCATION),
         this.staticOnly = staticOnly;
 
   @override
@@ -119,11 +118,7 @@
     if (staticOnly && !element.isStatic) {
       return;
     }
-    _addElementSuggestion(
-        element,
-        CompletionSuggestionKind.GETTER,
-        element.type,
-        element.enclosingElement);
+    _addElementSuggestion(element, element.type, element.enclosingElement);
   }
 
   @override
@@ -136,7 +131,6 @@
     }
     _addElementSuggestion(
         element,
-        CompletionSuggestionKind.METHOD,
         element.returnType,
         element.enclosingElement);
   }
@@ -149,13 +143,11 @@
     if (element.isGetter) {
       _addElementSuggestion(
           element,
-          CompletionSuggestionKind.GETTER,
           element.returnType,
           element.enclosingElement);
     } else if (element.isSetter) {
       _addElementSuggestion(
           element,
-          CompletionSuggestionKind.SETTER,
           element.returnType,
           element.enclosingElement);
     }
@@ -164,20 +156,13 @@
   /**
    * Add suggestions for the visible members in the given class
    */
-  static void suggestionsFor(DartCompletionRequest request, Element element) {
+  static void suggestionsFor(DartCompletionRequest request, Element element,
+      {bool staticOnly: false}) {
     if (element is ClassElement) {
-      return element.accept(new ClassElementSuggestionBuilder(request));
+      return element.accept(
+          new ClassElementSuggestionBuilder(request, staticOnly));
     }
   }
-
-  /**
-   * Add suggestions for the visible static members in the given class
-   */
-  static void staticSuggestionsFor(DartCompletionRequest request,
-      ClassElement element) {
-    return element.accept(
-        new ClassElementSuggestionBuilder(request, staticOnly: true));
-  }
 }
 
 /**
@@ -187,12 +172,13 @@
  */
 class LibraryElementSuggestionBuilder extends _AbstractSuggestionBuilder {
 
-  LibraryElementSuggestionBuilder(DartCompletionRequest request)
-      : super(request);
+  LibraryElementSuggestionBuilder(DartCompletionRequest request,
+      CompletionSuggestionKind kind)
+      : super(request, kind);
 
   @override
   visitClassElement(ClassElement element) {
-    _addElementSuggestion(element, CompletionSuggestionKind.CLASS, null, null);
+    _addElementSuggestion(element, null, null);
   }
 
   @override
@@ -207,38 +193,26 @@
 
   @override
   visitFunctionElement(FunctionElement element) {
-    _addElementSuggestion(
-        element,
-        CompletionSuggestionKind.FUNCTION,
-        element.returnType,
-        null);
+    _addElementSuggestion(element, element.returnType, null);
   }
 
   @override
   visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    _addElementSuggestion(
-        element,
-        CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
-        element.returnType,
-        null);
+    _addElementSuggestion(element, element.returnType, null);
   }
 
   @override
   visitTopLevelVariableElement(TopLevelVariableElement element) {
-    _addElementSuggestion(
-        element,
-        CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
-        element.type,
-        null);
+    _addElementSuggestion(element, element.type, null);
   }
 
   /**
    * Add suggestions for the visible members in the given library
    */
   static void suggestionsFor(DartCompletionRequest request,
-      LibraryElement library) {
+      CompletionSuggestionKind kind, LibraryElement library) {
     if (library != null) {
-      library.visitChildren(new LibraryElementSuggestionBuilder(request));
+      library.visitChildren(new LibraryElementSuggestionBuilder(request, kind));
     }
   }
 }
@@ -251,7 +225,7 @@
 class NamedConstructorSuggestionBuilder extends _AbstractSuggestionBuilder {
 
   NamedConstructorSuggestionBuilder(DartCompletionRequest request)
-      : super(request);
+      : super(request, CompletionSuggestionKind.INVOCATION);
 
   @override
   visitClassElement(ClassElement element) {
@@ -262,7 +236,6 @@
   visitConstructorElement(ConstructorElement element) {
     _addElementSuggestion(
         element,
-        CompletionSuggestionKind.CONSTRUCTOR,
         element.returnType,
         element.enclosingElement);
   }
@@ -287,12 +260,13 @@
  */
 class _AbstractSuggestionBuilder extends GeneralizingElementVisitor {
   final DartCompletionRequest request;
+  final CompletionSuggestionKind kind;
   final Set<String> _completions = new Set<String>();
 
-  _AbstractSuggestionBuilder(this.request);
+  _AbstractSuggestionBuilder(this.request, this.kind);
 
-  void _addElementSuggestion(Element element, CompletionSuggestionKind kind,
-      DartType type, ClassElement enclosingElement) {
+  void _addElementSuggestion(Element element, DartType type,
+      ClassElement enclosingElement) {
     if (element.isSynthetic) {
       return;
     }
@@ -309,13 +283,14 @@
         !_completions.add(completion)) {
       return;
     }
+    bool isDeprecated = element.isDeprecated;
     CompletionSuggestion suggestion = new CompletionSuggestion(
         kind,
-        CompletionRelevance.DEFAULT,
+        isDeprecated ? CompletionRelevance.LOW : CompletionRelevance.DEFAULT,
         completion,
         completion.length,
         0,
-        element.isDeprecated,
+        isDeprecated,
         false);
     suggestion.element = protocol.newElement_fromEngine(element);
     if (suggestion.element != null) {
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 964c87b..4358dd3 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -73,7 +73,8 @@
     node =
         new NodeLocator.con2(selectionOffset, selectionEnd).searchWithin(unit);
     // try to add proposals
-    _addProposal_addTypeAnnotation();
+    _addProposal_addTypeAnnotation_DeclaredIdentifier();
+    _addProposal_addTypeAnnotation_VariableDeclaration();
     _addProposal_assignToLocalVariable();
     _addProposal_convertToBlockFunctionBody();
     _addProposal_convertToExpressionFunctionBody();
@@ -166,7 +167,54 @@
     edits.add(edit);
   }
 
-  void _addProposal_addTypeAnnotation() {
+  void _addProposal_addTypeAnnotation_DeclaredIdentifier() {
+    DeclaredIdentifier declaredIdentifier =
+        node.getAncestor((n) => n is DeclaredIdentifier);
+    if (declaredIdentifier == null) {
+      ForEachStatement forEach = node.getAncestor((n) => n is ForEachStatement);
+      int offset = node.offset;
+      if (forEach != null &&
+          forEach.iterable != null &&
+          offset < forEach.iterable.offset) {
+        declaredIdentifier = forEach.loopVariable;
+      }
+    }
+    if (declaredIdentifier == null) {
+      _coverageMarker();
+      return;
+    }
+    // may be has type annotation already
+    if (declaredIdentifier.type != null) {
+      _coverageMarker();
+      return;
+    }
+    // prepare type source
+    String typeSource;
+    DartType type = declaredIdentifier.identifier.bestType;
+    if (type is InterfaceType || type is FunctionType) {
+      typeSource = utils.getTypeSource(type);
+    } else {
+      _coverageMarker();
+      return;
+    }
+    // add edit
+    Token keyword = declaredIdentifier.keyword;
+    if (keyword is KeywordToken && keyword.keyword == Keyword.VAR) {
+      SourceRange range = rangeToken(keyword);
+      _addReplaceEdit(range, typeSource);
+    } else {
+      _addInsertEdit(declaredIdentifier.identifier.offset, '$typeSource ');
+    }
+    // add proposal
+    _addAssist(AssistKind.ADD_TYPE_ANNOTATION, []);
+  }
+
+  void _addProposal_addTypeAnnotation_VariableDeclaration() {
+    AstNode node = this.node;
+    // check if "var v = 42;^"
+    if (node is VariableDeclarationStatement) {
+      node = (node as VariableDeclarationStatement).variables;
+    }
     // prepare VariableDeclarationList
     VariableDeclarationList declarationList =
         node.getAncestor((node) => node is VariableDeclarationList);
@@ -1081,12 +1129,10 @@
       return;
     }
     // returns
-    if (thenStatement is ReturnStatement || elseStatement is ReturnStatement) {
-      ReturnStatement thenReturn = thenStatement as ReturnStatement;
-      ReturnStatement elseReturn = elseStatement as ReturnStatement;
+    if (thenStatement is ReturnStatement && elseStatement is ReturnStatement) {
       String conditionSrc = _getNodeText(ifStatement.condition);
-      String theSrc = _getNodeText(thenReturn.expression);
-      String elseSrc = _getNodeText(elseReturn.expression);
+      String theSrc = _getNodeText(thenStatement.expression);
+      String elseSrc = _getNodeText(elseStatement.expression);
       _addReplaceEdit(
           rangeNode(ifStatement),
           'return $conditionSrc ? $theSrc : $elseSrc;');
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index 9ce5a4c..e3b36cf 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -52,41 +52,6 @@
 }
 
 /**
- * Returns possible names for a [String] variable with [text] value.
- */
-List<String> getVariableNameSuggestionsForText(String text,
-    Set<String> excluded) {
-  // filter out everything except of letters and white spaces
-  {
-    StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < text.length; i++) {
-      int c = text.codeUnitAt(i);
-      if (isLetter(c) || isWhitespace(c)) {
-        sb.writeCharCode(c);
-      }
-    }
-    text = sb.toString();
-  }
-  // make single camel-case text
-  {
-    List<String> words = text.split(' ');
-    StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < words.length; i++) {
-      String word = words[i];
-      if (i > 0) {
-        word = capitalize(word);
-      }
-      sb.write(word);
-    }
-    text = sb.toString();
-  }
-  // split camel-case into separate suggested names
-  Set<String> res = new Set();
-  _addAll(excluded, res, _getCamelWordCombinations(text));
-  return new List.from(res);
-}
-
-/**
  * Returns possible names for a variable with the given expected type and
  * expression assigned.
  */
@@ -125,6 +90,41 @@
 }
 
 /**
+ * Returns possible names for a [String] variable with [text] value.
+ */
+List<String> getVariableNameSuggestionsForText(String text,
+    Set<String> excluded) {
+  // filter out everything except of letters and white spaces
+  {
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < text.length; i++) {
+      int c = text.codeUnitAt(i);
+      if (isLetter(c) || isWhitespace(c)) {
+        sb.writeCharCode(c);
+      }
+    }
+    text = sb.toString();
+  }
+  // make single camel-case text
+  {
+    List<String> words = text.split(' ');
+    StringBuffer sb = new StringBuffer();
+    for (int i = 0; i < words.length; i++) {
+      String word = words[i];
+      if (i > 0) {
+        word = capitalize(word);
+      }
+      sb.write(word);
+    }
+    text = sb.toString();
+  }
+  // split camel-case into separate suggested names
+  Set<String> res = new Set();
+  _addAll(excluded, res, _getCamelWordCombinations(text));
+  return new List.from(res);
+}
+
+/**
  * Adds [toAdd] items which are not excluded.
  */
 void _addAll(Set<String> excluded, Set<String> result, Iterable<String> toAdd) {
@@ -175,6 +175,9 @@
   } else if (expression is PrefixedIdentifier) {
     PrefixedIdentifier node = expression;
     return node.identifier.name;
+  } else if (expression is PropertyAccess) {
+    PropertyAccess node = expression;
+    return node.propertyName.name;
   } else if (expression is MethodInvocation) {
     name = expression.methodName.name;
   } else if (expression is InstanceCreationExpression) {
diff --git a/pkg/analysis_server/lib/src/services/generated/completion.dart b/pkg/analysis_server/lib/src/services/generated/completion.dart.unused
similarity index 100%
rename from pkg/analysis_server/lib/src/services/generated/completion.dart
rename to pkg/analysis_server/lib/src/services/generated/completion.dart.unused
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index 1db798d..6f2e190 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -82,10 +82,10 @@
       }
       _DataInputStream stream = new _DataInputStream(bytes);
       return _readNode(stream);
-    }).catchError((e, stackTrace) {
-      _logger.logError2(
+    }).catchError((exception, stackTrace) {
+      _logger.logError(
           'Exception during reading index file ${name}',
-          new CaughtException(e, stackTrace));
+          new CaughtException(exception, stackTrace));
     });
   }
 
@@ -108,10 +108,10 @@
       _writeNode(node, stream);
       var bytes = stream.getBytes();
       return _fileManager.write(name, bytes);
-    }).catchError((e, stackTrace) {
-      _logger.logError2(
+    }).catchError((exception, stackTrace) {
+      _logger.logError(
           'Exception during reading index file ${name}',
-          new CaughtException(e, stackTrace));
+          new CaughtException(exception, stackTrace));
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index 4f79dc7..fdee721 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -137,7 +137,6 @@
     // prepare initializer
     Expression initializer = _variableNode.initializer;
     String initializerCode = utils.getNodeText(initializer);
-    int initializerPrecedence = getExpressionPrecedence(initializer);
     // replace references
     for (SearchMatch reference in _references) {
       SourceRange range = reference.sourceRange;
@@ -171,7 +170,7 @@
         } else {
           codeForReference = initializerCode;
         }
-      } else if (initializerPrecedence < getExpressionParentPrecedence(node)) {
+      } else if (_shouldUseParenthesis(initializer, node)) {
         codeForReference = '($initializerCode)';
       } else {
         codeForReference = initializerCode;
@@ -195,4 +194,25 @@
     return targetType == TokenType.STRING_INTERPOLATION_IDENTIFIER &&
         expression is! SimpleIdentifier;
   }
+
+  static bool _shouldUseParenthesis(Expression init, AstNode node) {
+    // check precedence
+    int initPrecedence = getExpressionPrecedence(init);
+    if (initPrecedence < getExpressionParentPrecedence(node)) {
+      return true;
+    }
+    // special case for '-'
+    AstNode parent = node.parent;
+    if (init is PrefixExpression && parent is PrefixExpression) {
+      if (parent.operator.type == TokenType.MINUS) {
+        TokenType initializerOperator = init.operator.type;
+        if (initializerOperator == TokenType.MINUS ||
+            initializerOperator == TokenType.MINUS_MINUS) {
+          return true;
+        }
+      }
+    }
+    // no () is needed
+    return false;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index c6c680e..96dbb03 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -19,6 +19,7 @@
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 
 
 /**
@@ -46,8 +47,9 @@
  * Returns the source which should replace given invocation with given
  * arguments.
  */
-String _getMethodSourceForInvocation(_SourcePart part, CorrectionUtils utils,
-    AstNode contextNode, Expression targetExpression, List<Expression> arguments) {
+String _getMethodSourceForInvocation(RefactoringStatus status, _SourcePart part,
+    CorrectionUtils utils, AstNode contextNode, Expression targetExpression,
+    List<Expression> arguments) {
   // prepare edits to replace parameters with arguments
   List<SourceEdit> edits = <SourceEdit>[];
   part._parameters.forEach(
@@ -63,15 +65,34 @@
     if (argument is NamedExpression) {
       argument = (argument as NamedExpression).expression;
     }
-    int argumentPrecedence = getExpressionPrecedence(argument);
-    String argumentSource = utils.getNodeText(argument);
+    // prepare argument properties
+    int argumentPrecedence;
+    String argumentSource;
+    if (argument != null) {
+      argumentPrecedence = getExpressionPrecedence(argument);
+      argumentSource = utils.getNodeText(argument);
+    } else {
+      // report about a missing required parameter
+      if (parameter.parameterKind == ParameterKind.REQUIRED) {
+        status.addError(
+            'No argument for the parameter "${parameter.name}".',
+            newLocation_fromNode(contextNode));
+        return;
+      }
+      // an optional parameter
+      argumentPrecedence = -1000;
+      argumentSource = parameter.defaultValueCode;
+      if (argumentSource == null) {
+        argumentSource = 'null';
+      }
+    }
     // replace all occurrences of this parameter
     for (_ParameterOccurrence occurrence in occurrences) {
       SourceRange range = occurrence.range;
       // prepare argument source to apply at this occurrence
       String occurrenceArgumentSource;
       if (argumentPrecedence < occurrence.parentPrecedence) {
-        occurrenceArgumentSource = "(${argumentSource})";
+        occurrenceArgumentSource = "($argumentSource)";
       } else {
         occurrenceArgumentSource = argumentSource;
       }
@@ -488,6 +509,7 @@
       if (ref._methodStatementsPart != null) {
         // prepare statements source for invocation
         String source = _getMethodSourceForInvocation(
+            status,
             ref._methodStatementsPart,
             _refUtils,
             usage,
@@ -506,6 +528,7 @@
       if (ref._methodExpressionPart != null) {
         // prepare expression source for invocation
         String source = _getMethodSourceForInvocation(
+            status,
             ref._methodExpressionPart,
             _refUtils,
             usage,
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 1fd1a09..b1a0d38 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -7,7 +7,7 @@
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
   analyzer: 0.23.0-dev.13
-  args: any
+  args: '>=0.12.1 <0.13.0'
   logging: any
   path: any
   watcher: any
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 42c2d5a..fc40264 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -318,8 +318,35 @@
 }
 ''');
     return prepareNavigation().then((_) {
-      findRegion(findOffset('new A'), 'new A'.length, true);
-      assertHasTarget('A {');
+      {
+        findRegion(findOffset('new A'), 'new'.length, true);
+        assertHasTarget('A {');
+      }
+      {
+        findRegion(findOffset('A()'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
+    });
+  }
+
+  test_instanceCreation_implicit_withTypeArgument() {
+    addTestFile('''
+class A {}
+class B<T> {
+}
+main() {
+  new B<A>();
+}
+''');
+    return prepareNavigation().then((_) {
+      {
+        findRegion(findOffset('new B'), 'new'.length, true);
+        assertHasTarget('B<T> {');
+      }
+      {
+        findRegion(findOffset('A>();'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
     });
   }
 
@@ -348,6 +375,36 @@
     });
   }
 
+  test_instanceCreation_named_withTypeArgument() {
+    addTestFile('''
+class A {}
+class B<T> {
+  A.named() {}
+}
+main() {
+  new B<A>.named();
+}
+''');
+    return prepareNavigation().then((_) {
+      {
+        findRegion(findOffset('new '), 'new'.length, true);
+        assertHasTarget('named() {}');
+      }
+      {
+        findRegion(findOffset('B<A>.named();'), 'B'.length, true);
+        assertHasTarget('B<T> {');
+      }
+      {
+        findRegion(findOffset('.named();'), '.named'.length, true);
+        assertHasTarget('named() {}');
+      }
+      {
+        findRegion(findOffset('A>.named();'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
+    });
+  }
+
   test_instanceCreation_unnamed() {
     addTestFile('''
 class A {
@@ -369,6 +426,32 @@
     });
   }
 
+  test_instanceCreation_unnamed_withTypeArgument() {
+    addTestFile('''
+class A {}
+class B<T> {
+  B() {}
+}
+main() {
+  new B<A>();
+}
+''');
+    return prepareNavigation().then((_) {
+      {
+        findRegion(findOffset('new '), 'new'.length, true);
+        assertHasTarget('B() {}', 0);
+      }
+      {
+        findRegion(findOffset('B<A>();'), 'B'.length, true);
+        assertHasTarget('B<T> {');
+      }
+      {
+        findRegion(findOffset('A>();'), 'A'.length, true);
+        assertHasTarget('A {');
+      }
+    });
+  }
+
   test_multiplyDefinedElement() {
     addFile('$projectPath/bin/libA.dart', 'library A; int TEST = 1;');
     addFile('$projectPath/bin/libB.dart', 'library B; int TEST = 2;');
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 161c060..0fb2192 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -323,6 +323,24 @@
     manager.assertContextFiles(project, [file1, file2]);
   }
 
+  void test_setRoots_exclude_sameRoot_removeExcludedFile_inFolder() {
+    // prepare paths
+    String project = '/project';
+    String file1 = '$project/bin/file1.dart';
+    String file2 = '$project/bin/file2.dart';
+    // create files
+    resourceProvider.newFile(file1, '// 1');
+    resourceProvider.newFile(file2, '// 2');
+    // set roots
+    manager.setRoots(<String>[project], <String>[file2], <String, String>{});
+    manager.assertContextPaths([project]);
+    manager.assertContextFiles(project, [file1]);
+    // stop excluding "2"
+    manager.setRoots(<String>[project], <String>[], <String, String>{});
+    manager.assertContextPaths([project]);
+    manager.assertContextFiles(project, [file1, file2]);
+  }
+
   void test_setRoots_exclude_sameRoot_removeExcludedFolder() {
     // prepare paths
     String project = '/project';
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 7413542..8eb8136 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -139,8 +139,8 @@
     return getSuggestions().then((_) {
       expect(replacementOffset, equals(completionOffset));
       expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.CLASS, 'Object');
-      assertHasResult(CompletionSuggestionKind.CLASS, 'HtmlElement');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'HtmlElement');
       assertNoResult('test');
     });
   }
@@ -153,8 +153,8 @@
     return getSuggestions().then((_) {
       expect(replacementOffset, equals(completionOffset));
       expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.CLASS, 'Object');
-      assertHasResult(CompletionSuggestionKind.LIBRARY_PREFIX, 'foo');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'foo');
       assertNoResult('HtmlElement');
       assertNoResult('test');
     });
@@ -181,10 +181,10 @@
     return getSuggestions().then((_) {
       expect(replacementOffset, equals(completionOffset));
       expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.CLASS, 'A');
-      assertHasResult(CompletionSuggestionKind.GETTER, 'a');
-      assertHasResult(CompletionSuggestionKind.LOCAL_VARIABLE, 'b');
-      assertHasResult(CompletionSuggestionKind.METHOD, 'x');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'A');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'a');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'x');
     });
   }
 
@@ -193,7 +193,7 @@
     return getSuggestions().then((_) {
       expect(replacementOffset, equals(completionOffset));
       expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.METHOD, 'b');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
     });
   }
 
@@ -206,8 +206,8 @@
     return getSuggestions().then((_) {
       expect(replacementOffset, equals(completionOffset - 3));
       expect(replacementLength, equals(4));
-      assertHasResult(CompletionSuggestionKind.CLASS, 'Object');
-      assertHasResult(CompletionSuggestionKind.TOP_LEVEL_VARIABLE, 'test');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'Object');
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'test');
       assertNoResult('HtmlElement');
     });
   }
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 691cc81..88483a2 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1036,50 +1036,24 @@
  *
  * enum {
  *   ARGUMENT_LIST
- *   CLASS
- *   CLASS_ALIAS
- *   CONSTRUCTOR
- *   FIELD
- *   FUNCTION
- *   FUNCTION_TYPE_ALIAS
- *   GETTER
  *   IMPORT
+ *   IDENTIFIER
+ *   INVOCATION
  *   KEYWORD
- *   LABEL
- *   LIBRARY_PREFIX
- *   LOCAL_VARIABLE
- *   METHOD
- *   METHOD_NAME
  *   NAMED_ARGUMENT
  *   OPTIONAL_ARGUMENT
  *   PARAMETER
- *   SETTER
- *   TOP_LEVEL_VARIABLE
- *   TYPE_PARAMETER
  * }
  */
 final Matcher isCompletionSuggestionKind = new MatchesEnum("CompletionSuggestionKind", [
   "ARGUMENT_LIST",
-  "CLASS",
-  "CLASS_ALIAS",
-  "CONSTRUCTOR",
-  "FIELD",
-  "FUNCTION",
-  "FUNCTION_TYPE_ALIAS",
-  "GETTER",
   "IMPORT",
+  "IDENTIFIER",
+  "INVOCATION",
   "KEYWORD",
-  "LABEL",
-  "LIBRARY_PREFIX",
-  "LOCAL_VARIABLE",
-  "METHOD",
-  "METHOD_NAME",
   "NAMED_ARGUMENT",
   "OPTIONAL_ARGUMENT",
-  "PARAMETER",
-  "SETTER",
-  "TOP_LEVEL_VARIABLE",
-  "TYPE_PARAMETER"
+  "PARAMETER"
 ]);
 
 /**
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index c87ef8d..8673177 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -60,11 +60,22 @@
 }
 const Object deprecated = const Deprecated("next release");
 
-abstract class List<E> extends Object {
+class Iterator<E> {
+  bool moveNext();
+  E get current;
+}
+
+abstract class Iterable<E> {
+  Iterator<E> get iterator;
+}
+
+abstract class List<E> implements Iterable<E> {
   void add(E value);
   E operator [](int index);
   void operator []=(int index, E value);
+  Iterator<E> get iterator => null;
 }
+
 class Map<K, V> extends Object {}
 
 external bool identical(Object a, Object b);
diff --git a/pkg/analysis_server/test/services/completion/combinator_computer_test.dart b/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
new file mode 100644
index 0000000..af4fc0f
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/combinator_computer_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, 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.
+
+library test.services.completion.dart.combinator;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/combinator_computer.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'completion_test_util.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(CombinatorComputerTest);
+}
+
+@ReflectiveTestCase()
+class CombinatorComputerTest extends AbstractCompletionTest {
+
+  @override
+  void setUp() {
+    super.setUp();
+    computer = new CombinatorComputer();
+  }
+
+  test_Block_inherited_local() {
+    // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
+    addTestSource('''
+      class F { var f1; f2() { } }
+      class E extends F { var e1; e2() { } }
+      class I { int i1; i2() { } }
+      class M { var m1; int m2() { } }
+      class A extends E implements I with M {a() {^}}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertNoSuggestions();
+    });
+  }
+
+  test_Combinator_hide() {
+    // SimpleIdentifier  HideCombinator  ImportDirective
+    addSource('/testAB.dart', '''
+      library libAB;
+      part '/partAB.dart';
+      class A { }
+      class B { }''');
+    addSource('/partAB.dart', '''
+      part of libAB;
+      var T1;
+      PB F1() => new PB();
+      class PB { }''');
+    addSource('/testCD.dart', '''
+      class C { }
+      class D { }''');
+    addTestSource('''
+      import "/testAB.dart" hide ^;
+      import "/testCD.dart";
+      class X {}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestClass(
+          'A',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestClass(
+          'B',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestClass(
+          'PB',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestTopLevelVar(
+          'T1',
+          null,
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestFunction(
+          'F1',
+          'PB',
+          false,
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertNotSuggested('C');
+      assertNotSuggested('D');
+      assertNotSuggested('X');
+      assertNotSuggested('Object');
+    });
+  }
+
+  test_Combinator_show() {
+    // SimpleIdentifier  HideCombinator  ImportDirective
+    addSource('/testAB.dart', '''
+      library libAB;
+      part '/partAB.dart';
+      class A { }
+      class B { }''');
+    addSource('/partAB.dart', '''
+      part of libAB;
+      var T1;
+      PB F1() => new PB();
+      typedef PB2 F2(int blat);
+      class Clz = Object with Object;
+      class PB { }''');
+    addSource('/testCD.dart', '''
+      class C { }
+      class D { }''');
+    addTestSource('''
+      import "/testAB.dart" show ^;
+      import "/testCD.dart";
+      class X {}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestClass(
+          'A',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestClass(
+          'B',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestClass(
+          'PB',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestTopLevelVar(
+          'T1',
+          null,
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestFunction(
+          'F1',
+          'PB',
+          false,
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestClass(
+          'Clz',
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertSuggestFunctionTypeAlias(
+          'F2',
+          null,
+          false,
+          CompletionRelevance.DEFAULT,
+          CompletionSuggestionKind.IDENTIFIER);
+      assertNotSuggested('C');
+      assertNotSuggested('D');
+      assertNotSuggested('X');
+      assertNotSuggested('Object');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/completion_computer_test.dart b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 30b0afc..4448236 100644
--- a/pkg/analysis_server/test/services/completion/completion_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -8,17 +8,18 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import '../../abstract_single_unit.dart';
-import '../../reflective_tests.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+import '../../reflective_tests.dart';
+
 main() {
   groupSep = ' | ';
   runReflectiveTests(DartCompletionManagerTest);
@@ -63,7 +64,7 @@
     source = addSource('/does/not/exist.dart', '');
     manager = new DartCompletionManager(context, searchEngine, source, 0);
     suggestion1 = new CompletionSuggestion(
-        CompletionSuggestionKind.CLASS,
+        CompletionSuggestionKind.INVOCATION,
         CompletionRelevance.DEFAULT,
         "suggestion1",
         1,
@@ -71,7 +72,7 @@
         false,
         false);
     suggestion2 = new CompletionSuggestion(
-        CompletionSuggestionKind.CLASS,
+        CompletionSuggestionKind.IDENTIFIER,
         CompletionRelevance.DEFAULT,
         "suggestion2",
         2,
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index 54929ec..941b3b7 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -8,7 +8,7 @@
 
 import 'package:analysis_server/src/protocol.dart' as protocol show Element,
     ElementKind;
-import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_computer.dart';
 import 'package:analysis_server/src/services/completion/invocation_computer.dart';
@@ -72,26 +72,35 @@
     return null;
   }
 
-  CompletionSuggestion assertSuggest(CompletionSuggestionKind kind,
-      String completion, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
-      bool isDeprecated = false, bool isPotential = false]) {
+  CompletionSuggestion assertSuggest(String completion,
+      {CompletionSuggestionKind csKind: CompletionSuggestionKind.INVOCATION,
+      CompletionRelevance relevance: CompletionRelevance.DEFAULT,
+      protocol.ElementKind elemKind: null, bool isDeprecated: false, bool isPotential:
+      false}) {
     CompletionSuggestion cs;
     request.suggestions.forEach((s) {
-      if (s.completion == completion && s.kind == kind) {
-        if (cs == null) {
-          cs = s;
-        } else {
-          _failedCompletion(
-              'expected exactly one $completion',
-              request.suggestions.where((s) => s.completion == completion));
+      if (s.completion == completion && s.kind == csKind) {
+        protocol.Element element = s.element;
+        if (elemKind == null || (element != null && elemKind == element.kind)) {
+          if (cs == null) {
+            cs = s;
+          } else {
+            _failedCompletion(
+                'expected exactly one $completion',
+                request.suggestions.where((s) => s.completion == completion));
+          }
         }
       }
     });
     if (cs == null) {
-      _failedCompletion('expected $completion $kind', request.suggestions);
+      _failedCompletion('expected $completion $csKind', request.suggestions);
     }
-    expect(cs.kind, equals(kind));
-    expect(cs.relevance, equals(relevance));
+    expect(cs.kind, equals(csKind));
+    if (isDeprecated) {
+      expect(cs.relevance, equals(CompletionRelevance.LOW));
+    } else {
+      expect(cs.relevance, equals(relevance));
+    }
     expect(cs.selectionOffset, equals(completion.length));
     expect(cs.selectionLength, equals(0));
     expect(cs.isDeprecated, equals(isDeprecated));
@@ -100,9 +109,10 @@
   }
 
   CompletionSuggestion assertSuggestClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.CLASS, name, relevance);
+        assertSuggest(name, csKind: kind, relevance: relevance);
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.CLASS));
@@ -113,9 +123,10 @@
   }
 
   CompletionSuggestion assertSuggestClassTypeAlias(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.CLASS_ALIAS, name, relevance);
+        assertSuggest(name, csKind: kind, relevance: relevance);
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.CLASS_TYPE_ALIAS));
@@ -126,13 +137,13 @@
   }
 
   CompletionSuggestion assertSuggestFunction(String name, String returnType,
-      bool isDeprecated, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      bool isDeprecated, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs = assertSuggest(
-        CompletionSuggestionKind.FUNCTION,
         name,
-        relevance,
-        isDeprecated);
+        csKind: kind,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
     expect(cs.returnType, equals(returnType));
     protocol.Element element = cs.element;
     expect(element, isNotNull);
@@ -151,12 +162,13 @@
 
   CompletionSuggestion assertSuggestFunctionTypeAlias(String name,
       String returnType, bool isDeprecated, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs = assertSuggest(
-        CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
         name,
-        relevance,
-        isDeprecated);
+        csKind: kind,
+        relevance: relevance,
+        isDeprecated: isDeprecated);
     expect(cs.returnType, equals(returnType));
     protocol.Element element = cs.element;
     expect(element, isNotNull);
@@ -176,9 +188,15 @@
   }
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.GETTER, name, relevance);
+      {CompletionRelevance relevance: CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated: false}) {
+    CompletionSuggestion cs = assertSuggest(
+        name,
+        csKind: kind,
+        relevance: relevance,
+        elemKind: protocol.ElementKind.GETTER,
+        isDeprecated: isDeprecated);
     expect(cs.returnType, equals(returnType));
     protocol.Element element = cs.element;
     expect(element, isNotNull);
@@ -194,11 +212,12 @@
   }
 
   CompletionSuggestion assertSuggestLibraryPrefix(String prefix,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     // Library prefix should only be suggested by ImportedComputer
     if (computer is ImportedComputer) {
       CompletionSuggestion cs =
-          assertSuggest(CompletionSuggestionKind.LIBRARY_PREFIX, prefix, relevance);
+          assertSuggest(prefix, csKind: kind, relevance: relevance);
       protocol.Element element = cs.element;
       expect(element, isNotNull);
       expect(element.kind, equals(protocol.ElementKind.LIBRARY));
@@ -211,12 +230,12 @@
   }
 
   CompletionSuggestion assertSuggestLocalVariable(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     // Local variables should only be suggested by LocalComputer
     if (computer is LocalComputer) {
       CompletionSuggestion cs =
-          assertSuggest(CompletionSuggestionKind.LOCAL_VARIABLE, name, relevance);
+          assertSuggest(name, csKind: kind, relevance: relevance);
       expect(cs.returnType, equals(returnType));
       protocol.Element element = cs.element;
       expect(element, isNotNull);
@@ -233,10 +252,10 @@
   }
 
   CompletionSuggestion assertSuggestMethod(String name, String declaringType,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.METHOD, name, relevance);
+        assertSuggest(name, csKind: kind, relevance: relevance);
     expect(cs.declaringType, equals(declaringType));
     expect(cs.returnType, equals(returnType));
     protocol.Element element = cs.element;
@@ -254,11 +273,11 @@
   }
 
   CompletionSuggestion assertSuggestNamedConstructor(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     if (computer is InvocationComputer) {
       CompletionSuggestion cs =
-          assertSuggest(CompletionSuggestionKind.CONSTRUCTOR, name, relevance);
+          assertSuggest(name, csKind: kind, relevance: relevance);
       protocol.Element element = cs.element;
       expect(element, isNotNull);
       expect(element.kind, equals(protocol.ElementKind.CONSTRUCTOR));
@@ -275,11 +294,12 @@
   }
 
   CompletionSuggestion assertSuggestParameter(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     // Parameters should only be suggested by LocalComputer
     if (computer is LocalComputer) {
       CompletionSuggestion cs =
-          assertSuggest(CompletionSuggestionKind.PARAMETER, name, relevance);
+          assertSuggest(name, csKind: kind, relevance: relevance);
       expect(cs.returnType, equals(returnType));
       protocol.Element element = cs.element;
       expect(element, isNotNull);
@@ -296,9 +316,13 @@
   }
 
   CompletionSuggestion assertSuggestSetter(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.SETTER, name, relevance);
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
+    CompletionSuggestion cs = assertSuggest(
+        name,
+        csKind: kind,
+        relevance: relevance,
+        elemKind: protocol.ElementKind.SETTER);
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.SETTER));
@@ -310,9 +334,10 @@
   }
 
   CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.TOP_LEVEL_VARIABLE, name, relevance);
+        assertSuggest(name, csKind: kind, relevance: relevance);
     expect(cs.returnType, equals(returnType));
     protocol.Element element = cs.element;
     expect(element, isNotNull);
@@ -447,9 +472,10 @@
   }
 
   CompletionSuggestion assertSuggestImportedClass(String name,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
-      return assertSuggestClass(name, relevance);
+      return assertSuggestClass(name, relevance, kind);
     } else {
       return assertNotSuggested(name);
     }
@@ -457,9 +483,15 @@
 
   CompletionSuggestion assertSuggestImportedFunction(String name,
       String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
-      return assertSuggestFunction(name, returnType, isDeprecated, relevance);
+      return assertSuggestFunction(
+          name,
+          returnType,
+          isDeprecated,
+          relevance,
+          kind);
     } else {
       return assertNotSuggested(name);
     }
@@ -467,13 +499,15 @@
 
   CompletionSuggestion assertSuggestImportedFunctionTypeAlias(String name,
       String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      CompletionRelevance.DEFAULT, CompletionSuggestionKind kind =
+      CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
       return assertSuggestFunctionTypeAlias(
           name,
           returnType,
           isDeprecated,
-          relevance);
+          relevance,
+          kind);
     } else {
       return assertNotSuggested(name);
     }
@@ -483,7 +517,7 @@
       String returnType, [CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
     if (computer is ImportedComputer) {
-      return assertSuggestGetter(name, returnType, relevance);
+      return assertSuggestGetter(name, returnType, relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -500,10 +534,10 @@
   }
 
   CompletionSuggestion assertSuggestImportedTopLevelVar(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION]) {
     if (computer is ImportedComputer) {
-      return assertSuggestTopLevelVar(name, returnType, relevance);
+      return assertSuggestTopLevelVar(name, returnType, relevance, kind);
     } else {
       return assertNotSuggested(name);
     }
@@ -519,10 +553,14 @@
   }
 
   CompletionSuggestion assertSuggestInvocationGetter(String name,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
+      String returnType, {CompletionRelevance relevance: CompletionRelevance.DEFAULT,
+      bool isDeprecated: false}) {
     if (computer is InvocationComputer) {
-      return assertSuggestGetter(name, returnType, relevance);
+      return assertSuggestGetter(
+          name,
+          returnType,
+          relevance: relevance,
+          isDeprecated: isDeprecated);
     } else {
       return assertNotSuggested(name);
     }
@@ -602,7 +640,7 @@
   CompletionSuggestion assertSuggestLocalGetter(String name, String returnType,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     if (computer is LocalComputer) {
-      return assertSuggestGetter(name, returnType, relevance);
+      return assertSuggestGetter(name, returnType, relevance: relevance);
     } else {
       return assertNotSuggested(name);
     }
@@ -632,14 +670,41 @@
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
     addSource('/libA.dart', '''
       library A;
+      bool hasLength(int expected) { }
+      void baz() { }''');
+    addTestSource('''
+      import '/libA.dart'
+      class B { }
+      String bar() => true;
+      void main() {expect(^)}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestLocalFunction('bar', 'String');
+      assertSuggestImportedFunction('hasLength', 'bool');
+      assertSuggestImportedFunction('identical', 'bool');
+      assertSuggestLocalClass('B');
+      assertSuggestImportedClass('Object');
+      assertNotSuggested('main');
+      assertNotSuggested('baz');
+      assertNotSuggested('print');
+    });
+  }
+
+  test_ArgumentList_namedParam() {
+    // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
+    // ExpressionStatement
+    addSource('/libA.dart', '''
+      library A;
       bool hasLength(int expected) { }''');
     addTestSource('''
       import '/libA.dart'
-      main() {expect(^)}''');
+      String bar() => true;
+      void main() {expect(foo: ^)}''');
     computeFast();
     return computeFull(true).then((_) {
-      assertSuggestLocalFunction('main', null);
+      assertSuggestLocalFunction('bar', 'String');
       assertSuggestImportedFunction('hasLength', 'bool');
+      assertNotSuggested('main');
     });
   }
 
@@ -765,7 +830,7 @@
       assertSuggestImportedClass('C');
       // hidden element suggested as low relevance
       assertSuggestImportedClass('D', CompletionRelevance.LOW);
-      assertSuggestImportedFunction('D1', null, true);
+      assertSuggestImportedFunction('D1', null, true, CompletionRelevance.LOW);
       assertSuggestLocalFunction('D2', 'Z');
       assertSuggestImportedClass('EE');
       // hidden element suggested as low relevance
@@ -885,6 +950,28 @@
     });
   }
 
+  test_CascadeExpression_selector2_withTrailingReturn() {
+    // PropertyAccess  CascadeExpression  ExpressionStatement  Block
+    addSource('/testB.dart', '''
+      class B { }''');
+    addTestSource('''
+      import "/testB.dart";
+      class A {var b; X _c;}
+      class X{}
+      main() {A a; a..^ return}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestInvocationGetter('b', null);
+      assertSuggestInvocationGetter('_c', 'X');
+      assertNotSuggested('Object');
+      assertNotSuggested('A');
+      assertNotSuggested('B');
+      assertNotSuggested('X');
+      assertNotSuggested('z');
+      assertNotSuggested('==');
+    });
+  }
+
   test_CascadeExpression_target() {
     // SimpleIdentifier  CascadeExpression  ExpressionStatement
     addTestSource('''
@@ -939,7 +1026,8 @@
       A T;''');
     computeFast();
     return computeFull(true).then((_) {
-      CompletionSuggestion suggestionA = assertSuggestLocalClass('A');
+      CompletionSuggestion suggestionA =
+          assertSuggestLocalClass('A', CompletionRelevance.LOW);
       if (suggestionA != null) {
         expect(suggestionA.element.isDeprecated, isTrue);
         expect(suggestionA.element.isPrivate, isFalse);
@@ -980,15 +1068,7 @@
       class X {}''');
     computeFast();
     return computeFull(true).then((_) {
-      assertSuggestImportedClass('A');
-      assertSuggestImportedClass('B');
-      assertSuggestImportedClass('PB');
-      assertSuggestImportedTopLevelVar('T1', null);
-      assertSuggestImportedFunction('F1', 'PB');
-      assertNotSuggested('C');
-      assertNotSuggested('D');
-      assertNotSuggested('X');
-      assertNotSuggested('Object');
+      assertNoSuggestions();
     });
   }
 
@@ -1015,17 +1095,7 @@
       class X {}''');
     computeFast();
     return computeFull(true).then((_) {
-      assertSuggestImportedClass('A');
-      assertSuggestImportedClass('B');
-      assertSuggestImportedClass('PB');
-      assertSuggestImportedTopLevelVar('T1', null);
-      assertSuggestImportedFunction('F1', 'PB');
-      assertSuggestImportedClass('Clz');
-      assertSuggestImportedFunctionTypeAlias('F2', null);
-      assertNotSuggested('C');
-      assertNotSuggested('D');
-      assertNotSuggested('X');
-      assertNotSuggested('Object');
+      assertNoSuggestions();
     });
   }
 
@@ -1157,6 +1227,23 @@
     });
   }
 
+  test_FormalParameterList() {
+    // FormalParameterList MethodDeclaration
+    addTestSource('''
+      foo() { }
+      void bar() { }
+      class A {a(^) { }}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestLocalFunction('foo', null);
+      assertSuggestLocalMethod('a', 'A', null);
+      assertSuggestLocalClass('A');
+      assertSuggestImportedClass('String');
+      assertSuggestImportedFunction('identical', 'bool');
+      assertNotSuggested('bar');
+    });
+  }
+
   test_ForStatement_body() {
     // Block  ForStatement
     addTestSource('main(args) {for (int i; i < 10; ++i) {^}}');
@@ -1394,7 +1481,8 @@
         expect(methodA.element.isDeprecated, isFalse);
         expect(methodA.element.isPrivate, isFalse);
       }
-      CompletionSuggestion getterF = assertSuggestLocalGetter('f', 'X');
+      CompletionSuggestion getterF =
+          assertSuggestLocalGetter('f', 'X', CompletionRelevance.LOW);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
@@ -1417,7 +1505,8 @@
         expect(methodA.element.isDeprecated, isFalse);
         expect(methodA.element.isPrivate, isTrue);
       }
-      CompletionSuggestion getterF = assertSuggestLocalGetter('f', 'X');
+      CompletionSuggestion getterF =
+          assertSuggestLocalGetter('f', 'X', CompletionRelevance.LOW);
       if (getterF != null) {
         expect(getterF.element.isDeprecated, isTrue);
         expect(getterF.element.isPrivate, isFalse);
@@ -1436,7 +1525,8 @@
     addTestSource('class A {@deprecated Z a(X x, _, b, {y: boo}) {^}}');
     computeFast();
     return computeFull(true).then((_) {
-      CompletionSuggestion methodA = assertSuggestLocalMethod('a', 'A', 'Z');
+      CompletionSuggestion methodA =
+          assertSuggestLocalMethod('a', 'A', 'Z', CompletionRelevance.LOW);
       if (methodA != null) {
         expect(methodA.element.isDeprecated, isTrue);
         expect(methodA.element.isPrivate, isFalse);
@@ -1550,7 +1640,7 @@
       class I {X get f => new A();get _g => new A();}
       class A implements I {
         static const int sc = 12;
-        var b; X _c;
+        @deprecated var b; X _c;
         X get d => new A();get _e => new A();
         set s1(I x) {} set _s2(I x) {}
         m(X x) {} I _n(X x) {}}
@@ -1561,7 +1651,7 @@
     computeFast();
     return computeFull(true).then((_) {
       assertSuggestInvocationGetter('sc', 'int');
-      assertSuggestInvocationGetter('b', null);
+      assertSuggestInvocationGetter('b', null, isDeprecated: true);
       assertNotSuggested('_c');
       assertSuggestInvocationGetter('d', 'X');
       assertNotSuggested('_e');
diff --git a/pkg/analysis_server/test/services/completion/test_all.dart b/pkg/analysis_server/test/services/completion/test_all.dart
index 1aeba0d..7efd76a 100644
--- a/pkg/analysis_server/test/services/completion/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'combinator_computer_test.dart' as combinator_test;
 import 'completion_computer_test.dart' as completion_computer_test;
 import 'completion_manager_test.dart' as completion_manager_test;
 import 'imported_computer_test.dart' as imported_test;
@@ -17,6 +18,7 @@
 main() {
   groupSep = ' | ';
   group('completion', () {
+    combinator_test.main();
     completion_computer_test.main();
     completion_manager_test.main();
     imported_test.main();
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 06e6509..65c8cd1 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -133,6 +133,76 @@
 ''');
   }
 
+  void test_addTypeAnnotation_declaredIdentifier_BAD_hasTypeAnnotation() {
+    _indexTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+    assertNoAssistAt('item in', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_declaredIdentifier_BAD_inForEachBody() {
+    _indexTestUnit('''
+main(List<String> items) {
+  for (var item in items) {
+    42;
+  }
+}
+''');
+    assertNoAssistAt('42;', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_declaredIdentifier_BAD_unknownType() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main() {
+  for (var item in unknownList) {
+  }
+}
+''');
+    assertNoAssistAt('item in', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_declaredIdentifier_OK() {
+    _indexTestUnit('''
+main(List<String> items) {
+  for (var item in items) {
+  }
+}
+''');
+    // on identifier
+    assertHasAssistAt('item in', AssistKind.ADD_TYPE_ANNOTATION, '''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+    // on "for"
+    assertHasAssistAt('for (', AssistKind.ADD_TYPE_ANNOTATION, '''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+  }
+
+  void test_addTypeAnnotation_declaredIdentifier_OK_final() {
+    _indexTestUnit('''
+main(List<String> items) {
+  for (final item in items) {
+  }
+}
+''');
+    assertHasAssistAt('item in', AssistKind.ADD_TYPE_ANNOTATION, '''
+main(List<String> items) {
+  for (final String item in items) {
+  }
+}
+''');
+  }
+
   void test_addTypeAnnotation_local_OK_Function() {
     _indexTestUnit('''
 main() {
@@ -211,6 +281,19 @@
 ''');
   }
 
+  void test_addTypeAnnotation_local_OK_onVariableDeclarationStatement() {
+    _indexTestUnit('''
+main() {
+  var v = 123; // marker
+}
+''');
+    assertHasAssistAt(' // marker', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  int v = 123; // marker
+}
+''');
+  }
+
   void test_addTypeAnnotation_local_wrong_hasTypeAnnotation() {
     _indexTestUnit('''
 main() {
@@ -1897,6 +1980,19 @@
 ''');
   }
 
+  void test_replaceIfElseWithConditional_wrong_expressionVsReturn() {
+    _indexTestUnit('''
+main() {
+  if (true) {
+    print(42);
+  } else {
+    return;
+  }
+}
+''');
+    assertNoAssistAt('else', AssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL);
+  }
+
   void test_replaceIfElseWithConditional_wrong_notIfStatement() {
     _indexTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index 9ef37c3..c1b2273 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -5,12 +5,13 @@
 library test.services.correction.name_suggestion;
 
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
-import '../../abstract_single_unit.dart';
-import '../../reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+import '../../reflective_tests.dart';
+
 
 main() {
   groupSep = ' | ';
@@ -45,31 +46,13 @@
     DartType expectedType = (findElement('node') as LocalVariableElement).type;
     Expression assignedExpression =
         findNodeAtString('null;', (node) => node is NullLiteral);
-    List<String> suggestions =
-        getVariableNameSuggestionsForExpression(
-            expectedType,
-            assignedExpression,
-            excluded);
+    List<String> suggestions = getVariableNameSuggestionsForExpression(
+        expectedType,
+        assignedExpression,
+        excluded);
     expect(suggestions, unorderedEquals(['treeNode', 'node']));
   }
 
-  void test_forExpression_expectedType_String() {
-    resolveTestUnit('''
-main() {
-  String res = 'abc';
-}
-''');
-    DartType expectedType = (findElement('res') as LocalVariableElement).type;
-    Expression assignedExpression = findNodeAtString("'abc';");
-    // first choice for "String" is "s"
-    expect(
-        getVariableNameSuggestionsForExpression(
-            expectedType,
-            assignedExpression,
-            new Set.from([])),
-        unorderedEquals(['s']));
-  }
-
   void test_forExpression_expectedType_double() {
     resolveTestUnit('''
 main() {
@@ -118,6 +101,23 @@
         unorderedEquals(['k']));
   }
 
+  void test_forExpression_expectedType_String() {
+    resolveTestUnit('''
+main() {
+  String res = 'abc';
+}
+''');
+    DartType expectedType = (findElement('res') as LocalVariableElement).type;
+    Expression assignedExpression = findNodeAtString("'abc';");
+    // first choice for "String" is "s"
+    expect(
+        getVariableNameSuggestionsForExpression(
+            expectedType,
+            assignedExpression,
+            new Set.from([])),
+        unorderedEquals(['s']));
+  }
+
   void test_forExpression_instanceCreation() {
     verifyNoTestUnitErrors = false;
     resolveTestUnit('''
@@ -268,6 +268,21 @@
         unorderedEquals([]));
   }
 
+  void test_forExpression_prefixedIdentifier() {
+    resolveTestUnit('''
+main(p) {
+  var res = p.sortedNodes;
+}
+''');
+    var excluded = new Set.from([]);
+    expect(
+        getVariableNameSuggestionsForExpression(
+            null,
+            findNodeAtString('p.sorted', (node) => node is PrefixedIdentifier),
+            excluded),
+        unorderedEquals(['sortedNodes', 'nodes']));
+  }
+
   void test_forExpression_privateName() {
     resolveTestUnit('''
 main(p) {
@@ -293,15 +308,14 @@
   void test_forExpression_propertyAccess() {
     resolveTestUnit('''
 main(p) {
-  var res = p.sortedNodes;
+  var res = p.q.sortedNodes;
 }
 ''');
     var excluded = new Set.from([]);
+    PropertyAccess expression =
+        findNodeAtString('p.q.sorted', (node) => node is PropertyAccess);
     expect(
-        getVariableNameSuggestionsForExpression(
-            null,
-            findNodeAtString('p.sorted', (node) => node is PrefixedIdentifier),
-            excluded),
+        getVariableNameSuggestionsForExpression(null, expression, excluded),
         unorderedEquals(['sortedNodes', 'nodes']));
   }
 
diff --git a/pkg/analysis_server/test/services/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart
index 452fae9..35372e0 100644
--- a/pkg/analysis_server/test/services/index/store/split_store_test.dart
+++ b/pkg/analysis_server/test/services/index/store/split_store_test.dart
@@ -132,7 +132,7 @@
       // no IndexNode
       expect(node, isNull);
       // failed
-      verify(logger.logError2(anyObject, anyObject)).once();
+      verify(logger.logError(anyObject, anyObject)).once();
     });
   }
 
@@ -145,7 +145,7 @@
     return nodeManager.getNode(name).then((IndexNode node) {
       expect(node, isNull);
       // failed
-      verify(logger.logError2(anyString, anyObject)).once();
+      verify(logger.logError(anyString, anyObject)).once();
     });
   }
 
@@ -236,7 +236,7 @@
     // try to put
     return nodeManager.putNode(name, node).then((_) {
       // failed
-      verify(logger.logError2(anyString, anyObject)).once();
+      verify(logger.logError(anyString, anyObject)).once();
     });
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index 17e0b73..bbed045 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -24,6 +24,102 @@
 class InlineLocalTest extends RefactoringTest {
   InlineLocalRefactoringImpl refactoring;
 
+  test_access() {
+    indexTestUnit('''
+main() {
+  int test = 1 + 2;
+  print(test);
+  print(test);
+}
+''');
+    _createRefactoring('test =');
+    expect(refactoring.refactoringName, 'Inline Local Variable');
+    // check initial conditions and access
+    return refactoring.checkInitialConditions().then((_) {
+      expect(refactoring.variableName, 'test');
+      expect(refactoring.referenceCount, 2);
+    });
+  }
+
+  test_bad_selectionMethod() {
+    indexTestUnit(r'''
+main() {
+}
+''');
+    _createRefactoring('main() {');
+    return refactoring.checkInitialConditions().then((status) {
+      _assert_fatalError_selection(status);
+    });
+  }
+
+  test_bad_selectionParameter() {
+    indexTestUnit(r'''
+main(int test) {
+}
+''');
+    _createRefactoring('test) {');
+    return refactoring.checkInitialConditions().then((status) {
+      _assert_fatalError_selection(status);
+    });
+  }
+
+  test_bad_selectionVariable_hasAssignments_1() {
+    indexTestUnit(r'''
+main() {
+  int test = 0;
+  test = 1;
+}
+''');
+    _createRefactoring('test = 0');
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedContextSearch: 'test = 1');
+    });
+  }
+
+  test_bad_selectionVariable_hasAssignments_2() {
+    indexTestUnit(r'''
+main() {
+  int test = 0;
+  test += 1;
+}
+''');
+    _createRefactoring('test = 0');
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedContextSearch: 'test += 1');
+    });
+  }
+
+  test_bad_selectionVariable_notInBlock() {
+    indexTestUnit(r'''
+main() {
+  if (true)
+    int test = 0;
+}
+''');
+    _createRefactoring('test = 0');
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+    });
+  }
+
+  test_bad_selectionVariable_notInitialized() {
+    indexTestUnit(r'''
+main() {
+  int test;
+}
+''');
+    _createRefactoring('test;');
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+    });
+  }
+
   test_OK_cascade_intoCascade() {
     indexTestUnit(r'''
 class A {
@@ -118,24 +214,6 @@
 ''');
   }
 
-  test_OK_intoStringInterpolation_stringInterpolation() {
-    indexTestUnit(r'''
-main() {
-  String a = 'aaa';
-  String b = '$a bbb';
-  String c = '$b ccc';
-}
-''');
-    _createRefactoring('b =');
-    // validate change
-    return assertSuccessfulRefactoring(r'''
-main() {
-  String a = 'aaa';
-  String c = '$a bbb ccc';
-}
-''');
-  }
-
   test_OK_intoStringInterpolation_string_differentQuotes() {
     indexTestUnit(r'''
 main() {
@@ -298,6 +376,24 @@
 ''');
   }
 
+  test_OK_intoStringInterpolation_stringInterpolation() {
+    indexTestUnit(r'''
+main() {
+  String a = 'aaa';
+  String b = '$a bbb';
+  String c = '$b ccc';
+}
+''');
+    _createRefactoring('b =');
+    // validate change
+    return assertSuccessfulRefactoring(r'''
+main() {
+  String a = 'aaa';
+  String c = '$a bbb ccc';
+}
+''');
+  }
+
   /**
    * <p>
    * https://code.google.com/p/dart/issues/detail?id=18587
@@ -368,6 +464,24 @@
 ''');
   }
 
+  test_OK_parenthesis_decrement_intoNegate() {
+    indexTestUnit('''
+main() {
+  var a = 1;
+  var test = --a;
+  var b = -test;
+}
+''');
+    _createRefactoring('test =');
+    // validate change
+    return assertSuccessfulRefactoring('''
+main() {
+  var a = 1;
+  var b = -(--a);
+}
+''');
+  }
+
   test_OK_parenthesis_instanceCreation_intoList() {
     indexTestUnit('''
 class A {}
@@ -386,6 +500,24 @@
 ''');
   }
 
+  test_OK_parenthesis_negate_intoNegate() {
+    indexTestUnit('''
+main() {
+  var a = 1;
+  var test = -a;
+  var b = -test;
+}
+''');
+    _createRefactoring('test =');
+    // validate change
+    return assertSuccessfulRefactoring('''
+main() {
+  var a = 1;
+  var b = -(-a);
+}
+''');
+  }
+
   test_OK_parenthesis_plus_intoMultiply() {
     indexTestUnit('''
 main() {
@@ -420,102 +552,6 @@
 ''');
   }
 
-  test_access() {
-    indexTestUnit('''
-main() {
-  int test = 1 + 2;
-  print(test);
-  print(test);
-}
-''');
-    _createRefactoring('test =');
-    expect(refactoring.refactoringName, 'Inline Local Variable');
-    // check initial conditions and access
-    return refactoring.checkInitialConditions().then((_) {
-      expect(refactoring.variableName, 'test');
-      expect(refactoring.referenceCount, 2);
-    });
-  }
-
-  test_bad_selectionMethod() {
-    indexTestUnit(r'''
-main() {
-}
-''');
-    _createRefactoring('main() {');
-    return refactoring.checkInitialConditions().then((status) {
-      _assert_fatalError_selection(status);
-    });
-  }
-
-  test_bad_selectionParameter() {
-    indexTestUnit(r'''
-main(int test) {
-}
-''');
-    _createRefactoring('test) {');
-    return refactoring.checkInitialConditions().then((status) {
-      _assert_fatalError_selection(status);
-    });
-  }
-
-  test_bad_selectionVariable_hasAssignments_1() {
-    indexTestUnit(r'''
-main() {
-  int test = 0;
-  test = 1;
-}
-''');
-    _createRefactoring('test = 0');
-    return refactoring.checkInitialConditions().then((status) {
-      assertRefactoringStatus(
-          status,
-          RefactoringProblemSeverity.FATAL,
-          expectedContextSearch: 'test = 1');
-    });
-  }
-
-  test_bad_selectionVariable_hasAssignments_2() {
-    indexTestUnit(r'''
-main() {
-  int test = 0;
-  test += 1;
-}
-''');
-    _createRefactoring('test = 0');
-    return refactoring.checkInitialConditions().then((status) {
-      assertRefactoringStatus(
-          status,
-          RefactoringProblemSeverity.FATAL,
-          expectedContextSearch: 'test += 1');
-    });
-  }
-
-  test_bad_selectionVariable_notInBlock() {
-    indexTestUnit(r'''
-main() {
-  if (true)
-    int test = 0;
-}
-''');
-    _createRefactoring('test = 0');
-    return refactoring.checkInitialConditions().then((status) {
-      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
-    });
-  }
-
-  test_bad_selectionVariable_notInitialized() {
-    indexTestUnit(r'''
-main() {
-  int test;
-}
-''');
-    _createRefactoring('test;');
-    return refactoring.checkInitialConditions().then((status) {
-      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
-    });
-  }
-
   void _assert_fatalError_selection(RefactoringStatus status) {
     expect(refactoring.variableName, isNull);
     expect(refactoring.referenceCount, 0);
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index d665de6..5a87e76 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -998,6 +998,85 @@
 ''');
   }
 
+  test_noArgument_named_hasDefault() {
+    verifyNoTestUnitErrors = false;
+    indexTestUnit(r'''
+test({a: 42}) {
+  print(a);
+}
+main() {
+  test();
+}
+''');
+    _createRefactoring('test(');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print(42);
+}
+''');
+  }
+
+  test_noArgument_positional_hasDefault() {
+    verifyNoTestUnitErrors = false;
+    indexTestUnit(r'''
+test([a = 42]) {
+  print(a);
+}
+main() {
+  test();
+}
+''');
+    _createRefactoring('test(');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print(42);
+}
+''');
+  }
+
+  test_noArgument_positional_noDefault() {
+    verifyNoTestUnitErrors = false;
+    indexTestUnit(r'''
+test([a]) {
+  print(a);
+}
+main() {
+  test();
+}
+''');
+    _createRefactoring('test(');
+    // validate change
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  print(null);
+}
+''');
+  }
+
+  test_noArgument_required() {
+    verifyNoTestUnitErrors = false;
+    indexTestUnit(r'''
+test(a) {
+  print(a);
+}
+main() {
+  test();
+}
+''');
+    _createRefactoring('test();');
+    // error
+    return refactoring.checkAllConditions().then((status) {
+      var location = new SourceRange(findOffset('test();'), 'test()'.length);
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: 'No argument for the parameter "a".',
+          expectedContextRange: location);
+    });
+  }
+
   test_reference_expressionBody() {
     indexTestUnit(r'''
 String message() => 'Hello, World!';
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 84a34fe..f78c21a 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -173,9 +173,6 @@
   }
 
   test_checkFinalConditions_shadowsInSubClass_notImportedLib() {
-    indexTestUnit('''
-class Test {}
-''');
     indexUnit('/lib.dart', '''
 library my.lib;
 class A {
@@ -187,6 +184,9 @@
   }",
 }
 ''');
+    indexTestUnit('''
+class Test {}
+''');
     createRenameRefactoringAtString('Test {}');
     // check status
     refactoring.newName = 'NewName';
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index da50b3c..70ee2b2 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1879,26 +1879,35 @@
         </p>
         <enum>
           <value><code>ARGUMENT_LIST</code></value>
-          <value><code>CLASS</code></value>
-          <value><code>CLASS_ALIAS</code></value>
-          <value><code>CONSTRUCTOR</code></value>
-          <value><code>FIELD</code></value>
-          <value><code>FUNCTION</code></value>
-          <value><code>FUNCTION_TYPE_ALIAS</code></value>
-          <value><code>GETTER</code></value>
           <value><code>IMPORT</code></value>
-          <value><code>KEYWORD</code></value>
-          <value><code>LABEL</code></value>
-          <value><code>LIBRARY_PREFIX</code></value>
-          <value><code>LOCAL_VARIABLE</code></value>
-          <value><code>METHOD</code></value>
-          <value><code>METHOD_NAME</code></value>
+          <value>
+            <code>IDENTIFIER</code>
+            <p>
+              The element identifier should be inserted at the completion location.
+              For example "someMethod" in import 'myLib.dart' show someMethod; .
+              For suggestions of this kind, the element attribute is defined 
+              and the completion field is the element's identifier.
+            </p>
+          </value>
+          <value>
+            <code>INVOCATION</code>
+            <p>
+              The element is being invoked at the completion location.
+              For example, "someMethod" in x.someMethod(); .
+              For suggestions of this kind, the element attribute is defined 
+              and the completion field is the element's identifier.
+            </p>
+          </value>
+          <value>
+            <code>KEYWORD</code>
+            <p>
+              A keyword is being suggested.
+              For suggestions of this kind, the completion is the keyword.
+            </p>
+          </value>
           <value><code>NAMED_ARGUMENT</code></value>
           <value><code>OPTIONAL_ARGUMENT</code></value>
           <value><code>PARAMETER</code></value>
-          <value><code>SETTER</code></value>
-          <value><code>TOP_LEVEL_VARIABLE</code></value>
-          <value><code>TYPE_PARAMETER</code></value>
         </enum>
       </type>
       <type name="Element">
diff --git a/pkg/analyzer/bin/coverage.dart b/pkg/analyzer/bin/coverage.dart
index 30efc6c..32194c6 100644
--- a/pkg/analyzer/bin/coverage.dart
+++ b/pkg/analyzer/bin/coverage.dart
@@ -78,7 +78,7 @@
 
 
 printUsage([var description = 'Code coverage tool for Dart.']) {
-  var usage = _argParser.getUsage();
+  var usage = _argParser.usage;
   print('$description\n');
   print('Usage: coverage [options] <script>\n');
   print('$usage\n');
diff --git a/pkg/analyzer/bin/formatter.dart b/pkg/analyzer/bin/formatter.dart
index c4c689e..28436f6 100755
--- a/pkg/analyzer/bin/formatter.dart
+++ b/pkg/analyzer/bin/formatter.dart
@@ -227,7 +227,7 @@
         ..write('\n\n')
         ..write('Usage: $BINARY_NAME [flags] [path...]\n\n')
         ..write('Supported flags are:\n')
-        ..write('${argParser.getUsage()}\n\n');
+        ..write('${argParser.usage}\n\n');
   _log(buffer.toString());
 }
 
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index f6e51e7..0e31c41 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -276,9 +276,9 @@
   /**
    * Generates a string displaying usage information for the defined options.
    *
-   * See [ArgParser.getUsage()].
+   * See [ArgParser.usage].
    */
-  String getUsage() => _parser.getUsage();
+  String getUsage() => _parser.usage;
 
   /**
    * Parses [args], a list of command-line arguments, matches them against the
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 4de0a6a1..25bac6e 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -24,6 +24,7 @@
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/source/package_map_provider.dart';
 import 'package:analyzer/source/pub_package_map_provider.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 
 /**
  * The maximum number of sources for which AST structures should be kept in the cache.
@@ -67,7 +68,8 @@
   final HashMap<Source, AnalysisErrorInfo> sourceErrorsMap =
       new HashMap<Source, AnalysisErrorInfo>();
 
-  AnalyzerImpl(this.sourcePath, this.options, this.startTime) {
+  AnalyzerImpl(String sourcePath, this.options, this.startTime)
+      : sourcePath = _normalizeSourcePath(sourcePath) {
     if (sdk == null) {
       sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
     }
@@ -111,6 +113,13 @@
     prepareAnalysisContext(sourceFile, librarySource);
   }
 
+  /**
+   * Convert [sourcePath] into an absolute path.
+   */
+  static String _normalizeSourcePath(String sourcePath) {
+    return new File(sourcePath).absolute.path;
+  }
+
   /// The sync version of analysis.
   ErrorSeverity _analyzeSync(int printMode) {
     // don't try to analyze parts
@@ -411,24 +420,30 @@
   StdLogger(this.log);
 
   @override
-  void logError(String message) {
+  void logError(String message, [CaughtException exception]) {
     stderr.writeln(message);
-  }
-
-  @override
-  void logError2(String message, Exception exception) {
-    stderr.writeln(message);
-  }
-
-  @override
-  void logInformation(String message) {
-    if (log) {
-      stdout.writeln(message);
+    if (exception != null) {
+      stderr.writeln(exception);
     }
   }
 
   @override
-  void logInformation2(String message, Exception exception) {
+  void logError2(String message, Object exception) {
+    stderr.writeln(message);
+  }
+
+  @override
+  void logInformation(String message, [CaughtException exception]) {
+    if (log) {
+      stdout.writeln(message);
+      if (exception != null) {
+        stderr.writeln(exception);
+      }
+    }
+  }
+
+  @override
+  void logInformation2(String message, Object exception) {
     if (log) {
       stdout.writeln(message);
     }
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index f5506fb..ddc9a1b 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -801,7 +801,9 @@
       } else {
         message = "The right-hand size is null";
       }
-      AnalysisEngine.instance.logger.logError2(message, new JavaException(message));
+      AnalysisEngine.instance.logger.logError(
+          message,
+          new CaughtException(new AnalysisException(message), null));
     }
     this._leftHandSide = becomeParentOf(leftHandSide);
     this._rightHandSide = becomeParentOf(rightHandSide);
@@ -1390,7 +1392,7 @@
           cloneToken(node.leftParenthesis),
           cloneNode(node.identifier),
           cloneToken(node.inKeyword),
-          cloneNode(node.iterator),
+          cloneNode(node.iterable),
           cloneToken(node.rightParenthesis),
           cloneNode(node.body));
     }
@@ -1400,7 +1402,7 @@
         cloneToken(node.leftParenthesis),
         cloneNode(loopVariable),
         cloneToken(node.inKeyword),
-        cloneNode(node.iterator),
+        cloneNode(node.iterable),
         cloneToken(node.rightParenthesis),
         cloneNode(node.body));
   }
@@ -2157,7 +2159,7 @@
   @override
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement other = this._other as ForEachStatement;
-    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.loopVariable, other.loopVariable) && isEqualTokens(node.inKeyword, other.inKeyword) && isEqualNodes(node.iterator, other.iterator) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
+    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.loopVariable, other.loopVariable) && isEqualTokens(node.inKeyword, other.inKeyword) && isEqualNodes(node.iterable, other.iterable) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
   }
 
   @override
@@ -7518,7 +7520,7 @@
   /**
    * The expression evaluated to produce the iterator.
    */
-  Expression _iterator;
+  Expression _iterable;
 
   /**
    * The right parenthesis.
@@ -7543,7 +7545,7 @@
    */
   ForEachStatement.con1(this.awaitKeyword, this.forKeyword, this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
     this._loopVariable = becomeParentOf(loopVariable);
-    this._iterator = becomeParentOf(iterator);
+    this._iterable = becomeParentOf(iterator);
     this._body = becomeParentOf(body);
   }
 
@@ -7560,7 +7562,7 @@
    */
   ForEachStatement.con2(this.awaitKeyword, this.forKeyword, this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
     this._identifier = becomeParentOf(identifier);
-    this._iterator = becomeParentOf(iterator);
+    this._iterable = becomeParentOf(iterator);
     this._body = becomeParentOf(body);
   }
 
@@ -7592,7 +7594,7 @@
    *
    * @return the expression evaluated to produce the iterator
    */
-  Expression get iterator => _iterator;
+  Expression get iterable => _iterable;
 
   /**
    * Return the declaration of the loop variable, or `null` if the loop variable is a simple
@@ -7625,8 +7627,8 @@
    *
    * @param expression the expression evaluated to produce the iterator
    */
-  void set iterator(Expression expression) {
-    _iterator = becomeParentOf(expression);
+  void set iterable(Expression expression) {
+    _iterable = becomeParentOf(expression);
   }
 
   /**
@@ -7642,7 +7644,7 @@
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_loopVariable, visitor);
     safelyVisitChild(_identifier, visitor);
-    safelyVisitChild(_iterator, visitor);
+    safelyVisitChild(_iterable, visitor);
     safelyVisitChild(_body, visitor);
   }
 }
@@ -9879,9 +9881,9 @@
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
-      return new ForEachStatement.con2(_mapToken(node.awaitKeyword), _mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.identifier), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+      return new ForEachStatement.con2(_mapToken(node.awaitKeyword), _mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(node.identifier), _mapToken(node.inKeyword), _cloneNode(node.iterable), _mapToken(node.rightParenthesis), _cloneNode(node.body));
     }
-    return new ForEachStatement.con1(_mapToken(node.awaitKeyword), _mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(loopVariable), _mapToken(node.inKeyword), _cloneNode(node.iterator), _mapToken(node.rightParenthesis), _cloneNode(node.body));
+    return new ForEachStatement.con1(_mapToken(node.awaitKeyword), _mapToken(node.forKeyword), _mapToken(node.leftParenthesis), _cloneNode(loopVariable), _mapToken(node.inKeyword), _cloneNode(node.iterable), _mapToken(node.rightParenthesis), _cloneNode(node.body));
   }
 
   @override
@@ -12443,8 +12445,10 @@
       node.accept(this);
     } on NodeLocator_NodeFoundException catch (exception) {
       // A node with the right source position was found.
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset ($_startOffset - $_endOffset)", exception);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Unable to locate element at offset ($_startOffset - $_endOffset)",
+          new CaughtException(exception, stackTrace));
       return null;
     }
     return _foundNode;
@@ -12463,10 +12467,12 @@
     try {
       node.visitChildren(this);
     } on NodeLocator_NodeFoundException catch (exception) {
-      throw exception;
-    } catch (exception) {
+      rethrow;
+    } catch (exception, stackTrace) {
       // Ignore the exception and proceed in order to visit the rest of the structure.
-      AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
+      AnalysisEngine.instance.logger.logInformation(
+          "Exception caught while traversing an AST structure.",
+          new CaughtException(exception, stackTrace));
     }
     if (start <= _startOffset && _endOffset <= end) {
       _foundNode = node;
@@ -12939,8 +12945,8 @@
     } else if (identical(node.identifier, _oldNode)) {
       node.identifier = _newNode as SimpleIdentifier;
       return true;
-    } else if (identical(node.iterator, _oldNode)) {
-      node.iterator = _newNode as Expression;
+    } else if (identical(node.iterable, _oldNode)) {
+      node.iterable = _newNode as Expression;
       return true;
     } else if (identical(node.body, _oldNode)) {
       node.body = _newNode as Statement;
@@ -16348,6 +16354,12 @@
         return false;
       }
     }
+    if (parent is ForEachStatement) {
+      ForEachStatement stmt = parent as ForEachStatement;
+      if (identical(stmt.identifier, target)) {
+        return false;
+      }
+    }
     return true;
   }
 
@@ -16387,6 +16399,8 @@
       return true;
     } else if (parent is AssignmentExpression) {
       return identical((parent as AssignmentExpression).leftHandSide, target);
+    } else if (parent is ForEachStatement) {
+      return identical((parent as ForEachStatement).identifier, target);
     }
     return false;
   }
@@ -16452,7 +16466,9 @@
    */
   Element _returnOrReportElement(AstNode parent, bool isValid, Element element) {
     if (!isValid) {
-      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType} to a ${element.runtimeType}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation(
+          "Internal error: attempting to set the name of a ${parent.runtimeType} to a ${element.runtimeType}",
+          new CaughtException(new AnalysisException(), null));
       return null;
     }
     return element;
@@ -17765,7 +17781,7 @@
       _visitNode(loopVariable);
     }
     _writer.print(" in ");
-    _visitNode(node.iterator);
+    _visitNode(node.iterable);
     _writer.print(") ");
     _visitNode(node.body);
     return null;
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index ee68be8..21f12f6 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -74,6 +74,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (value == null) {
       return UNKNOWN_VALUE;
     }
@@ -1253,7 +1258,8 @@
             if (library.isDartCore) {
               DartObjectImpl leftArgument = arguments[0].accept(this);
               DartObjectImpl rightArgument = arguments[1].accept(this);
-              return _dartObjectComputer.equalEqual(node, leftArgument, rightArgument);
+              return _dartObjectComputer.isIdentical(node, leftArgument,
+                  rightArgument);
             }
           }
         }
@@ -1727,6 +1733,18 @@
     return null;
   }
 
+  DartObjectImpl isIdentical(Expression node, DartObjectImpl leftOperand,
+                             DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.isIdentical(_typeProvider, rightOperand);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node, []);
+      }
+    }
+    return null;
+  }
+
   DartObjectImpl lessThan(BinaryExpression node, DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
       try {
@@ -2119,6 +2137,21 @@
   DartObjectImpl integerDivide(TypeProvider typeProvider, DartObjectImpl rightOperand) => new DartObjectImpl(typeProvider.intType, _state.integerDivide(rightOperand._state));
 
   /**
+   * Return the result of invoking the identical function on this object with
+   * the given argument.
+   *
+   * @param typeProvider the type provider used to find known types
+   * @param rightOperand the right-hand operand of the operation
+   * @return the result of invoking the identical function on this object with
+   *         the given argument
+   */
+  DartObjectImpl isIdentical(TypeProvider typeProvider,
+                             DartObjectImpl rightOperand) {
+    return new DartObjectImpl(typeProvider.boolType,
+        _state.isIdentical(rightOperand._state));
+  }
+
+  /**
    * Return `true` if this object represents an object whose type is 'bool'.
    *
    * @return `true` if this object represents a boolean value
@@ -2517,6 +2550,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (value == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -2824,6 +2862,11 @@
   }
 
   @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
   String get typeName => "dynamic";
 
   @override
@@ -3080,6 +3123,11 @@
 
   @override
   BoolState equalEqual(InstanceState rightOperand) {
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (_element == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -3138,6 +3186,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (rightOperand is DynamicState) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -3376,6 +3429,16 @@
   }
 
   /**
+   * Return the result of invoking the identical function on this object with
+   * the given argument.
+   *
+   * @param rightOperand the right-hand operand of the operation
+   * @return the result of invoking the identical function on this object with
+   *         the given argument
+   */
+  BoolState isIdentical(InstanceState rightOperand);
+
+  /**
    * Return `true` if this object represents an object whose type is 'bool'.
    *
    * @return `true` if this object represents a boolean value
@@ -3760,6 +3823,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (value == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4080,6 +4148,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (rightOperand is DynamicState) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4168,6 +4241,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (rightOperand is DynamicState) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4252,6 +4330,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (rightOperand is DynamicState) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4314,6 +4397,11 @@
   }
 
   @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
   bool operator ==(Object object) => object is NumState;
 
   @override
@@ -4539,6 +4627,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (value == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4612,6 +4705,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (value == null) {
       return BoolState.UNKNOWN_VALUE;
     }
@@ -4673,6 +4771,11 @@
   @override
   BoolState equalEqual(InstanceState rightOperand) {
     assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
     if (_element == null) {
       return BoolState.UNKNOWN_VALUE;
     }
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 91d8575..6025f07 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -8166,7 +8166,9 @@
       InterfaceType futureType = futureElement.type;
       return futureType.substitute4(<DartType> [DynamicTypeImpl.instance]);
     } on AnalysisException catch (exception, stackTrace) {
-      AnalysisEngine.instance.logger.logError2("Could not build the element model for dart:async", new CaughtException(exception, stackTrace));
+      AnalysisEngine.instance.logger.logError(
+          "Could not build the element model for dart:async",
+          new CaughtException(exception, stackTrace));
       return VoidTypeImpl.instance;
     }
   }
@@ -10034,6 +10036,11 @@
     List<DartType> argumentTypes = definingType.typeArguments;
     if (baseAccessor != null && argumentTypes.length != 0) {
       FunctionType baseType = baseAccessor.type;
+      if (baseType == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            'Type of $baseAccessor is null in PropertyAccessorMember._isChangedByTypeSubstitution');
+        return false;
+      }
       List<DartType> parameterTypes = definingType.element.type.typeArguments;
       FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
       if (baseType != substitutedType) {
@@ -10677,16 +10684,31 @@
 }
 
 /**
- * The abstract class `TypeImpl` implements the behavior common to objects representing the
- * declared type of elements in the element model.
+ * The abstract class `TypeImpl` implements the behavior common to objects
+ * representing the declared type of elements in the element model.
  */
 abstract class TypeImpl implements DartType {
-  static bool equalArrays(List<DartType> typeArgs1, List<DartType> typeArgs2, Set<ElementPair> visitedElementPairs) {
-    if (typeArgs1.length != typeArgs2.length) {
+  /**
+   * Return `true` if corresponding elements of the [first] and [second] lists
+   * of type arguments are all equal. Use the set of [visitedElementPairs] to
+   * prevent infinite loops when the types are recursively defined.
+   */
+  static bool equalArrays(List<DartType> first, List<DartType> second,
+      Set<ElementPair> visitedElementPairs) {
+    if (first.length != second.length) {
       return false;
     }
-    for (int i = 0; i < typeArgs1.length; i++) {
-      if (!(typeArgs1[i] as TypeImpl).internalEquals(typeArgs2[i], visitedElementPairs)) {
+    for (int i = 0; i < first.length; i++) {
+      if (first[i] == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            'Found null type argument in TypeImpl.equalArrays');
+        return second[i] == null;
+      } else if (second[i] == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            'Found null type argument in TypeImpl.equalArrays');
+        return false;
+      }
+      if (!(first[i] as TypeImpl).internalEquals(second[i], visitedElementPairs)) {
         return false;
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
new file mode 100644
index 0000000..04d3684
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -0,0 +1,2637 @@
+// Copyright (c) 2014, 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.
+
+library engine.resolver.element_resolver;
+
+import 'dart:collection';
+
+import 'error.dart';
+import 'scanner.dart' as sc;
+import 'utilities_dart.dart';
+import 'ast.dart';
+import 'element.dart';
+import 'engine.dart';
+import 'resolver.dart';
+
+/**
+ * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]
+ * to resolve references within the AST structure to the elements being referenced. The requirements
+ * for the element resolver are:
+ * <ol>
+ * * Every [SimpleIdentifier] should be resolved to the element to which it refers.
+ * Specifically:
+ * * An identifier within the declaration of that name should resolve to the element being
+ * declared.
+ * * An identifier denoting a prefix should resolve to the element representing the import that
+ * defines the prefix (an [ImportElement]).
+ * * An identifier denoting a variable should resolve to the element representing the variable (a
+ * [VariableElement]).
+ * * An identifier denoting a parameter should resolve to the element representing the parameter
+ * (a [ParameterElement]).
+ * * An identifier denoting a field should resolve to the element representing the getter or
+ * setter being invoked (a [PropertyAccessorElement]).
+ * * An identifier denoting the name of a method or function being invoked should resolve to the
+ * element representing the method or function (a [ExecutableElement]).
+ * * An identifier denoting a label should resolve to the element representing the label (a
+ * [LabelElement]).
+ * The identifiers within directives are exceptions to this rule and are covered below.
+ * * Every node containing a token representing an operator that can be overridden (
+ * [BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to
+ * the element representing the method invoked by that operator (a [MethodElement]).
+ * * Every [FunctionExpressionInvocation] should resolve to the element representing the
+ * function being invoked (a [FunctionElement]). This will be the same element as that to
+ * which the name is resolved if the function has a name, but is provided for those cases where an
+ * unnamed function is being invoked.
+ * * Every [LibraryDirective] and [PartOfDirective] should resolve to the element
+ * representing the library being specified by the directive (a [LibraryElement]) unless, in
+ * the case of a part-of directive, the specified library does not exist.
+ * * Every [ImportDirective] and [ExportDirective] should resolve to the element
+ * representing the library being specified by the directive unless the specified library does not
+ * exist (an [ImportElement] or [ExportElement]).
+ * * The identifier representing the prefix in an [ImportDirective] should resolve to the
+ * element representing the prefix (a [PrefixElement]).
+ * * The identifiers in the hide and show combinators in [ImportDirective]s and
+ * [ExportDirective]s should resolve to the elements that are being hidden or shown,
+ * respectively, unless those names are not defined in the specified library (or the specified
+ * library does not exist).
+ * * Every [PartDirective] should resolve to the element representing the compilation unit
+ * being specified by the string unless the specified compilation unit does not exist (a
+ * [CompilationUnitElement]).
+ * </ol>
+ * Note that AST nodes that would represent elements that are not defined are not resolved to
+ * anything. This includes such things as references to undeclared variables (which is an error) and
+ * names in hide and show combinators that are not defined in the imported library (which is not an
+ * error).
+ */
+class ElementResolver extends SimpleAstVisitor<Object> {
+  /**
+   * Checks whether the given expression is a reference to a class. If it is then the
+   * [ClassElement] is returned, otherwise `null` is returned.
+   *
+   * @param expression the expression to evaluate
+   * @return the element representing the class
+   */
+  static ClassElementImpl getTypeReference(Expression expression) {
+    if (expression is Identifier) {
+      Element staticElement = expression.staticElement;
+      if (staticElement is ClassElementImpl) {
+        return staticElement;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Helper function for `maybeMergeExecutableElements` that does the actual merging.
+   *
+   * @param elementArrayToMerge non-empty array of elements to merge.
+   * @return
+   */
+  static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
+    // Flatten methods structurally. Based on
+    // [InheritanceManager.computeMergedExecutableElement] and
+    // [InheritanceManager.createSyntheticExecutableElement].
+    //
+    // However, the approach we take here is much simpler, but expected to work
+    // well in the common case. It degrades gracefully in the uncommon case,
+    // by computing the type [dynamic] for the method, preventing any
+    // hints from being generated (TODO: not done yet).
+    //
+    // The approach is: we require that each [ExecutableElement] has the
+    // same shape: the same number of required, optional positional, and optional named
+    // parameters, in the same positions, and with the named parameters in the
+    // same order. We compute a type by unioning pointwise.
+    ExecutableElement e_0 = elementArrayToMerge[0];
+    List<ParameterElement> ps_0 = e_0.parameters;
+    List<ParameterElementImpl> ps_out = new List<ParameterElementImpl>(ps_0.length);
+    for (int j = 0; j < ps_out.length; j++) {
+      ps_out[j] = new ParameterElementImpl(ps_0[j].name, 0);
+      ps_out[j].synthetic = true;
+      ps_out[j].type = ps_0[j].type;
+      ps_out[j].parameterKind = ps_0[j].parameterKind;
+    }
+    DartType r_out = e_0.returnType;
+    for (int i = 1; i < elementArrayToMerge.length; i++) {
+      ExecutableElement e_i = elementArrayToMerge[i];
+      r_out = UnionTypeImpl.union([r_out, e_i.returnType]);
+      List<ParameterElement> ps_i = e_i.parameters;
+      // Each function must have the same number of params.
+      if (ps_0.length != ps_i.length) {
+        return null;
+        // TODO (collinsn): return an element representing [dynamic] here instead.
+      } else {
+        // Each function must have the same kind of params, with the same names,
+        // in the same order.
+        for (int j = 0; j < ps_i.length; j++) {
+          if (ps_0[j].parameterKind != ps_i[j].parameterKind || !identical(ps_0[j].name, ps_i[j].name)) {
+            return null;
+          } else {
+            // The output parameter type is the union of the input parameter types.
+            ps_out[j].type = UnionTypeImpl.union([ps_out[j].type, ps_i[j].type]);
+          }
+        }
+      }
+    }
+    // TODO (collinsn): this code should work for functions and methods,
+    // so we may want [FunctionElementImpl]
+    // instead here in some cases? And then there are constructors and property accessors.
+    // Maybe the answer is to create a new subclass of [ExecutableElementImpl] which
+    // is used for merged executable elements, in analogy with [MultiplyInheritedMethodElementImpl]
+    // and [MultiplyInheritedPropertyAcessorElementImpl].
+    ExecutableElementImpl e_out = new MethodElementImpl(e_0.name, 0);
+    e_out.synthetic = true;
+    e_out.returnType = r_out;
+    e_out.parameters = ps_out;
+    e_out.type = new FunctionTypeImpl.con1(e_out);
+    // Get NPE in [toString()] w/o this.
+    e_out.enclosingElement = e_0.enclosingElement;
+    return e_out;
+  }
+
+  /**
+   * Return `true` if the given identifier is the return type of a constructor declaration.
+   *
+   * @return `true` if the given identifier is the return type of a constructor declaration.
+   */
+  static bool _isConstructorReturnType(SimpleIdentifier identifier) {
+    AstNode parent = identifier.parent;
+    if (parent is ConstructorDeclaration) {
+      return identical(parent.returnType, identifier);
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given identifier is the return type of a factory constructor.
+   *
+   * @return `true` if the given identifier is the return type of a factory constructor
+   *         declaration.
+   */
+  static bool _isFactoryConstructorReturnType(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is ConstructorDeclaration) {
+      ConstructorDeclaration constructor = parent;
+      return identical(constructor.returnType, node) && constructor.factoryKeyword != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given 'super' expression is used in a valid context.
+   *
+   * @param node the 'super' expression to analyze
+   * @return `true` if the 'super' expression is in a valid context
+   */
+  static bool _isSuperInValidContext(SuperExpression node) {
+    for (AstNode n = node; n != null; n = n.parent) {
+      if (n is CompilationUnit) {
+        return false;
+      }
+      if (n is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = n as ConstructorDeclaration;
+        return constructor.factoryKeyword == null;
+      }
+      if (n is ConstructorFieldInitializer) {
+        return false;
+      }
+      if (n is MethodDeclaration) {
+        MethodDeclaration method = n as MethodDeclaration;
+        return !method.isStatic;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return a method representing the merge of the given elements. The type of the merged element is
+   * the component-wise union of the types of the given elements. If not all input elements have the
+   * same shape then [null] is returned.
+   *
+   * @param elements the `ExecutableElement`s to merge
+   * @return an `ExecutableElement` representing the merge of `elements`
+   */
+  static ExecutableElement _maybeMergeExecutableElements(Set<ExecutableElement> elements) {
+    List<ExecutableElement> elementArrayToMerge = new List.from(elements);
+    if (elementArrayToMerge.length == 0) {
+      return null;
+    } else if (elementArrayToMerge.length == 1) {
+      // If all methods are equal, don't bother building a new one.
+      return elementArrayToMerge[0];
+    } else {
+      return _computeMergedExecutableElement(elementArrayToMerge);
+    }
+  }
+
+  /**
+   * The resolver driving this participant.
+   */
+  final ResolverVisitor _resolver;
+
+  /**
+   * The element for the library containing the compilation unit being visited.
+   */
+  LibraryElement _definingLibrary;
+
+  /**
+   * A flag indicating whether we should generate hints.
+   */
+  bool _enableHints = false;
+
+  /**
+   * The type representing the type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the type 'type'.
+   */
+  DartType _typeType;
+
+  /**
+   * A utility class for the resolver to answer the question of "what are my subtypes?".
+   */
+  SubtypeManager _subtypeManager;
+
+  /**
+   * The object keeping track of which elements have had their types promoted.
+   */
+  TypePromotionManager _promoteManager;
+
+  /**
+   * Initialize a newly created visitor to resolve the nodes in a compilation unit.
+   *
+   * @param resolver the resolver driving this participant
+   */
+  ElementResolver(this._resolver) {
+    this._definingLibrary = _resolver.definingLibrary;
+    AnalysisOptions options = _definingLibrary.context.analysisOptions;
+    _enableHints = options.hint;
+    _dynamicType = _resolver.typeProvider.dynamicType;
+    _typeType = _resolver.typeProvider.typeType;
+    _subtypeManager = new SubtypeManager();
+    _promoteManager = _resolver.promoteManager;
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType != sc.TokenType.EQ) {
+      operatorType = _operatorFromCompoundAssignment(operatorType);
+      Expression leftHandSide = node.leftHandSide;
+      if (leftHandSide != null) {
+        String methodName = operatorType.lexeme;
+        DartType staticType = _getStaticType(leftHandSide);
+        MethodElement staticMethod = _lookUpMethod(leftHandSide, staticType, methodName);
+        node.staticElement = staticMethod;
+        DartType propagatedType = _getPropagatedType(leftHandSide);
+        MethodElement propagatedMethod = _lookUpMethod(leftHandSide, propagatedType, methodName);
+        node.propagatedElement = propagatedMethod;
+        if (_shouldReportMissingMember(staticType, staticMethod)) {
+          _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
+        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+          _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    if (operator.isUserDefinableOperator) {
+      Expression leftOperand = node.leftOperand;
+      if (leftOperand != null) {
+        String methodName = operator.lexeme;
+        DartType staticType = _getStaticType(leftOperand);
+        MethodElement staticMethod = _lookUpMethod(leftOperand, staticType, methodName);
+        node.staticElement = staticMethod;
+        DartType propagatedType = _getPropagatedType(leftOperand);
+        MethodElement propagatedMethod = _lookUpMethod(leftOperand, propagatedType, methodName);
+        node.propagatedElement = propagatedMethod;
+        if (_shouldReportMissingMember(staticType, staticMethod)) {
+          _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+          _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    _lookupLabel(node, node.label);
+    return null;
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitCommentReference(CommentReference node) {
+    Identifier identifier = node.identifier;
+    if (identifier is SimpleIdentifier) {
+      SimpleIdentifier simpleIdentifier = identifier;
+      Element element = _resolveSimpleIdentifier(simpleIdentifier);
+      if (element == null) {
+        //
+        // This might be a reference to an imported name that is missing the prefix.
+        //
+        element = _findImportWithoutPrefix(simpleIdentifier);
+        if (element is MultiplyDefinedElement) {
+          // TODO(brianwilkerson) Report this error?
+          element = null;
+        }
+      }
+      if (element == null) {
+        // TODO(brianwilkerson) Report this error?
+        //        resolver.reportError(
+        //            StaticWarningCode.UNDEFINED_IDENTIFIER,
+        //            simpleIdentifier,
+        //            simpleIdentifier.getName());
+      } else {
+        if (element.library == null || element.library != _definingLibrary) {
+          // TODO(brianwilkerson) Report this error?
+        }
+        simpleIdentifier.staticElement = element;
+        if (node.newKeyword != null) {
+          if (element is ClassElement) {
+            ConstructorElement constructor = (element as ClassElement).unnamedConstructor;
+            if (constructor == null) {
+              // TODO(brianwilkerson) Report this error.
+            } else {
+              simpleIdentifier.staticElement = constructor;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        }
+      }
+    } else if (identifier is PrefixedIdentifier) {
+      PrefixedIdentifier prefixedIdentifier = identifier;
+      SimpleIdentifier prefix = prefixedIdentifier.prefix;
+      SimpleIdentifier name = prefixedIdentifier.identifier;
+      Element element = _resolveSimpleIdentifier(prefix);
+      if (element == null) {
+        //        resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, prefix, prefix.getName());
+      } else {
+        if (element is PrefixElement) {
+          prefix.staticElement = element;
+          // TODO(brianwilkerson) Report this error?
+          element = _resolver.nameScope.lookup(identifier, _definingLibrary);
+          name.staticElement = element;
+          return null;
+        }
+        LibraryElement library = element.library;
+        if (library == null) {
+          // TODO(brianwilkerson) We need to understand how the library could ever be null.
+          AnalysisEngine.instance.logger.logError("Found element with null library: ${element.name}");
+        } else if (library != _definingLibrary) {
+          // TODO(brianwilkerson) Report this error.
+        }
+        name.staticElement = element;
+        if (node.newKeyword == null) {
+          if (element is ClassElement) {
+            Element memberElement = _lookupGetterOrMethod((element as ClassElement).type, name.name);
+            if (memberElement == null) {
+              memberElement = (element as ClassElement).getNamedConstructor(name.name);
+              if (memberElement == null) {
+                memberElement = _lookUpSetter(prefix, (element as ClassElement).type, name.name);
+              }
+            }
+            if (memberElement == null) {
+              //              reportGetterOrSetterNotFound(prefixedIdentifier, name, element.getDisplayName());
+            } else {
+              name.staticElement = memberElement;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        } else {
+          if (element is ClassElement) {
+            ConstructorElement constructor = (element as ClassElement).getNamedConstructor(name.name);
+            if (constructor == null) {
+              // TODO(brianwilkerson) Report this error.
+            } else {
+              name.staticElement = constructor;
+            }
+          } else {
+            // TODO(brianwilkerson) Report this error.
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    super.visitConstructorDeclaration(node);
+    ConstructorElement element = node.element;
+    if (element is ConstructorElementImpl) {
+      ConstructorElementImpl constructorElement = element;
+      ConstructorName redirectedNode = node.redirectedConstructor;
+      if (redirectedNode != null) {
+        // set redirected factory constructor
+        ConstructorElement redirectedElement = redirectedNode.staticElement;
+        constructorElement.redirectedConstructor = redirectedElement;
+      } else {
+        // set redirected generative constructor
+        for (ConstructorInitializer initializer in node.initializers) {
+          if (initializer is RedirectingConstructorInvocation) {
+            ConstructorElement redirectedElement = initializer.staticElement;
+            constructorElement.redirectedConstructor = redirectedElement;
+          }
+        }
+      }
+      _setMetadata(constructorElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    SimpleIdentifier fieldName = node.fieldName;
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    FieldElement fieldElement = enclosingClass.getField(fieldName.name);
+    fieldName.staticElement = fieldElement;
+    return null;
+  }
+
+  @override
+  Object visitConstructorName(ConstructorName node) {
+    DartType type = node.type.type;
+    if (type != null && type.isDynamic) {
+      return null;
+    } else if (type is! InterfaceType) {
+      // TODO(brianwilkerson) Report these errors.
+      //      ASTNode parent = node.getParent();
+      //      if (parent instanceof InstanceCreationExpression) {
+      //        if (((InstanceCreationExpression) parent).isConst()) {
+      //          // CompileTimeErrorCode.CONST_WITH_NON_TYPE
+      //        } else {
+      //          // StaticWarningCode.NEW_WITH_NON_TYPE
+      //        }
+      //      } else {
+      //        // This is part of a redirecting factory constructor; not sure which error code to use
+      //      }
+      return null;
+    }
+    // look up ConstructorElement
+    ConstructorElement constructor;
+    SimpleIdentifier name = node.name;
+    InterfaceType interfaceType = type as InterfaceType;
+    if (name == null) {
+      constructor = interfaceType.lookUpConstructor(null, _definingLibrary);
+    } else {
+      constructor = interfaceType.lookUpConstructor(name.name, _definingLibrary);
+      name.staticElement = constructor;
+    }
+    node.staticElement = constructor;
+    return null;
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    _lookupLabel(node, node.label);
+    return null;
+  }
+
+  @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      // The element is null when the URI is invalid
+      // TODO(brianwilkerson) Figure out whether the element can ever be something other than an
+      // ExportElement
+      _resolveCombinators(exportElement.exportedLibrary, node.combinators);
+      _setMetadata(exportElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return super.visitFieldFormalParameter(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    // TODO(brianwilkerson) Can we ever resolve the function being invoked?
+    Expression expression = node.function;
+    if (expression is FunctionExpression) {
+      FunctionExpression functionExpression = expression;
+      ExecutableElement functionElement = functionExpression.element;
+      ArgumentList argumentList = node.argumentList;
+      List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, functionElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    SimpleIdentifier prefixNode = node.prefix;
+    if (prefixNode != null) {
+      String prefixName = prefixNode.name;
+      for (PrefixElement prefixElement in _definingLibrary.prefixes) {
+        if (prefixElement.displayName == prefixName) {
+          prefixNode.staticElement = prefixElement;
+          break;
+        }
+      }
+    }
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      // The element is null when the URI is invalid
+      LibraryElement library = importElement.importedLibrary;
+      if (library != null) {
+        _resolveCombinators(library, node.combinators);
+      }
+      _setMetadata(importElement, node);
+    }
+    return null;
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    Expression target = node.realTarget;
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
+    String getterMethodName = sc.TokenType.INDEX.lexeme;
+    String setterMethodName = sc.TokenType.INDEX_EQ.lexeme;
+    bool isInGetterContext = node.inGetterContext();
+    bool isInSetterContext = node.inSetterContext();
+    if (isInGetterContext && isInSetterContext) {
+      // lookup setter
+      MethodElement setterStaticMethod = _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement setterPropagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
+      // set setter element
+      node.staticElement = setterStaticMethod;
+      node.propagatedElement = setterPropagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, setterStaticMethod, setterPropagatedMethod, staticType, propagatedType);
+      // lookup getter method
+      MethodElement getterStaticMethod = _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement getterPropagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
+      // set getter element
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(getterStaticMethod, getterPropagatedMethod);
+      node.auxiliaryElements = auxiliaryElements;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, getterStaticMethod, getterPropagatedMethod, staticType, propagatedType);
+    } else if (isInGetterContext) {
+      // lookup getter method
+      MethodElement staticMethod = _lookUpMethod(target, staticType, getterMethodName);
+      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
+      // set getter element
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, getterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
+    } else if (isInSetterContext) {
+      // lookup setter method
+      MethodElement staticMethod = _lookUpMethod(target, staticType, setterMethodName);
+      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
+      // set setter element
+      node.staticElement = staticMethod;
+      node.propagatedElement = propagatedMethod;
+      // generate undefined method warning
+      _checkForUndefinedIndexOperator(node, target, setterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
+    }
+    return null;
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    ConstructorElement invokedConstructor = node.constructorName.staticElement;
+    node.staticElement = invokedConstructor;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(node.isConst, argumentList, invokedConstructor);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    SimpleIdentifier methodName = node.methodName;
+    //
+    // Synthetic identifiers have been already reported during parsing.
+    //
+    if (methodName.isSynthetic) {
+      return null;
+    }
+    //
+    // We have a method invocation of one of two forms: 'e.m(a1, ..., an)' or 'm(a1, ..., an)'. The
+    // first step is to figure out which executable is being invoked, using both the static and the
+    // propagated type information.
+    //
+    Expression target = node.realTarget;
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
+      return null;
+    }
+    Element staticElement;
+    Element propagatedElement;
+    DartType staticType = null;
+    DartType propagatedType = null;
+    if (target == null) {
+      staticElement = _resolveInvokedElement(methodName);
+      propagatedElement = null;
+    } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(target)) {
+      LibraryElement importedLibrary = _getImportedLibrary(target);
+      methodName.staticElement = importedLibrary.loadLibraryFunction;
+      return null;
+    } else {
+      staticType = _getStaticType(target);
+      propagatedType = _getPropagatedType(target);
+      //
+      // If this method invocation is of the form 'C.m' where 'C' is a class, then we don't call
+      // resolveInvokedElement(..) which walks up the class hierarchy, instead we just look for the
+      // member in the type only.
+      //
+      ClassElementImpl typeReference = getTypeReference(target);
+      if (typeReference != null) {
+        staticElement = propagatedElement = _resolveElement(typeReference, methodName);
+      } else {
+        staticElement = _resolveInvokedElementWithTarget(target, staticType, methodName);
+        propagatedElement = _resolveInvokedElementWithTarget(target, propagatedType, methodName);
+      }
+    }
+    staticElement = _convertSetterToGetter(staticElement);
+    propagatedElement = _convertSetterToGetter(propagatedElement);
+    //
+    // Record the results.
+    //
+    methodName.staticElement = staticElement;
+    methodName.propagatedElement = propagatedElement;
+    ArgumentList argumentList = node.argumentList;
+    if (staticElement != null) {
+      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, staticElement);
+      if (parameters != null) {
+        argumentList.correspondingStaticParameters = parameters;
+      }
+    }
+    if (propagatedElement != null) {
+      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, propagatedElement);
+      if (parameters != null) {
+        argumentList.correspondingPropagatedParameters = parameters;
+      }
+    }
+    //
+    // Then check for error conditions.
+    //
+    ErrorCode errorCode = _checkForInvocationError(target, true, staticElement);
+    bool generatedWithTypePropagation = false;
+    if (_enableHints && errorCode == null && staticElement == null) {
+      // The method lookup may have failed because there were multiple
+      // incompatible choices. In this case we don't want to generate a hint.
+      if (propagatedElement == null && propagatedType is UnionType) {
+        // TODO(collinsn): an improvement here is to make the propagated type of the method call
+        // the union of the propagated types of all possible calls.
+        if (_lookupMethods(target, propagatedType as UnionType, methodName.name).length > 1) {
+          return null;
+        }
+      }
+      errorCode = _checkForInvocationError(target, false, propagatedElement);
+      if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
+        ClassElement classElementContext = null;
+        if (target == null) {
+          classElementContext = _resolver.enclosingClass;
+        } else {
+          DartType type = target.bestType;
+          if (type != null) {
+            if (type.element is ClassElement) {
+              classElementContext = type.element as ClassElement;
+            }
+          }
+        }
+        if (classElementContext != null) {
+          _subtypeManager.ensureLibraryVisited(_definingLibrary);
+          HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
+          for (ClassElement subtypeElement in subtypeElements) {
+            if (subtypeElement.getMethod(methodName.name) != null) {
+              errorCode = null;
+            }
+          }
+        }
+      }
+      generatedWithTypePropagation = true;
+    }
+    if (errorCode == null) {
+      return null;
+    }
+    if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
+      _resolver.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
+      _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
+      String targetTypeName;
+      if (target == null) {
+        ClassElement enclosingClass = _resolver.enclosingClass;
+        targetTypeName = enclosingClass.displayName;
+        ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD);
+        _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
+      } else {
+        // ignore Function "call"
+        // (if we are about to create a hint using type propagation, then we can use type
+        // propagation here as well)
+        DartType targetType = null;
+        if (!generatedWithTypePropagation) {
+          targetType = _getStaticType(target);
+        } else {
+          // choose the best type
+          targetType = _getPropagatedType(target);
+          if (targetType == null) {
+            targetType = _getStaticType(target);
+          }
+        }
+        if (targetType != null && targetType.isDartCoreFunction && methodName.name == FunctionElement.CALL_METHOD_NAME) {
+          // TODO(brianwilkerson) Can we ever resolve the function being invoked?
+          //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
+          return null;
+        }
+        targetTypeName = targetType == null ? null : targetType.displayName;
+        ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD);
+        _recordUndefinedNode(targetType.element, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
+      }
+    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
+      // Generate the type name.
+      // The error code will never be generated via type propagation
+      DartType targetType = _getStaticType(target);
+      if (targetType is InterfaceType && !targetType.isObject) {
+        targetType = (targetType as InterfaceType).superclass;
+      }
+      String targetTypeName = targetType == null ? null : targetType.name;
+      _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    Expression operand = node.operand;
+    String methodName = _getPostfixOperator(node);
+    DartType staticType = _getStaticType(operand);
+    MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
+    node.staticElement = staticMethod;
+    DartType propagatedType = _getPropagatedType(operand);
+    MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
+    node.propagatedElement = propagatedMethod;
+    if (_shouldReportMissingMember(staticType, staticMethod)) {
+      _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
+    } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+      _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]);
+    }
+    return null;
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefix = node.prefix;
+    SimpleIdentifier identifier = node.identifier;
+    //
+    // First, check the "lib.loadLibrary" case
+    //
+    if (identifier.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(prefix)) {
+      LibraryElement importedLibrary = _getImportedLibrary(prefix);
+      identifier.staticElement = importedLibrary.loadLibraryFunction;
+      return null;
+    }
+    //
+    // Check to see whether the prefix is really a prefix.
+    //
+    Element prefixElement = prefix.staticElement;
+    if (prefixElement is PrefixElement) {
+      Element element = _resolver.nameScope.lookup(node, _definingLibrary);
+      if (element == null && identifier.inSetterContext()) {
+        element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _definingLibrary);
+      }
+      if (element == null) {
+        if (identifier.inSetterContext()) {
+          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
+        } else if (node.parent is Annotation) {
+          Annotation annotation = node.parent as Annotation;
+          _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+          return null;
+        } else {
+          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
+        }
+        return null;
+      }
+      if (element is PropertyAccessorElement && identifier.inSetterContext()) {
+        PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
+        if (variable != null) {
+          PropertyAccessorElement setter = variable.setter;
+          if (setter != null) {
+            element = setter;
+          }
+        }
+      }
+      // TODO(brianwilkerson) The prefix needs to be resolved to the element for the import that
+      // defines the prefix, not the prefix's element.
+      identifier.staticElement = element;
+      // Validate annotation element.
+      if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolveAnnotationElement(annotation);
+        return null;
+      }
+      return null;
+    }
+    // May be annotation, resolve invocation of "const" constructor.
+    if (node.parent is Annotation) {
+      Annotation annotation = node.parent as Annotation;
+      _resolveAnnotationElement(annotation);
+    }
+    //
+    // Otherwise, the prefix is really an expression that happens to be a simple identifier and this
+    // is really equivalent to a property access node.
+    //
+    _resolvePropertyAccess(prefix, identifier);
+    return null;
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType.isUserDefinableOperator || operatorType == sc.TokenType.PLUS_PLUS || operatorType == sc.TokenType.MINUS_MINUS) {
+      Expression operand = node.operand;
+      String methodName = _getPrefixOperator(node);
+      DartType staticType = _getStaticType(operand);
+      MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
+      node.staticElement = staticMethod;
+      DartType propagatedType = _getPropagatedType(operand);
+      MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
+      node.propagatedElement = propagatedMethod;
+      if (_shouldReportMissingMember(staticType, staticMethod)) {
+        _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
+      } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
+        _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    Expression target = node.realTarget;
+    if (target is SuperExpression && !_isSuperInValidContext(target)) {
+      return null;
+    }
+    SimpleIdentifier propertyName = node.propertyName;
+    _resolvePropertyAccess(target, propertyName);
+    return null;
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (enclosingClass == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    SimpleIdentifier name = node.constructorName;
+    ConstructorElement element;
+    if (name == null) {
+      element = enclosingClass.unnamedConstructor;
+    } else {
+      element = enclosingClass.getNamedConstructor(name.name);
+    }
+    if (element == null) {
+      // TODO(brianwilkerson) Report this error and decide what element to associate with the node.
+      return null;
+    }
+    if (name != null) {
+      name.staticElement = element;
+    }
+    node.staticElement = element;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, element);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _setMetadataForParameter(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    //
+    // Synthetic identifiers have been already reported during parsing.
+    //
+    if (node.isSynthetic) {
+      return null;
+    }
+    //
+    // We ignore identifiers that have already been resolved, such as identifiers representing the
+    // name in a declaration.
+    //
+    if (node.staticElement != null) {
+      return null;
+    }
+    //
+    // The name dynamic denotes a Type object even though dynamic is not a class.
+    //
+    if (node.name == _dynamicType.name) {
+      node.staticElement = _dynamicType.element;
+      node.staticType = _typeType;
+      return null;
+    }
+    //
+    // Otherwise, the node should be resolved.
+    //
+    Element element = _resolveSimpleIdentifier(node);
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (_isFactoryConstructorReturnType(node) && !identical(element, enclosingClass)) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
+    } else if (_isConstructorReturnType(node) && !identical(element, enclosingClass)) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      element = null;
+    } else if (element == null || (element is PrefixElement && !_isValidAsPrefix(node))) {
+      // TODO(brianwilkerson) Recover from this error.
+      if (_isConstructorReturnType(node)) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+      } else if (node.parent is Annotation) {
+        Annotation annotation = node.parent as Annotation;
+        _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      } else {
+        _recordUndefinedNode(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
+      }
+    }
+    node.staticElement = element;
+    if (node.inSetterContext() && node.inGetterContext() && enclosingClass != null) {
+      InterfaceType enclosingType = enclosingClass.type;
+      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(_lookUpGetter(null, enclosingType, node.name), null);
+      node.auxiliaryElements = auxiliaryElements;
+    }
+    //
+    // Validate annotation element.
+    //
+    if (node.parent is Annotation) {
+      Annotation annotation = node.parent as Annotation;
+      _resolveAnnotationElement(annotation);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (enclosingClass == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    InterfaceType superType = enclosingClass.supertype;
+    if (superType == null) {
+      // TODO(brianwilkerson) Report this error.
+      return null;
+    }
+    SimpleIdentifier name = node.constructorName;
+    String superName = name != null ? name.name : null;
+    ConstructorElement element = superType.lookUpConstructor(superName, _definingLibrary);
+    if (element == null) {
+      if (name != null) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superType.displayName, name]);
+      } else {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superType.displayName]);
+      }
+      return null;
+    } else {
+      if (element.isFactory) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
+      }
+    }
+    if (name != null) {
+      name.staticElement = element;
+    }
+    node.staticElement = element;
+    ArgumentList argumentList = node.argumentList;
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(isInConstConstructor, argumentList, element);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    if (!_isSuperInValidContext(node)) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
+    }
+    return super.visitSuperExpression(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    _setMetadata(node.element, node);
+    return null;
+  }
+
+  /**
+   * Generate annotation elements for each of the annotations in the given node list and add them to
+   * the given list of elements.
+   *
+   * @param annotationList the list of elements to which new elements are to be added
+   * @param annotations the AST nodes used to generate new elements
+   */
+  void _addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annotation> annotations) {
+    int annotationCount = annotations.length;
+    for (int i = 0; i < annotationCount; i++) {
+      Annotation annotation = annotations[i];
+      Element resolvedElement = annotation.element;
+      if (resolvedElement != null) {
+        ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(resolvedElement);
+        annotation.elementAnnotation = elementAnnotation;
+        annotationList.add(elementAnnotation);
+      }
+    }
+  }
+
+  /**
+   * Given that we have found code to invoke the given element, return the error code that should be
+   * reported, or `null` if no error should be reported.
+   *
+   * @param target the target of the invocation, or `null` if there was no target
+   * @param useStaticContext
+   * @param element the element to be invoked
+   * @return the error code that should be reported
+   */
+  ErrorCode _checkForInvocationError(Expression target, bool useStaticContext, Element element) {
+    // Prefix is not declared, instead "prefix.id" are declared.
+    if (element is PrefixElement) {
+      element = null;
+    }
+    if (element is PropertyAccessorElement) {
+      //
+      // This is really a function expression invocation.
+      //
+      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
+      FunctionType getterType = element.type;
+      if (getterType != null) {
+        DartType returnType = getterType.returnType;
+        if (!_isExecutableType(returnType)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      }
+    } else if (element is ExecutableElement) {
+      return null;
+    } else if (element is MultiplyDefinedElement) {
+      // The error has already been reported
+      return null;
+    } else if (element == null && target is SuperExpression) {
+      // TODO(jwren) We should split the UNDEFINED_METHOD into two error codes, this one, and
+      // a code that describes the situation where the method was found, but it was not
+      // accessible from the current library.
+      return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
+    } else {
+      //
+      // This is really a function expression invocation.
+      //
+      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
+      if (element is PropertyInducingElement) {
+        PropertyAccessorElement getter = element.getter;
+        FunctionType getterType = getter.type;
+        if (getterType != null) {
+          DartType returnType = getterType.returnType;
+          if (!_isExecutableType(returnType)) {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        }
+      } else if (element is VariableElement) {
+        DartType variableType = element.type;
+        if (!_isExecutableType(variableType)) {
+          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+        }
+      } else {
+        if (target == null) {
+          ClassElement enclosingClass = _resolver.enclosingClass;
+          if (enclosingClass == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (element == null) {
+            // Proxy-conditional warning, based on state of resolver.getEnclosingClass()
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
+          } else {
+            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
+          }
+        } else {
+          DartType targetType;
+          if (useStaticContext) {
+            targetType = _getStaticType(target);
+          } else {
+            // Compute and use the propagated type, if it is null, then it may be the case that
+            // static type is some type, in which the static type should be used.
+            targetType = target.bestType;
+          }
+          if (targetType == null) {
+            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+          } else if (!targetType.isDynamic && !targetType.isBottom) {
+            // Proxy-conditional warning, based on state of targetType.getElement()
+            return StaticTypeWarningCode.UNDEFINED_METHOD;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Check that the for some index expression that the method element was resolved, otherwise a
+   * [StaticWarningCode#UNDEFINED_OPERATOR] is generated.
+   *
+   * @param node the index expression to resolve
+   * @param target the target of the expression
+   * @param methodName the name of the operator associated with the context of using of the given
+   *          index expression
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForUndefinedIndexOperator(IndexExpression node, Expression target, String methodName, MethodElement staticMethod, MethodElement propagatedMethod, DartType staticType, DartType propagatedType) {
+    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticMethod);
+    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false);
+    if (shouldReportMissingMember_static || shouldReportMissingMember_propagated) {
+      sc.Token leftBracket = node.leftBracket;
+      sc.Token rightBracket = node.rightBracket;
+      ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_OPERATOR : HintCode.UNDEFINED_OPERATOR);
+      if (leftBracket == null || rightBracket == null) {
+        _recordUndefinedNode(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, node, [
+            methodName,
+            shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
+      } else {
+        int offset = leftBracket.offset;
+        int length = rightBracket.offset - offset + 1;
+        _recordUndefinedOffset(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, offset, length, [
+            methodName,
+            shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given a list of arguments and the element that will be invoked using those argument, compute
+   * the list of parameters that correspond to the list of arguments. Return the parameters that
+   * correspond to the arguments, or `null` if no correspondence could be computed.
+   *
+   * @param argumentList the list of arguments being passed to the element
+   * @param executableElement the element that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
+   */
+  List<ParameterElement> _computeCorrespondingParameters(ArgumentList argumentList, Element element) {
+    if (element is PropertyAccessorElement) {
+      //
+      // This is an invocation of the call method defined on the value returned by the getter.
+      //
+      FunctionType getterType = element.type;
+      if (getterType != null) {
+        DartType getterReturnType = getterType.returnType;
+        if (getterReturnType is InterfaceType) {
+          MethodElement callMethod = getterReturnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+          if (callMethod != null) {
+            return _resolveArgumentsToFunction(false, argumentList, callMethod);
+          }
+        } else if (getterReturnType is FunctionType) {
+          List<ParameterElement> parameters = getterReturnType.parameters;
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
+        }
+      }
+    } else if (element is ExecutableElement) {
+      return _resolveArgumentsToFunction(false, argumentList, element);
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      DartType type = _promoteManager.getStaticType(variable);
+      if (type is FunctionType) {
+        FunctionType functionType = type;
+        List<ParameterElement> parameters = functionType.parameters;
+        return _resolveArgumentsToParameters(false, argumentList, parameters);
+      } else if (type is InterfaceType) {
+        // "call" invocation
+        MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+        if (callMethod != null) {
+          List<ParameterElement> parameters = callMethod.parameters;
+          return _resolveArgumentsToParameters(false, argumentList, parameters);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given element is a setter, return the getter associated with it. Otherwise, return the
+   * element unchanged.
+   *
+   * @param element the element to be normalized
+   * @return a non-setter element derived from the given element
+   */
+  Element _convertSetterToGetter(Element element) {
+    // TODO(brianwilkerson) Determine whether and why the element could ever be a setter.
+    if (element is PropertyAccessorElement) {
+      return element.variable.getter;
+    }
+    return element;
+  }
+
+  /**
+   * Return `true` if the given element is not a proxy.
+   *
+   * @param element the enclosing element. If null, `true` will be returned.
+   * @return `false` iff the passed [Element] is a [ClassElement] that is a proxy
+   *         or inherits proxy
+   * @see ClassElement#isOrInheritsProxy()
+   */
+  bool _doesntHaveProxy(Element element) => !(element is ClassElement && element.isOrInheritsProxy);
+
+  /**
+   * Look for any declarations of the given identifier that are imported using a prefix. Return the
+   * element that was found, or `null` if the name is not imported using a prefix.
+   *
+   * @param identifier the identifier that might have been imported using a prefix
+   * @return the element that was found
+   */
+  Element _findImportWithoutPrefix(SimpleIdentifier identifier) {
+    Element element = null;
+    Scope nameScope = _resolver.nameScope;
+    for (ImportElement importElement in _definingLibrary.imports) {
+      PrefixElement prefixElement = importElement.prefix;
+      if (prefixElement != null) {
+        Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier("${prefixElement.name}.${identifier.name}");
+        Element importedElement = nameScope.lookup(prefixedIdentifier, _definingLibrary);
+        if (importedElement != null) {
+          if (element == null) {
+            element = importedElement;
+          } else {
+            element = MultiplyDefinedElementImpl.fromElements(_definingLibrary.context, element, importedElement);
+          }
+        }
+      }
+    }
+    return element;
+  }
+
+  /**
+   * Assuming that the given expression is a prefix for a deferred import, return the library that
+   * is being imported.
+   *
+   * @param expression the expression representing the deferred import's prefix
+   * @return the library that is being imported by the import associated with the prefix
+   */
+  LibraryElement _getImportedLibrary(Expression expression) {
+    PrefixElement prefixElement = (expression as SimpleIdentifier).staticElement as PrefixElement;
+    List<ImportElement> imports = prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    return imports[0].importedLibrary;
+  }
+
+  /**
+   * Return the name of the method invoked by the given postfix expression.
+   *
+   * @param node the postfix expression being invoked
+   * @return the name of the method invoked by the expression
+   */
+  String _getPostfixOperator(PostfixExpression node) => (node.operator.type == sc.TokenType.PLUS_PLUS) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
+
+  /**
+   * Return the name of the method invoked by the given postfix expression.
+   *
+   * @param node the postfix expression being invoked
+   * @return the name of the method invoked by the expression
+   */
+  String _getPrefixOperator(PrefixExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType operatorType = operator.type;
+    if (operatorType == sc.TokenType.PLUS_PLUS) {
+      return sc.TokenType.PLUS.lexeme;
+    } else if (operatorType == sc.TokenType.MINUS_MINUS) {
+      return sc.TokenType.MINUS.lexeme;
+    } else if (operatorType == sc.TokenType.MINUS) {
+      return "unary-";
+    } else {
+      return operator.lexeme;
+    }
+  }
+
+  /**
+   * Return the propagated type of the given expression that is to be used for type analysis.
+   *
+   * @param expression the expression whose type is to be returned
+   * @return the type of the given expression
+   */
+  DartType _getPropagatedType(Expression expression) {
+    DartType propagatedType = _resolveTypeParameter(expression.propagatedType);
+    if (propagatedType is FunctionType) {
+      //
+      // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
+      //
+      propagatedType = _resolver.typeProvider.functionType;
+    }
+    return propagatedType;
+  }
+
+  /**
+   * Return the static type of the given expression that is to be used for type analysis.
+   *
+   * @param expression the expression whose type is to be returned
+   * @return the type of the given expression
+   */
+  DartType _getStaticType(Expression expression) {
+    if (expression is NullLiteral) {
+      return _resolver.typeProvider.bottomType;
+    }
+    DartType staticType = _resolveTypeParameter(expression.staticType);
+    if (staticType is FunctionType) {
+      //
+      // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
+      //
+      staticType = _resolver.typeProvider.functionType;
+    }
+    return staticType;
+  }
+
+  /**
+   * Return `true` if the given expression is a prefix for a deferred import.
+   *
+   * @param expression the expression being tested
+   * @return `true` if the given expression is a prefix for a deferred import
+   */
+  bool _isDeferredPrefix(Expression expression) {
+    if (expression is! SimpleIdentifier) {
+      return false;
+    }
+    Element element = (expression as SimpleIdentifier).staticElement;
+    if (element is! PrefixElement) {
+      return false;
+    }
+    PrefixElement prefixElement = element as PrefixElement;
+    List<ImportElement> imports = prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
+    if (imports.length != 1) {
+      return false;
+    }
+    return imports[0].isDeferred;
+  }
+
+  /**
+   * Return `true` if the given type represents an object that could be invoked using the call
+   * operator '()'.
+   *
+   * @param type the type being tested
+   * @return `true` if the given type represents an object that could be invoked
+   */
+  bool _isExecutableType(DartType type) {
+    if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || type.isObject) {
+      return true;
+    } else if (type is InterfaceType) {
+      ClassElement classElement = type.element;
+      // 16078 from Gilad: If the type is a Functor with the @proxy annotation, treat it as an
+      // executable type.
+      // example code: NonErrorResolverTest.test_invocationOfNonFunction_proxyOnFunctionClass()
+      if (classElement.isProxy && type.isSubtypeOf(_resolver.typeProvider.functionType)) {
+        return true;
+      }
+      MethodElement methodElement = classElement.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+      return methodElement != null;
+    }
+    return false;
+  }
+
+  /**
+   * @return `true` iff current enclosing function is constant constructor declaration.
+   */
+  bool get isInConstConstructor {
+    ExecutableElement function = _resolver.enclosingFunction;
+    if (function is ConstructorElement) {
+      return function.isConst;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given element is a static element.
+   *
+   * @param element the element being tested
+   * @return `true` if the given element is a static element
+   */
+  bool _isStatic(Element element) {
+    if (element is ExecutableElement) {
+      return element.isStatic;
+    } else if (element is PropertyInducingElement) {
+      return element.isStatic;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given node can validly be resolved to a prefix:
+   * * it is the prefix in an import directive, or
+   * * it is the prefix in a prefixed identifier.
+   *
+   * @param node the node being tested
+   * @return `true` if the given node is the prefix in an import directive
+   */
+  bool _isValidAsPrefix(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (parent is ImportDirective) {
+      return identical(parent.prefix, node);
+    } else if (parent is PrefixedIdentifier) {
+      return true;
+    } else if (parent is MethodInvocation) {
+      return identical(parent.target, node);
+    }
+    return false;
+  }
+
+  /**
+   * Look up the getter with the given name in the given type. Return the element representing the
+   * getter that was found, or `null` if there is no getter with the given name.
+   *
+   * @param target the target of the invocation, or `null` if there is no target
+   * @param type the type in which the getter is defined
+   * @param getterName the name of the getter being looked up
+   * @return the element representing the getter that was found
+   */
+  PropertyAccessorElement _lookUpGetter(Expression target, DartType type, String getterName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpGetterInSuperclass(getterName, _definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpGetter(getterName, _definingLibrary);
+      }
+      if (accessor != null) {
+        return accessor;
+      }
+      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the getter with the given name in the interfaces implemented by the given type, either
+   * directly or indirectly. Return the element representing the getter that was found, or
+   * `null` if there is no getter with the given name.
+   *
+   * @param targetType the type in which the getter might be defined
+   * @param includeTargetType `true` if the search should include the target type
+   * @param getterName the name of the getter being looked up
+   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
+   *          to prevent infinite recursion and to optimize the search
+   * @return the element representing the getter that was found
+   */
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
+    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
+    // finding the inherited member. We need to follow that scheme. The code below should cover the
+    // 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      PropertyAccessorElement getter = targetType.getGetter(getterName);
+      if (getter != null && getter.isAccessibleIn(_definingLibrary)) {
+        return getter;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(interfaceType, true, getterName, visitedInterfaces);
+      if (getter != null) {
+        return getter;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins) {
+      PropertyAccessorElement getter = _lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
+      if (getter != null) {
+        return getter;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfaces);
+  }
+
+  /**
+   * Look up the method or getter with the given name in the given type. Return the element
+   * representing the method or getter that was found, or `null` if there is no method or
+   * getter with the given name.
+   *
+   * @param type the type in which the method or getter is defined
+   * @param memberName the name of the method or getter being looked up
+   * @return the element representing the method or getter that was found
+   */
+  ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      ExecutableElement member = interfaceType.lookUpMethod(memberName, _definingLibrary);
+      if (member != null) {
+        return member;
+      }
+      member = interfaceType.lookUpGetter(memberName, _definingLibrary);
+      if (member != null) {
+        return member;
+      }
+      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the method or getter with the given name in the interfaces implemented by the given
+   * type, either directly or indirectly. Return the element representing the method or getter that
+   * was found, or `null` if there is no method or getter with the given name.
+   *
+   * @param targetType the type in which the method or getter might be defined
+   * @param includeTargetType `true` if the search should include the target type
+   * @param memberName the name of the method or getter being looked up
+   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
+   *          to prevent infinite recursion and to optimize the search
+   * @return the element representing the method or getter that was found
+   */
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
+    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
+    // finding the inherited member. We need to follow that scheme. The code below should cover the
+    // 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      ExecutableElement member = targetType.getMethod(memberName);
+      if (member != null) {
+        return member;
+      }
+      member = targetType.getGetter(memberName);
+      if (member != null) {
+        return member;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(interfaceType, true, memberName, visitedInterfaces);
+      if (member != null) {
+        return member;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins) {
+      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(mixinType, true, memberName, visitedInterfaces);
+      if (member != null) {
+        return member;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visitedInterfaces);
+  }
+
+  /**
+   * Find the element corresponding to the given label node in the current label scope.
+   *
+   * @param parentNode the node containing the given label
+   * @param labelNode the node representing the label being looked up
+   * @return the element corresponding to the given label node in the current scope
+   */
+  LabelElementImpl _lookupLabel(AstNode parentNode, SimpleIdentifier labelNode) {
+    LabelScope labelScope = _resolver.labelScope;
+    LabelElementImpl labelElement = null;
+    if (labelNode == null) {
+      if (labelScope == null) {
+        // TODO(brianwilkerson) Do we need to report this error, or is this condition always caught in the parser?
+        // reportError(ResolverErrorCode.BREAK_OUTSIDE_LOOP);
+      } else {
+        labelElement = labelScope.lookup(LabelScope.EMPTY_LABEL) as LabelElementImpl;
+        if (labelElement == null) {
+          // TODO(brianwilkerson) Do we need to report this error, or is this condition always caught in the parser?
+          // reportError(ResolverErrorCode.BREAK_OUTSIDE_LOOP);
+        }
+        //
+        // The label element that was returned was a marker for look-up and isn't stored in the
+        // element model.
+        //
+        labelElement = null;
+      }
+    } else {
+      if (labelScope == null) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+      } else {
+        labelElement = labelScope.lookup(labelNode.name) as LabelElementImpl;
+        if (labelElement == null) {
+          _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
+        } else {
+          labelNode.staticElement = labelElement;
+        }
+      }
+    }
+    if (labelElement != null) {
+      ExecutableElement labelContainer = labelElement.getAncestor((element) => element is ExecutableElement);
+      if (!identical(labelContainer, _resolver.enclosingFunction)) {
+        _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
+        labelElement = null;
+      }
+    }
+    return labelElement;
+  }
+
+  /**
+   * Look up the method with the given name in the given type. Return the element representing the
+   * method that was found, or `null` if there is no method with the given name.
+   *
+   * @param target the target of the invocation, or `null` if there is no target
+   * @param type the type in which the method is defined
+   * @param methodName the name of the method being looked up
+   * @return the element representing the method that was found
+   */
+  MethodElement _lookUpMethod(Expression target, DartType type, String methodName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      MethodElement method;
+      if (target is SuperExpression) {
+        method = interfaceType.lookUpMethodInSuperclass(methodName, _definingLibrary);
+      } else {
+        method = interfaceType.lookUpMethod(methodName, _definingLibrary);
+      }
+      if (method != null) {
+        return method;
+      }
+      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
+    } else if (type is UnionType) {
+      // TODO (collinsn): I want [computeMergedExecutableElement] to be general
+      // and work with functions, methods, constructors, and property accessors. However,
+      // I won't be able to assume it returns [MethodElement] here then.
+      return _maybeMergeExecutableElements(_lookupMethods(target, type, methodName)) as MethodElement;
+    }
+    return null;
+  }
+
+  /**
+   * Look up the method with the given name in the interfaces implemented by the given type, either
+   * directly or indirectly. Return the element representing the method that was found, or
+   * `null` if there is no method with the given name.
+   *
+   * @param targetType the type in which the member might be defined
+   * @param includeTargetType `true` if the search should include the target type
+   * @param methodName the name of the method being looked up
+   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
+   *          to prevent infinite recursion and to optimize the search
+   * @return the element representing the method that was found
+   */
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
+    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
+    // finding the inherited member. We need to follow that scheme. The code below should cover the
+    // 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      MethodElement method = targetType.getMethod(methodName);
+      if (method != null && method.isAccessibleIn(_definingLibrary)) {
+        return method;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      MethodElement method = _lookUpMethodInInterfaces(interfaceType, true, methodName, visitedInterfaces);
+      if (method != null) {
+        return method;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins) {
+      MethodElement method = _lookUpMethodInInterfaces(mixinType, true, methodName, visitedInterfaces);
+      if (method != null) {
+        return method;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfaces);
+  }
+
+  /**
+   * Look up all methods of a given name defined on a union type.
+   *
+   * @param target
+   * @param type
+   * @param methodName
+   * @return all methods named `methodName` defined on the union type `type`.
+   */
+  Set<ExecutableElement> _lookupMethods(Expression target, UnionType type, String methodName) {
+    Set<ExecutableElement> methods = new HashSet<ExecutableElement>();
+    bool allElementsHaveMethod = true;
+    for (DartType t in type.elements) {
+      MethodElement m = _lookUpMethod(target, t, methodName);
+      if (m != null) {
+        methods.add(m);
+      } else {
+        allElementsHaveMethod = false;
+      }
+    }
+    // For strict union types we require that all types in the union define the method.
+    if (AnalysisEngine.instance.strictUnionTypes) {
+      if (allElementsHaveMethod) {
+        return methods;
+      } else {
+        return new Set<ExecutableElement>();
+      }
+    } else {
+      return methods;
+    }
+  }
+
+  /**
+   * Look up the setter with the given name in the given type. Return the element representing the
+   * setter that was found, or `null` if there is no setter with the given name.
+   *
+   * @param target the target of the invocation, or `null` if there is no target
+   * @param type the type in which the setter is defined
+   * @param setterName the name of the setter being looked up
+   * @return the element representing the setter that was found
+   */
+  PropertyAccessorElement _lookUpSetter(Expression target, DartType type, String setterName) {
+    type = _resolveTypeParameter(type);
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      PropertyAccessorElement accessor;
+      if (target is SuperExpression) {
+        accessor = interfaceType.lookUpSetterInSuperclass(setterName, _definingLibrary);
+      } else {
+        accessor = interfaceType.lookUpSetter(setterName, _definingLibrary);
+      }
+      if (accessor != null) {
+        return accessor;
+      }
+      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new HashSet<ClassElement>());
+    }
+    return null;
+  }
+
+  /**
+   * Look up the setter with the given name in the interfaces implemented by the given type, either
+   * directly or indirectly. Return the element representing the setter that was found, or
+   * `null` if there is no setter with the given name.
+   *
+   * @param targetType the type in which the setter might be defined
+   * @param includeTargetType `true` if the search should include the target type
+   * @param setterName the name of the setter being looked up
+   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
+   *          to prevent infinite recursion and to optimize the search
+   * @return the element representing the setter that was found
+   */
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, HashSet<ClassElement> visitedInterfaces) {
+    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
+    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
+    // finding the inherited member. We need to follow that scheme. The code below should cover the
+    // 80% case.
+    ClassElement targetClass = targetType.element;
+    if (visitedInterfaces.contains(targetClass)) {
+      return null;
+    }
+    visitedInterfaces.add(targetClass);
+    if (includeTargetType) {
+      PropertyAccessorElement setter = targetType.getSetter(setterName);
+      if (setter != null && setter.isAccessibleIn(_definingLibrary)) {
+        return setter;
+      }
+    }
+    for (InterfaceType interfaceType in targetType.interfaces) {
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(interfaceType, true, setterName, visitedInterfaces);
+      if (setter != null) {
+        return setter;
+      }
+    }
+    for (InterfaceType mixinType in targetType.mixins) {
+      PropertyAccessorElement setter = _lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
+      if (setter != null) {
+        return setter;
+      }
+    }
+    InterfaceType superclass = targetType.superclass;
+    if (superclass == null) {
+      return null;
+    }
+    return _lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfaces);
+  }
+
+  /**
+   * Given some class element, this method uses [subtypeManager] to find the set of all
+   * subtypes; the subtypes are then searched for a member (method, getter, or setter), that matches
+   * a passed
+   *
+   * @param element the class element to search the subtypes of, if a non-ClassElement element is
+   *          passed, then `false` is returned
+   * @param memberName the member name to search for
+   * @param asMethod `true` if the methods should be searched for in the subtypes
+   * @param asAccessor `true` if the accessors (getters and setters) should be searched for in
+   *          the subtypes
+   * @return `true` if and only if the passed memberName was found in a subtype
+   */
+  bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
+    if (element is ClassElement) {
+      _subtypeManager.ensureLibraryVisited(_definingLibrary);
+      HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
+      for (ClassElement subtypeElement in subtypeElements) {
+        if (asMethod && subtypeElement.getMethod(memberName) != null) {
+          return true;
+        } else if (asAccessor && (subtypeElement.getGetter(memberName) != null || subtypeElement.getSetter(memberName) != null)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return the binary operator that is invoked by the given compound assignment operator.
+   *
+   * @param operator the assignment operator being mapped
+   * @return the binary operator that invoked by the given assignment operator
+   */
+  sc.TokenType _operatorFromCompoundAssignment(sc.TokenType operator) {
+    while (true) {
+      if (operator == sc.TokenType.AMPERSAND_EQ) {
+        return sc.TokenType.AMPERSAND;
+      } else if (operator == sc.TokenType.BAR_EQ) {
+        return sc.TokenType.BAR;
+      } else if (operator == sc.TokenType.CARET_EQ) {
+        return sc.TokenType.CARET;
+      } else if (operator == sc.TokenType.GT_GT_EQ) {
+        return sc.TokenType.GT_GT;
+      } else if (operator == sc.TokenType.LT_LT_EQ) {
+        return sc.TokenType.LT_LT;
+      } else if (operator == sc.TokenType.MINUS_EQ) {
+        return sc.TokenType.MINUS;
+      } else if (operator == sc.TokenType.PERCENT_EQ) {
+        return sc.TokenType.PERCENT;
+      } else if (operator == sc.TokenType.PLUS_EQ) {
+        return sc.TokenType.PLUS;
+      } else if (operator == sc.TokenType.SLASH_EQ) {
+        return sc.TokenType.SLASH;
+      } else if (operator == sc.TokenType.STAR_EQ) {
+        return sc.TokenType.STAR;
+      } else if (operator == sc.TokenType.TILDE_SLASH_EQ) {
+        return sc.TokenType.TILDE_SLASH;
+      } else {
+        // Internal error: Unmapped assignment operator.
+        AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
+        return operator;
+      }
+      break;
+    }
+  }
+
+  /**
+   * Record that the given node is undefined, causing an error to be reported if appropriate.
+   *
+   * @param declaringElement the element inside which no declaration was found. If this element is a
+   *          proxy, no error will be reported. If null, then an error will always be reported.
+   * @param errorCode the error code to report.
+   * @param node the node which is undefined.
+   * @param arguments arguments to the error message.
+   */
+  void _recordUndefinedNode(Element declaringElement, ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForNode(errorCode, node, arguments);
+    }
+  }
+
+  /**
+   * Record that the given offset/length is undefined, causing an error to be reported if
+   * appropriate.
+   *
+   * @param declaringElement the element inside which no declaration was found. If this element is a
+   *          proxy, no error will be reported. If null, then an error will always be reported.
+   * @param errorCode the error code to report.
+   * @param offset the offset to the text which is undefined.
+   * @param length the length of the text which is undefined.
+   * @param arguments arguments to the error message.
+   */
+  void _recordUndefinedOffset(Element declaringElement, ErrorCode errorCode, int offset, int length, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForOffset(errorCode, offset, length, arguments);
+    }
+  }
+
+  /**
+   * Record that the given token is undefined, causing an error to be reported if appropriate.
+   *
+   * @param declaringElement the element inside which no declaration was found. If this element is a
+   *          proxy, no error will be reported. If null, then an error will always be reported.
+   * @param errorCode the error code to report.
+   * @param token the token which is undefined.
+   * @param arguments arguments to the error message.
+   */
+  void _recordUndefinedToken(Element declaringElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
+    if (_doesntHaveProxy(declaringElement)) {
+      _resolver.reportErrorForToken(errorCode, token, arguments);
+    }
+  }
+
+  void _resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
+    ArgumentList argumentList = annotation.arguments;
+    // error will be reported in ConstantVerifier
+    if (argumentList == null) {
+      return;
+    }
+    // resolve arguments to parameters
+    List<ParameterElement> parameters = _resolveArgumentsToFunction(true, argumentList, constructor);
+    if (parameters != null) {
+      argumentList.correspondingStaticParameters = parameters;
+    }
+  }
+
+  /**
+   * Continues resolution of the given [Annotation].
+   *
+   * @param annotation the [Annotation] to resolve
+   */
+  void _resolveAnnotationElement(Annotation annotation) {
+    SimpleIdentifier nameNode1;
+    SimpleIdentifier nameNode2;
+    {
+      Identifier annName = annotation.name;
+      if (annName is PrefixedIdentifier) {
+        PrefixedIdentifier prefixed = annName;
+        nameNode1 = prefixed.prefix;
+        nameNode2 = prefixed.identifier;
+      } else {
+        nameNode1 = annName as SimpleIdentifier;
+        nameNode2 = null;
+      }
+    }
+    SimpleIdentifier nameNode3 = annotation.constructorName;
+    ConstructorElement constructor = null;
+    //
+    // CONST or Class(args)
+    //
+    if (nameNode1 != null && nameNode2 == null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      // CONST
+      if (element1 is PropertyAccessorElement) {
+        _resolveAnnotationElementGetter(annotation, element1);
+        return;
+      }
+      // Class(args)
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(null, _definingLibrary);
+      }
+    }
+    //
+    // prefix.CONST or prefix.Class() or Class.CONST or Class.constructor(args)
+    //
+    if (nameNode1 != null && nameNode2 != null && nameNode3 == null) {
+      Element element1 = nameNode1.staticElement;
+      Element element2 = nameNode2.staticElement;
+      // Class.CONST - not resolved yet
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        element2 = classElement.lookUpGetter(nameNode2.name, _definingLibrary);
+      }
+      // prefix.CONST or Class.CONST
+      if (element2 is PropertyAccessorElement) {
+        nameNode2.staticElement = element2;
+        annotation.element = element2;
+        _resolveAnnotationElementGetter(annotation, element2 as PropertyAccessorElement);
+        return;
+      }
+      // prefix.Class()
+      if (element2 is ClassElement) {
+        ClassElement classElement = element2 as ClassElement;
+        constructor = classElement.unnamedConstructor;
+      }
+      // Class.constructor(args)
+      if (element1 is ClassElement) {
+        ClassElement classElement = element1;
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(nameNode2.name, _definingLibrary);
+        nameNode2.staticElement = constructor;
+      }
+    }
+    //
+    // prefix.Class.CONST or prefix.Class.constructor(args)
+    //
+    if (nameNode1 != null && nameNode2 != null && nameNode3 != null) {
+      Element element2 = nameNode2.staticElement;
+      // element2 should be ClassElement
+      if (element2 is ClassElement) {
+        ClassElement classElement = element2;
+        String name3 = nameNode3.name;
+        // prefix.Class.CONST
+        PropertyAccessorElement getter = classElement.lookUpGetter(name3, _definingLibrary);
+        if (getter != null) {
+          nameNode3.staticElement = getter;
+          annotation.element = element2;
+          _resolveAnnotationElementGetter(annotation, getter);
+          return;
+        }
+        // prefix.Class.constructor(args)
+        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(name3, _definingLibrary);
+        nameNode3.staticElement = constructor;
+      }
+    }
+    // we need constructor
+    if (constructor == null) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      return;
+    }
+    // record element
+    annotation.element = constructor;
+    // resolve arguments
+    _resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+  }
+
+  void _resolveAnnotationElementGetter(Annotation annotation, PropertyAccessorElement accessorElement) {
+    // accessor should be synthetic
+    if (!accessorElement.isSynthetic) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+      return;
+    }
+    // variable should be constant
+    VariableElement variableElement = accessorElement.variable;
+    if (!variableElement.isConst) {
+      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+    }
+    // OK
+    return;
+  }
+
+  /**
+   * Given a list of arguments and the element that will be invoked using those argument, compute
+   * the list of parameters that correspond to the list of arguments. Return the parameters that
+   * correspond to the arguments, or `null` if no correspondence could be computed.
+   *
+   * @param reportError if `true` then compile-time error should be reported; if `false`
+   *          then compile-time warning
+   * @param argumentList the list of arguments being passed to the element
+   * @param executableElement the element that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
+   */
+  List<ParameterElement> _resolveArgumentsToFunction(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
+    if (executableElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = executableElement.parameters;
+    return _resolveArgumentsToParameters(reportError, argumentList, parameters);
+  }
+
+  /**
+   * Given a list of arguments and the parameters related to the element that will be invoked using
+   * those argument, compute the list of parameters that correspond to the list of arguments. Return
+   * the parameters that correspond to the arguments.
+   *
+   * @param reportError if `true` then compile-time error should be reported; if `false`
+   *          then compile-time warning
+   * @param argumentList the list of arguments being passed to the element
+   * @param parameters the of the function that will be invoked with the arguments
+   * @return the parameters that correspond to the arguments
+   */
+  List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
+    List<ParameterElement> requiredParameters = new List<ParameterElement>();
+    List<ParameterElement> positionalParameters = new List<ParameterElement>();
+    HashMap<String, ParameterElement> namedParameters = new HashMap<String, ParameterElement>();
+    for (ParameterElement parameter in parameters) {
+      ParameterKind kind = parameter.parameterKind;
+      if (kind == ParameterKind.REQUIRED) {
+        requiredParameters.add(parameter);
+      } else if (kind == ParameterKind.POSITIONAL) {
+        positionalParameters.add(parameter);
+      } else {
+        namedParameters[parameter.name] = parameter;
+      }
+    }
+    List<ParameterElement> unnamedParameters = new List<ParameterElement>.from(requiredParameters);
+    unnamedParameters.addAll(positionalParameters);
+    int unnamedParameterCount = unnamedParameters.length;
+    int unnamedIndex = 0;
+    NodeList<Expression> arguments = argumentList.arguments;
+    int argumentCount = arguments.length;
+    List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
+    int positionalArgumentCount = 0;
+    HashSet<String> usedNames = new HashSet<String>();
+    bool noBlankArguments = true;
+    for (int i = 0; i < argumentCount; i++) {
+      Expression argument = arguments[i];
+      if (argument is NamedExpression) {
+        SimpleIdentifier nameNode = argument.name.label;
+        String name = nameNode.name;
+        ParameterElement element = namedParameters[name];
+        if (element == null) {
+          ErrorCode errorCode = (reportError ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER);
+          _resolver.reportErrorForNode(errorCode, nameNode, [name]);
+        } else {
+          resolvedParameters[i] = element;
+          nameNode.staticElement = element;
+        }
+        if (!usedNames.add(name)) {
+          _resolver.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
+        }
+      } else {
+        if (argument is SimpleIdentifier && argument.name.isEmpty) {
+          noBlankArguments = false;
+        }
+        positionalArgumentCount++;
+        if (unnamedIndex < unnamedParameterCount) {
+          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
+        }
+      }
+    }
+    if (positionalArgumentCount < requiredParameters.length && noBlankArguments) {
+      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
+      _resolver.reportErrorForNode(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
+    } else if (positionalArgumentCount > unnamedParameterCount && noBlankArguments) {
+      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
+      _resolver.reportErrorForNode(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
+    }
+    return resolvedParameters;
+  }
+
+  /**
+   * Resolve the names in the given combinators in the scope of the given library.
+   *
+   * @param library the library that defines the names
+   * @param combinators the combinators containing the names to be resolved
+   */
+  void _resolveCombinators(LibraryElement library, NodeList<Combinator> combinators) {
+    if (library == null) {
+      //
+      // The library will be null if the directive containing the combinators has a URI that is not
+      // valid.
+      //
+      return;
+    }
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(library);
+    for (Combinator combinator in combinators) {
+      NodeList<SimpleIdentifier> names;
+      if (combinator is HideCombinator) {
+        names = combinator.hiddenNames;
+      } else {
+        names = (combinator as ShowCombinator).shownNames;
+      }
+      for (SimpleIdentifier name in names) {
+        String nameStr = name.name;
+        Element element = namespace.get(nameStr);
+        if (element == null) {
+          element = namespace.get("$nameStr=");
+        }
+        if (element != null) {
+          // Ensure that the name always resolves to a top-level variable
+          // rather than a getter or setter
+          if (element is PropertyAccessorElement) {
+            element = (element as PropertyAccessorElement).variable;
+          }
+          name.staticElement = element;
+        }
+      }
+    }
+  }
+
+  /**
+   * Given an invocation of the form 'C.x()' where 'C' is a class, find and return the element 'x'
+   * in 'C'.
+   *
+   * @param classElement the class element
+   * @param nameNode the member name node
+   */
+  Element _resolveElement(ClassElementImpl classElement, SimpleIdentifier nameNode) {
+    String name = nameNode.name;
+    Element element = classElement.getMethod(name);
+    if (element == null && nameNode.inSetterContext()) {
+      element = classElement.getSetter(name);
+    }
+    if (element == null && nameNode.inGetterContext()) {
+      element = classElement.getGetter(name);
+    }
+    if (element != null && element.isAccessibleIn(_definingLibrary)) {
+      return element;
+    }
+    return null;
+  }
+
+  /**
+   * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the element being invoked. If
+   * the returned element is a method, then the method will be invoked. If the returned element is a
+   * getter, the getter will be invoked without arguments and the result of that invocation will
+   * then be invoked with the arguments.
+   *
+   * @param methodName the name of the method being invoked ('m')
+   * @return the element being invoked
+   */
+  Element _resolveInvokedElement(SimpleIdentifier methodName) {
+    //
+    // Look first in the lexical scope.
+    //
+    Element element = _resolver.nameScope.lookup(methodName, _definingLibrary);
+    if (element == null) {
+      //
+      // If it isn't defined in the lexical scope, and the invocation is within a class, then look
+      // in the inheritance scope.
+      //
+      ClassElement enclosingClass = _resolver.enclosingClass;
+      if (enclosingClass != null) {
+        InterfaceType enclosingType = enclosingClass.type;
+        element = _lookUpMethod(null, enclosingType, methodName.name);
+        if (element == null) {
+          //
+          // If there's no method, then it's possible that 'm' is a getter that returns a function.
+          //
+          element = _lookUpGetter(null, enclosingType, methodName.name);
+        }
+      }
+    }
+    // TODO(brianwilkerson) Report this error.
+    return element;
+  }
+
+  /**
+   * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the element being invoked.
+   * If the returned element is a method, then the method will be invoked. If the returned element
+   * is a getter, the getter will be invoked without arguments and the result of that invocation
+   * will then be invoked with the arguments.
+   *
+   * @param target the target of the invocation ('e')
+   * @param targetType the type of the target
+   * @param methodName the name of the method being invoked ('m')
+   * @return the element being invoked
+   */
+  Element _resolveInvokedElementWithTarget(Expression target, DartType targetType, SimpleIdentifier methodName) {
+    if (targetType is InterfaceType || targetType is UnionType) {
+      Element element = _lookUpMethod(target, targetType, methodName.name);
+      if (element == null) {
+        //
+        // If there's no method, then it's possible that 'm' is a getter that returns a function.
+        //
+        // TODO (collinsn): need to add union type support here too, in the style of [lookUpMethod].
+        element = _lookUpGetter(target, targetType, methodName.name);
+      }
+      return element;
+    } else if (target is SimpleIdentifier) {
+      Element targetElement = target.staticElement;
+      if (targetElement is PrefixElement) {
+        //
+        // Look to see whether the name of the method is really part of a prefixed identifier for an
+        // imported top-level function or top-level getter that returns a function.
+        //
+        String name = "${target.name}.$methodName";
+        Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
+        Element element = _resolver.nameScope.lookup(functionName, _definingLibrary);
+        if (element != null) {
+          // TODO(brianwilkerson) This isn't a method invocation, it's a function invocation where
+          // the function name is a prefixed identifier. Consider re-writing the AST.
+          return element;
+        }
+      }
+    }
+    // TODO(brianwilkerson) Report this error.
+    return null;
+  }
+
+  /**
+   * Given that we are accessing a property of the given type with the given name, return the
+   * element that represents the property.
+   *
+   * @param target the target of the invocation ('e')
+   * @param targetType the type in which the search for the property should begin
+   * @param propertyName the name of the property being accessed
+   * @return the element that represents the property
+   */
+  ExecutableElement _resolveProperty(Expression target, DartType targetType, SimpleIdentifier propertyName) {
+    ExecutableElement memberElement = null;
+    if (propertyName.inSetterContext()) {
+      memberElement = _lookUpSetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = _lookUpGetter(target, targetType, propertyName.name);
+    }
+    if (memberElement == null) {
+      memberElement = _lookUpMethod(target, targetType, propertyName.name);
+    }
+    return memberElement;
+  }
+
+  void _resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
+    DartType staticType = _getStaticType(target);
+    DartType propagatedType = _getPropagatedType(target);
+    Element staticElement = null;
+    Element propagatedElement = null;
+    //
+    // If this property access is of the form 'C.m' where 'C' is a class, then we don't call
+    // resolveProperty(..) which walks up the class hierarchy, instead we just look for the
+    // member in the type only.
+    //
+    ClassElementImpl typeReference = getTypeReference(target);
+    if (typeReference != null) {
+      // TODO(brianwilkerson) Why are we setting the propagated element here? It looks wrong.
+      staticElement = propagatedElement = _resolveElement(typeReference, propertyName);
+    } else {
+      staticElement = _resolveProperty(target, staticType, propertyName);
+      propagatedElement = _resolveProperty(target, propagatedType, propertyName);
+    }
+    // May be part of annotation, record property element only if exists.
+    // Error was already reported in validateAnnotationElement().
+    if (target.parent.parent is Annotation) {
+      if (staticElement != null) {
+        propertyName.staticElement = staticElement;
+      }
+      return;
+    }
+    propertyName.staticElement = staticElement;
+    propertyName.propagatedElement = propagatedElement;
+    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticElement);
+    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && _shouldReportMissingMember(propagatedType, propagatedElement) && !_memberFoundInSubclass(propagatedType.element, propertyName.name, false, true);
+    // TODO(collinsn): add support for errors on union types by extending
+    // [lookupGetter] and [lookupSetter] in analogy with the earlier [lookupMethod] extensions.
+    if (propagatedType is UnionType) {
+      shouldReportMissingMember_propagated = false;
+    }
+    if (shouldReportMissingMember_static || shouldReportMissingMember_propagated) {
+      Element staticOrPropagatedEnclosingElt = shouldReportMissingMember_static ? staticType.element : propagatedType.element;
+      bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt);
+      String displayName = staticOrPropagatedEnclosingElt != null ? staticOrPropagatedEnclosingElt.displayName : propagatedType != null ? propagatedType.displayName : staticType.displayName;
+      // Special getter cases.
+      if (propertyName.inGetterContext()) {
+        if (!isStaticProperty && staticOrPropagatedEnclosingElt is ClassElement) {
+          ClassElement classElement = staticOrPropagatedEnclosingElt;
+          InterfaceType targetType = classElement.type;
+          if (targetType != null && targetType.isDartCoreFunction && propertyName.name == FunctionElement.CALL_METHOD_NAME) {
+            // TODO(brianwilkerson) Can we ever resolve the function being invoked?
+            //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
+            return;
+          } else if (classElement.isEnum && propertyName.name == "_name") {
+            _resolver.reportErrorForNode(CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, propertyName, [propertyName.name]);
+            return;
+          }
+        }
+      }
+      Element declaringElement = staticType.isVoid ? null : staticOrPropagatedEnclosingElt;
+      if (propertyName.inSetterContext()) {
+        ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? StaticWarningCode.UNDEFINED_SETTER : StaticTypeWarningCode.UNDEFINED_SETTER);
+        ErrorCode errorCode = shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFINED_SETTER;
+        _recordUndefinedNode(declaringElement, errorCode, propertyName, [propertyName.name, displayName]);
+      } else if (propertyName.inGetterContext()) {
+        ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? StaticWarningCode.UNDEFINED_GETTER : StaticTypeWarningCode.UNDEFINED_GETTER);
+        ErrorCode errorCode = shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFINED_GETTER;
+        _recordUndefinedNode(declaringElement, errorCode, propertyName, [propertyName.name, displayName]);
+      } else {
+        _recordUndefinedNode(declaringElement, StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
+      }
+    }
+  }
+
+  /**
+   * Resolve the given simple identifier if possible. Return the element to which it could be
+   * resolved, or `null` if it could not be resolved. This does not record the results of the
+   * resolution.
+   *
+   * @param node the identifier to be resolved
+   * @return the element to which the identifier could be resolved
+   */
+  Element _resolveSimpleIdentifier(SimpleIdentifier node) {
+    Element element = _resolver.nameScope.lookup(node, _definingLibrary);
+    if (element is PropertyAccessorElement && node.inSetterContext()) {
+      PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
+      if (variable != null) {
+        PropertyAccessorElement setter = variable.setter;
+        if (setter == null) {
+          //
+          // Check to see whether there might be a locally defined getter and an inherited setter.
+          //
+          ClassElement enclosingClass = _resolver.enclosingClass;
+          if (enclosingClass != null) {
+            setter = _lookUpSetter(null, enclosingClass.type, node.name);
+          }
+        }
+        if (setter != null) {
+          element = setter;
+        }
+      }
+    } else if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
+      element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _definingLibrary);
+    }
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (element == null && enclosingClass != null) {
+      InterfaceType enclosingType = enclosingClass.type;
+      if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
+        element = _lookUpSetter(null, enclosingType, node.name);
+      }
+      if (element == null && node.inGetterContext()) {
+        element = _lookUpGetter(null, enclosingType, node.name);
+      }
+      if (element == null) {
+        element = _lookUpMethod(null, enclosingType, node.name);
+      }
+    }
+    return element;
+  }
+
+  /**
+   * If the given type is a type parameter, resolve it to the type that should be used when looking
+   * up members. Otherwise, return the original type.
+   *
+   * @param type the type that is to be resolved if it is a type parameter
+   * @return the type that should be used in place of the argument if it is a type parameter, or the
+   *         original argument if it isn't a type parameter
+   */
+  DartType _resolveTypeParameter(DartType type) {
+    if (type is TypeParameterType) {
+      DartType bound = type.element.bound;
+      if (bound == null) {
+        return _resolver.typeProvider.objectType;
+      }
+      return bound;
+    }
+    return type;
+  }
+
+  /**
+   * Given a node that can have annotations associated with it and the element to which that node
+   * has been resolved, create the annotations in the element model representing the annotations on
+   * the node.
+   *
+   * @param element the element to which the node has been resolved
+   * @param node the node that can have annotations associated with it
+   */
+  void _setMetadata(Element element, AnnotatedNode node) {
+    if (element is! ElementImpl) {
+      return;
+    }
+    List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
+    _addAnnotations(annotationList, node.metadata);
+    if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
+      VariableDeclarationList list = node.parent as VariableDeclarationList;
+      _addAnnotations(annotationList, list.metadata);
+      if (list.parent is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
+        _addAnnotations(annotationList, fieldDeclaration.metadata);
+      } else if (list.parent is TopLevelVariableDeclaration) {
+        TopLevelVariableDeclaration variableDeclaration = list.parent as TopLevelVariableDeclaration;
+        _addAnnotations(annotationList, variableDeclaration.metadata);
+      }
+    }
+    if (!annotationList.isEmpty) {
+      (element as ElementImpl).metadata = annotationList;
+    }
+  }
+
+  /**
+   * Given a node that can have annotations associated with it and the element to which that node
+   * has been resolved, create the annotations in the element model representing the annotations on
+   * the node.
+   *
+   * @param element the element to which the node has been resolved
+   * @param node the node that can have annotations associated with it
+   */
+  void _setMetadataForParameter(Element element, NormalFormalParameter node) {
+    if (element is! ElementImpl) {
+      return;
+    }
+    List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
+    _addAnnotations(annotationList, node.metadata);
+    if (!annotationList.isEmpty) {
+      (element as ElementImpl).metadata = annotationList;
+    }
+  }
+
+  /**
+   * Return `true` if we should report an error as a result of looking up a member in the
+   * given type and not finding any member.
+   *
+   * @param type the type in which we attempted to perform the look-up
+   * @param member the result of the look-up
+   * @return `true` if we should report an error
+   */
+  bool _shouldReportMissingMember(DartType type, Element member) {
+    if (member != null || type == null || type.isDynamic || type.isBottom) {
+      return false;
+    }
+    return true;
+  }
+}
+
+/**
+ * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to
+ * look up names in the lexical scope when there is no identifier in the AST structure. There is
+ * no identifier in the AST when the parser could not distinguish between a method invocation and
+ * an invocation of a top-level function imported with a prefix.
+ */
+class ElementResolver_SyntheticIdentifier extends Identifier {
+  /**
+   * The name of the synthetic identifier.
+   */
+  final String name;
+
+  /**
+   * Initialize a newly created synthetic identifier to have the given name.
+   *
+   * @param name the name of the synthetic identifier
+   */
+  ElementResolver_SyntheticIdentifier(this.name);
+
+  @override
+  accept(AstVisitor visitor) => null;
+
+  @override
+  sc.Token get beginToken => null;
+
+  @override
+  Element get bestElement => null;
+
+  @override
+  sc.Token get endToken => null;
+
+  @override
+  int get precedence => 16;
+
+  @override
+  Element get propagatedElement => null;
+
+  @override
+  Element get staticElement => null;
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+  }
+}
+
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 4de74d4..3404ad8 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -18,6 +18,7 @@
 import 'utilities_general.dart';
 import 'instrumentation.dart';
 import 'error.dart';
+import 'error_verifier.dart';
 import 'source.dart';
 import 'scanner.dart';
 import 'ast.dart';
@@ -111,11 +112,13 @@
       }
     }
     //
-    // We should never get to this point because the last partition should always be a universal
-    // partition, except in the case of the SDK context, in which case the source should always be
-    // part of the SDK.
+    // We should never get to this point because the last partition should
+    // always be a universal partition, except in the case of the SDK context,
+    // in which case the source should always be part of the SDK.
     //
-    AnalysisEngine.instance.logger.logInformation2("Could not find context for ${source.fullName}", new JavaException());
+    AnalysisEngine.instance.logger.logInformation(
+        "Could not find context for ${source.fullName}",
+        new CaughtException(new AnalysisException(), null));
     return null;
   }
 
@@ -1158,8 +1161,10 @@
             }
           }
         }
-      } on ObsoleteSourceAnalysisException catch (exception) {
-        AnalysisEngine.instance.logger.logInformation2("Could not compute errors", exception);
+      } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Could not compute errors",
+            new CaughtException(exception, stackTrace));
       }
       if (errors.isEmpty) {
         return AnalysisError.NO_ERRORS;
@@ -1169,8 +1174,10 @@
       HtmlEntry htmlEntry = sourceEntry;
       try {
         return _getHtmlResolutionData2(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
-      } on ObsoleteSourceAnalysisException catch (exception) {
-        AnalysisEngine.instance.logger.logInformation2("Could not compute errors", exception);
+      } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Could not compute errors",
+            new CaughtException(exception, stackTrace));
       }
     }
     return AnalysisError.NO_ERRORS;
@@ -1212,8 +1219,10 @@
       } else if (sourceEntry is DartEntry) {
         return _getDartScanData2(source, SourceEntry.LINE_INFO, null);
       }
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${SourceEntry.LINE_INFO}", exception);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute ${SourceEntry.LINE_INFO}",
+          new CaughtException(exception, stackTrace));
     }
     return null;
   }
@@ -1529,7 +1538,11 @@
       NamespaceBuilder builder = new NamespaceBuilder();
       namespace = builder.createPublicNamespaceForLibrary(library);
       if (dartEntry == null) {
-        AnalysisEngine.instance.logger.logError2("Could not compute the public namespace for ${library.source.fullName}", new CaughtException(new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}"), null));
+        AnalysisEngine.instance.logger.logError(
+            "Could not compute the public namespace for ${library.source.fullName}",
+            new CaughtException(
+                new AnalysisException("A Dart file became a non-Dart file: ${source.fullName}"),
+                null));
         return null;
       }
       if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
@@ -1613,55 +1626,95 @@
   }
 
   @override
-  AnalysisContextStatistics get statistics {
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+                                     DataDescriptor rowDesc,
+                                     CacheState state)) {
+    void handleCacheItem(Source source, SourceEntry dartEntry,
+                         DataDescriptor descriptor) {
+      callback(source, dartEntry, descriptor, dartEntry.getState(descriptor));
+    }
+    void handleCacheItemInLibrary(DartEntry dartEntry, Source librarySource,
+                                  DataDescriptor descriptor) {
+      callback(librarySource, dartEntry, descriptor,
+          dartEntry.getStateInLibrary(descriptor, librarySource));
+    }
+
     bool hintsEnabled = _options.hint;
-    AnalysisContextStatisticsImpl statistics = new AnalysisContextStatisticsImpl();
     MapIterator<Source, SourceEntry> iterator = _cache.iterator();
     while (iterator.moveNext()) {
+      Source source = iterator.key;
       SourceEntry sourceEntry = iterator.value;
       if (sourceEntry is DartEntry) {
-        Source source = iterator.key;
         DartEntry dartEntry = sourceEntry;
         SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
         // get library independent values
-        statistics.putCacheItem(dartEntry, SourceEntry.LINE_INFO);
-        statistics.putCacheItem(dartEntry, DartEntry.PARSE_ERRORS);
-        statistics.putCacheItem(dartEntry, DartEntry.PARSED_UNIT);
-        statistics.putCacheItem(dartEntry, DartEntry.SOURCE_KIND);
+        handleCacheItem(source, dartEntry, SourceEntry.CONTENT);
+        handleCacheItem(source, dartEntry, SourceEntry.LINE_INFO);
+        // The list of containing libraries is always valid, so the state isn't
+        // interesting.
+//        handleCacheItem(source, dartEntry, DartEntry.CONTAINING_LIBRARIES);
+        handleCacheItem(source, dartEntry, DartEntry.PARSE_ERRORS);
+        handleCacheItem(source, dartEntry, DartEntry.PARSED_UNIT);
+        handleCacheItem(source, dartEntry, DartEntry.SCAN_ERRORS);
+        handleCacheItem(source, dartEntry, DartEntry.SOURCE_KIND);
+        handleCacheItem(source, dartEntry, DartEntry.TOKEN_STREAM);
         if (kind == SourceKind.LIBRARY) {
-          statistics.putCacheItem(dartEntry, DartEntry.ELEMENT);
-          statistics.putCacheItem(dartEntry, DartEntry.EXPORTED_LIBRARIES);
-          statistics.putCacheItem(dartEntry, DartEntry.IMPORTED_LIBRARIES);
-          statistics.putCacheItem(dartEntry, DartEntry.INCLUDED_PARTS);
-          statistics.putCacheItem(dartEntry, DartEntry.IS_CLIENT);
-          statistics.putCacheItem(dartEntry, DartEntry.IS_LAUNCHABLE);
-          // The public namespace isn't computed by performAnalysisTask() and therefore isn't
-          // interesting.
-          //statistics.putCacheItem(dartEntry, DartEntry.PUBLIC_NAMESPACE);
+          handleCacheItem(source, dartEntry, DartEntry.ELEMENT);
+          handleCacheItem(source, dartEntry, DartEntry.EXPORTED_LIBRARIES);
+          handleCacheItem(source, dartEntry, DartEntry.IMPORTED_LIBRARIES);
+          handleCacheItem(source, dartEntry, DartEntry.INCLUDED_PARTS);
+          handleCacheItem(source, dartEntry, DartEntry.IS_CLIENT);
+          handleCacheItem(source, dartEntry, DartEntry.IS_LAUNCHABLE);
+          // The public namespace isn't computed by performAnalysisTask()
+          // and therefore isn't interesting.
+          //handleCacheItem(key, dartEntry, DartEntry.PUBLIC_NAMESPACE);
         }
         // get library-specific values
         List<Source> librarySources = getLibrariesContaining(source);
         for (Source librarySource in librarySources) {
-          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS);
-          statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLVED_UNIT);
+          // These values are not currently being computed, so their state is
+          // not interesting.
+//          handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.ANGULAR_ERRORS);
+//          handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_ELEMENT);
+//          handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_UNIT);
+          handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS);
+          handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLVED_UNIT);
           if (_generateSdkErrors || !source.isInSystemLibrary) {
-            statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.VERIFICATION_ERRORS);
+            handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.VERIFICATION_ERRORS);
             if (hintsEnabled) {
-              statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.HINTS);
+              handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.HINTS);
             }
           }
         }
       } else if (sourceEntry is HtmlEntry) {
         HtmlEntry htmlEntry = sourceEntry;
-        statistics.putCacheItem(htmlEntry, SourceEntry.LINE_INFO);
-        statistics.putCacheItem(htmlEntry, HtmlEntry.PARSE_ERRORS);
-        statistics.putCacheItem(htmlEntry, HtmlEntry.PARSED_UNIT);
-        statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
-        statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT);
+        handleCacheItem(source, htmlEntry, SourceEntry.CONTENT);
+        handleCacheItem(source, htmlEntry, SourceEntry.LINE_INFO);
+        // These values are not currently being computed, so their state is
+        // not interesting.
+//        handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_APPLICATION);
+//        handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_COMPONENT);
+//        handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ENTRY);
+//        handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ERRORS);
+        handleCacheItem(source, htmlEntry, HtmlEntry.ELEMENT);
+        handleCacheItem(source, htmlEntry, HtmlEntry.PARSE_ERRORS);
+        handleCacheItem(source, htmlEntry, HtmlEntry.PARSED_UNIT);
+        // These values are not currently being computed, so their state is
+        // not interesting.
+//        handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_BUILD_ERRORS);
+//        handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_RESOLUTION_ERRORS);
+        handleCacheItem(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
+        handleCacheItem(source, htmlEntry, HtmlEntry.RESOLVED_UNIT);
         // We are not currently recording any hints related to HTML.
-        // statistics.putCacheItem(htmlEntry, HtmlEntry.HINTS);
+//        handleCacheItem(key, htmlEntry, HtmlEntry.HINTS);
       }
     }
+  }
+
+  @override
+  AnalysisContextStatistics get statistics {
+    AnalysisContextStatisticsImpl statistics = new AnalysisContextStatisticsImpl();
+    visitCacheItems(statistics._internalPutCacheItem);
     statistics.partitionData = _cache.partitionData;
     return statistics;
   }
@@ -1730,11 +1783,15 @@
     int performStart = JavaSystem.currentTimeMillis();
     try {
       task.perform(_resultRecorder);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: $taskDescription", exception);
-    } on AnalysisException catch (exception) {
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not perform analysis task: $taskDescription",
+          new CaughtException(exception, stackTrace));
+    } on AnalysisException catch (exception, stackTrace) {
       if (exception.cause is! JavaIOException) {
-        AnalysisEngine.instance.logger.logError2("Internal error while performing the task: $task", exception);
+        AnalysisEngine.instance.logger.logError(
+            "Internal error while performing the task: $task",
+            new CaughtException(exception, stackTrace));
       }
     }
     int performEnd = JavaSystem.currentTimeMillis();
@@ -2511,8 +2568,10 @@
     }
     CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     if (unit == null) {
-      CaughtException exception = new CaughtException(new AnalysisException("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"), null);
-      AnalysisEngine.instance.logger.logInformation2(exception.toString(), exception);
+      CaughtException exception = new CaughtException(
+          new AnalysisException("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"),
+          null);
+      AnalysisEngine.instance.logger.logInformation(exception.toString(), exception);
       unitEntry.recordResolutionError(exception);
       return new AnalysisContextImpl_TaskData(null, false);
     }
@@ -2679,7 +2738,9 @@
       return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), false);
     } on AnalysisException catch (exception, stackTrace) {
       dartEntry.recordResolutionError(new CaughtException(exception, stackTrace));
-      AnalysisEngine.instance.logger.logError2("Internal error trying to create a ResolveDartLibraryTask", new CaughtException(exception, stackTrace));
+      AnalysisEngine.instance.logger.logError(
+          "Internal error trying to create a ResolveDartLibraryTask",
+          new CaughtException(exception, stackTrace));
     }
     return new AnalysisContextImpl_TaskData(null, false);
   }
@@ -2837,8 +2898,10 @@
     }
     try {
       return _getDartParseData(source, dartEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
       return defaultValue;
     }
   }
@@ -2891,8 +2954,10 @@
     }
     try {
       return _getDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
       return defaultValue;
     }
   }
@@ -2936,8 +3001,10 @@
     }
     try {
       return _getDartScanData(source, dartEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
       return defaultValue;
     }
   }
@@ -3010,8 +3077,10 @@
     }
     try {
       return _getHtmlResolutionData2(source, htmlEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
+    } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Could not compute $descriptor",
+          new CaughtException(exception, stackTrace));
       return defaultValue;
     }
   }
@@ -3657,20 +3726,6 @@
   }
 
   /**
-   * Log the given debugging information.
-   *
-   * @param message the message to be added to the log
-   * @param exception the exception to be included in the log entry
-   */
-  void _logInformation2(String message, Exception exception) {
-    if (exception == null) {
-      AnalysisEngine.instance.logger.logInformation(message);
-    } else {
-      AnalysisEngine.instance.logger.logInformation2(message, exception);
-    }
-  }
-
-  /**
    * Notify all of the analysis listeners that a task is about to be performed.
    *
    * @param taskDescription a human readable description of the task that is about to be performed
@@ -5113,14 +5168,6 @@
   @override
   List<Source> get sources => _sources;
 
-  void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
-  }
-
-  void putCacheItemInLibrary(DartEntry dartEntry, Source librarySource, DataDescriptor descriptor) {
-    _internalPutCacheItem(dartEntry, descriptor, dartEntry.getStateInLibrary(descriptor, librarySource));
-  }
-
   /**
    * Set the partition data returned by this object to the given data.
    */
@@ -5128,7 +5175,8 @@
     _partitionData = data;
   }
 
-  void _internalPutCacheItem(SourceEntry dartEntry, DataDescriptor rowDesc, CacheState state) {
+  void _internalPutCacheItem(Source source, SourceEntry dartEntry,
+                             DataDescriptor rowDesc, CacheState state) {
     String rowName = rowDesc.toString();
     AnalysisContextStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl;
     if (row == null) {
@@ -5148,15 +5196,7 @@
 class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStatistics_CacheRow {
   final String name;
 
-  int _errorCount = 0;
-
-  int _flushedCount = 0;
-
-  int _inProcessCount = 0;
-
-  int _invalidCount = 0;
-
-  int _validCount = 0;
+  Map<CacheState, int> _counts = <CacheState, int>{};
 
   AnalysisContextStatisticsImpl_CacheRowImpl(this.name);
 
@@ -5164,38 +5204,38 @@
   bool operator ==(Object obj) => obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name;
 
   @override
-  int get errorCount => _errorCount;
+  int get errorCount => getCount(CacheState.ERROR);
 
   @override
-  int get flushedCount => _flushedCount;
+  int get flushedCount => getCount(CacheState.FLUSHED);
 
   @override
-  int get inProcessCount => _inProcessCount;
+  int get inProcessCount => getCount(CacheState.IN_PROCESS);
 
   @override
-  int get invalidCount => _invalidCount;
+  int get invalidCount => getCount(CacheState.INVALID);
 
   @override
-  int get validCount => _validCount;
+  int get validCount => getCount(CacheState.VALID);
 
   @override
   int get hashCode => name.hashCode;
 
+  @override
+  int getCount(CacheState state) {
+    int count = _counts[state];
+    if (count != null) {
+      return count;
+    } else {
+      return 0;
+    }
+  }
+
   void _incState(CacheState state) {
-    if (state == CacheState.ERROR) {
-      _errorCount++;
-    }
-    if (state == CacheState.FLUSHED) {
-      _flushedCount++;
-    }
-    if (state == CacheState.IN_PROCESS) {
-      _inProcessCount++;
-    }
-    if (state == CacheState.INVALID) {
-      _invalidCount++;
-    }
-    if (state == CacheState.VALID) {
-      _validCount++;
+    if (_counts[state] == null) {
+      _counts[state] = 1;
+    } else {
+      _counts[state]++;
     }
   }
 }
@@ -5213,6 +5253,18 @@
  */
 abstract class AnalysisContextStatistics_CacheRow {
   /**
+   * List of possible states which can be queried.
+   */
+  static const List<CacheState> STATES = const <CacheState>[
+      CacheState.ERROR, CacheState.FLUSHED, CacheState.IN_PROCESS,
+      CacheState.INVALID, CacheState.VALID];
+
+  /**
+   * Return the number of entries whose state is [state].
+   */
+  int getCount(CacheState state);
+
+  /**
    * Return the number of entries whose state is [CacheState.ERROR].
    */
   int get errorCount;
@@ -5936,7 +5988,9 @@
       _safelyPerform();
     } on AnalysisException catch (exception, stackTrace) {
       _thrownException = new CaughtException(exception, stackTrace);
-      AnalysisEngine.instance.logger.logInformation2("Task failed: $taskDescription", new CaughtException(exception, stackTrace));
+      AnalysisEngine.instance.logger.logInformation(
+          "Task failed: $taskDescription",
+          new CaughtException(exception, stackTrace));
     }
     return accept(visitor);
   }
@@ -7425,7 +7479,9 @@
     this._errors = errors;
     this._lineInfo = lineInfo;
     if (lineInfo == null) {
-      AnalysisEngine.instance.logger.logInformation2("No line info: $source", new JavaException());
+      AnalysisEngine.instance.logger.logInformation(
+          "No line info: $source",
+          new CaughtException(new AnalysisException(), null));
     }
   }
 
@@ -8023,10 +8079,10 @@
       if (state.getState(BUILT_UNIT) == CacheState.VALID) {
         // TODO(brianwilkerson) We're cloning the structure to remove any
         // previous resolution data, but I'm not sure that's necessary.
-        return state.getValue(BUILT_UNIT).accept(new AstCloner()) as CompilationUnit;
+        return state.getValue(BUILT_UNIT).accept(new AstCloner());
       }
       if (state.getState(RESOLVED_UNIT) == CacheState.VALID) {
-        return state.getValue(RESOLVED_UNIT).accept(new AstCloner()) as CompilationUnit;
+        return state.getValue(RESOLVED_UNIT).accept(new AstCloner());
       }
       state = state._nextState;
     }
@@ -8133,10 +8189,12 @@
       ResolutionState state = _resolutionState;
       while (state != null) {
         if (state.getState(BUILT_UNIT) == CacheState.VALID) {
-          setValue(PARSED_UNIT, state.getValue(BUILT_UNIT));
+          CompilationUnit unit = state.getValue(BUILT_UNIT);
+          setValue(PARSED_UNIT, unit.accept(new AstCloner()));
           break;
         } else if (state.getState(RESOLVED_UNIT) == CacheState.VALID) {
-          setValue(PARSED_UNIT, state.getValue(RESOLVED_UNIT));
+          CompilationUnit unit = state.getValue(RESOLVED_UNIT);
+          setValue(PARSED_UNIT, unit.accept(new AstCloner()));
           break;
         }
         state = state._nextState;
@@ -8519,7 +8577,8 @@
    * relative to a library.
    */
   bool _isValidLibraryDescriptor(DataDescriptor descriptor) {
-    return descriptor == BUILT_ELEMENT
+    return descriptor == ANGULAR_ERRORS
+        || descriptor == BUILT_ELEMENT
         || descriptor == BUILT_UNIT
         || descriptor == HINTS
         || descriptor == RESOLUTION_ERRORS
@@ -10209,6 +10268,13 @@
       instrumentation.log();
     }
   }
+
+  @override
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+                                     DataDescriptor rowDesc,
+                                     CacheState state)) {
+    _basis.visitCacheItems(callback);
+  }
 }
 
 /**
@@ -10306,23 +10372,34 @@
    *          the elements representing the libraries
    */
   void recordLibraryElements(Map<Source, LibraryElement> elementMap);
+
+  /**
+   * Call the given callback function for eache cache item in the context.
+   */
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+                                     DataDescriptor rowDesc,
+                                     CacheState state));
 }
 
 /**
- * The interface `Logger` defines the behavior of objects that can be used to receive
- * information about errors within the analysis engine. Implementations usually write this
- * information to a file, but can also record the information for later use (such as during testing)
- * or even ignore the information.
+ * A `Logger` is an object that can be used to receive information about errors
+ * within the analysis engine. Implementations usually write this information to
+ * a file, but can also record the information for later use (such as during
+ * testing) or even ignore the information.
  */
 abstract class Logger {
-  static final Logger NULL = new Logger_NullLogger();
+  /**
+   * A logger that ignores all logging.
+   */
+  static final Logger NULL = new NullLogger();
 
   /**
-   * Log the given message as an error.
-   *
-   * @param message an explanation of why the error occurred or what it means
+   * Log the given message as an error. The [message] is expected to be an
+   * explanation of why the error occurred or what it means. The [exception] is
+   * expected to be the reason for the error. At least one argument must be
+   * provided.
    */
-  void logError(String message);
+  void logError(String message, [CaughtException exception]);
 
   /**
    * Log the given exception as one representing an error.
@@ -10330,15 +10407,15 @@
    * @param message an explanation of why the error occurred or what it means
    * @param exception the exception being logged
    */
-  void logError2(String message, Exception exception);
+  @deprecated
+  void logError2(String message, Object exception);
 
   /**
-   * Log the given informational message.
-   *
-   * @param message an explanation of why the error occurred or what it means
-   * @param exception the exception being logged
+   * Log the given informational message. The [message] is expected to be an
+   * explanation of why the error occurred or what it means. The [exception] is
+   * expected to be the reason for the error.
    */
-  void logInformation(String message);
+  void logInformation(String message, [CaughtException exception]);
 
   /**
    * Log the given exception as one representing an informational message.
@@ -10346,27 +10423,28 @@
    * @param message an explanation of why the error occurred or what it means
    * @param exception the exception being logged
    */
-  void logInformation2(String message, Exception exception);
+  @deprecated
+  void logInformation2(String message, Object exception);
 }
 
 /**
- * Implementation of [Logger] that does nothing.
+ * An implementation of [Logger] that does nothing.
  */
-class Logger_NullLogger implements Logger {
+class NullLogger implements Logger {
   @override
-  void logError(String message) {
+  void logError(String message, [CaughtException exception]) {
   }
 
   @override
-  void logError2(String message, Exception exception) {
+  void logError2(String message, Object exception) {
   }
 
   @override
-  void logInformation(String message) {
+  void logInformation(String message, [CaughtException exception]) {
   }
 
   @override
-  void logInformation2(String message, Exception exception) {
+  void logInformation2(String message, Object exception) {
   }
 }
 
@@ -11769,10 +11847,17 @@
 }
 
 /**
- * Instances of the class `ResolutionEraser` remove any resolution information from an AST
+ * A `ResolutionEraser` removes any resolution information from an AST
  * structure when used to visit that structure.
  */
 class ResolutionEraser extends GeneralizingAstVisitor<Object> {
+  /**
+   * Remove any resolution information from the given AST structure.
+   */
+  static void erase(AstNode node) {
+    node.accept(new ResolutionEraser());
+  }
+
   @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     node.staticElement = null;
@@ -11955,10 +12040,12 @@
   void invalidateAllResolutionInformation() {
     _nextState = null;
     _librarySource = null;
+    setState(DartEntry.BUILT_UNIT, CacheState.INVALID);
+    setState(DartEntry.BUILT_ELEMENT, CacheState.INVALID);
+    setState(DartEntry.HINTS, CacheState.INVALID);
     setState(DartEntry.RESOLVED_UNIT, CacheState.INVALID);
     setState(DartEntry.RESOLUTION_ERRORS, CacheState.INVALID);
     setState(DartEntry.VERIFICATION_ERRORS, CacheState.INVALID);
-    setState(DartEntry.HINTS, CacheState.INVALID);
   }
 
   /**
@@ -11988,6 +12075,7 @@
     setState(DartEntry.RESOLVED_UNIT, CacheState.ERROR);
     setState(DartEntry.RESOLUTION_ERRORS, CacheState.ERROR);
     recordVerificationError();
+    setState(DartEntry.ANGULAR_ERRORS, CacheState.ERROR);
   }
 
   /**
@@ -13010,8 +13098,8 @@
       result.state = state;
       if (state != CacheState.IN_PROCESS) {
         //
-        // If the state is in-process, we can leave the current value in the cache
-        // for any 'get' methods to access.
+        // If the state is in-process, we can leave the current value in the
+        // cache for any 'get' methods to access.
         //
         result.value = descriptor.defaultValue;
       }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
new file mode 100644
index 0000000..74542c1
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -0,0 +1,5498 @@
+// Copyright (c) 2014, 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.
+
+library engine.resolver.error_verifier;
+
+import 'dart:collection';
+import "dart:math" as math;
+
+import 'java_engine.dart';
+import 'error.dart';
+import 'scanner.dart' as sc;
+import 'utilities_dart.dart';
+import 'ast.dart';
+import 'parser.dart' show Parser, ParserErrorCode;
+import 'sdk.dart' show DartSdk, SdkLibrary;
+import 'element.dart';
+import 'constant.dart';
+import 'resolver.dart';
+import 'element_resolver.dart';
+
+/**
+ * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
+ * errors and warnings not covered by the parser and resolver.
+ */
+class ErrorVerifier extends RecursiveAstVisitor<Object> {
+  /**
+   * Return the static type of the given expression that is to be used for type analysis.
+   *
+   * @param expression the expression whose type is to be returned
+   * @return the static type of the given expression
+   */
+  static DartType getStaticType(Expression expression) {
+    DartType type = expression.staticType;
+    if (type == null) {
+      // TODO(brianwilkerson) This should never happen.
+      return DynamicTypeImpl.instance;
+    }
+    return type;
+  }
+
+  /**
+   * Return the variable element represented by the given expression, or `null` if there is no
+   * such element.
+   *
+   * @param expression the expression whose element is to be returned
+   * @return the variable element represented by the expression
+   */
+  static VariableElement getVariableElement(Expression expression) {
+    if (expression is Identifier) {
+      Element element = expression.staticElement;
+      if (element is VariableElement) {
+        return element;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The error reporter by which errors will be reported.
+   */
+  final ErrorReporter _errorReporter;
+
+  /**
+   * The current library that is being analyzed.
+   */
+  final LibraryElement _currentLibrary;
+
+  /**
+   * The type representing the type 'bool'.
+   */
+  InterfaceType _boolType;
+
+  /**
+   * The type representing the type 'int'.
+   */
+  InterfaceType _intType;
+
+  /**
+   * The object providing access to the types defined by the language.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * The manager for the inheritance mappings.
+   */
+  final InheritanceManager _inheritanceManager;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a
+   * [ConstructorDeclaration] and the constructor is 'const'.
+   *
+   * @see #visitConstructorDeclaration(ConstructorDeclaration)
+   */
+  bool _isEnclosingConstructorConst = false;
+
+  /**
+   * A flag indicating whether we are currently within a function body marked as being asynchronous.
+   */
+  bool _inAsync = false;
+
+  /**
+   * A flag indicating whether we are currently within a function body marked as being a generator.
+   */
+  bool _inGenerator = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a
+   * [CatchClause].
+   *
+   * @see #visitCatchClause(CatchClause)
+   */
+  bool _isInCatchClause = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of an
+   * [Comment].
+   */
+  bool _isInComment = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of an
+   * [InstanceCreationExpression].
+   */
+  bool _isInConstInstanceCreation = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting children nodes of a native
+   * [ClassDeclaration].
+   */
+  bool _isInNativeClass = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a static variable
+   * declaration.
+   */
+  bool _isInStaticVariableDeclaration = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting an instance variable
+   * declaration.
+   */
+  bool _isInInstanceVariableDeclaration = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting an instance variable
+   * initializer.
+   */
+  bool _isInInstanceVariableInitializer = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a
+   * [ConstructorInitializer].
+   */
+  bool _isInConstructorInitializer = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a
+   * [FunctionTypedFormalParameter].
+   */
+  bool _isInFunctionTypedFormalParameter = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a static method. By "method"
+   * here getter, setter and operator declarations are also implied since they are all represented
+   * with a [MethodDeclaration] in the AST structure.
+   */
+  bool _isInStaticMethod = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting a factory constructor.
+   */
+  bool _isInFactory = false;
+
+  /**
+   * This is set to `true` iff the visitor is currently visiting code in the SDK.
+   */
+  bool _isInSystemLibrary = false;
+
+  /**
+   * A flag indicating whether the current library contains at least one import directive with a URI
+   * that uses the "dart-ext" scheme.
+   */
+  bool _hasExtUri = false;
+
+  /**
+   * This is set to `false` on the entry of every [BlockFunctionBody], and is restored
+   * to the enclosing value on exit. The value is used in
+   * [checkForMixedReturns] to prevent both
+   * [StaticWarningCode#MIXED_RETURN_TYPES] and [StaticWarningCode#RETURN_WITHOUT_VALUE]
+   * from being generated in the same function body.
+   */
+  bool _hasReturnWithoutValue = false;
+
+  /**
+   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
+   * a class.
+   */
+  ClassElement _enclosingClass;
+
+  /**
+   * The method or function that we are currently visiting, or `null` if we are not inside a
+   * method or function.
+   */
+  ExecutableElement _enclosingFunction;
+
+  /**
+   * The return statements found in the method or function that we are currently visiting that have
+   * a return value.
+   */
+  List<ReturnStatement> _returnsWith = new List<ReturnStatement>();
+
+  /**
+   * The return statements found in the method or function that we are currently visiting that do
+   * not have a return value.
+   */
+  List<ReturnStatement> _returnsWithout = new List<ReturnStatement>();
+
+  /**
+   * This map is initialized when visiting the contents of a class declaration. If the visitor is
+   * not in an enclosing class declaration, then the map is set to `null`.
+   *
+   * When set the map maps the set of [FieldElement]s in the class to an
+   * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
+   * methods, specifically [checkForAllFinalInitializedErrorCodes],
+   * can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
+   * only ever make a copy, or read from this map after it has been set in
+   * [visitClassDeclaration].
+   *
+   * @see #visitClassDeclaration(ClassDeclaration)
+   * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
+   */
+  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
+
+  /**
+   * A table mapping name of the library to the export directive which export this library.
+   */
+  HashMap<String, LibraryElement> _nameToExportElement = new HashMap<String, LibraryElement>();
+
+  /**
+   * A table mapping name of the library to the import directive which import this library.
+   */
+  HashMap<String, LibraryElement> _nameToImportElement = new HashMap<String, LibraryElement>();
+
+  /**
+   * A table mapping names to the exported elements.
+   */
+  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
+
+  /**
+   * A set of the names of the variable initializers we are visiting now.
+   */
+  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer = new HashSet<String>();
+
+  /**
+   * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
+   * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
+   */
+  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
+
+  /**
+   * Static final string with value `"getter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _GETTER_SPACE = "getter ";
+
+  /**
+   * Static final string with value `"setter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _SETTER_SPACE = "setter ";
+
+  /**
+   * Initialize the [ErrorVerifier] visitor.
+   */
+  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider, this._inheritanceManager) {
+    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    this._hasExtUri = _currentLibrary.hasExtUri;
+    _isEnclosingConstructorConst = false;
+    _isInCatchClause = false;
+    _isInStaticVariableDeclaration = false;
+    _isInInstanceVariableDeclaration = false;
+    _isInInstanceVariableInitializer = false;
+    _isInConstructorInitializer = false;
+    _isInStaticMethod = false;
+    _boolType = _typeProvider.boolType;
+    _intType = _typeProvider.intType;
+    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
+        _typeProvider.nullType,
+        _typeProvider.numType,
+        _intType,
+        _typeProvider.doubleType,
+        _boolType,
+        _typeProvider.stringType];
+  }
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    _checkForInvalidAnnotationFromDeferredLibrary(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
+  Object visitArgumentList(ArgumentList node) {
+    _checkForArgumentTypesNotAssignableInList(node);
+    return super.visitArgumentList(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  Object visitAssertStatement(AssertStatement node) {
+    _checkForNonBoolExpression(node);
+    return super.visitAssertStatement(node);
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression lhs = node.leftHandSide;
+    Expression rhs = node.rightHandSide;
+    if (operatorType == sc.TokenType.EQ) {
+      _checkForInvalidAssignment(lhs, rhs);
+    } else {
+      _checkForInvalidCompoundAssignment(node, lhs, rhs);
+      _checkForArgumentTypeNotAssignableForArgument(rhs);
+    }
+    _checkForAssignmentToFinal(lhs);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  Object visitAwaitExpression(AwaitExpression node) {
+    if (!_inAsync) {
+      _errorReporter.reportErrorForToken(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword, []);
+    }
+    return super.visitAwaitExpression(node);
+  }
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    sc.Token operator = node.operator;
+    sc.TokenType type = operator.type;
+    if (type == sc.TokenType.AMPERSAND_AMPERSAND || type == sc.TokenType.BAR_BAR) {
+      String lexeme = operator.lexeme;
+      _checkForAssignability(node.leftOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+      _checkForAssignability(node.rightOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
+    } else {
+      _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    bool wasInAsync = _inAsync;
+    bool wasInGenerator = _inGenerator;
+    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
+    _hasReturnWithoutValue = false;
+    List<ReturnStatement> previousReturnsWith = _returnsWith;
+    List<ReturnStatement> previousReturnsWithout = _returnsWithout;
+    try {
+      _inAsync = node.isAsynchronous;
+      _inGenerator = node.isGenerator;
+      _returnsWith = new List<ReturnStatement>();
+      _returnsWithout = new List<ReturnStatement>();
+      super.visitBlockFunctionBody(node);
+      _checkForMixedReturns(node);
+    } finally {
+      _inAsync = wasInAsync;
+      _inGenerator = wasInGenerator;
+      _returnsWith = previousReturnsWith;
+      _returnsWithout = previousReturnsWithout;
+      _hasReturnWithoutValue = previousHasReturnWithoutValue;
+    }
+    return null;
+  }
+
+  @override
+  Object visitBreakStatement(BreakStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
+        _errorReporter.reportErrorForNode(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    bool previousIsInCatchClause = _isInCatchClause;
+    try {
+      _isInCatchClause = true;
+      _checkForTypeAnnotationDeferredClass(node.exceptionType);
+      return super.visitCatchClause(node);
+    } finally {
+      _isInCatchClause = previousIsInCatchClause;
+    }
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    ClassElement outerClass = _enclosingClass;
+    try {
+      _isInNativeClass = node.nativeClause != null;
+      _enclosingClass = node.element;
+      ExtendsClause extendsClause = node.extendsClause;
+      ImplementsClause implementsClause = node.implementsClause;
+      WithClause withClause = node.withClause;
+      _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
+      _checkForMemberWithClassName();
+      _checkForNoDefaultSuperConstructorImplicit(node);
+      _checkForConflictingTypeVariableErrorCodes(node);
+      // Only do error checks on the clause nodes if there is a non-null clause
+      if (implementsClause != null || extendsClause != null || withClause != null) {
+        // Only check for all of the inheritance logic around clauses if there isn't an error code
+        // such as "Cannot extend double" already on the class.
+        if (!_checkForImplementsDisallowedClass(implementsClause) && !_checkForExtendsDisallowedClass(extendsClause) && !_checkForAllMixinErrorCodes(withClause)) {
+          _checkForExtendsDeferredClass(extendsClause);
+          _checkForImplementsDeferredClass(implementsClause);
+          _checkForNonAbstractClassInheritsAbstractMember(node.name);
+          _checkForInconsistentMethodInheritance();
+          _checkForRecursiveInterfaceInheritance(_enclosingClass);
+          _checkForConflictingGetterAndMethod();
+          _checkForConflictingInstanceGetterAndSuperclassMember();
+          _checkImplementsSuperClass(node);
+          _checkImplementsFunctionWithoutCall(node);
+        }
+      }
+      // initialize initialFieldElementsMap
+      if (_enclosingClass != null) {
+        List<FieldElement> fieldElements = _enclosingClass.fields;
+        _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
+        for (FieldElement fieldElement in fieldElements) {
+          if (!fieldElement.isSynthetic) {
+            _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
+          }
+        }
+      }
+      _checkForFinalNotInitializedInClass(node);
+      _checkForDuplicateDefinitionInheritance();
+      _checkForConflictingInstanceMethodSetter(node);
+      return super.visitClassDeclaration(node);
+    } finally {
+      _isInNativeClass = false;
+      _initialFieldElementsMap = null;
+      _enclosingClass = outerClass;
+    }
+  }
+
+  @override
+  Object visitClassTypeAlias(ClassTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    ClassElement outerClassElement = _enclosingClass;
+    try {
+      _enclosingClass = node.element;
+      ImplementsClause implementsClause = node.implementsClause;
+      // Only check for all of the inheritance logic around clauses if there isn't an error code
+      // such as "Cannot extend double" already on the class.
+      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
+        _checkForExtendsDeferredClassInTypeAlias(node);
+        _checkForImplementsDeferredClass(implementsClause);
+        _checkForRecursiveInterfaceInheritance(_enclosingClass);
+        _checkForNonAbstractClassInheritsAbstractMember(node.name);
+      }
+    } finally {
+      _enclosingClass = outerClassElement;
+    }
+    return super.visitClassTypeAlias(node);
+  }
+
+  @override
+  Object visitComment(Comment node) {
+    _isInComment = true;
+    try {
+      return super.visitComment(node);
+    } finally {
+      _isInComment = false;
+    }
+  }
+
+  @override
+  Object visitCompilationUnit(CompilationUnit node) {
+    _checkForDeferredPrefixCollisions(node);
+    return super.visitCompilationUnit(node);
+  }
+
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitConditionalExpression(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      ConstructorElement constructorElement = node.element;
+      _enclosingFunction = constructorElement;
+      _isEnclosingConstructorConst = node.constKeyword != null;
+      _isInFactory = node.factoryKeyword != null;
+      _checkForInvalidModifierOnBody(node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
+      _checkForConstConstructorWithNonFinalField(node, constructorElement);
+      _checkForConstConstructorWithNonConstSuper(node);
+      _checkForConflictingConstructorNameAndMember(node, constructorElement);
+      _checkForAllFinalInitializedErrorCodes(node);
+      _checkForRedirectingConstructorErrorCodes(node);
+      _checkForMultipleSuperInitializers(node);
+      _checkForRecursiveConstructorRedirect(node, constructorElement);
+      if (!_checkForRecursiveFactoryRedirect(node, constructorElement)) {
+        _checkForAllRedirectConstructorErrorCodes(node);
+      }
+      _checkForUndefinedConstructorInInitializerImplicit(node);
+      _checkForRedirectToNonConstConstructor(node, constructorElement);
+      _checkForReturnInGenerativeConstructor(node);
+      return super.visitConstructorDeclaration(node);
+    } finally {
+      _isEnclosingConstructorConst = false;
+      _isInFactory = false;
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    _isInConstructorInitializer = true;
+    try {
+      SimpleIdentifier fieldName = node.fieldName;
+      Element staticElement = fieldName.staticElement;
+      _checkForInvalidField(node, fieldName, staticElement);
+      _checkForFieldInitializerNotAssignable(node, staticElement);
+      return super.visitConstructorFieldInitializer(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitContinueStatement(ContinueStatement node) {
+    SimpleIdentifier labelNode = node.label;
+    if (labelNode != null) {
+      Element labelElement = labelNode.staticElement;
+      if (labelElement is LabelElementImpl && labelElement.isOnSwitchStatement) {
+        _errorReporter.reportErrorForNode(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+    _checkForInvalidAssignment(node.identifier, node.defaultValue);
+    _checkForDefaultValueInFunctionTypedParameter(node);
+    return super.visitDefaultFormalParameter(node);
+  }
+
+  @override
+  Object visitDoStatement(DoStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitDoStatement(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      LibraryElement exportedLibrary = exportElement.exportedLibrary;
+      _checkForAmbiguousExport(node, exportElement, exportedLibrary);
+      _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
+      _checkForExportInternalLibrary(node, exportElement);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    bool wasInAsync = _inAsync;
+    bool wasInGenerator = _inGenerator;
+    try {
+      _inAsync = node.isAsynchronous;
+      _inGenerator = node.isGenerator;
+      FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
+      DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+      _checkForReturnOfInvalidType(node.expression, expectedReturnType);
+      return super.visitExpressionFunctionBody(node);
+    } finally {
+      _inAsync = wasInAsync;
+      _inGenerator = wasInGenerator;
+    }
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    _isInStaticVariableDeclaration = node.isStatic;
+    _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
+    if (_isInInstanceVariableDeclaration) {
+      VariableDeclarationList variables = node.fields;
+      if (variables.isConst) {
+        _errorReporter.reportErrorForToken(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
+      }
+    }
+    try {
+      _checkForAllInvalidOverrideErrorCodesForField(node);
+      return super.visitFieldDeclaration(node);
+    } finally {
+      _isInStaticVariableDeclaration = false;
+      _isInInstanceVariableDeclaration = false;
+    }
+  }
+
+  @override
+  Object visitFieldFormalParameter(FieldFormalParameter node) {
+    _checkForValidField(node);
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForFieldInitializingFormalRedirectingConstructor(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitFieldFormalParameter(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    ExecutableElement outerFunction = _enclosingFunction;
+    try {
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      _enclosingFunction = node.element;
+      TypeName returnType = node.returnType;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+        if (node.isSetter) {
+          FunctionExpression functionExpression = node.functionExpression;
+          if (functionExpression != null) {
+            _checkForWrongNumberOfParametersForSetter(identifier, functionExpression.parameters);
+          }
+          _checkForNonVoidReturnTypeForSetter(returnType);
+        }
+      }
+      if (node.isSetter) {
+        _checkForInvalidModifierOnBody(node.functionExpression.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
+      }
+      _checkForTypeAnnotationDeferredClass(returnType);
+      return super.visitFunctionDeclaration(node);
+    } finally {
+      _enclosingFunction = outerFunction;
+    }
+  }
+
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    // If this function expression is wrapped in a function declaration, don't change the
+    // enclosingFunction field.
+    if (node.parent is! FunctionDeclaration) {
+      ExecutableElement outerFunction = _enclosingFunction;
+      try {
+        _enclosingFunction = node.element;
+        return super.visitFunctionExpression(node);
+      } finally {
+        _enclosingFunction = outerFunction;
+      }
+    } else {
+      return super.visitFunctionExpression(node);
+    }
+  }
+
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    Expression functionExpression = node.function;
+    DartType expressionType = functionExpression.staticType;
+    if (!_isFunctionType(expressionType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
+    }
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
+    _checkForDefaultValueInFunctionTypeAlias(node);
+    _checkForTypeAliasCannotReferenceItself_function(node);
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    bool old = _isInFunctionTypedFormalParameter;
+    _isInFunctionTypedFormalParameter = true;
+    try {
+      _checkForTypeAnnotationDeferredClass(node.returnType);
+      return super.visitFunctionTypedFormalParameter(node);
+    } finally {
+      _isInFunctionTypedFormalParameter = old;
+    }
+  }
+
+  @override
+  Object visitIfStatement(IfStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitIfStatement(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      _checkForImportDuplicateLibraryName(node, importElement);
+      _checkForImportInternalLibrary(node, importElement);
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    _checkForArgumentTypeNotAssignableForArgument(node.index);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    bool wasInConstInstanceCreation = _isInConstInstanceCreation;
+    _isInConstInstanceCreation = node.isConst;
+    try {
+      ConstructorName constructorName = node.constructorName;
+      TypeName typeName = constructorName.type;
+      DartType type = typeName.type;
+      if (type is InterfaceType) {
+        InterfaceType interfaceType = type;
+        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+        _checkForConstOrNewWithEnum(node, typeName, interfaceType);
+        if (_isInConstInstanceCreation) {
+          _checkForConstWithNonConst(node);
+          _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
+          _checkForConstWithTypeParameters(typeName);
+          _checkForConstDeferredClass(node, constructorName, typeName);
+        } else {
+          _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
+        }
+      }
+      return super.visitInstanceCreationExpression(node);
+    } finally {
+      _isInConstInstanceCreation = wasInConstInstanceCreation;
+    }
+  }
+
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitIsExpression(node);
+  }
+
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (node.constKeyword != null) {
+        NodeList<TypeName> arguments = typeArguments.arguments;
+        if (arguments.length != 0) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
+        }
+      }
+      _checkForExpectedOneListTypeArgument(node, typeArguments);
+      _checkForListElementTypeNotAssignable(node, typeArguments);
+    }
+    return super.visitListLiteral(node);
+  }
+
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments.length != 0) {
+        if (node.constKeyword != null) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
+        }
+      }
+      _checkExpectedTwoMapTypeArguments(typeArguments);
+      _checkForMapTypeNotAssignable(node, typeArguments);
+    }
+    _checkForNonConstMapAsExpressionStatement(node);
+    return super.visitMapLiteral(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    ExecutableElement previousFunction = _enclosingFunction;
+    try {
+      _isInStaticMethod = node.isStatic;
+      _enclosingFunction = node.element;
+      SimpleIdentifier identifier = node.name;
+      String methodName = "";
+      if (identifier != null) {
+        methodName = identifier.name;
+      }
+      TypeName returnTypeName = node.returnType;
+      if (node.isSetter || node.isGetter) {
+        _checkForMismatchedAccessorTypes(node, methodName);
+      }
+      if (node.isGetter) {
+        _checkForVoidReturnType(node);
+        _checkForConflictingStaticGetterAndInstanceSetter(node);
+      } else if (node.isSetter) {
+        _checkForInvalidModifierOnBody(node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
+        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
+        _checkForNonVoidReturnTypeForSetter(returnTypeName);
+        _checkForConflictingStaticSetterAndInstanceMember(node);
+      } else if (node.isOperator) {
+        _checkForOptionalParameterInOperator(node);
+        _checkForWrongNumberOfParametersForOperator(node);
+        _checkForNonVoidReturnTypeForOperator(node);
+      }
+      _checkForConcreteClassWithAbstractMember(node);
+      _checkForAllInvalidOverrideErrorCodesForMethod(node);
+      _checkForTypeAnnotationDeferredClass(returnTypeName);
+      return super.visitMethodDeclaration(node);
+    } finally {
+      _enclosingFunction = previousFunction;
+      _isInStaticMethod = false;
+    }
+  }
+
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    SimpleIdentifier methodName = node.methodName;
+    if (target != null) {
+      ClassElement typeReference = ElementResolver.getTypeReference(target);
+      _checkForStaticAccessToInstanceMember(typeReference, methodName);
+      _checkForInstanceAccessToStaticMember(typeReference, methodName);
+    } else {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
+    }
+    return super.visitMethodInvocation(node);
+  }
+
+  @override
+  Object visitNativeClause(NativeClause node) {
+    // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
+    if (!_isInSystemLibrary) {
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
+    }
+    return super.visitNativeClause(node);
+  }
+
+  @override
+  Object visitNativeFunctionBody(NativeFunctionBody node) {
+    _checkForNativeFunctionBodyInNonSDKCode(node);
+    return super.visitNativeFunctionBody(node);
+  }
+
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    _checkForAssignmentToFinal(node.operand);
+    _checkForIntNotAssignable(node.operand);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (node.parent is! Annotation) {
+      ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
+      SimpleIdentifier name = node.identifier;
+      _checkForStaticAccessToInstanceMember(typeReference, name);
+      _checkForInstanceAccessToStaticMember(typeReference, name);
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.TokenType operatorType = node.operator.type;
+    Expression operand = node.operand;
+    if (operatorType == sc.TokenType.BANG) {
+      _checkForNonBoolNegationExpression(operand);
+    } else if (operatorType.isIncrementOperator) {
+      _checkForAssignmentToFinal(operand);
+    }
+    _checkForIntNotAssignable(operand);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
+    SimpleIdentifier propertyName = node.propertyName;
+    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
+    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
+    return super.visitPropertyAccess(node);
+  }
+
+  @override
+  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitRedirectingConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _checkForRethrowOutsideCatch(node);
+    return super.visitRethrowExpression(node);
+  }
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    if (node.expression == null) {
+      _returnsWithout.add(node);
+    } else {
+      _returnsWith.add(node);
+    }
+    _checkForAllReturnStatementErrorCodes(node);
+    return super.visitReturnStatement(node);
+  }
+
+  @override
+  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+    _checkForConstFormalParameter(node);
+    _checkForPrivateOptionalParameter(node);
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitSimpleFormalParameter(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    _checkForImplicitThisReferenceInInitializer(node);
+    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
+      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _isInConstructorInitializer = true;
+    try {
+      return super.visitSuperConstructorInvocation(node);
+    } finally {
+      _isInConstructorInitializer = false;
+    }
+  }
+
+  @override
+  Object visitSwitchStatement(SwitchStatement node) {
+    _checkForSwitchExpressionNotAssignable(node);
+    _checkForCaseBlocksNotTerminated(node);
+    _checkForMissingEnumConstantInSwitch(node);
+    return super.visitSwitchStatement(node);
+  }
+
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    _checkForInvalidReferenceToThis(node);
+    return super.visitThisExpression(node);
+  }
+
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _checkForConstEvalThrowsException(node);
+    return super.visitThrowExpression(node);
+  }
+
+  @override
+  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitTopLevelVariableDeclaration(node);
+  }
+
+  @override
+  Object visitTypeArgumentList(TypeArgumentList node) {
+    NodeList<TypeName> list = node.arguments;
+    for (TypeName typeName in list) {
+      _checkForTypeAnnotationDeferredClass(typeName);
+    }
+    return super.visitTypeArgumentList(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    _checkForTypeArgumentNotMatchingBounds(node);
+    _checkForTypeParameterReferencedByStatic(node);
+    return super.visitTypeName(node);
+  }
+
+  @override
+  Object visitTypeParameter(TypeParameter node) {
+    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
+    _checkForTypeParameterSupertypeOfItsBound(node);
+    _checkForTypeAnnotationDeferredClass(node.bound);
+    return super.visitTypeParameter(node);
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    SimpleIdentifier nameNode = node.name;
+    Expression initializerNode = node.initializer;
+    // do checks
+    _checkForInvalidAssignment(nameNode, initializerNode);
+    // visit name
+    nameNode.accept(this);
+    // visit initializer
+    String name = nameNode.name;
+    _namesForReferenceToDeclaredVariableInInitializer.add(name);
+    bool wasInInstanceVariableInitializer = _isInInstanceVariableInitializer;
+    _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
+    try {
+      if (initializerNode != null) {
+        initializerNode.accept(this);
+      }
+    } finally {
+      _isInInstanceVariableInitializer = wasInInstanceVariableInitializer;
+      _namesForReferenceToDeclaredVariableInInitializer.remove(name);
+    }
+    // done
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclarationList(VariableDeclarationList node) {
+    _checkForTypeAnnotationDeferredClass(node.type);
+    return super.visitVariableDeclarationList(node);
+  }
+
+  @override
+  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    _checkForFinalNotInitialized(node.variables);
+    return super.visitVariableDeclarationStatement(node);
+  }
+
+  @override
+  Object visitWhileStatement(WhileStatement node) {
+    _checkForNonBoolCondition(node.condition);
+    return super.visitWhileStatement(node);
+  }
+
+  @override
+  Object visitYieldStatement(YieldStatement node) {
+    if (!_inGenerator) {
+      CompileTimeErrorCode errorCode;
+      if (node.star != null) {
+        errorCode = CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR;
+      } else {
+        errorCode = CompileTimeErrorCode.YIELD_IN_NON_GENERATOR;
+      }
+      _errorReporter.reportErrorForNode(errorCode, node, []);
+    }
+    return super.visitYieldStatement(node);
+  }
+
+  /**
+   * This verifies if the passed map literal has type arguments then there is exactly two.
+   *
+   * @param typeArguments the type arguments, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
+   */
+  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 2) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed constructor declaration does not violate any of the error codes
+   * relating to the initialization of fields in the enclosing class.
+   *
+   * @param node the [ConstructorDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #initialFieldElementsMap
+   * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
+   * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
+   */
+  bool _checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
+    if (node.factoryKeyword != null || node.redirectedConstructor != null || node.externalKeyword != null) {
+      return false;
+    }
+    // Ignore if native class.
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    // Visit all of the field formal parameters
+    NodeList<FormalParameter> formalParameters = node.parameters.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      FormalParameter parameter = formalParameter;
+      if (parameter is DefaultFormalParameter) {
+        parameter = (parameter as DefaultFormalParameter).parameter;
+      }
+      if (parameter is FieldFormalParameter) {
+        FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
+        INIT_STATE state = fieldElementsMap[fieldElement];
+        if (state == INIT_STATE.NOT_INIT) {
+          fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
+        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+          if (fieldElement.isFinal || fieldElement.isConst) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Visit all of the initializers
+    NodeList<ConstructorInitializer> initializers = node.initializers;
+    for (ConstructorInitializer constructorInitializer in initializers) {
+      if (constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+      if (constructorInitializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer constructorFieldInitializer = constructorInitializer;
+        SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
+        Element element = fieldName.staticElement;
+        if (element is FieldElement) {
+          FieldElement fieldElement = element;
+          INIT_STATE state = fieldElementsMap[fieldElement];
+          if (state == INIT_STATE.NOT_INIT) {
+            fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
+          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
+            if (fieldElement.isFinal || fieldElement.isConst) {
+              _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
+              foundError = true;
+            }
+          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
+            foundError = true;
+          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    // Visit all of the states in the map to ensure that none were never
+    // initialized.
+    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
+      if (state == INIT_STATE.NOT_INIT) {
+        if (fieldElement.isConst) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+                  node.returnType,
+                  [fieldElement.name]);
+          foundError = true;
+        } else if (fieldElement.isFinal) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.FINAL_NOT_INITIALIZED,
+                  node.returnType,
+                  [fieldElement.name]);
+          foundError = true;
+        }
+      }
+    });
+    return foundError;
+  }
+
+  /**
+   * This checks the passed executable element against override-error codes.
+   *
+   * @param executableElement a non-null [ExecutableElement] to evaluate
+   * @param overriddenExecutable the element that the executableElement is overriding
+   * @param parameters the parameters of the executable element
+   * @param errorNameTarget the node to report problems on
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
+   * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
+   * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
+   * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+   */
+  bool _checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    bool isGetter = false;
+    bool isSetter = false;
+    if (executableElement is PropertyAccessorElement) {
+      PropertyAccessorElement accessorElement = executableElement;
+      isGetter = accessorElement.isGetter;
+      isSetter = accessorElement.isSetter;
+    }
+    String executableElementName = executableElement.name;
+    FunctionType overridingFT = executableElement.type;
+    FunctionType overriddenFT = overriddenExecutable.type;
+    InterfaceType enclosingType = _enclosingClass.type;
+    overriddenFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(overriddenFT, executableElementName, enclosingType);
+    if (overridingFT == null || overriddenFT == null) {
+      return false;
+    }
+    DartType overridingFTReturnType = overridingFT.returnType;
+    DartType overriddenFTReturnType = overriddenFT.returnType;
+    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
+    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
+    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
+    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
+    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
+    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
+    // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
+    if (overridingNormalPT.length > overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+          overriddenNormalPT.length,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    if (overridingNormalPT.length + overridingPositionalPT.length < overriddenPositionalPT.length + overriddenNormalPT.length) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+          overriddenPositionalPT.length + overriddenNormalPT.length,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    // For each named parameter in the overridden method, verify that there is
+    // the same name in the overriding method.
+    for (String overriddenParamName in overriddenNamedPT.keys) {
+      if (!overridingNamedPT.containsKey(overriddenParamName)) {
+        // The overridden method expected the overriding method to have
+        // overridingParamName, but it does not.
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.INVALID_OVERRIDE_NAMED,
+            errorNameTarget,
+            [overriddenParamName,
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
+    if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
+      _errorReporter.reportTypeErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+          overridingFTReturnType,
+          overriddenFTReturnType,
+          overriddenExecutable.enclosingElement.displayName]);
+      return true;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
+    if (parameterLocations == null) {
+      return false;
+    }
+    int parameterIndex = 0;
+    for (int i = 0; i < overridingNormalPT.length; i++) {
+      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
+        _errorReporter.reportTypeErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingNormalPT[i],
+            overriddenNormalPT[i],
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
+    for (int i = 0; i < overriddenPositionalPT.length; i++) {
+      if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingPositionalPT[i],
+            overriddenPositionalPT[i],
+            overriddenExecutable.enclosingElement.displayName]);
+        return true;
+      }
+      parameterIndex++;
+    }
+    // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    for (String overriddenName in overriddenNamedPT.keys) {
+      DartType overridingType = overridingNamedPT[overriddenName];
+      if (overridingType == null) {
+        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been
+        // created above if this could be reached.
+        continue;
+      }
+      DartType overriddenType = overriddenNamedPT[overriddenName];
+      if (!overriddenType.isAssignableTo(overridingType)) {
+        // lookup the parameter for the error to select
+        ParameterElement parameterToSelect = null;
+        AstNode parameterLocationToSelect = null;
+        for (int i = 0; i < parameters.length; i++) {
+          ParameterElement parameter = parameters[i];
+          if (parameter.parameterKind == ParameterKind.NAMED
+              && overriddenName == parameter.name) {
+            parameterToSelect = parameter;
+            parameterLocationToSelect = parameterLocations[i];
+            break;
+          }
+        }
+        if (parameterToSelect != null) {
+          _errorReporter.reportTypeErrorForNode(
+              StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
+              parameterLocationToSelect,
+              [overridingType,
+              overriddenType,
+              overriddenExecutable.enclosingElement.displayName]);
+          return true;
+        }
+      }
+    }
+    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
+    //
+    // Create three arrays: an array of the optional parameter ASTs (FormalParameters), an array of
+    // the optional parameters elements from our method, and finally an array of the optional
+    // parameter elements from the method we are overriding.
+    //
+    bool foundError = false;
+    List<AstNode> formalParameters = new List<AstNode>();
+    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
+    List<ParameterElementImpl> overriddenParameterElts = new List<ParameterElementImpl>();
+    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElement parameter = parameters[i];
+      if (parameter.parameterKind.isOptional) {
+        formalParameters.add(parameterLocations[i]);
+        parameterElts.add(parameter as ParameterElementImpl);
+      }
+    }
+    for (ParameterElement parameterElt in overriddenPEs) {
+      if (parameterElt.parameterKind.isOptional) {
+        if (parameterElt is ParameterElementImpl) {
+          overriddenParameterElts.add(parameterElt);
+        }
+      }
+    }
+    //
+    // Next compare the list of optional parameter elements to the list of overridden optional
+    // parameter elements.
+    //
+    if (parameterElts.length > 0) {
+      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
+        // Named parameters, consider the names when matching the parameterElts to the overriddenParameterElts
+        for (int i = 0; i < parameterElts.length; i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          String parameterName = parameterElt.name;
+          for (int j = 0; j < overriddenParameterElts.length; j++) {
+            ParameterElementImpl overriddenParameterElt = overriddenParameterElts[j];
+            String overriddenParameterName = overriddenParameterElt.name;
+            if (parameterName != null && parameterName == overriddenParameterName) {
+              EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
+              if (_isUserDefinedObject(overriddenResult)) {
+                break;
+              }
+              if (!result.equalValues(_typeProvider, overriddenResult)) {
+                _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
+                    overriddenExecutable.enclosingElement.displayName,
+                    overriddenExecutable.displayName,
+                    parameterName]);
+                foundError = true;
+              }
+            }
+          }
+        }
+      } else {
+        // Positional parameters, consider the positions when matching the parameterElts to the overriddenParameterElts
+        for (int i = 0; i < parameterElts.length && i < overriddenParameterElts.length; i++) {
+          ParameterElementImpl parameterElt = parameterElts[i];
+          EvaluationResultImpl result = parameterElt.evaluationResult;
+          // TODO (jwren) Ignore Object types, see Dart bug 11287
+          if (_isUserDefinedObject(result)) {
+            continue;
+          }
+          ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
+          EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
+          if (_isUserDefinedObject(overriddenResult)) {
+            continue;
+          }
+          if (!result.equalValues(_typeProvider, overriddenResult)) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
+                overriddenExecutable.enclosingElement.displayName,
+                overriddenExecutable.displayName]);
+            foundError = true;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks the passed executable element against override-error codes. This method computes
+   * the passed executableElement is overriding and calls
+   * [checkForAllInvalidOverrideErrorCodes]
+   * when the [InheritanceManager] returns a [MultiplyInheritedExecutableElement], this
+   * method loops through the array in the [MultiplyInheritedExecutableElement].
+   *
+   * @param executableElement a non-null [ExecutableElement] to evaluate
+   * @param parameters the parameters of the executable element
+   * @param errorNameTarget the node to report problems on
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
+    //
+    // Compute the overridden executable from the InheritanceManager
+    //
+    List<ExecutableElement> overriddenExecutables = _inheritanceManager.lookupOverrides(_enclosingClass, executableElement.name);
+    if (overriddenExecutables.isEmpty) {
+      // Nothing is overridden, so we just have to check if the new name collides
+      // with a static defined in the superclass.
+      // TODO(paulberry): currently we don't do this check if the new element
+      // overrides a method in an interface (see issue 18947).
+      return _checkForInstanceMethodNameCollidesWithSuperclassStatic(executableElement, errorNameTarget);
+    }
+    for (ExecutableElement overriddenElement in overriddenExecutables) {
+      if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement, parameters, parameterLocations, errorNameTarget)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This checks the passed field declaration against override-error codes.
+   *
+   * @param node the [MethodDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
+    if (_enclosingClass == null || node.isStatic) {
+      return false;
+    }
+    bool hasProblems = false;
+    VariableDeclarationList fields = node.fields;
+    for (VariableDeclaration field in fields.variables) {
+      FieldElement element = field.element as FieldElement;
+      if (element == null) {
+        continue;
+      }
+      PropertyAccessorElement getter = element.getter;
+      PropertyAccessorElement setter = element.setter;
+      SimpleIdentifier fieldName = field.name;
+      if (getter != null) {
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
+            getter,
+            ParameterElementImpl.EMPTY_ARRAY,
+            AstNode.EMPTY_ARRAY,
+            fieldName)) {
+          hasProblems = true;
+        }
+      }
+      if (setter != null) {
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
+            setter,
+            setter.parameters,
+            <AstNode> [fieldName],
+            fieldName)) {
+          hasProblems = true;
+        }
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This checks the passed method declaration against override-error codes.
+   *
+   * @param node the [MethodDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
+   */
+  bool _checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
+    if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
+      return false;
+    }
+    ExecutableElement executableElement = node.element;
+    if (executableElement == null) {
+      return false;
+    }
+    SimpleIdentifier methodName = node.name;
+    if (methodName.isSynthetic) {
+      return false;
+    }
+    FormalParameterList formalParameterList = node.parameters;
+    NodeList<FormalParameter> parameterList = formalParameterList != null ? formalParameterList.parameters : null;
+    List<AstNode> parameters = parameterList != null ? new List.from(parameterList) : null;
+    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
+  }
+
+  /**
+   * This verifies that all classes of the passed 'with' clause are valid.
+   *
+   * @param node the 'with' clause to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool _checkForAllMixinErrorCodes(WithClause withClause) {
+    if (withClause == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (TypeName mixinName in withClause.mixinTypes) {
+      DartType mixinType = mixinName.type;
+      if (mixinType is! InterfaceType) {
+        continue;
+      }
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          mixinName,
+          CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+        problemReported = true;
+      } else {
+        ClassElement mixinElement = (mixinType as InterfaceType).element;
+        if (_checkForExtendsOrImplementsDeferredClass(
+            mixinName,
+            CompileTimeErrorCode.MIXIN_DEFERRED_CLASS)) {
+          problemReported = true;
+        }
+        if (_checkForMixinDeclaresConstructor(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (_checkForMixinInheritsNotFromObject(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (_checkForMixinReferencesSuper(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * This checks error related to the redirected constructors.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
+   * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
+   */
+  bool _checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
+    //
+    // Prepare redirected constructor node
+    //
+    ConstructorName redirectedConstructor = node.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    //
+    // Prepare redirected constructor type
+    //
+    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
+    if (redirectedElement == null) {
+      //
+      // If the element is null, we check for the REDIRECT_TO_MISSING_CONSTRUCTOR case
+      //
+      TypeName constructorTypeName = redirectedConstructor.type;
+      DartType redirectedType = constructorTypeName.type;
+      if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
+        //
+        // Prepare the constructor name
+        //
+        String constructorStrName = constructorTypeName.name.name;
+        if (redirectedConstructor.name != null) {
+          constructorStrName += ".${redirectedConstructor.name.name}";
+        }
+        ErrorCode errorCode = (node.constKeyword != null ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
+        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
+        return true;
+      }
+      return false;
+    }
+    FunctionType redirectedType = redirectedElement.type;
+    DartType redirectedReturnType = redirectedType.returnType;
+    //
+    // Report specific problem when return type is incompatible
+    //
+    FunctionType constructorType = node.element.type;
+    DartType constructorReturnType = constructorType.returnType;
+    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
+      return true;
+    }
+    //
+    // Check parameters
+    //
+    if (!redirectedType.isSubtypeOf(constructorType)) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This checks that the return statement of the form <i>return e;</i> is not in a generative
+   * constructor.
+   *
+   * This checks that return statements without expressions are not in a generative constructor and
+   * the return type is not assignable to `null`; that is, we don't have `return;` if
+   * the enclosing method has a return type.
+   *
+   * This checks that the return type matches the type of the declared return type in the enclosing
+   * method or function.
+   *
+   * @param node the return statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
+   * @see StaticWarningCode#RETURN_WITHOUT_VALUE
+   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
+   */
+  bool _checkForAllReturnStatementErrorCodes(ReturnStatement node) {
+    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
+    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
+    Expression returnExpression = node.expression;
+    // RETURN_IN_GENERATIVE_CONSTRUCTOR
+    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
+    if (isGenerativeConstructor) {
+      if (returnExpression == null) {
+        return false;
+      }
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
+      return true;
+    }
+    // RETURN_WITHOUT_VALUE
+    if (returnExpression == null) {
+      if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
+        return false;
+      }
+      _hasReturnWithoutValue = true;
+      _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
+      return true;
+    } else if (_inGenerator) {
+      // RETURN_IN_GENERATOR
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATOR, node, []);
+    }
+    // RETURN_OF_INVALID_TYPE
+    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+  }
+
+  /**
+   * This verifies that the export namespace of the passed export directive does not export any name
+   * already exported by other export directive.
+   *
+   * @param node the export directive node to report problem on
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @param exportedLibrary the library element containing the exported element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
+   */
+  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
+    if (exportedLibrary == null) {
+      return false;
+    }
+    // check exported names
+    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
+    Map<String, Element> definedNames = namespace.definedNames;
+    for (String name in definedNames.keys) {
+      Element element = definedNames[name];
+      Element prevElement = _exportedElements[name];
+      if (element != null && prevElement != null && prevElement != element) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
+            name,
+            prevElement.library.definingCompilationUnit.displayName,
+            element.library.definingCompilationUnit.displayName]);
+        return true;
+      } else {
+        _exportedElements[name] = element;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignable.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type of the parameter
+   * @param actualStaticType the actual static type of the argument
+   * @param expectedPropagatedType the expected propagated type of the parameter, may be
+   *          `null`
+   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, ErrorCode errorCode) {
+    //
+    // Warning case: test static type information
+    //
+    if (actualStaticType != null && expectedStaticType != null) {
+      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+        _errorReporter.reportTypeErrorForNode(errorCode, expression, [actualStaticType, expectedStaticType]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed argument can be assigned to its corresponding parameter.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument.
+   *
+   * @param argument the argument to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed expression can be assigned to its corresponding parameters.
+   *
+   * This method corresponds to
+   * BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes.
+   *
+   * @param expression the expression to evaluate
+   * @param expectedStaticType the expected static type
+   * @param expectedPropagatedType the expected propagated type, may be `null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, getStaticType(expression), errorCode);
+
+  /**
+   * This verifies that the passed arguments can be assigned to their corresponding parameters.
+   *
+   * This method corresponds to BestPracticesVerifier.checkForArgumentTypesNotAssignableInList.
+   *
+   * @param node the arguments to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+    if (argumentList == null) {
+      return false;
+    }
+    bool problemReported = false;
+    for (Expression argument in argumentList.arguments) {
+      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * Check that the static type of the given expression is assignable to the given type. If it
+   * isn't, report an error with the given error code.
+   *
+   * @param expression the expression being tested
+   * @param type the type that the expression must be assignable to
+   * @param errorCode the error code to be reported
+   * @param arguments the arguments to pass in when creating the error
+   * @return `true` if an error was reported
+   */
+  bool _checkForAssignability(Expression expression, InterfaceType type, ErrorCode errorCode, List<Object> arguments) {
+    if (expression == null) {
+      return false;
+    }
+    DartType expressionType = expression.staticType;
+    if (expressionType == null) {
+      return false;
+    }
+    if (expressionType.isAssignableTo(type)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(errorCode, expression, arguments);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed expression is not final.
+   *
+   * @param node the expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ASSIGNMENT_TO_CONST
+   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
+   * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
+   */
+  bool _checkForAssignmentToFinal(Expression expression) {
+    // prepare element
+    Element element = null;
+    AstNode highlightedNode = expression;
+    if (expression is Identifier) {
+      element = expression.staticElement;
+      if (expression is PrefixedIdentifier) {
+        highlightedNode = expression.identifier;
+      }
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+      highlightedNode = propertyAccess.propertyName;
+    }
+    // check if element is assignable
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element as PropertyAccessorElement;
+      element = accessor.variable;
+    }
+    if (element is VariableElement) {
+      VariableElement variable = element as VariableElement;
+      if (variable.isConst) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
+        return true;
+      }
+      if (variable.isFinal) {
+        if (variable is FieldElementImpl && variable.setter == null && variable.isSynthetic) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, highlightedNode, [variable.name, variable.enclosingElement.displayName]);
+          return true;
+        }
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
+        return true;
+      }
+      return false;
+    }
+    if (element is FunctionElement) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FUNCTION, expression, []);
+      return true;
+    }
+    if (element is MethodElement) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed identifier is not a keyword, and generates the passed error code
+   * on the identifier if it is a keyword.
+   *
+   * @param identifier the identifier to check to ensure that it is not a keyword
+   * @param errorCode if the passed identifier is a keyword then this error code is created on the
+   *          identifier, the error code will be one of
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME] or
+   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
+   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
+   */
+  bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
+    sc.Token token = identifier.token;
+    if (token.type == sc.TokenType.KEYWORD) {
+      _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
+   * 'throw'.
+   *
+   * @param node the switch case to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool _checkForCaseBlockNotTerminated(SwitchCase node) {
+    NodeList<Statement> statements = node.statements;
+    if (statements.isEmpty) {
+      // fall-through without statements at all
+      AstNode parent = node.parent;
+      if (parent is SwitchStatement) {
+        SwitchStatement switchStatement = parent;
+        NodeList<SwitchMember> members = switchStatement.members;
+        int index = members.indexOf(node);
+        if (index != -1 && index < members.length - 1) {
+          return false;
+        }
+      }
+      // no other switch member after this one
+    } else {
+      Statement statement = statements[statements.length - 1];
+      // terminated with statement
+      if (statement is BreakStatement || statement is ContinueStatement || statement is ReturnStatement) {
+        return false;
+      }
+      // terminated with 'throw' expression
+      if (statement is ExpressionStatement) {
+        Expression expression = statement.expression;
+        if (expression is ThrowExpression) {
+          return false;
+        }
+      }
+    }
+    // report error
+    _errorReporter.reportErrorForToken(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the switch cases in the given switch statement is terminated with 'break',
+   * 'continue', 'return' or 'throw'.
+   *
+   * @param node the switch statement containing the cases to be checked
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
+   */
+  bool _checkForCaseBlocksNotTerminated(SwitchStatement node) {
+    bool foundError = false;
+    NodeList<SwitchMember> members = node.members;
+    int lastMember = members.length - 1;
+    for (int i = 0; i < lastMember; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchCase && _checkForCaseBlockNotTerminated(member)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed method declaration is abstract only if the enclosing class is
+   * also abstract.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
+   */
+  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
+    if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
+      SimpleIdentifier nameNode = node.name;
+      String memberName = nameNode.name;
+      ExecutableElement overriddenMember;
+      if (node.isGetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(memberName, _currentLibrary);
+      } else if (node.isSetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(memberName, _currentLibrary);
+      } else {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(memberName, _currentLibrary);
+      }
+      if (overriddenMember == null) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, nameNode, [memberName, _enclosingClass.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies all possible conflicts of the constructor name with other constructors and
+   * members of the same class.
+   *
+   * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
+   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
+   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
+   */
+  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node, ConstructorElement constructorElement) {
+    SimpleIdentifier constructorName = node.name;
+    String name = constructorElement.name;
+    ClassElement classElement = constructorElement.enclosingElement;
+    // constructors
+    List<ConstructorElement> constructors = classElement.constructors;
+    for (ConstructorElement otherConstructor in constructors) {
+      if (identical(otherConstructor, constructorElement)) {
+        continue;
+      }
+      if (name == otherConstructor.name) {
+        if (name == null || name.length == 0) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
+        } else {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
+        }
+        return true;
+      }
+    }
+    // conflict with class member
+    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic) {
+      // fields
+      FieldElement field = classElement.getField(name);
+      if (field != null) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
+        return true;
+      }
+      // methods
+      MethodElement method = classElement.getMethod(name);
+      if (method != null) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the [enclosingClass] does not have a method and getter pair with the
+   * same name on, via inheritance.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
+   * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
+   */
+  bool _checkForConflictingGetterAndMethod() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    // method declared in the enclosing class vs. inherited getter
+    for (MethodElement method in _enclosingClass.methods) {
+      String name = method.name;
+      // find inherited property accessor (and can be only getter)
+      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! PropertyAccessorElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
+          _enclosingClass.displayName,
+          inherited.enclosingElement.displayName,
+          name]);
+    }
+    // getter declared in the enclosing class vs. inherited method
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (!accessor.isGetter) {
+        continue;
+      }
+      String name = accessor.name;
+      // find inherited method
+      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+      if (inherited is! MethodElement) {
+        continue;
+      }
+      // report problem
+      hasProblem = true;
+      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
+          _enclosingClass.displayName,
+          inherited.enclosingElement.displayName,
+          name]);
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the superclass of the [enclosingClass] does not declare accessible
+   * static members with the same name as the instance getters/setters declared in
+   * [enclosingClass].
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
+   */
+  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // check every accessor
+    bool hasProblem = false;
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      // we analyze instance accessors here
+      if (accessor.isStatic) {
+        continue;
+      }
+      // prepare accessor properties
+      String name = accessor.displayName;
+      bool getter = accessor.isGetter;
+      // if non-final variable, ignore setter - we alreay reported problem for getter
+      if (accessor.isSetter && accessor.isSynthetic) {
+        continue;
+      }
+      // try to find super element
+      ExecutableElement superElement;
+      superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
+      if (superElement == null) {
+        superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
+      }
+      if (superElement == null) {
+        continue;
+      }
+      // OK, not static
+      if (!superElement.isStatic) {
+        continue;
+      }
+      // prepare "super" type to report its name
+      ClassElement superElementClass = superElement.enclosingElement as ClassElement;
+      InterfaceType superElementType = superElementClass.type;
+      // report problem
+      hasProblem = true;
+      if (getter) {
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      } else {
+        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have a setter with the same name as the passed
+   * instance method declaration.
+   *
+   * TODO(jwren) add other "conflicting" error codes into algorithm/ data structure
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
+   */
+  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
+    // Reference all of the class members in this class.
+    NodeList<ClassMember> classMembers = node.members;
+    if (classMembers.isEmpty) {
+      return false;
+    }
+    // Create a HashMap to track conflicting members, and then loop through members in the class to
+    // construct the HashMap, at the same time, look for violations.  Don't add members if they are
+    // part of a conflict, this prevents multiple warnings for one issue.
+    bool foundError = false;
+    HashMap<String, ClassMember> memberHashMap = new HashMap<String, ClassMember>();
+    for (ClassMember classMember in classMembers) {
+      if (classMember is MethodDeclaration) {
+        MethodDeclaration method = classMember;
+        if (method.isStatic) {
+          continue;
+        }
+        // prepare name
+        SimpleIdentifier name = method.name;
+        if (name == null) {
+          continue;
+        }
+        bool addThisMemberToTheMap = true;
+        bool isGetter = method.isGetter;
+        bool isSetter = method.isSetter;
+        bool isOperator = method.isOperator;
+        bool isMethod = !isGetter && !isSetter && !isOperator;
+        // Do lookups in the enclosing class (and the inherited member) if the member is a method or
+        // a setter for StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
+        if (isMethod) {
+          String setterName = "${name.name}=";
+          Element enclosingElementOfSetter = null;
+          ClassMember conflictingSetter = memberHashMap[setterName];
+          if (conflictingSetter != null) {
+            enclosingElementOfSetter = conflictingSetter.element.enclosingElement;
+          } else {
+            ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, setterName);
+            if (elementFromInheritance != null) {
+              enclosingElementOfSetter = elementFromInheritance.enclosingElement;
+            }
+          }
+          if (enclosingElementOfSetter != null) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
+                _enclosingClass.displayName,
+                name.name,
+                enclosingElementOfSetter.displayName]);
+            foundError = true;
+            addThisMemberToTheMap = false;
+          }
+        } else if (isSetter) {
+          String methodName = name.name;
+          ClassMember conflictingMethod = memberHashMap[methodName];
+          if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
+            // report problem
+            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
+            foundError = true;
+            addThisMemberToTheMap = false;
+          }
+        }
+        // Finally, add this member into the HashMap.
+        if (addThisMemberToTheMap) {
+          if (method.isSetter) {
+            memberHashMap["${name.name}="] = method;
+          } else {
+            memberHashMap[name.name] = method;
+          }
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the same name as
+   * the passed static getter method declaration.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
+   */
+  bool _checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
+    if (!node.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find setter
+    ExecutableElement setter = enclosingType.lookUpSetter(name, _currentLibrary);
+    if (setter == null) {
+      return false;
+    }
+    // OK, also static
+    if (setter.isStatic) {
+      return false;
+    }
+    // prepare "setter" type to report its name
+    ClassElement setterClass = setter.enclosingElement as ClassElement;
+    InterfaceType setterType = setterClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the same name as
+   * the passed static getter method declaration.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
+   */
+  bool _checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
+    if (!node.isStatic) {
+      return false;
+    }
+    // prepare name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // prepare enclosing type
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType enclosingType = _enclosingClass.type;
+    // try to find member
+    ExecutableElement member;
+    member = enclosingType.lookUpMethod(name, _currentLibrary);
+    if (member == null) {
+      member = enclosingType.lookUpGetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      member = enclosingType.lookUpSetter(name, _currentLibrary);
+    }
+    if (member == null) {
+      return false;
+    }
+    // OK, also static
+    if (member.isStatic) {
+      return false;
+    }
+    // prepare "member" type to report its name
+    ClassElement memberClass = member.enclosingElement as ClassElement;
+    InterfaceType memberType = memberClass.type;
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies all conflicts between type variable and enclosing class. TODO(scheglov)
+   *
+   * @param node the class declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_CLASS
+   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_MEMBER
+   */
+  bool _checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
+    bool problemReported = false;
+    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
+      String name = typeParameter.name;
+      // name is same as the name of the enclosing class
+      if (_enclosingClass.name == name) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+      // check members
+      if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
+        problemReported = true;
+      }
+    }
+    return problemReported;
+  }
+
+  /**
+   * This verifies that if the passed constructor declaration is 'const' then there are no
+   * invocations of non-'const' super constructors.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
+   */
+  bool _checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // OK, const factory, checked elsewhere
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // check for mixins
+    if (_enclosingClass.mixins.length != 0) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, node.returnType, []);
+      return true;
+    }
+    // try to find and check super constructor invocation
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation superInvocation = initializer;
+        ConstructorElement element = superInvocation.staticElement;
+        if (element == null || element.isConst) {
+          return false;
+        }
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, [element.enclosingElement.displayName]);
+        return true;
+      }
+    }
+    // no explicit super constructor invocation, check default constructor
+    InterfaceType supertype = _enclosingClass.supertype;
+    if (supertype == null) {
+      return false;
+    }
+    if (supertype.isObject) {
+      return false;
+    }
+    ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
+    if (unnamedConstructor == null) {
+      return false;
+    }
+    if (unnamedConstructor.isConst) {
+      return false;
+    }
+    // default constructor is not 'const', report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, [supertype.displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies that if the passed constructor declaration is 'const' then there are no non-final
+   * instance variable.
+   *
+   * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
+   */
+  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node, ConstructorElement constructorElement) {
+    if (!_isEnclosingConstructorConst) {
+      return false;
+    }
+    // check if there is non-final field
+    ClassElement classElement = constructorElement.enclosingElement;
+    if (!classElement.hasNonFinalField) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed 'const' instance creation expression is not creating a deferred
+   * type.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_DEFERRED_CLASS
+   */
+  bool _checkForConstDeferredClass(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName, [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed throw expression is not enclosed in a 'const' constructor
+   * declaration.
+   *
+   * @param node the throw expression expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
+   */
+  bool _checkForConstEvalThrowsException(ThrowExpression node) {
+    if (_isEnclosingConstructorConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed normal formal parameter is not 'const'.
+   *
+   * @param node the normal formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
+   */
+  bool _checkForConstFormalParameter(NormalFormalParameter node) {
+    if (node.isConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed instance creation expression is not being invoked on an abstract
+   * class.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param typeName the [TypeName] of the [ConstructorName] from the
+   *          [InstanceCreationExpression], this is the AST node that the error is attached to
+   * @param type the type being constructed with this [InstanceCreationExpression]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
+   * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
+   */
+  bool _checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
+    if (type.element.isAbstract) {
+      ConstructorElement element = node.staticElement;
+      if (element != null && !element.isFactory) {
+        if ((node.keyword as sc.KeywordToken).keyword == sc.Keyword.CONST) {
+          _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
+        } else {
+          _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed instance creation expression is not being invoked on an enum.
+   *
+   * @param node the instance creation expression to verify
+   * @param typeName the [TypeName] of the [ConstructorName] from the
+   *          [InstanceCreationExpression], this is the AST node that the error is attached to
+   * @param type the type being constructed with this [InstanceCreationExpression]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INSTANTIATE_ENUM
+   */
+  bool _checkForConstOrNewWithEnum(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
+    if (type.element.isEnum) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANTIATE_ENUM, typeName, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed 'const' instance creation expression is not being invoked on a
+   * constructor that is not 'const'.
+   *
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   *
+   * @param node the instance creation expression to verify
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
+   */
+  bool _checkForConstWithNonConst(InstanceCreationExpression node) {
+    ConstructorElement constructorElement = node.staticElement;
+    if (constructorElement != null && !constructorElement.isConst) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed type name does not reference any type parameters.
+   *
+   * @param typeName the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
+   */
+  bool _checkForConstWithTypeParameters(TypeName typeName) {
+    // something wrong with AST
+    if (typeName == null) {
+      return false;
+    }
+    Identifier name = typeName.name;
+    if (name == null) {
+      return false;
+    }
+    // should not be a type parameter
+    if (name.staticElement is TypeParameterElement) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
+    }
+    // check type arguments
+    TypeArgumentList typeArguments = typeName.typeArguments;
+    if (typeArguments != null) {
+      bool hasError = false;
+      for (TypeName argument in typeArguments.arguments) {
+        if (_checkForConstWithTypeParameters(argument)) {
+          hasError = true;
+        }
+      }
+      return hasError;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies that if the passed 'const' instance creation expression is being invoked on the
+   * resolved constructor.
+   *
+   * This method assumes that the instance creation was tested to be 'const' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
+   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
+   */
+  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
+    // OK if resolved
+    if (node.staticElement != null) {
+      return false;
+    }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
+    Identifier className = typeName.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies that there are no default parameters in the passed function type alias.
+   *
+   * @param node the function type alias to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
+   */
+  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
+    bool result = false;
+    FormalParameterList formalParameterList = node.parameters;
+    NodeList<FormalParameter> parameters = formalParameterList.parameters;
+    for (FormalParameter formalParameter in parameters) {
+      if (formalParameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultFormalParameter = formalParameter;
+        if (defaultFormalParameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
+          result = true;
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * This verifies that the given default formal parameter is not part of a function typed
+   * parameter.
+   *
+   * @param node the default formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
+   */
+  bool _checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
+    // OK, not in a function typed parameter.
+    if (!_isInFunctionTypedFormalParameter) {
+      return false;
+    }
+    // OK, no default value.
+    if (node.defaultValue == null) {
+      return false;
+    }
+    // Report problem.
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that any deferred imports in the given compilation unit have a unique prefix.
+   *
+   * @param node the compilation unit containing the imports to be checked
+   * @return `true` if an error was generated
+   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
+   */
+  bool _checkForDeferredPrefixCollisions(CompilationUnit node) {
+    bool foundError = false;
+    NodeList<Directive> directives = node.directives;
+    int count = directives.length;
+    if (count > 0) {
+      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new HashMap<PrefixElement, List<ImportDirective>>();
+      for (int i = 0; i < count; i++) {
+        Directive directive = directives[i];
+        if (directive is ImportDirective) {
+          ImportDirective importDirective = directive;
+          SimpleIdentifier prefix = importDirective.prefix;
+          if (prefix != null) {
+            Element element = prefix.staticElement;
+            if (element is PrefixElement) {
+              PrefixElement prefixElement = element;
+              List<ImportDirective> elements = prefixToDirectivesMap[prefixElement];
+              if (elements == null) {
+                elements = new List<ImportDirective>();
+                prefixToDirectivesMap[prefixElement] = elements;
+              }
+              elements.add(importDirective);
+            }
+          }
+        }
+      }
+      for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
+        if (_hasDeferredPrefixCollision(imports)) {
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the given name of
+   * the static member.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+   */
+  bool _checkForDuplicateDefinitionInheritance() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    bool hasProblem = false;
+    for (ExecutableElement member in _enclosingClass.methods) {
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
+      }
+    }
+    for (ExecutableElement member in _enclosingClass.accessors) {
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
+      }
+    }
+    return hasProblem;
+  }
+
+  /**
+   * This verifies that the enclosing class does not have an instance member with the given name of
+   * the static member.
+   *
+   * @param staticMember the static member to check conflict for
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+   */
+  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
+    // prepare name
+    String name = staticMember.name;
+    if (name == null) {
+      return false;
+    }
+    // try to find member
+    ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+    if (inheritedMember == null) {
+      return false;
+    }
+    // OK, also static
+    if (inheritedMember.isStatic) {
+      return false;
+    }
+    // determine the display name, use the extended display name if the enclosing class of the
+    // inherited member is in a different source
+    String displayName;
+    Element enclosingElement = inheritedMember.enclosingElement;
+    if (enclosingElement.source == _enclosingClass.source) {
+      displayName = enclosingElement.displayName;
+    } else {
+      displayName = enclosingElement.getExtendedDisplayName(null);
+    }
+    // report problem
+    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, displayName]);
+    return true;
+  }
+
+  /**
+   * This verifies if the passed list literal has type arguments then there is exactly one.
+   *
+   * @param node the list literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
+   */
+  bool _checkForExpectedOneListTypeArgument(ListLiteral node, TypeArgumentList typeArguments) {
+    // check number of type arguments
+    int num = typeArguments.arguments.length;
+    if (num == 1) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
+    return true;
+  }
+
+  /**
+   * This verifies the passed import has unique name among other exported libraries.
+   *
+   * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @param exportedLibrary the library element containing the exported element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
+    if (exportedLibrary == null) {
+      return false;
+    }
+    String name = exportedLibrary.name;
+    // check if there is other exported library with the same name
+    LibraryElement prevLibrary = _nameToExportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != exportedLibrary) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
+            prevLibrary.definingCompilationUnit.displayName,
+            exportedLibrary.definingCompilationUnit.displayName,
+            name]);
+        return true;
+      }
+    } else {
+      _nameToExportElement[name] = exportedLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   *
+   * @param node the export directive to evaluate
+   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
+   */
+  bool _checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = exportElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed extends clause does not extend a deferred class.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
+   */
+  bool _checkForExtendsDeferredClass(ExtendsClause node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type alias does not extend a deferred class.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed extends clause does not extend classes such as num or String.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDisallowedClass(ExtendsClause node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type alias does not extend classes such as num or String.
+   *
+   * @param node the extends clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias node) {
+    if (node == null) {
+      return false;
+    }
+    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
+  }
+
+  /**
+   * This verifies that the passed type name does not extend, implement or mixin classes that are
+   * deferred.
+   *
+   * @param node the type name to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForExtendsDeferredClass(ExtendsClause)
+   * @see #checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias)
+   * @see #checkForImplementsDeferredClass(ImplementsClause)
+   * @see #checkForAllMixinErrorCodes(WithClause)
+   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
+   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
+   * @see CompileTimeErrorCode#MIXIN_DEFERRED_CLASS
+   */
+  bool _checkForExtendsOrImplementsDeferredClass(TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    if (typeName.isDeferred) {
+      _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name.name]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed type name does not extend, implement or mixin classes such as
+   * 'num' or 'String'.
+   *
+   * @param node the type name to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see #checkForExtendsDisallowedClass(ExtendsClause)
+   * @see #checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias)
+   * @see #checkForImplementsDisallowedClass(ImplementsClause)
+   * @see #checkForAllMixinErrorCodes(WithClause)
+   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
+   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
+   * @see CompileTimeErrorCode#MIXIN_OF_DISALLOWED_CLASS
+   */
+  bool _checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
+    if (typeName.isSynthetic) {
+      return false;
+    }
+    DartType superType = typeName.type;
+    for (InterfaceType disallowedType in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
+      if (superType != null && superType == disallowedType) {
+        // if the violating type happens to be 'num', we need to rule out the case where the
+        // enclosing class is 'int' or 'double'
+        if (superType == _typeProvider.numType) {
+          AstNode grandParent = typeName.parent.parent;
+          // Note: this is a corner case that won't happen often, so adding a field currentClass
+          // (see currentFunction) to ErrorVerifier isn't worth if for this case, but if the field
+          // currentClass is added, then this message should become a todo to not lookup the
+          // grandparent node
+          if (grandParent is ClassDeclaration) {
+            ClassElement classElement = grandParent.element;
+            DartType classType = classElement.type;
+            if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
+              return false;
+            }
+          }
+        }
+        // otherwise, report the error
+        _errorReporter.reportErrorForNode(errorCode, typeName, [disallowedType.displayName]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed constructor field initializer has compatible field and
+   * initializer expression types.
+   *
+   * @param node the constructor field initializer to test
+   * @param staticElement the static element from the name in the
+   *          [ConstructorFieldInitializer]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
+   * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
+   */
+  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node, Element staticElement) {
+    // prepare field element
+    if (staticElement is! FieldElement) {
+      return false;
+    }
+    FieldElement fieldElement = staticElement as FieldElement;
+    // prepare field type
+    DartType fieldType = fieldElement.type;
+    // prepare expression type
+    Expression expression = node.expression;
+    if (expression == null) {
+      return false;
+    }
+    // test the static type of the expression
+    DartType staticType = getStaticType(expression);
+    if (staticType == null) {
+      return false;
+    }
+    if (staticType.isAssignableTo(fieldType)) {
+      return false;
+    }
+    // report problem
+    if (_isEnclosingConstructorConst) {
+      // TODO(paulberry): this error should be based on the actual type of the constant, not the
+      // static type.  See dartbug.com/21119.
+      _errorReporter.reportTypeErrorForNode(CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
+    }
+    _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
+    return true;
+    // TODO(brianwilkerson) Define a hint corresponding to these errors and report it if appropriate.
+    //    // test the propagated type of the expression
+    //    Type propagatedType = expression.getPropagatedType();
+    //    if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
+    //      return false;
+    //    }
+    //    // report problem
+    //    if (isEnclosingConstructorConst) {
+    //      errorReporter.reportTypeErrorForNode(
+    //          CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
+    //          expression,
+    //          propagatedType == null ? staticType : propagatedType,
+    //          fieldType);
+    //    } else {
+    //      errorReporter.reportTypeErrorForNode(
+    //          StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
+    //          expression,
+    //          propagatedType == null ? staticType : propagatedType,
+    //          fieldType);
+    //    }
+    //    return true;
+  }
+
+  /**
+   * This verifies that the passed field formal parameter is in a constructor declaration.
+   *
+   * @param node the field formal parameter to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
+   */
+  bool _checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
+    ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
+    if (constructor == null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
+      return true;
+    }
+    // constructor cannot be a factory
+    if (constructor.factoryKeyword != null) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
+      return true;
+    }
+    // constructor cannot have a redirection
+    for (ConstructorInitializer initializer in constructor.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
+        return true;
+      }
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies that the passed variable declaration list has only initialized variables if the
+   * list is final or const. This method is called by
+   * [checkForFinalNotInitializedInClass],
+   * [visitTopLevelVariableDeclaration] and
+   * [visitVariableDeclarationStatement].
+   *
+   * @param node the class declaration to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
+   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
+   */
+  bool _checkForFinalNotInitialized(VariableDeclarationList node) {
+    if (_isInNativeClass) {
+      return false;
+    }
+    bool foundError = false;
+    if (!node.isSynthetic) {
+      NodeList<VariableDeclaration> variables = node.variables;
+      for (VariableDeclaration variable in variables) {
+        if (variable.initializer == null) {
+          if (node.isConst) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
+          } else if (node.isFinal) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
+          }
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that final fields that are declared, without any constructors in the enclosing
+   * class, are initialized. Cases in which there is at least one constructor are handled at the end
+   * of [checkForAllFinalInitializedErrorCodes].
+   *
+   * @param node the class declaration to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
+   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
+   */
+  bool _checkForFinalNotInitializedInClass(ClassDeclaration node) {
+    NodeList<ClassMember> classMembers = node.members;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is ConstructorDeclaration) {
+        return false;
+      }
+    }
+    bool foundError = false;
+    for (ClassMember classMember in classMembers) {
+      if (classMember is FieldDeclaration
+          && _checkForFinalNotInitialized(classMember.fields)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed implements clause does not implement classes that are deferred.
+   *
+   * @param node the implements clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
+   */
+  bool _checkForImplementsDeferredClass(ImplementsClause node) {
+    if (node == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in node.interfaces) {
+      if (_checkForExtendsOrImplementsDeferredClass(
+          type,
+          CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the passed implements clause does not implement classes such as 'num' or
+   * 'String'.
+   *
+   * @param node the implements clause to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
+   */
+  bool _checkForImplementsDisallowedClass(ImplementsClause node) {
+    if (node == null) {
+      return false;
+    }
+    bool foundError = false;
+    for (TypeName type in node.interfaces) {
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          type,
+          CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that if the passed identifier is part of constructor initializer, then it does
+   * not reference implicitly 'this' expression.
+   *
+   * @param node the simple identifier to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
+   * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
+   */
+  bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
+    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInFactory && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
+      return false;
+    }
+    // prepare element
+    Element element = node.staticElement;
+    if (!(element is MethodElement || element is PropertyAccessorElement)) {
+      return false;
+    }
+    // static element
+    ExecutableElement executableElement = element as ExecutableElement;
+    if (executableElement.isStatic) {
+      return false;
+    }
+    // not a class member
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    // comment
+    AstNode parent = node.parent;
+    if (parent is CommentReference) {
+      return false;
+    }
+    // qualified method invocation
+    if (parent is MethodInvocation) {
+      MethodInvocation invocation = parent;
+      if (identical(invocation.methodName, node) && invocation.realTarget != null) {
+        return false;
+      }
+    }
+    // qualified property access
+    if (parent is PropertyAccess) {
+      PropertyAccess access = parent;
+      if (identical(access.propertyName, node) && access.realTarget != null) {
+        return false;
+      }
+    }
+    if (parent is PrefixedIdentifier) {
+      PrefixedIdentifier prefixed = parent;
+      if (identical(prefixed.identifier, node)) {
+        return false;
+      }
+    }
+    // report problem
+    if (_isInStaticMethod) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+    } else if (_isInFactory) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, node, []);
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies the passed import has unique name among other imported libraries.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
+   */
+  bool _checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
+    // prepare imported library
+    LibraryElement nodeLibrary = importElement.importedLibrary;
+    if (nodeLibrary == null) {
+      return false;
+    }
+    String name = nodeLibrary.name;
+    // check if there is other imported library with the same name
+    LibraryElement prevLibrary = _nameToImportElement[name];
+    if (prevLibrary != null) {
+      if (prevLibrary != nodeLibrary) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
+            prevLibrary.definingCompilationUnit.displayName,
+            nodeLibrary.definingCompilationUnit.displayName,
+            name]);
+        return true;
+      }
+    } else {
+      _nameToImportElement[name] = nodeLibrary;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * Check that if the visiting library is not system, then any passed library should not be SDK
+   * internal library.
+   *
+   * @param node the import directive to evaluate
+   * @param importElement the [ImportElement] retrieved from the node, if the element in the
+   *          node was `null`, then this method is not called
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
+   */
+  bool _checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
+    if (_isInSystemLibrary) {
+      return false;
+    }
+    // should be private
+    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
+    String uri = importElement.uri;
+    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
+    if (sdkLibrary == null) {
+      return false;
+    }
+    if (!sdkLibrary.isInternal) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
+    return true;
+  }
+
+  /**
+   * For each class declaration, this method is called which verifies that all inherited members are
+   * inherited consistently.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
+   */
+  bool _checkForInconsistentMethodInheritance() {
+    // Ensure that the inheritance manager has a chance to generate all errors we may care about,
+    // note that we ensure that the interfaces data since there are no errors.
+    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    HashSet<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    if (errors == null || errors.isEmpty) {
+      return false;
+    }
+    for (AnalysisError error in errors) {
+      _errorReporter.reportError(error);
+    }
+    return true;
+  }
+
+  /**
+   * This checks the given "typeReference" is not a type reference and that then the "name" is
+   * reference to an instance member.
+   *
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
+   * @param name the accessed name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
+   */
+  bool _checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
+    // OK, in comment
+    if (_isInComment) {
+      return false;
+    }
+    // OK, target is a type
+    if (typeReference != null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement executableElement = element as ExecutableElement;
+    // OK, top-level element
+    if (executableElement.enclosingElement is! ClassElement) {
+      return false;
+    }
+    // OK, instance member
+    if (!executableElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  /**
+   * This checks whether the given [executableElement] collides with the name of a static
+   * method in one of its superclasses, and reports the appropriate warning if it does.
+   *
+   * @param executableElement the method to check.
+   * @param errorNameTarget the node to report problems on.
+   * @return `true` if and only if a warning was generated.
+   * @see StaticTypeWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   */
+  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
+    String executableElementName = executableElement.name;
+    if (executableElement is! PropertyAccessorElement && !executableElement.isOperator) {
+      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+      InterfaceType superclassType = _enclosingClass.supertype;
+      ClassElement superclassElement = superclassType == null ? null : superclassType.element;
+      bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
+      while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
+        visitedClasses.add(superclassElement);
+        LibraryElement superclassLibrary = superclassElement.library;
+        // Check fields.
+        List<FieldElement> fieldElts = superclassElement.fields;
+        for (FieldElement fieldElt in fieldElts) {
+          // We need the same name.
+          if (fieldElt.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (fieldElt.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                fieldElt.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        // Check methods.
+        List<MethodElement> methodElements = superclassElement.methods;
+        for (MethodElement methodElement in methodElements) {
+          // We need the same name.
+          if (methodElement.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (methodElement.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                methodElement.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        superclassType = superclassElement.supertype;
+        superclassElement = superclassType == null ? null : superclassType.element;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that an 'int' can be assigned to the parameter corresponding to the given
+   * expression. This is used for prefix and postfix expressions where the argument value is
+   * implicit.
+   *
+   * @param argument the expression to which the operator is being applied
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForIntNotAssignable(Expression argument) {
+    if (argument == null) {
+      return false;
+    }
+    ParameterElement staticParameterElement = argument.staticParameterElement;
+    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
+    return _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+  }
+
+  /**
+   * This verifies that the passed [Annotation] isn't defined in a deferred library.
+   *
+   * @param node the [Annotation]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
+   */
+  bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation node) {
+    Identifier nameIdentifier = node.name;
+    if (nameIdentifier is PrefixedIdentifier) {
+      if (nameIdentifier.isDeferred) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY, node.name, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed left hand side and right hand side represent a valid assignment.
+   *
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
+   */
+  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+    if (lhs == null || rhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
+    DartType staticRightType = getStaticType(rhs);
+    if (!staticRightType.isAssignableTo(leftType)) {
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType, leftType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given an assignment using a compound assignment operator, this verifies that the given
+   * assignment is valid.
+   *
+   * @param node the assignment expression being tested
+   * @param lhs the left hand side expression
+   * @param rhs the right hand side expression
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
+   */
+  bool _checkForInvalidCompoundAssignment(AssignmentExpression node, Expression lhs, Expression rhs) {
+    if (lhs == null) {
+      return false;
+    }
+    VariableElement leftVariableElement = getVariableElement(lhs);
+    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
+    MethodElement invokedMethod = node.staticElement;
+    if (invokedMethod == null) {
+      return false;
+    }
+    DartType rightType = invokedMethod.type.returnType;
+    if (leftType == null || rightType == null) {
+      return false;
+    }
+    if (!rightType.isAssignableTo(leftType)) {
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Check the given initializer to ensure that the field being initialized is a valid field.
+   *
+   * @param node the field initializer being checked
+   * @param fieldName the field name from the [ConstructorFieldInitializer]
+   * @param staticElement the static element from the name in the
+   *          [ConstructorFieldInitializer]
+   */
+  void _checkForInvalidField(ConstructorFieldInitializer node, SimpleIdentifier fieldName, Element staticElement) {
+    if (staticElement is FieldElement) {
+      FieldElement fieldElement = staticElement;
+      if (fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, node, [fieldName]);
+      } else if (fieldElement.isStatic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
+      }
+    } else {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, node, [fieldName]);
+      return;
+    }
+  }
+
+  /**
+   * Check to see whether the given function body has a modifier associated with it, and report it
+   * as an error if it does.
+   *
+   * @param body the function body being checked
+   * @param errorCode the error code to be reported if a modifier is found
+   * @return `true` if an error was reported
+   */
+  bool _checkForInvalidModifierOnBody(FunctionBody body, CompileTimeErrorCode errorCode) {
+    sc.Token keyword = body.keyword;
+    if (keyword != null) {
+      _errorReporter.reportErrorForToken(errorCode, keyword, [keyword.lexeme]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the usage of the passed 'this' is valid.
+   *
+   * @param node the 'this' expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
+   */
+  bool _checkForInvalidReferenceToThis(ThisExpression node) {
+    if (!_isThisInValidContext(node)) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
+   * parameter as a type argument.
+   *
+   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
+   *          [ListLiteral] or [MapLiteral]
+   * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
+   *          [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
+    bool foundError = false;
+    for (TypeName typeName in arguments) {
+      if (typeName.type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This verifies that the elements given [ListLiteral] are subtypes of the specified element
+   * type.
+   *
+   * @param node the list literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForListElementTypeNotAssignable(ListLiteral node, TypeArgumentList typeArguments) {
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 1) {
+      return false;
+    }
+    DartType listElementType = typeNames[0].type;
+    // Check every list element.
+    bool hasProblems = false;
+    for (Expression element in node.elements) {
+      if (node.constKeyword != null) {
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            element,
+            listElementType,
+            CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          element,
+          listElementType,
+          StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
+   * key/value types specified in the type arguments.
+   *
+   * @param node the map literal to evaluate
+   * @param typeArguments the type arguments, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
+   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
+   */
+  bool _checkForMapTypeNotAssignable(MapLiteral node, TypeArgumentList typeArguments) {
+    // Prepare maps key/value types.
+    NodeList<TypeName> typeNames = typeArguments.arguments;
+    if (typeNames.length < 2) {
+      return false;
+    }
+    DartType keyType = typeNames[0].type;
+    DartType valueType = typeNames[1].type;
+    // Check every map entry.
+    bool hasProblems = false;
+    NodeList<MapLiteralEntry> entries = node.entries;
+    for (MapLiteralEntry entry in entries) {
+      Expression key = entry.key;
+      Expression value = entry.value;
+      if (node.constKeyword != null) {
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            key,
+            keyType,
+            CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            value,
+            valueType,
+            CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          key,
+          keyType,
+          StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          value,
+          valueType,
+          StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+    }
+    return hasProblems;
+  }
+
+  /**
+   * This verifies that the [enclosingClass] does not define members with the same name as
+   * the enclosing class.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
+   */
+  bool _checkForMemberWithClassName() {
+    if (_enclosingClass == null) {
+      return false;
+    }
+    String className = _enclosingClass.name;
+    if (className == null) {
+      return false;
+    }
+    bool problemReported = false;
+    // check accessors
+    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+      if (className == accessor.name) {
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
+        problemReported = true;
+      }
+    }
+    // don't check methods, they would be constructors
+    // done
+    return problemReported;
+  }
+
+  /**
+   * Check to make sure that all similarly typed accessors are of the same type (including inherited
+   * accessors).
+   *
+   * @param node the accessor currently being visited
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES
+   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE
+   */
+  bool _checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
+    ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
+    if (accessorElement is! PropertyAccessorElement) {
+      return false;
+    }
+    PropertyAccessorElement propertyAccessorElement = accessorElement as PropertyAccessorElement;
+    PropertyAccessorElement counterpartAccessor = null;
+    ClassElement enclosingClassForCounterpart = null;
+    if (propertyAccessorElement.isGetter) {
+      counterpartAccessor = propertyAccessorElement.correspondingSetter;
+    } else {
+      counterpartAccessor = propertyAccessorElement.correspondingGetter;
+      // If the setter and getter are in the same enclosing element, return, this prevents having
+      // MISMATCHED_GETTER_AND_SETTER_TYPES reported twice.
+      if (counterpartAccessor != null && identical(counterpartAccessor.enclosingElement, propertyAccessorElement.enclosingElement)) {
+        return false;
+      }
+    }
+    if (counterpartAccessor == null) {
+      // If the accessor is declared in a class, check the superclasses.
+      if (_enclosingClass != null) {
+        // Figure out the correct identifier to lookup in the inheritance graph, if 'x', then 'x=',
+        // or if 'x=', then 'x'.
+        String lookupIdentifier = propertyAccessorElement.name;
+        if (StringUtilities.endsWithChar(lookupIdentifier, 0x3D)) {
+          lookupIdentifier = lookupIdentifier.substring(0, lookupIdentifier.length - 1);
+        } else {
+          lookupIdentifier += "=";
+        }
+        // lookup with the identifier.
+        ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, lookupIdentifier);
+        // Verify that we found something, and that it is an accessor
+        if (elementFromInheritance != null && elementFromInheritance is PropertyAccessorElement) {
+          enclosingClassForCounterpart = elementFromInheritance.enclosingElement as ClassElement;
+          counterpartAccessor = elementFromInheritance;
+        }
+      }
+      if (counterpartAccessor == null) {
+        return false;
+      }
+    }
+    // Default of null == no accessor or no type (dynamic)
+    DartType getterType = null;
+    DartType setterType = null;
+    // Get an existing counterpart accessor if any.
+    if (propertyAccessorElement.isGetter) {
+      getterType = _getGetterType(propertyAccessorElement);
+      setterType = _getSetterType(counterpartAccessor);
+    } else if (propertyAccessorElement.isSetter) {
+      setterType = _getSetterType(propertyAccessorElement);
+      getterType = _getGetterType(counterpartAccessor);
+    }
+    // If either types are not assignable to each other, report an error (if the getter is null,
+    // it is dynamic which is assignable to everything).
+    if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
+      if (enclosingClassForCounterpart == null) {
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType, getterType]);
+        return true;
+      } else {
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+            accessorTextName,
+            setterType,
+            getterType,
+            enclosingClassForCounterpart.displayName]);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Check to make sure that switch statements whose static type is an enum type either have a
+   * default case or include all of the enum constants.
+   *
+   * @param statement the switch statement to check
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
+    // TODO(brianwilkerson) This needs to be checked after constant values have been computed.
+    Expression expression = statement.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    Element expressionElement = expressionType.element;
+    if (expressionElement is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = expressionElement as ClassElement;
+    if (!classElement.isEnum) {
+      return false;
+    }
+    List<String> constantNames = new List<String>();
+    List<FieldElement> fields = classElement.fields;
+    int fieldCount = fields.length;
+    for (int i = 0; i < fieldCount; i++) {
+      FieldElement field = fields[i];
+      if (field.isStatic && !field.isSynthetic) {
+        constantNames.add(field.name);
+      }
+    }
+    NodeList<SwitchMember> members = statement.members;
+    int memberCount = members.length;
+    for (int i = 0; i < memberCount; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchDefault) {
+        return false;
+      }
+      String constantName = _getConstantName((member as SwitchCase).expression);
+      if (constantName != null) {
+        constantNames.remove(constantName);
+      }
+    }
+    int nameCount = constantNames.length;
+    if (nameCount == 0) {
+      return false;
+    }
+    for (int i = 0; i < nameCount; i++) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH, statement, [constantNames[i]]);
+    }
+    return true;
+  }
+
+  /**
+   * This verifies that the given function body does not contain return statements that both have
+   * and do not have return values.
+   *
+   * @param node the function body being tested
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#MIXED_RETURN_TYPES
+   */
+  bool _checkForMixedReturns(BlockFunctionBody node) {
+    if (_hasReturnWithoutValue) {
+      return false;
+    }
+    int withCount = _returnsWith.length;
+    int withoutCount = _returnsWithout.length;
+    if (withCount > 0 && withoutCount > 0) {
+      for (int i = 0; i < withCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
+      }
+      for (int i = 0; i < withoutCount; i++) {
+        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin does not have an explicitly declared constructor.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
+   */
+  bool _checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
+    for (ConstructorElement constructor in mixinElement.constructors) {
+      if (!constructor.isSynthetic && !constructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin has the 'Object' superclass.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
+   */
+  bool _checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
+    InterfaceType mixinSupertype = mixinElement.supertype;
+    if (mixinSupertype != null) {
+      if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed mixin does not reference 'super'.
+   *
+   * @param mixinName the node to report problem on
+   * @param mixinElement the mixing to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
+   */
+  bool _checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
+    if (mixinElement.hasReferenceToSuper) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed constructor has at most one 'super' initializer.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
+   */
+  bool _checkForMultipleSuperInitializers(ConstructorDeclaration node) {
+    int numSuperInitializers = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is SuperConstructorInvocation) {
+        numSuperInitializers++;
+        if (numSuperInitializers > 1) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
+        }
+      }
+    }
+    return numSuperInitializers > 0;
+  }
+
+  /**
+   * Checks to ensure that native function bodies can only in SDK code.
+   *
+   * @param node the native function body to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
+   */
+  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
+    if (!_isInSystemLibrary && !_hasExtUri) {
+      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed 'new' instance creation expression invokes existing constructor.
+   *
+   * This method assumes that the instance creation was tested to be 'new' before being called.
+   *
+   * @param node the instance creation expression to evaluate
+   * @param constructorName the constructor name, always non-`null`
+   * @param typeName the name of the type defining the constructor, always non-`null`
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
+   */
+  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
+    // OK if resolved
+    if (node.staticElement != null) {
+      return false;
+    }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
+    // prepare class name
+    Identifier className = typeName.name;
+    // report as named or default constructor absence
+    SimpleIdentifier name = constructorName.name;
+    if (name != null) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
+    } else {
+      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
+    }
+    return true;
+  }
+
+  /**
+   * This checks that if the passed class declaration implicitly calls default constructor of its
+   * superclass, there should be such default constructor - implicit or explicit.
+   *
+   * @param node the [ClassDeclaration] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+   */
+  bool _checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
+    // do nothing if there is explicit constructor
+    List<ConstructorElement> constructors = _enclosingClass.constructors;
+    if (!constructors[0].isSynthetic) {
+      return false;
+    }
+    // prepare super
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    // try to find default generative super constructor
+    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
+        return true;
+      }
+      if (superUnnamedConstructor.isDefaultConstructor) {
+        return true;
+      }
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
+    return true;
+  }
+
+  /**
+   * This checks that passed class declaration overrides all members required by its superclasses
+   * and interfaces.
+   *
+   * @param classNameNode the [SimpleIdentifier] to be used if there is a violation, this is
+   *          either the named from the [ClassDeclaration] or from the [ClassTypeAlias].
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
+   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
+   */
+  bool _checkForNonAbstractClassInheritsAbstractMember(SimpleIdentifier classNameNode) {
+    if (_enclosingClass.isAbstract) {
+      return false;
+    }
+    //
+    // Store in local sets the set of all method and accessor names
+    //
+    List<MethodElement> methods = _enclosingClass.methods;
+    for (MethodElement method in methods) {
+      String methodName = method.name;
+      // If the enclosing class declares the method noSuchMethod(), then return.
+      // From Spec:  It is a static warning if a concrete class does not have an implementation for
+      // a method in any of its superinterfaces unless it declares its own noSuchMethod
+      // method (7.10).
+      if (methodName == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
+        return false;
+      }
+    }
+    HashSet<ExecutableElement> missingOverrides = new HashSet<ExecutableElement>();
+    //
+    // Loop through the set of all executable elements declared in the implicit interface.
+    //
+    MemberMap membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
+    MemberMap membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
+    for (int i = 0; i < membersInheritedFromInterfaces.size; i++) {
+      String memberName = membersInheritedFromInterfaces.getKey(i);
+      ExecutableElement executableElt = membersInheritedFromInterfaces.getValue(i);
+      if (memberName == null) {
+        break;
+      }
+      // If the element is not synthetic and can be determined to be defined in Object, skip it.
+      if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
+        continue;
+      }
+      // Check to see if some element is in local enclosing class that matches the name of the
+      // required member.
+      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
+        // We do not have to verify that this implementation of the found method matches the
+        // required function type: the set of StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings
+        // break out the different specific situations.
+        continue;
+      }
+      // First check to see if this element was declared in the superclass chain, in which case
+      // there is already a concrete implementation.
+      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
+      // Check to see if an element was found in the superclass chain with the correct name.
+      if (elt != null) {
+        // Reference the types, if any are null then continue.
+        InterfaceType enclosingType = _enclosingClass.type;
+        FunctionType concreteType = elt.type;
+        FunctionType requiredMemberType = executableElt.type;
+        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
+          continue;
+        }
+        // Some element was found in the superclass chain that matches the name of the required
+        // member.
+        // If it is not abstract and it is the correct one (types match- the version of this method
+        // that we have has the correct number of parameters, etc), then this class has a valid
+        // implementation of this method, so skip it.
+        if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
+          // Since we are comparing two function types, we need to do the appropriate type
+          // substitutions first ().
+          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
+          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
+          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
+            continue;
+          }
+        }
+      }
+      // The not qualifying concrete executable element was found, add it to the list.
+      missingOverrides.add(executableElt);
+    }
+    // Now that we have the set of missing overrides, generate a warning on this class
+    int missingOverridesSize = missingOverrides.length;
+    if (missingOverridesSize == 0) {
+      return false;
+    }
+    List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
+    List<String> stringMembersArrayListSet = new List<String>();
+    for (int i = 0; i < missingOverridesArray.length; i++) {
+      String newStrMember;
+      Element enclosingElement = missingOverridesArray[i].enclosingElement;
+      String prefix = StringUtilities.EMPTY;
+      if (missingOverridesArray[i] is PropertyAccessorElement) {
+        PropertyAccessorElement propertyAccessorElement = missingOverridesArray[i] as PropertyAccessorElement;
+        if (propertyAccessorElement.isGetter) {
+          prefix = _GETTER_SPACE;
+          // "getter "
+        } else {
+          prefix = _SETTER_SPACE;
+          // "setter "
+        }
+      }
+      if (enclosingElement != null) {
+        newStrMember = "$prefix'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
+      } else {
+        newStrMember = "$prefix'${missingOverridesArray[i].displayName}'";
+      }
+      stringMembersArrayListSet.add(newStrMember);
+    }
+    List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
+    AnalysisErrorWithProperties analysisError;
+    if (stringMembersArray.length == 1) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, classNameNode, [stringMembersArray[0]]);
+    } else if (stringMembersArray.length == 2) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, classNameNode, [stringMembersArray[0], stringMembersArray[1]]);
+    } else if (stringMembersArray.length == 3) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2]]);
+    } else if (stringMembersArray.length == 4) {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2],
+          stringMembersArray[3]]);
+    } else {
+      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, classNameNode, [
+          stringMembersArray[0],
+          stringMembersArray[1],
+          stringMembersArray[2],
+          stringMembersArray[3],
+          stringMembersArray.length - 4]);
+    }
+    analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
+    _errorReporter.reportError(analysisError);
+    return true;
+  }
+
+  /**
+   * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
+   * reported on the expression.
+   *
+   * @param condition the conditional expression to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_CONDITION
+   */
+  bool _checkForNonBoolCondition(Expression condition) {
+    DartType conditionType = getStaticType(condition);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
+   *
+   * @param node the assert statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
+   */
+  bool _checkForNonBoolExpression(AssertStatement node) {
+    Expression expression = node.condition;
+    DartType type = getStaticType(expression);
+    if (type is InterfaceType) {
+      if (!type.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        return true;
+      }
+    } else if (type is FunctionType) {
+      FunctionType functionType = type;
+      if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_boolType)) {
+        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Checks to ensure that the given expression is assignable to bool.
+   *
+   * @param expression the expression expression to test
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#NON_BOOL_NEGATION_EXPRESSION
+   */
+  bool _checkForNonBoolNegationExpression(Expression expression) {
+    DartType conditionType = getStaticType(expression);
+    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies the passed map literal either:
+   * * has `const modifier`
+   * * has explicit type arguments
+   * * is not start of the statement
+   *
+   * @param node the map literal to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+   */
+  bool _checkForNonConstMapAsExpressionStatement(MapLiteral node) {
+    // "const"
+    if (node.constKeyword != null) {
+      return false;
+    }
+    // has type arguments
+    if (node.typeArguments != null) {
+      return false;
+    }
+    // prepare statement
+    Statement statement = node.getAncestor((node) => node is ExpressionStatement);
+    if (statement == null) {
+      return false;
+    }
+    // OK, statement does not start with map
+    if (!identical(statement.beginToken, node.beginToken)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies the passed method declaration of operator `[]=`, has `void` return
+   * type.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
+   */
+  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
+    // check that []= operator
+    SimpleIdentifier name = node.name;
+    if (name.name != "[]=") {
+      return false;
+    }
+    // check return type
+    TypeName typeName = node.returnType;
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
+      }
+    }
+    // no warning
+    return false;
+  }
+
+  /**
+   * This verifies the passed setter has no return type or the `void` return type.
+   *
+   * @param typeName the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
+   */
+  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+    if (typeName != null) {
+      DartType type = typeName.type;
+      if (type != null && !type.isVoid) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This verifies the passed operator-method declaration, does not have an optional parameter.
+   *
+   * This method assumes that the method declaration was tested to be an operator declaration before
+   * being called.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
+   */
+  bool _checkForOptionalParameterInOperator(MethodDeclaration node) {
+    FormalParameterList parameterList = node.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    bool foundError = false;
+    NodeList<FormalParameter> formalParameters = parameterList.parameters;
+    for (FormalParameter formalParameter in formalParameters) {
+      if (formalParameter.kind.isOptional) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
+        foundError = true;
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks for named optional parameters that begin with '_'.
+   *
+   * @param node the default formal parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
+   */
+  bool _checkForPrivateOptionalParameter(FormalParameter node) {
+    // should be named parameter
+    if (node.kind != ParameterKind.NAMED) {
+      return false;
+    }
+    // name should start with '_'
+    SimpleIdentifier name = node.identifier;
+    if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
+    return true;
+  }
+
+  /**
+   * This checks if the passed constructor declaration is the redirecting generative constructor and
+   * references itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
+   */
+  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
+    // we check generative constructor here
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // try to find redirecting constructor invocation and analyzer it for recursion
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        // OK if no cycle
+        if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
+          return false;
+        }
+        // report error
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
+        return true;
+      }
+    }
+    // OK, no redirecting constructor invocation
+    return false;
+  }
+
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
+   */
+  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // OK if no cycle
+    if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
+    return true;
+  }
+
+  /**
+   * This checks the class declaration is not a superinterface to itself.
+   *
+   * @param classElt the class element to test
+   * @return `true` if and only if an error code is generated on the passed element
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   */
+  bool _checkForRecursiveInterfaceInheritance(ClassElement classElt) {
+    if (classElt == null) {
+      return false;
+    }
+    return _safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
+  }
+
+  /**
+   * This checks the passed constructor declaration has a valid combination of redirected
+   * constructor invocation(s), super constructor invocations and field initializers.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
+   * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
+   * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
+   * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
+   * @see CompileTimeErrorCode#REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
+   */
+  bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
+    bool errorReported = false;
+    //
+    // Check for default values in the parameters
+    //
+    ConstructorName redirectedConstructor = node.redirectedConstructor;
+    if (redirectedConstructor != null) {
+      for (FormalParameter parameter in node.parameters.parameters) {
+        if (parameter is DefaultFormalParameter && parameter.defaultValue != null) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
+          errorReported = true;
+        }
+      }
+    }
+    // check if there are redirected invocations
+    int numRedirections = 0;
+    for (ConstructorInitializer initializer in node.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (numRedirections > 0) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
+          errorReported = true;
+        }
+        if (node.factoryKeyword == null) {
+          RedirectingConstructorInvocation invocation = initializer;
+          ConstructorElement redirectingElement = invocation.staticElement;
+          if (redirectingElement == null) {
+            String enclosingTypeName = _enclosingClass.displayName;
+            String constructorStrName = enclosingTypeName;
+            if (invocation.constructorName != null) {
+              constructorStrName += ".${invocation.constructorName.name}";
+            }
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR, invocation, [constructorStrName, enclosingTypeName]);
+          } else {
+            if (redirectingElement.isFactory) {
+              _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR, initializer, []);
+            }
+          }
+        }
+        numRedirections++;
+      }
+    }
+    // check for other initializers
+    if (numRedirections > 0) {
+      for (ConstructorInitializer initializer in node.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
+          errorReported = true;
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
+          errorReported = true;
+        }
+      }
+    }
+    // done
+    return errorReported;
+  }
+
+  /**
+   * This checks if the passed constructor declaration has redirected constructor and references
+   * itself directly or indirectly.
+   *
+   * @param node the constructor declaration to evaluate
+   * @param constructorElement the constructor element
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
+   */
+  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node, ConstructorElement constructorElement) {
+    // prepare redirected constructor
+    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
+    if (redirectedConstructorNode == null) {
+      return false;
+    }
+    // prepare element
+    if (constructorElement == null) {
+      return false;
+    }
+    // OK, it is not 'const'
+    if (!constructorElement.isConst) {
+      return false;
+    }
+    // prepare redirected constructor
+    ConstructorElement redirectedConstructor = constructorElement.redirectedConstructor;
+    if (redirectedConstructor == null) {
+      return false;
+    }
+    // OK, it is also 'const'
+    if (redirectedConstructor.isConst) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
+    return true;
+  }
+
+  /**
+   * This checks that the rethrow is inside of a catch clause.
+   *
+   * @param node the rethrow expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
+   */
+  bool _checkForRethrowOutsideCatch(RethrowExpression node) {
+    if (!_isInCatchClause) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This checks that if the the given constructor declaration is generative, then it does not have
+   * an expression function body.
+   *
+   * @param node the constructor to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
+   */
+  bool _checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
+    // ignore factory
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    // block body (with possible return statement) is checked elsewhere
+    FunctionBody body = node.body;
+    if (body is! ExpressionFunctionBody) {
+      return false;
+    }
+    // report error
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
+    return true;
+  }
+
+  /**
+   * This checks that a type mis-match between the return type and the expressed return type by the
+   * enclosing method or function.
+   *
+   * This method is called both by [checkForAllReturnStatementErrorCodes]
+   * and [visitExpressionFunctionBody].
+   *
+   * @param returnExpression the returned expression to evaluate
+   * @param expectedReturnType the expressed return type by the enclosing method or function
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
+   */
+  bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
+    if (_enclosingFunction == null) {
+      return false;
+    }
+    DartType staticReturnType = getStaticType(returnExpression);
+    if (expectedReturnType.isVoid) {
+      if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
+        return false;
+      }
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+          staticReturnType,
+          expectedReturnType,
+          _enclosingFunction.displayName]);
+      return true;
+    }
+    if (_enclosingFunction.isAsynchronous && !_enclosingFunction.isGenerator) {
+      // TODO(brianwilkerson) Figure out how to get the type "Future" so that we can build the type
+      // we need to test against.
+      //      InterfaceType impliedType = "Future<" + flatten(staticReturnType) + ">"
+      //      if (impliedType.isAssignableTo(expectedReturnType)) {
+      //        return false;
+      //      }
+      //      errorReporter.reportTypeErrorForNode(
+      //          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+      //          returnExpression,
+      //          impliedType,
+      //          expectedReturnType.getDisplayName(),
+      //          enclosingFunction.getDisplayName());
+      //      return true;
+      return false;
+    }
+    if (staticReturnType.isAssignableTo(expectedReturnType)) {
+      return false;
+    }
+    _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType,
+        expectedReturnType,
+        _enclosingFunction.displayName]);
+    return true;
+    // TODO(brianwilkerson) Define a hint corresponding to the warning and report it if appropriate.
+    //    Type propagatedReturnType = returnExpression.getPropagatedType();
+    //    boolean isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
+    //    if (isStaticAssignable || isPropagatedAssignable) {
+    //      return false;
+    //    }
+    //    errorReporter.reportTypeErrorForNode(
+    //        StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+    //        returnExpression,
+    //        staticReturnType,
+    //        expectedReturnType,
+    //        enclosingFunction.getDisplayName());
+    //    return true;
+  }
+
+  /**
+   * This checks the given "typeReference" and that the "name" is not the reference to an instance
+   * member.
+   *
+   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
+   *          or `null`, aka, the class element of 'C' in 'C.x', see
+   *          [getTypeReference]
+   * @param name the accessed name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
+   */
+  bool _checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
+    // OK, target is not a type
+    if (typeReference == null) {
+      return false;
+    }
+    // prepare member Element
+    Element element = name.staticElement;
+    if (element is! ExecutableElement) {
+      return false;
+    }
+    ExecutableElement memberElement = element as ExecutableElement;
+    // OK, static
+    if (memberElement.isStatic) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  /**
+   * This checks that the type of the passed 'switch' expression is assignable to the type of the
+   * 'case' members.
+   *
+   * @param node the 'switch' statement to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
+   */
+  bool _checkForSwitchExpressionNotAssignable(SwitchStatement node) {
+    // prepare 'switch' expression type
+    Expression expression = node.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    // compare with type of the first 'case'
+    NodeList<SwitchMember> members = node.members;
+    for (SwitchMember switchMember in members) {
+      if (switchMember is! SwitchCase) {
+        continue;
+      }
+      SwitchCase switchCase = switchMember as SwitchCase;
+      // prepare 'case' type
+      Expression caseExpression = switchCase.expression;
+      DartType caseType = getStaticType(caseExpression);
+      // check types
+      if (expressionType.isAssignableTo(caseType)) {
+        return false;
+      }
+      // report problem
+      _errorReporter.reportErrorForNode(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the passed function type alias does not reference itself directly.
+   *
+   * @param node the function type alias to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
+   */
+  bool _checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
+    FunctionTypeAliasElement element = node.element;
+    if (!_hasTypedefSelfReference(element)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
+    return true;
+  }
+
+  /**
+   * This verifies that the passed type name is not a deferred type.
+   *
+   * @param expression the expression to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#TYPE_ANNOTATION_DEFERRED_CLASS
+   */
+  bool _checkForTypeAnnotationDeferredClass(TypeName node) {
+    if (node != null && node.isDeferred) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS, node, [node.name]);
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the type arguments in the passed type name are all within their bounds.
+   *
+   * @param node the [TypeName] to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+   */
+  bool _checkForTypeArgumentNotMatchingBounds(TypeName node) {
+    if (node.typeArguments == null) {
+      return false;
+    }
+    // prepare Type
+    DartType type = node.type;
+    if (type == null) {
+      return false;
+    }
+    // prepare ClassElement
+    Element element = type.element;
+    if (element is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = element as ClassElement;
+    // prepare type parameters
+    List<DartType> typeParameters = classElement.type.typeArguments;
+    List<TypeParameterElement> boundingElts = classElement.typeParameters;
+    // iterate over each bounded type parameter and corresponding argument
+    NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
+    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
+    int loopThroughIndex = math.min(typeNameArgList.length, boundingElts.length);
+    bool foundError = false;
+    for (int i = 0; i < loopThroughIndex; i++) {
+      TypeName argTypeName = typeNameArgList[i];
+      DartType argType = argTypeName.type;
+      DartType boundType = boundingElts[i].bound;
+      if (argType != null && boundType != null) {
+        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
+          boundType = boundType.substitute2(typeArguments, typeParameters);
+        }
+        if (!argType.isSubtypeOf(boundType)) {
+          ErrorCode errorCode;
+          if (_isInConstInstanceCreation) {
+            errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          } else {
+            errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
+          }
+          _errorReporter.reportTypeErrorForNode(errorCode, argTypeName, [argType, boundType]);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * This checks that if the passed type name is a type parameter being used to define a static
+   * member.
+   *
+   * @param node the type name to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#TYPE_PARAMETER_REFERENCED_BY_STATIC
+   */
+  bool _checkForTypeParameterReferencedByStatic(TypeName node) {
+    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+      DartType type = node.type;
+      if (type is TypeParameterType) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * This checks that if the passed type parameter is a supertype of its bound.
+   *
+   * @param node the type parameter to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
+   */
+  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
+    TypeParameterElement element = node.element;
+    // prepare bound
+    DartType bound = element.bound;
+    if (bound == null) {
+      return false;
+    }
+    // OK, type parameter is not supertype of its bound
+    if (!bound.isMoreSpecificThan(element.type)) {
+      return false;
+    }
+    // report problem
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
+    return true;
+  }
+
+  /**
+   * This checks that if the passed generative constructor has neither an explicit super constructor
+   * invocation nor a redirecting constructor invocation, that the superclass has a default
+   * generative constructor.
+   *
+   * @param node the constructor declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
+   * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
+   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
+   */
+  bool _checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
+    //
+    // Ignore if the constructor is not generative.
+    //
+    if (node.factoryKeyword != null) {
+      return false;
+    }
+    //
+    // Ignore if the constructor has either an implicit super constructor invocation or a
+    // redirecting constructor invocation.
+    //
+    for (ConstructorInitializer constructorInitializer in node.initializers) {
+      if (constructorInitializer is SuperConstructorInvocation || constructorInitializer is RedirectingConstructorInvocation) {
+        return false;
+      }
+    }
+    //
+    // Check to see whether the superclass has a non-factory unnamed constructor.
+    //
+    if (_enclosingClass == null) {
+      return false;
+    }
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    ClassElement superElement = superType.element;
+    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
+    if (superUnnamedConstructor != null) {
+      if (superUnnamedConstructor.isFactory) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
+        return true;
+      }
+      if (!superUnnamedConstructor.isDefaultConstructor) {
+        int offset;
+        int length;
+        {
+          Identifier returnType = node.returnType;
+          SimpleIdentifier name = node.name;
+          offset = returnType.offset;
+          length = (name != null ? name.end : returnType.end) - offset;
+        }
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
+      }
+      return false;
+    }
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
+    return true;
+  }
+
+  /**
+   * This checks that if the given name is a reference to a static member it is defined in the
+   * enclosing class rather than in a superclass.
+   *
+   * @param name the name to be evaluated
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
+   */
+  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
+    Element element = name.staticElement;
+    if (element == null || element is TypeParameterElement) {
+      return false;
+    }
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is! ClassElement) {
+      return false;
+    }
+    if ((element is MethodElement && !element.isStatic) || (element is PropertyAccessorElement && !element.isStatic)) {
+      return false;
+    }
+    if (identical(enclosingElement, _enclosingClass)) {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
+    return true;
+  }
+
+  void _checkForValidField(FieldFormalParameter node) {
+    ParameterElement element = node.element;
+    if (element is FieldFormalParameterElement) {
+      FieldElement fieldElement = element.field;
+      if (fieldElement == null || fieldElement.isSynthetic) {
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
+      } else {
+        ParameterElement parameterElement = node.element;
+        if (parameterElement is FieldFormalParameterElementImpl) {
+          FieldFormalParameterElementImpl fieldFormal = parameterElement;
+          DartType declaredType = fieldFormal.type;
+          DartType fieldType = fieldElement.type;
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+          } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
+            _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType, fieldType]);
+          }
+        } else {
+          if (fieldElement.isSynthetic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
+          } else if (fieldElement.isStatic) {
+            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
+          }
+        }
+      }
+    }
+    //    else {
+    //    // TODO(jwren) Report error, constructor initializer variable is a top level element
+    //    // (Either here or in ErrorVerifier#checkForAllFinalInitializedErrorCodes)
+    //    }
+  }
+
+  /**
+   * This verifies that the given getter does not have a return type of 'void'.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#VOID_RETURN_FOR_GETTER
+   */
+  bool _checkForVoidReturnType(MethodDeclaration node) {
+    TypeName returnType = node.returnType;
+    if (returnType == null || returnType.name.name != "void") {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType, []);
+    return true;
+  }
+
+  /**
+   * This verifies the passed operator-method declaration, has correct number of parameters.
+   *
+   * This method assumes that the method declaration was tested to be an operator declaration before
+   * being called.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
+   */
+  bool _checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
+    // prepare number of parameters
+    FormalParameterList parameterList = node.parameters;
+    if (parameterList == null) {
+      return false;
+    }
+    int numParameters = parameterList.parameters.length;
+    // prepare operator name
+    SimpleIdentifier nameNode = node.name;
+    if (nameNode == null) {
+      return false;
+    }
+    String name = nameNode.name;
+    // check for exact number of parameters
+    int expected = -1;
+    if ("[]=" == name) {
+      expected = 2;
+    } else if ("<" == name || ">" == name || "<=" == name || ">=" == name || "==" == name || "+" == name || "/" == name || "~/" == name || "*" == name || "%" == name || "|" == name || "^" == name || "&" == name || "<<" == name || ">>" == name || "[]" == name) {
+      expected = 1;
+    } else if ("~" == name) {
+      expected = 0;
+    }
+    if (expected != -1 && numParameters != expected) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
+      return true;
+    }
+    // check for operator "-"
+    if ("-" == name && numParameters > 1) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
+      return true;
+    }
+    // OK
+    return false;
+  }
+
+  /**
+   * This verifies if the passed setter parameter list have only one required parameter.
+   *
+   * This method assumes that the method declaration was tested to be a setter before being called.
+   *
+   * @param setterName the name of the setter to report problems on
+   * @param parameterList the parameter list to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
+   */
+  bool _checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
+    if (setterName == null) {
+      return false;
+    }
+    if (parameterList == null) {
+      return false;
+    }
+    NodeList<FormalParameter> parameters = parameterList.parameters;
+    if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that if the given class declaration implements the class Function that it has a
+   * concrete implementation of the call method.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#FUNCTION_WITHOUT_CALL
+   */
+  bool _checkImplementsFunctionWithoutCall(ClassDeclaration node) {
+    if (node.isAbstract) {
+      return false;
+    }
+    ClassElement classElement = node.element;
+    if (classElement == null) {
+      return false;
+    }
+    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
+      return false;
+    }
+    // If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
+    if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) != null) {
+      return false;
+    }
+    ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
+    if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
+      _errorReporter.reportErrorForNode(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * This verifies that the given class declaration does not have the same class in the 'extends'
+   * and 'implements' clauses.
+   *
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#IMPLEMENTS_SUPER_CLASS
+   */
+  bool _checkImplementsSuperClass(ClassDeclaration node) {
+    // prepare super type
+    InterfaceType superType = _enclosingClass.supertype;
+    if (superType == null) {
+      return false;
+    }
+    // prepare interfaces
+    ImplementsClause implementsClause = node.implementsClause;
+    if (implementsClause == null) {
+      return false;
+    }
+    // check interfaces
+    bool hasProblem = false;
+    for (TypeName interfaceNode in implementsClause.interfaces) {
+      if (interfaceNode.type == superType) {
+        hasProblem = true;
+        _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
+      }
+    }
+    // done
+    return hasProblem;
+  }
+
+  /**
+   * Return the error code that should be used when the given class references itself directly.
+   *
+   * @param classElt the class that references itself
+   * @return the error code that should be used
+   */
+  ErrorCode _getBaseCaseErrorCode(ClassElement classElt) {
+    InterfaceType supertype = classElt.supertype;
+    if (supertype != null && _enclosingClass == supertype.element) {
+      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS;
+    }
+    List<InterfaceType> mixins = classElt.mixins;
+    for (int i = 0; i < mixins.length; i++) {
+      if (_enclosingClass == mixins[i].element) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH;
+      }
+    }
+    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
+  }
+
+  /**
+   * Given an expression in a switch case whose value is expected to be an enum constant, return the
+   * name of the constant.
+   *
+   * @param expression the expression from the switch case
+   * @return the name of the constant referenced by the expression
+   */
+  String _getConstantName(Expression expression) {
+    // TODO(brianwilkerson) Convert this to return the element representing the constant.
+    if (expression is SimpleIdentifier) {
+      return expression.name;
+    } else if (expression is PrefixedIdentifier) {
+      return expression.identifier.name;
+    } else if (expression is PropertyAccess) {
+      return expression.propertyName.name;
+    }
+    return null;
+  }
+
+  /**
+   * Returns the Type (return type) for a given getter.
+   *
+   * @param propertyAccessorElement
+   * @return The type of the given getter.
+   */
+  DartType _getGetterType(PropertyAccessorElement propertyAccessorElement) {
+    FunctionType functionType = propertyAccessorElement.type;
+    if (functionType != null) {
+      return functionType.returnType;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Returns the Type (first and only parameter) for a given setter.
+   *
+   * @param propertyAccessorElement
+   * @return The type of the given setter.
+   */
+  DartType _getSetterType(PropertyAccessorElement propertyAccessorElement) {
+    // Get the parameters for MethodDeclaration or FunctionDeclaration
+    List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
+    // If there are no setter parameters, return no type.
+    if (setterParameters.length == 0) {
+      return null;
+    }
+    return setterParameters[0].type;
+  }
+
+  /**
+   * Given a list of directives that have the same prefix, generate an error if there is more than
+   * one import and any of those imports is deferred.
+   *
+   * @param directives the list of directives that have the same prefix
+   * @return `true` if an error was generated
+   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
+   */
+  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
+    bool foundError = false;
+    int count = directives.length;
+    if (count > 1) {
+      for (int i = 0; i < count; i++) {
+        sc.Token deferredToken = directives[i].deferredToken;
+        if (deferredToken != null) {
+          _errorReporter.reportErrorForToken(CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken, []);
+          foundError = true;
+        }
+      }
+    }
+    return foundError;
+  }
+
+  /**
+   * @return `true` if the given constructor redirects to itself, directly or indirectly
+   */
+  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
+    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
+    ConstructorElement current = element;
+    while (current != null) {
+      if (constructors.contains(current)) {
+        return identical(current, element);
+      }
+      constructors.add(current);
+      current = current.redirectedConstructor;
+      if (current is ConstructorMember) {
+        current = (current as ConstructorMember).baseElement;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * @return <code>true</code> if given [Element] has direct or indirect reference to itself
+   *         from anywhere except [ClassElement] or type parameter bounds.
+   */
+  bool _hasTypedefSelfReference(Element target) {
+    Set<Element> checked = new HashSet<Element>();
+    List<Element> toCheck = new List<Element>();
+    toCheck.add(target);
+    bool firstIteration = true;
+    while (true) {
+      Element current;
+      // get next element
+      while (true) {
+        // may be no more elements to check
+        if (toCheck.isEmpty) {
+          return false;
+        }
+        // try to get next element
+        current = toCheck.removeAt(toCheck.length - 1);
+        if (target == current) {
+          if (firstIteration) {
+            firstIteration = false;
+            break;
+          } else {
+            return true;
+          }
+        }
+        if (current != null && !checked.contains(current)) {
+          break;
+        }
+      }
+      // check current element
+      current.accept(new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(target, toCheck));
+      checked.add(current);
+    }
+  }
+
+  bool _isFunctionType(DartType type) {
+    if (type.isDynamic || type.isBottom) {
+      return true;
+    } else if (type is FunctionType || type.isDartCoreFunction) {
+      return true;
+    } else if (type is InterfaceType) {
+      MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
+      return callMethod != null;
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given type represents the class `Future` from the
+   * `dart:async` library.
+   *
+   * @param type the type to be tested
+   * @return `true` if the given type represents the class `Future` from the
+   *         `dart:async` library
+   */
+  bool _isFuture(DartType type) {
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      if (interfaceType.name == "Future") {
+        ClassElement element = interfaceType.element;
+        if (element != null) {
+          LibraryElement library = element.library;
+          if (library.name == "dart.async") {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` iff the passed [ClassElement] has a method, getter or setter that
+   * matches the name of the passed [ExecutableElement] in either the class itself, or one of
+   * its' mixins that is concrete.
+   *
+   * By "match", only the name of the member is tested to match, it does not have to equal or be a
+   * subtype of the passed executable element, this is due to the specific use where this method is
+   * used in [checkForNonAbstractClassInheritsAbstractMember].
+   *
+   * @param executableElt the executable to search for in the passed class element
+   * @param classElt the class method to search through the members of
+   * @return `true` iff the passed member is found in the passed class element
+   */
+  bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
+    ExecutableElement foundElt = null;
+    String executableName = executableElt.name;
+    if (executableElt is MethodElement) {
+      foundElt = classElt.getMethod(executableName);
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElt.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getMethod(executableName);
+      }
+      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
+        return true;
+      }
+    } else if (executableElt is PropertyAccessorElement) {
+      PropertyAccessorElement propertyAccessorElement = executableElt;
+      if (propertyAccessorElement.isGetter) {
+        foundElt = classElt.getGetter(executableName);
+      }
+      if (foundElt == null && propertyAccessorElement.isSetter) {
+        foundElt = classElt.getSetter(executableName);
+      }
+      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+      List<InterfaceType> mixins = classElt.mixins;
+      for (int i = 0; i < mixins.length && foundElt == null; i++) {
+        foundElt = mixins[i].getGetter(executableName);
+        if (foundElt == null) {
+          foundElt = mixins[i].getSetter(executableName);
+        }
+      }
+      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * @param node the 'this' expression to analyze
+   * @return `true` if the given 'this' expression is in the valid context
+   */
+  bool _isThisInValidContext(ThisExpression node) {
+    for (AstNode n = node; n != null; n = n.parent) {
+      if (n is CompilationUnit) {
+        return false;
+      }
+      if (n is ConstructorDeclaration) {
+        ConstructorDeclaration constructor = n as ConstructorDeclaration;
+        return constructor.factoryKeyword == null;
+      }
+      if (n is ConstructorInitializer) {
+        return false;
+      }
+      if (n is MethodDeclaration) {
+        MethodDeclaration method = n as MethodDeclaration;
+        return !method.isStatic;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Return `true` if the given identifier is in a location where it is allowed to resolve to
+   * a static member of a supertype.
+   *
+   * @param node the node being tested
+   * @return `true` if the given identifier is in a location where it is allowed to resolve to
+   *         a static member of a supertype
+   */
+  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return true;
+    }
+    AstNode parent = node.parent;
+    if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
+      return true;
+    }
+    if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
+      return true;
+    }
+    if (parent is Annotation && identical(parent.constructorName, node)) {
+      return true;
+    }
+    if (parent is CommentReference) {
+      CommentReference commentReference = parent;
+      if (commentReference.newKeyword != null) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null || (result.value != null && result.value.isUserDefinedObject);
+
+  /**
+   * This checks the class declaration is not a superinterface to itself.
+   *
+   * @param classElt the class element to test
+   * @param path a list containing the potentially cyclic implements path
+   * @return `true` if and only if an error code is generated on the passed element
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
+   */
+  bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
+    // Detect error condition.
+    int size = path.length;
+    // If this is not the base case (size > 0), and the enclosing class is the passed class
+    // element then an error an error.
+    if (size > 0 && _enclosingClass == classElt) {
+      String enclosingClassName = _enclosingClass.displayName;
+      if (size > 1) {
+        // Construct a string showing the cyclic implements path: "A, B, C, D, A"
+        String separator = ", ";
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < size; i++) {
+          buffer.write(path[i].displayName);
+          buffer.write(separator);
+        }
+        buffer.write(classElt.displayName);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, buffer.toString()]);
+        return true;
+      } else {
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
+        _errorReporter.reportErrorForOffset(_getBaseCaseErrorCode(classElt), _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        return true;
+      }
+    }
+    if (path.indexOf(classElt) > 0) {
+      return false;
+    }
+    path.add(classElt);
+    // n-case
+    InterfaceType supertype = classElt.supertype;
+    if (supertype != null && _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
+      return true;
+    }
+    List<InterfaceType> interfaceTypes = classElt.interfaces;
+    for (InterfaceType interfaceType in interfaceTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
+        return true;
+      }
+    }
+    List<InterfaceType> mixinTypes = classElt.mixins;
+    for (InterfaceType mixinType in mixinTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(mixinType.element, path)) {
+        return true;
+      }
+    }
+    path.removeAt(path.length - 1);
+    return false;
+  }
+}
+
+class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
+  Element target;
+
+  List<Element> toCheck;
+
+  GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.target, this.toCheck) : super();
+
+  bool _inClass = false;
+
+  @override
+  Object visitClassElement(ClassElement element) {
+    _addTypeToCheck(element.supertype);
+    for (InterfaceType mixin in element.mixins) {
+      _addTypeToCheck(mixin);
+    }
+    _inClass = !element.isTypedef;
+    try {
+      return super.visitClassElement(element);
+    } finally {
+      _inClass = false;
+    }
+  }
+
+  @override
+  Object visitExecutableElement(ExecutableElement element) {
+    if (element.isSynthetic) {
+      return null;
+    }
+    _addTypeToCheck(element.returnType);
+    return super.visitExecutableElement(element);
+  }
+
+  @override
+  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    _addTypeToCheck(element.returnType);
+    return super.visitFunctionTypeAliasElement(element);
+  }
+
+  @override
+  Object visitParameterElement(ParameterElement element) {
+    _addTypeToCheck(element.type);
+    return super.visitParameterElement(element);
+  }
+
+  @override
+  Object visitTypeParameterElement(TypeParameterElement element) {
+    _addTypeToCheck(element.bound);
+    return super.visitTypeParameterElement(element);
+  }
+
+  @override
+  Object visitVariableElement(VariableElement element) {
+    _addTypeToCheck(element.type);
+    return super.visitVariableElement(element);
+  }
+
+  void _addTypeToCheck(DartType type) {
+    if (type == null) {
+      return;
+    }
+    Element element = type.element;
+    // it is OK to reference target from class
+    if (_inClass && target == element) {
+      return;
+    }
+    // schedule for checking
+    toCheck.add(element);
+    // type arguments
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      for (DartType typeArgument in interfaceType.typeArguments) {
+        _addTypeToCheck(typeArgument);
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 41ae5ea..50743a1 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -1543,7 +1543,11 @@
     XmlNode current = newParent;
     while (current != null) {
       if (identical(current, this)) {
-        AnalysisEngine.instance.logger.logError2("Circular structure while setting an XML node's parent", new IllegalArgumentException(_buildRecursiveStructureMessage(newParent)));
+        AnalysisEngine.instance.logger.logError(
+            "Circular structure while setting an XML node's parent",
+            new CaughtException(
+                new ArgumentError(_buildRecursiveStructureMessage(newParent)),
+                null));
         return;
       }
       current = current.parent;
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index a609a4a..0e7d123 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -8820,7 +8820,7 @@
         _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
         _isEqualNodes(node.loopVariable, toNode.loopVariable),
         _isEqualTokens(node.inKeyword, toNode.inKeyword),
-        _isEqualNodes(node.iterator, toNode.iterator),
+        _isEqualNodes(node.iterable, toNode.iterable),
         _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
         _isEqualNodes(node.body, toNode.body));
   }
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index c1c4bed..aeaa972 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2,9 +2,6 @@
 // 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.
 
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
 library engine.resolver;
 
 import 'dart:collection';
@@ -19,12 +16,14 @@
 import 'utilities_dart.dart';
 import 'utilities_general.dart';
 import 'ast.dart';
-import 'parser.dart' show Parser, ParserErrorCode;
 import 'sdk.dart' show DartSdk, SdkLibrary;
 import 'element.dart';
 import 'html.dart' as ht;
 import 'engine.dart';
 import 'constant.dart';
+import 'error_verifier.dart';
+import 'element_resolver.dart';
+import 'static_type_analyzer.dart';
 
 /**
  * Instances of the class `AngularCompilationUnitBuilder` build an Angular specific element
@@ -3385,7 +3384,9 @@
         buffer.writeln("---------");
         parent = parent.parent;
       }
-      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
+      AnalysisEngine.instance.logger.logError(
+          buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
     }
     return element;
   }
@@ -3986,7 +3987,7 @@
         }
       }
       holder.validate();
-    } catch (ex) {
+    } catch (exception, stackTrace) {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
         StringBuffer buffer = new StringBuffer();
@@ -3995,10 +3996,14 @@
         buffer.write(" in ");
         buffer.write(classNode.name);
         buffer.write(" was not set while trying to build the element model.");
-        AnalysisEngine.instance.logger.logError2(buffer.toString(), new AnalysisException(buffer.toString(), new CaughtException(ex, null)));
+        AnalysisEngine.instance.logger.logError(
+            buffer.toString(),
+            new CaughtException(exception, stackTrace));
       } else {
         String message = "Exception caught in ElementBuilder.visitMethodDeclaration()";
-        AnalysisEngine.instance.logger.logError2(message, new AnalysisException(message, new CaughtException(ex, null)));
+        AnalysisEngine.instance.logger.logError(
+            message,
+            new CaughtException(exception, stackTrace));
       }
     } finally {
       if (node.name.staticElement == null) {
@@ -4009,7 +4014,9 @@
         buffer.write(" in ");
         buffer.write(classNode.name);
         buffer.write(" was not set while trying to resolve types.");
-        AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(buffer.toString()), null));
+        AnalysisEngine.instance.logger.logError(
+            buffer.toString(),
+            new CaughtException(new AnalysisException(buffer.toString()), null));
       }
     }
     return null;
@@ -4646,2627 +4653,6 @@
 }
 
 /**
- * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]
- * to resolve references within the AST structure to the elements being referenced. The requirements
- * for the element resolver are:
- * <ol>
- * * Every [SimpleIdentifier] should be resolved to the element to which it refers.
- * Specifically:
- * * An identifier within the declaration of that name should resolve to the element being
- * declared.
- * * An identifier denoting a prefix should resolve to the element representing the import that
- * defines the prefix (an [ImportElement]).
- * * An identifier denoting a variable should resolve to the element representing the variable (a
- * [VariableElement]).
- * * An identifier denoting a parameter should resolve to the element representing the parameter
- * (a [ParameterElement]).
- * * An identifier denoting a field should resolve to the element representing the getter or
- * setter being invoked (a [PropertyAccessorElement]).
- * * An identifier denoting the name of a method or function being invoked should resolve to the
- * element representing the method or function (a [ExecutableElement]).
- * * An identifier denoting a label should resolve to the element representing the label (a
- * [LabelElement]).
- * The identifiers within directives are exceptions to this rule and are covered below.
- * * Every node containing a token representing an operator that can be overridden (
- * [BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to
- * the element representing the method invoked by that operator (a [MethodElement]).
- * * Every [FunctionExpressionInvocation] should resolve to the element representing the
- * function being invoked (a [FunctionElement]). This will be the same element as that to
- * which the name is resolved if the function has a name, but is provided for those cases where an
- * unnamed function is being invoked.
- * * Every [LibraryDirective] and [PartOfDirective] should resolve to the element
- * representing the library being specified by the directive (a [LibraryElement]) unless, in
- * the case of a part-of directive, the specified library does not exist.
- * * Every [ImportDirective] and [ExportDirective] should resolve to the element
- * representing the library being specified by the directive unless the specified library does not
- * exist (an [ImportElement] or [ExportElement]).
- * * The identifier representing the prefix in an [ImportDirective] should resolve to the
- * element representing the prefix (a [PrefixElement]).
- * * The identifiers in the hide and show combinators in [ImportDirective]s and
- * [ExportDirective]s should resolve to the elements that are being hidden or shown,
- * respectively, unless those names are not defined in the specified library (or the specified
- * library does not exist).
- * * Every [PartDirective] should resolve to the element representing the compilation unit
- * being specified by the string unless the specified compilation unit does not exist (a
- * [CompilationUnitElement]).
- * </ol>
- * Note that AST nodes that would represent elements that are not defined are not resolved to
- * anything. This includes such things as references to undeclared variables (which is an error) and
- * names in hide and show combinators that are not defined in the imported library (which is not an
- * error).
- */
-class ElementResolver extends SimpleAstVisitor<Object> {
-  /**
-   * Checks whether the given expression is a reference to a class. If it is then the
-   * [ClassElement] is returned, otherwise `null` is returned.
-   *
-   * @param expression the expression to evaluate
-   * @return the element representing the class
-   */
-  static ClassElementImpl getTypeReference(Expression expression) {
-    if (expression is Identifier) {
-      Element staticElement = expression.staticElement;
-      if (staticElement is ClassElementImpl) {
-        return staticElement;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Helper function for `maybeMergeExecutableElements` that does the actual merging.
-   *
-   * @param elementArrayToMerge non-empty array of elements to merge.
-   * @return
-   */
-  static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
-    // Flatten methods structurally. Based on
-    // [InheritanceManager.computeMergedExecutableElement] and
-    // [InheritanceManager.createSyntheticExecutableElement].
-    //
-    // However, the approach we take here is much simpler, but expected to work
-    // well in the common case. It degrades gracefully in the uncommon case,
-    // by computing the type [dynamic] for the method, preventing any
-    // hints from being generated (TODO: not done yet).
-    //
-    // The approach is: we require that each [ExecutableElement] has the
-    // same shape: the same number of required, optional positional, and optional named
-    // parameters, in the same positions, and with the named parameters in the
-    // same order. We compute a type by unioning pointwise.
-    ExecutableElement e_0 = elementArrayToMerge[0];
-    List<ParameterElement> ps_0 = e_0.parameters;
-    List<ParameterElementImpl> ps_out = new List<ParameterElementImpl>(ps_0.length);
-    for (int j = 0; j < ps_out.length; j++) {
-      ps_out[j] = new ParameterElementImpl(ps_0[j].name, 0);
-      ps_out[j].synthetic = true;
-      ps_out[j].type = ps_0[j].type;
-      ps_out[j].parameterKind = ps_0[j].parameterKind;
-    }
-    DartType r_out = e_0.returnType;
-    for (int i = 1; i < elementArrayToMerge.length; i++) {
-      ExecutableElement e_i = elementArrayToMerge[i];
-      r_out = UnionTypeImpl.union([r_out, e_i.returnType]);
-      List<ParameterElement> ps_i = e_i.parameters;
-      // Each function must have the same number of params.
-      if (ps_0.length != ps_i.length) {
-        return null;
-        // TODO (collinsn): return an element representing [dynamic] here instead.
-      } else {
-        // Each function must have the same kind of params, with the same names,
-        // in the same order.
-        for (int j = 0; j < ps_i.length; j++) {
-          if (ps_0[j].parameterKind != ps_i[j].parameterKind || !identical(ps_0[j].name, ps_i[j].name)) {
-            return null;
-          } else {
-            // The output parameter type is the union of the input parameter types.
-            ps_out[j].type = UnionTypeImpl.union([ps_out[j].type, ps_i[j].type]);
-          }
-        }
-      }
-    }
-    // TODO (collinsn): this code should work for functions and methods,
-    // so we may want [FunctionElementImpl]
-    // instead here in some cases? And then there are constructors and property accessors.
-    // Maybe the answer is to create a new subclass of [ExecutableElementImpl] which
-    // is used for merged executable elements, in analogy with [MultiplyInheritedMethodElementImpl]
-    // and [MultiplyInheritedPropertyAcessorElementImpl].
-    ExecutableElementImpl e_out = new MethodElementImpl(e_0.name, 0);
-    e_out.synthetic = true;
-    e_out.returnType = r_out;
-    e_out.parameters = ps_out;
-    e_out.type = new FunctionTypeImpl.con1(e_out);
-    // Get NPE in [toString()] w/o this.
-    e_out.enclosingElement = e_0.enclosingElement;
-    return e_out;
-  }
-
-  /**
-   * Return `true` if the given identifier is the return type of a constructor declaration.
-   *
-   * @return `true` if the given identifier is the return type of a constructor declaration.
-   */
-  static bool _isConstructorReturnType(SimpleIdentifier identifier) {
-    AstNode parent = identifier.parent;
-    if (parent is ConstructorDeclaration) {
-      return identical(parent.returnType, identifier);
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given identifier is the return type of a factory constructor.
-   *
-   * @return `true` if the given identifier is the return type of a factory constructor
-   *         declaration.
-   */
-  static bool _isFactoryConstructorReturnType(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent is ConstructorDeclaration) {
-      ConstructorDeclaration constructor = parent;
-      return identical(constructor.returnType, node) && constructor.factoryKeyword != null;
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given 'super' expression is used in a valid context.
-   *
-   * @param node the 'super' expression to analyze
-   * @return `true` if the 'super' expression is in a valid context
-   */
-  static bool _isSuperInValidContext(SuperExpression node) {
-    for (AstNode n = node; n != null; n = n.parent) {
-      if (n is CompilationUnit) {
-        return false;
-      }
-      if (n is ConstructorDeclaration) {
-        ConstructorDeclaration constructor = n as ConstructorDeclaration;
-        return constructor.factoryKeyword == null;
-      }
-      if (n is ConstructorFieldInitializer) {
-        return false;
-      }
-      if (n is MethodDeclaration) {
-        MethodDeclaration method = n as MethodDeclaration;
-        return !method.isStatic;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return a method representing the merge of the given elements. The type of the merged element is
-   * the component-wise union of the types of the given elements. If not all input elements have the
-   * same shape then [null] is returned.
-   *
-   * @param elements the `ExecutableElement`s to merge
-   * @return an `ExecutableElement` representing the merge of `elements`
-   */
-  static ExecutableElement _maybeMergeExecutableElements(Set<ExecutableElement> elements) {
-    List<ExecutableElement> elementArrayToMerge = new List.from(elements);
-    if (elementArrayToMerge.length == 0) {
-      return null;
-    } else if (elementArrayToMerge.length == 1) {
-      // If all methods are equal, don't bother building a new one.
-      return elementArrayToMerge[0];
-    } else {
-      return _computeMergedExecutableElement(elementArrayToMerge);
-    }
-  }
-
-  /**
-   * The resolver driving this participant.
-   */
-  final ResolverVisitor _resolver;
-
-  /**
-   * The element for the library containing the compilation unit being visited.
-   */
-  LibraryElement _definingLibrary;
-
-  /**
-   * A flag indicating whether we should generate hints.
-   */
-  bool _enableHints = false;
-
-  /**
-   * The type representing the type 'dynamic'.
-   */
-  DartType _dynamicType;
-
-  /**
-   * The type representing the type 'type'.
-   */
-  DartType _typeType;
-
-  /**
-   * A utility class for the resolver to answer the question of "what are my subtypes?".
-   */
-  SubtypeManager _subtypeManager;
-
-  /**
-   * The object keeping track of which elements have had their types promoted.
-   */
-  TypePromotionManager _promoteManager;
-
-  /**
-   * Initialize a newly created visitor to resolve the nodes in a compilation unit.
-   *
-   * @param resolver the resolver driving this participant
-   */
-  ElementResolver(this._resolver) {
-    this._definingLibrary = _resolver.definingLibrary;
-    AnalysisOptions options = _definingLibrary.context.analysisOptions;
-    _enableHints = options.hint;
-    _dynamicType = _resolver.typeProvider.dynamicType;
-    _typeType = _resolver.typeProvider.typeType;
-    _subtypeManager = new SubtypeManager();
-    _promoteManager = _resolver.promoteManager;
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.Token operator = node.operator;
-    sc.TokenType operatorType = operator.type;
-    if (operatorType != sc.TokenType.EQ) {
-      operatorType = _operatorFromCompoundAssignment(operatorType);
-      Expression leftHandSide = node.leftHandSide;
-      if (leftHandSide != null) {
-        String methodName = operatorType.lexeme;
-        DartType staticType = _getStaticType(leftHandSide);
-        MethodElement staticMethod = _lookUpMethod(leftHandSide, staticType, methodName);
-        node.staticElement = staticMethod;
-        DartType propagatedType = _getPropagatedType(leftHandSide);
-        MethodElement propagatedMethod = _lookUpMethod(leftHandSide, propagatedType, methodName);
-        node.propagatedElement = propagatedMethod;
-        if (_shouldReportMissingMember(staticType, staticMethod)) {
-          _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_METHOD, operator, [methodName, staticType.displayName]);
-        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-          _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_METHOD, operator, [methodName, propagatedType.displayName]);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    sc.Token operator = node.operator;
-    if (operator.isUserDefinableOperator) {
-      Expression leftOperand = node.leftOperand;
-      if (leftOperand != null) {
-        String methodName = operator.lexeme;
-        DartType staticType = _getStaticType(leftOperand);
-        MethodElement staticMethod = _lookUpMethod(leftOperand, staticType, methodName);
-        node.staticElement = staticMethod;
-        DartType propagatedType = _getPropagatedType(leftOperand);
-        MethodElement propagatedMethod = _lookUpMethod(leftOperand, propagatedType, methodName);
-        node.propagatedElement = propagatedMethod;
-        if (_shouldReportMissingMember(staticType, staticMethod)) {
-          _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
-        } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-          _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitBreakStatement(BreakStatement node) {
-    _lookupLabel(node, node.label);
-    return null;
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitCommentReference(CommentReference node) {
-    Identifier identifier = node.identifier;
-    if (identifier is SimpleIdentifier) {
-      SimpleIdentifier simpleIdentifier = identifier;
-      Element element = _resolveSimpleIdentifier(simpleIdentifier);
-      if (element == null) {
-        //
-        // This might be a reference to an imported name that is missing the prefix.
-        //
-        element = _findImportWithoutPrefix(simpleIdentifier);
-        if (element is MultiplyDefinedElement) {
-          // TODO(brianwilkerson) Report this error?
-          element = null;
-        }
-      }
-      if (element == null) {
-        // TODO(brianwilkerson) Report this error?
-        //        resolver.reportError(
-        //            StaticWarningCode.UNDEFINED_IDENTIFIER,
-        //            simpleIdentifier,
-        //            simpleIdentifier.getName());
-      } else {
-        if (element.library == null || element.library != _definingLibrary) {
-          // TODO(brianwilkerson) Report this error?
-        }
-        simpleIdentifier.staticElement = element;
-        if (node.newKeyword != null) {
-          if (element is ClassElement) {
-            ConstructorElement constructor = (element as ClassElement).unnamedConstructor;
-            if (constructor == null) {
-              // TODO(brianwilkerson) Report this error.
-            } else {
-              simpleIdentifier.staticElement = constructor;
-            }
-          } else {
-            // TODO(brianwilkerson) Report this error.
-          }
-        }
-      }
-    } else if (identifier is PrefixedIdentifier) {
-      PrefixedIdentifier prefixedIdentifier = identifier;
-      SimpleIdentifier prefix = prefixedIdentifier.prefix;
-      SimpleIdentifier name = prefixedIdentifier.identifier;
-      Element element = _resolveSimpleIdentifier(prefix);
-      if (element == null) {
-        //        resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, prefix, prefix.getName());
-      } else {
-        if (element is PrefixElement) {
-          prefix.staticElement = element;
-          // TODO(brianwilkerson) Report this error?
-          element = _resolver.nameScope.lookup(identifier, _definingLibrary);
-          name.staticElement = element;
-          return null;
-        }
-        LibraryElement library = element.library;
-        if (library == null) {
-          // TODO(brianwilkerson) We need to understand how the library could ever be null.
-          AnalysisEngine.instance.logger.logError("Found element with null library: ${element.name}");
-        } else if (library != _definingLibrary) {
-          // TODO(brianwilkerson) Report this error.
-        }
-        name.staticElement = element;
-        if (node.newKeyword == null) {
-          if (element is ClassElement) {
-            Element memberElement = _lookupGetterOrMethod((element as ClassElement).type, name.name);
-            if (memberElement == null) {
-              memberElement = (element as ClassElement).getNamedConstructor(name.name);
-              if (memberElement == null) {
-                memberElement = _lookUpSetter(prefix, (element as ClassElement).type, name.name);
-              }
-            }
-            if (memberElement == null) {
-              //              reportGetterOrSetterNotFound(prefixedIdentifier, name, element.getDisplayName());
-            } else {
-              name.staticElement = memberElement;
-            }
-          } else {
-            // TODO(brianwilkerson) Report this error.
-          }
-        } else {
-          if (element is ClassElement) {
-            ConstructorElement constructor = (element as ClassElement).getNamedConstructor(name.name);
-            if (constructor == null) {
-              // TODO(brianwilkerson) Report this error.
-            } else {
-              name.staticElement = constructor;
-            }
-          } else {
-            // TODO(brianwilkerson) Report this error.
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    super.visitConstructorDeclaration(node);
-    ConstructorElement element = node.element;
-    if (element is ConstructorElementImpl) {
-      ConstructorElementImpl constructorElement = element;
-      ConstructorName redirectedNode = node.redirectedConstructor;
-      if (redirectedNode != null) {
-        // set redirected factory constructor
-        ConstructorElement redirectedElement = redirectedNode.staticElement;
-        constructorElement.redirectedConstructor = redirectedElement;
-      } else {
-        // set redirected generative constructor
-        for (ConstructorInitializer initializer in node.initializers) {
-          if (initializer is RedirectingConstructorInvocation) {
-            ConstructorElement redirectedElement = initializer.staticElement;
-            constructorElement.redirectedConstructor = redirectedElement;
-          }
-        }
-      }
-      _setMetadata(constructorElement, node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    SimpleIdentifier fieldName = node.fieldName;
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    FieldElement fieldElement = enclosingClass.getField(fieldName.name);
-    fieldName.staticElement = fieldElement;
-    return null;
-  }
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    DartType type = node.type.type;
-    if (type != null && type.isDynamic) {
-      return null;
-    } else if (type is! InterfaceType) {
-      // TODO(brianwilkerson) Report these errors.
-      //      ASTNode parent = node.getParent();
-      //      if (parent instanceof InstanceCreationExpression) {
-      //        if (((InstanceCreationExpression) parent).isConst()) {
-      //          // CompileTimeErrorCode.CONST_WITH_NON_TYPE
-      //        } else {
-      //          // StaticWarningCode.NEW_WITH_NON_TYPE
-      //        }
-      //      } else {
-      //        // This is part of a redirecting factory constructor; not sure which error code to use
-      //      }
-      return null;
-    }
-    // look up ConstructorElement
-    ConstructorElement constructor;
-    SimpleIdentifier name = node.name;
-    InterfaceType interfaceType = type as InterfaceType;
-    if (name == null) {
-      constructor = interfaceType.lookUpConstructor(null, _definingLibrary);
-    } else {
-      constructor = interfaceType.lookUpConstructor(name.name, _definingLibrary);
-      name.staticElement = constructor;
-    }
-    node.staticElement = constructor;
-    return null;
-  }
-
-  @override
-  Object visitContinueStatement(ContinueStatement node) {
-    _lookupLabel(node, node.label);
-    return null;
-  }
-
-  @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
-    if (exportElement != null) {
-      // The element is null when the URI is invalid
-      // TODO(brianwilkerson) Figure out whether the element can ever be something other than an
-      // ExportElement
-      _resolveCombinators(exportElement.exportedLibrary, node.combinators);
-      _setMetadata(exportElement, node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    _setMetadataForParameter(node.element, node);
-    return super.visitFieldFormalParameter(node);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    // TODO(brianwilkerson) Can we ever resolve the function being invoked?
-    Expression expression = node.function;
-    if (expression is FunctionExpression) {
-      FunctionExpression functionExpression = expression;
-      ExecutableElement functionElement = functionExpression.element;
-      ArgumentList argumentList = node.argumentList;
-      List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, functionElement);
-      if (parameters != null) {
-        argumentList.correspondingStaticParameters = parameters;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    _setMetadataForParameter(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    SimpleIdentifier prefixNode = node.prefix;
-    if (prefixNode != null) {
-      String prefixName = prefixNode.name;
-      for (PrefixElement prefixElement in _definingLibrary.prefixes) {
-        if (prefixElement.displayName == prefixName) {
-          prefixNode.staticElement = prefixElement;
-          break;
-        }
-      }
-    }
-    ImportElement importElement = node.element;
-    if (importElement != null) {
-      // The element is null when the URI is invalid
-      LibraryElement library = importElement.importedLibrary;
-      if (library != null) {
-        _resolveCombinators(library, node.combinators);
-      }
-      _setMetadata(importElement, node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    Expression target = node.realTarget;
-    DartType staticType = _getStaticType(target);
-    DartType propagatedType = _getPropagatedType(target);
-    String getterMethodName = sc.TokenType.INDEX.lexeme;
-    String setterMethodName = sc.TokenType.INDEX_EQ.lexeme;
-    bool isInGetterContext = node.inGetterContext();
-    bool isInSetterContext = node.inSetterContext();
-    if (isInGetterContext && isInSetterContext) {
-      // lookup setter
-      MethodElement setterStaticMethod = _lookUpMethod(target, staticType, setterMethodName);
-      MethodElement setterPropagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
-      // set setter element
-      node.staticElement = setterStaticMethod;
-      node.propagatedElement = setterPropagatedMethod;
-      // generate undefined method warning
-      _checkForUndefinedIndexOperator(node, target, getterMethodName, setterStaticMethod, setterPropagatedMethod, staticType, propagatedType);
-      // lookup getter method
-      MethodElement getterStaticMethod = _lookUpMethod(target, staticType, getterMethodName);
-      MethodElement getterPropagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
-      // set getter element
-      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(getterStaticMethod, getterPropagatedMethod);
-      node.auxiliaryElements = auxiliaryElements;
-      // generate undefined method warning
-      _checkForUndefinedIndexOperator(node, target, getterMethodName, getterStaticMethod, getterPropagatedMethod, staticType, propagatedType);
-    } else if (isInGetterContext) {
-      // lookup getter method
-      MethodElement staticMethod = _lookUpMethod(target, staticType, getterMethodName);
-      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, getterMethodName);
-      // set getter element
-      node.staticElement = staticMethod;
-      node.propagatedElement = propagatedMethod;
-      // generate undefined method warning
-      _checkForUndefinedIndexOperator(node, target, getterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
-    } else if (isInSetterContext) {
-      // lookup setter method
-      MethodElement staticMethod = _lookUpMethod(target, staticType, setterMethodName);
-      MethodElement propagatedMethod = _lookUpMethod(target, propagatedType, setterMethodName);
-      // set setter element
-      node.staticElement = staticMethod;
-      node.propagatedElement = propagatedMethod;
-      // generate undefined method warning
-      _checkForUndefinedIndexOperator(node, target, setterMethodName, staticMethod, propagatedMethod, staticType, propagatedType);
-    }
-    return null;
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    ConstructorElement invokedConstructor = node.constructorName.staticElement;
-    node.staticElement = invokedConstructor;
-    ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = _resolveArgumentsToFunction(node.isConst, argumentList, invokedConstructor);
-    if (parameters != null) {
-      argumentList.correspondingStaticParameters = parameters;
-    }
-    return null;
-  }
-
-  @override
-  Object visitLibraryDirective(LibraryDirective node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    SimpleIdentifier methodName = node.methodName;
-    //
-    // Synthetic identifiers have been already reported during parsing.
-    //
-    if (methodName.isSynthetic) {
-      return null;
-    }
-    //
-    // We have a method invocation of one of two forms: 'e.m(a1, ..., an)' or 'm(a1, ..., an)'. The
-    // first step is to figure out which executable is being invoked, using both the static and the
-    // propagated type information.
-    //
-    Expression target = node.realTarget;
-    if (target is SuperExpression && !_isSuperInValidContext(target)) {
-      return null;
-    }
-    Element staticElement;
-    Element propagatedElement;
-    DartType staticType = null;
-    DartType propagatedType = null;
-    if (target == null) {
-      staticElement = _resolveInvokedElement(methodName);
-      propagatedElement = null;
-    } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(target)) {
-      LibraryElement importedLibrary = _getImportedLibrary(target);
-      methodName.staticElement = importedLibrary.loadLibraryFunction;
-      return null;
-    } else {
-      staticType = _getStaticType(target);
-      propagatedType = _getPropagatedType(target);
-      //
-      // If this method invocation is of the form 'C.m' where 'C' is a class, then we don't call
-      // resolveInvokedElement(..) which walks up the class hierarchy, instead we just look for the
-      // member in the type only.
-      //
-      ClassElementImpl typeReference = getTypeReference(target);
-      if (typeReference != null) {
-        staticElement = propagatedElement = _resolveElement(typeReference, methodName);
-      } else {
-        staticElement = _resolveInvokedElementWithTarget(target, staticType, methodName);
-        propagatedElement = _resolveInvokedElementWithTarget(target, propagatedType, methodName);
-      }
-    }
-    staticElement = _convertSetterToGetter(staticElement);
-    propagatedElement = _convertSetterToGetter(propagatedElement);
-    //
-    // Record the results.
-    //
-    methodName.staticElement = staticElement;
-    methodName.propagatedElement = propagatedElement;
-    ArgumentList argumentList = node.argumentList;
-    if (staticElement != null) {
-      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, staticElement);
-      if (parameters != null) {
-        argumentList.correspondingStaticParameters = parameters;
-      }
-    }
-    if (propagatedElement != null) {
-      List<ParameterElement> parameters = _computeCorrespondingParameters(argumentList, propagatedElement);
-      if (parameters != null) {
-        argumentList.correspondingPropagatedParameters = parameters;
-      }
-    }
-    //
-    // Then check for error conditions.
-    //
-    ErrorCode errorCode = _checkForInvocationError(target, true, staticElement);
-    bool generatedWithTypePropagation = false;
-    if (_enableHints && errorCode == null && staticElement == null) {
-      // The method lookup may have failed because there were multiple
-      // incompatible choices. In this case we don't want to generate a hint.
-      if (propagatedElement == null && propagatedType is UnionType) {
-        // TODO(collinsn): an improvement here is to make the propagated type of the method call
-        // the union of the propagated types of all possible calls.
-        if (_lookupMethods(target, propagatedType as UnionType, methodName.name).length > 1) {
-          return null;
-        }
-      }
-      errorCode = _checkForInvocationError(target, false, propagatedElement);
-      if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
-        ClassElement classElementContext = null;
-        if (target == null) {
-          classElementContext = _resolver.enclosingClass;
-        } else {
-          DartType type = target.bestType;
-          if (type != null) {
-            if (type.element is ClassElement) {
-              classElementContext = type.element as ClassElement;
-            }
-          }
-        }
-        if (classElementContext != null) {
-          _subtypeManager.ensureLibraryVisited(_definingLibrary);
-          HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
-          for (ClassElement subtypeElement in subtypeElements) {
-            if (subtypeElement.getMethod(methodName.name) != null) {
-              errorCode = null;
-            }
-          }
-        }
-      }
-      generatedWithTypePropagation = true;
-    }
-    if (errorCode == null) {
-      return null;
-    }
-    if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
-      _resolver.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
-    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
-      _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
-    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
-      String targetTypeName;
-      if (target == null) {
-        ClassElement enclosingClass = _resolver.enclosingClass;
-        targetTypeName = enclosingClass.displayName;
-        ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD);
-        _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
-      } else {
-        // ignore Function "call"
-        // (if we are about to create a hint using type propagation, then we can use type
-        // propagation here as well)
-        DartType targetType = null;
-        if (!generatedWithTypePropagation) {
-          targetType = _getStaticType(target);
-        } else {
-          // choose the best type
-          targetType = _getPropagatedType(target);
-          if (targetType == null) {
-            targetType = _getStaticType(target);
-          }
-        }
-        if (targetType != null && targetType.isDartCoreFunction && methodName.name == FunctionElement.CALL_METHOD_NAME) {
-          // TODO(brianwilkerson) Can we ever resolve the function being invoked?
-          //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
-          return null;
-        }
-        targetTypeName = targetType == null ? null : targetType.displayName;
-        ErrorCode proxyErrorCode = (generatedWithTypePropagation ? HintCode.UNDEFINED_METHOD : StaticTypeWarningCode.UNDEFINED_METHOD);
-        _recordUndefinedNode(targetType.element, proxyErrorCode, methodName, [methodName.name, targetTypeName]);
-      }
-    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
-      // Generate the type name.
-      // The error code will never be generated via type propagation
-      DartType targetType = _getStaticType(target);
-      if (targetType is InterfaceType && !targetType.isObject) {
-        targetType = (targetType as InterfaceType).superclass;
-      }
-      String targetTypeName = targetType == null ? null : targetType.name;
-      _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, methodName, [methodName.name, targetTypeName]);
-    }
-    return null;
-  }
-
-  @override
-  Object visitPartDirective(PartDirective node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitPartOfDirective(PartOfDirective node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    Expression operand = node.operand;
-    String methodName = _getPostfixOperator(node);
-    DartType staticType = _getStaticType(operand);
-    MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
-    node.staticElement = staticMethod;
-    DartType propagatedType = _getPropagatedType(operand);
-    MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
-    node.propagatedElement = propagatedMethod;
-    if (_shouldReportMissingMember(staticType, staticMethod)) {
-      _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, node.operator, [methodName, staticType.displayName]);
-    } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-      _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, node.operator, [methodName, propagatedType.displayName]);
-    }
-    return null;
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    SimpleIdentifier prefix = node.prefix;
-    SimpleIdentifier identifier = node.identifier;
-    //
-    // First, check the "lib.loadLibrary" case
-    //
-    if (identifier.name == FunctionElement.LOAD_LIBRARY_NAME && _isDeferredPrefix(prefix)) {
-      LibraryElement importedLibrary = _getImportedLibrary(prefix);
-      identifier.staticElement = importedLibrary.loadLibraryFunction;
-      return null;
-    }
-    //
-    // Check to see whether the prefix is really a prefix.
-    //
-    Element prefixElement = prefix.staticElement;
-    if (prefixElement is PrefixElement) {
-      Element element = _resolver.nameScope.lookup(node, _definingLibrary);
-      if (element == null && identifier.inSetterContext()) {
-        element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _definingLibrary);
-      }
-      if (element == null) {
-        if (identifier.inSetterContext()) {
-          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
-        } else if (node.parent is Annotation) {
-          Annotation annotation = node.parent as Annotation;
-          _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
-          return null;
-        } else {
-          _resolver.reportErrorForNode(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
-        }
-        return null;
-      }
-      if (element is PropertyAccessorElement && identifier.inSetterContext()) {
-        PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
-        if (variable != null) {
-          PropertyAccessorElement setter = variable.setter;
-          if (setter != null) {
-            element = setter;
-          }
-        }
-      }
-      // TODO(brianwilkerson) The prefix needs to be resolved to the element for the import that
-      // defines the prefix, not the prefix's element.
-      identifier.staticElement = element;
-      // Validate annotation element.
-      if (node.parent is Annotation) {
-        Annotation annotation = node.parent as Annotation;
-        _resolveAnnotationElement(annotation);
-        return null;
-      }
-      return null;
-    }
-    // May be annotation, resolve invocation of "const" constructor.
-    if (node.parent is Annotation) {
-      Annotation annotation = node.parent as Annotation;
-      _resolveAnnotationElement(annotation);
-    }
-    //
-    // Otherwise, the prefix is really an expression that happens to be a simple identifier and this
-    // is really equivalent to a property access node.
-    //
-    _resolvePropertyAccess(prefix, identifier);
-    return null;
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    sc.Token operator = node.operator;
-    sc.TokenType operatorType = operator.type;
-    if (operatorType.isUserDefinableOperator || operatorType == sc.TokenType.PLUS_PLUS || operatorType == sc.TokenType.MINUS_MINUS) {
-      Expression operand = node.operand;
-      String methodName = _getPrefixOperator(node);
-      DartType staticType = _getStaticType(operand);
-      MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
-      node.staticElement = staticMethod;
-      DartType propagatedType = _getPropagatedType(operand);
-      MethodElement propagatedMethod = _lookUpMethod(operand, propagatedType, methodName);
-      node.propagatedElement = propagatedMethod;
-      if (_shouldReportMissingMember(staticType, staticMethod)) {
-        _recordUndefinedToken(staticType.element, StaticTypeWarningCode.UNDEFINED_OPERATOR, operator, [methodName, staticType.displayName]);
-      } else if (_enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false)) {
-        _recordUndefinedToken(propagatedType.element, HintCode.UNDEFINED_OPERATOR, operator, [methodName, propagatedType.displayName]);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    Expression target = node.realTarget;
-    if (target is SuperExpression && !_isSuperInValidContext(target)) {
-      return null;
-    }
-    SimpleIdentifier propertyName = node.propertyName;
-    _resolvePropertyAccess(target, propertyName);
-    return null;
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    if (enclosingClass == null) {
-      // TODO(brianwilkerson) Report this error.
-      return null;
-    }
-    SimpleIdentifier name = node.constructorName;
-    ConstructorElement element;
-    if (name == null) {
-      element = enclosingClass.unnamedConstructor;
-    } else {
-      element = enclosingClass.getNamedConstructor(name.name);
-    }
-    if (element == null) {
-      // TODO(brianwilkerson) Report this error and decide what element to associate with the node.
-      return null;
-    }
-    if (name != null) {
-      name.staticElement = element;
-    }
-    node.staticElement = element;
-    ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = _resolveArgumentsToFunction(false, argumentList, element);
-    if (parameters != null) {
-      argumentList.correspondingStaticParameters = parameters;
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    _setMetadataForParameter(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    //
-    // Synthetic identifiers have been already reported during parsing.
-    //
-    if (node.isSynthetic) {
-      return null;
-    }
-    //
-    // We ignore identifiers that have already been resolved, such as identifiers representing the
-    // name in a declaration.
-    //
-    if (node.staticElement != null) {
-      return null;
-    }
-    //
-    // The name dynamic denotes a Type object even though dynamic is not a class.
-    //
-    if (node.name == _dynamicType.name) {
-      node.staticElement = _dynamicType.element;
-      node.staticType = _typeType;
-      return null;
-    }
-    //
-    // Otherwise, the node should be resolved.
-    //
-    Element element = _resolveSimpleIdentifier(node);
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    if (_isFactoryConstructorReturnType(node) && !identical(element, enclosingClass)) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
-    } else if (_isConstructorReturnType(node) && !identical(element, enclosingClass)) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
-      element = null;
-    } else if (element == null || (element is PrefixElement && !_isValidAsPrefix(node))) {
-      // TODO(brianwilkerson) Recover from this error.
-      if (_isConstructorReturnType(node)) {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
-      } else if (node.parent is Annotation) {
-        Annotation annotation = node.parent as Annotation;
-        _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
-      } else {
-        _recordUndefinedNode(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
-      }
-    }
-    node.staticElement = element;
-    if (node.inSetterContext() && node.inGetterContext() && enclosingClass != null) {
-      InterfaceType enclosingType = enclosingClass.type;
-      AuxiliaryElements auxiliaryElements = new AuxiliaryElements(_lookUpGetter(null, enclosingType, node.name), null);
-      node.auxiliaryElements = auxiliaryElements;
-    }
-    //
-    // Validate annotation element.
-    //
-    if (node.parent is Annotation) {
-      Annotation annotation = node.parent as Annotation;
-      _resolveAnnotationElement(annotation);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    if (enclosingClass == null) {
-      // TODO(brianwilkerson) Report this error.
-      return null;
-    }
-    InterfaceType superType = enclosingClass.supertype;
-    if (superType == null) {
-      // TODO(brianwilkerson) Report this error.
-      return null;
-    }
-    SimpleIdentifier name = node.constructorName;
-    String superName = name != null ? name.name : null;
-    ConstructorElement element = superType.lookUpConstructor(superName, _definingLibrary);
-    if (element == null) {
-      if (name != null) {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, node, [superType.displayName, name]);
-      } else {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node, [superType.displayName]);
-      }
-      return null;
-    } else {
-      if (element.isFactory) {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
-      }
-    }
-    if (name != null) {
-      name.staticElement = element;
-    }
-    node.staticElement = element;
-    ArgumentList argumentList = node.argumentList;
-    List<ParameterElement> parameters = _resolveArgumentsToFunction(isInConstConstructor, argumentList, element);
-    if (parameters != null) {
-      argumentList.correspondingStaticParameters = parameters;
-    }
-    return null;
-  }
-
-  @override
-  Object visitSuperExpression(SuperExpression node) {
-    if (!_isSuperInValidContext(node)) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node, []);
-    }
-    return super.visitSuperExpression(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    _setMetadata(node.element, node);
-    return null;
-  }
-
-  /**
-   * Generate annotation elements for each of the annotations in the given node list and add them to
-   * the given list of elements.
-   *
-   * @param annotationList the list of elements to which new elements are to be added
-   * @param annotations the AST nodes used to generate new elements
-   */
-  void _addAnnotations(List<ElementAnnotationImpl> annotationList, NodeList<Annotation> annotations) {
-    int annotationCount = annotations.length;
-    for (int i = 0; i < annotationCount; i++) {
-      Annotation annotation = annotations[i];
-      Element resolvedElement = annotation.element;
-      if (resolvedElement != null) {
-        ElementAnnotationImpl elementAnnotation = new ElementAnnotationImpl(resolvedElement);
-        annotation.elementAnnotation = elementAnnotation;
-        annotationList.add(elementAnnotation);
-      }
-    }
-  }
-
-  /**
-   * Given that we have found code to invoke the given element, return the error code that should be
-   * reported, or `null` if no error should be reported.
-   *
-   * @param target the target of the invocation, or `null` if there was no target
-   * @param useStaticContext
-   * @param element the element to be invoked
-   * @return the error code that should be reported
-   */
-  ErrorCode _checkForInvocationError(Expression target, bool useStaticContext, Element element) {
-    // Prefix is not declared, instead "prefix.id" are declared.
-    if (element is PrefixElement) {
-      element = null;
-    }
-    if (element is PropertyAccessorElement) {
-      //
-      // This is really a function expression invocation.
-      //
-      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
-      FunctionType getterType = element.type;
-      if (getterType != null) {
-        DartType returnType = getterType.returnType;
-        if (!_isExecutableType(returnType)) {
-          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-        }
-      }
-    } else if (element is ExecutableElement) {
-      return null;
-    } else if (element is MultiplyDefinedElement) {
-      // The error has already been reported
-      return null;
-    } else if (element == null && target is SuperExpression) {
-      // TODO(jwren) We should split the UNDEFINED_METHOD into two error codes, this one, and
-      // a code that describes the situation where the method was found, but it was not
-      // accessible from the current library.
-      return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
-    } else {
-      //
-      // This is really a function expression invocation.
-      //
-      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
-      if (element is PropertyInducingElement) {
-        PropertyAccessorElement getter = element.getter;
-        FunctionType getterType = getter.type;
-        if (getterType != null) {
-          DartType returnType = getterType.returnType;
-          if (!_isExecutableType(returnType)) {
-            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-          }
-        }
-      } else if (element is VariableElement) {
-        DartType variableType = element.type;
-        if (!_isExecutableType(variableType)) {
-          return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-        }
-      } else {
-        if (target == null) {
-          ClassElement enclosingClass = _resolver.enclosingClass;
-          if (enclosingClass == null) {
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (element == null) {
-            // Proxy-conditional warning, based on state of resolver.getEnclosingClass()
-            return StaticTypeWarningCode.UNDEFINED_METHOD;
-          } else {
-            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-          }
-        } else {
-          DartType targetType;
-          if (useStaticContext) {
-            targetType = _getStaticType(target);
-          } else {
-            // Compute and use the propagated type, if it is null, then it may be the case that
-            // static type is some type, in which the static type should be used.
-            targetType = target.bestType;
-          }
-          if (targetType == null) {
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (!targetType.isDynamic && !targetType.isBottom) {
-            // Proxy-conditional warning, based on state of targetType.getElement()
-            return StaticTypeWarningCode.UNDEFINED_METHOD;
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Check that the for some index expression that the method element was resolved, otherwise a
-   * [StaticWarningCode#UNDEFINED_OPERATOR] is generated.
-   *
-   * @param node the index expression to resolve
-   * @param target the target of the expression
-   * @param methodName the name of the operator associated with the context of using of the given
-   *          index expression
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForUndefinedIndexOperator(IndexExpression node, Expression target, String methodName, MethodElement staticMethod, MethodElement propagatedMethod, DartType staticType, DartType propagatedType) {
-    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticMethod);
-    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && _shouldReportMissingMember(propagatedType, propagatedMethod) && !_memberFoundInSubclass(propagatedType.element, methodName, true, false);
-    if (shouldReportMissingMember_static || shouldReportMissingMember_propagated) {
-      sc.Token leftBracket = node.leftBracket;
-      sc.Token rightBracket = node.rightBracket;
-      ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_OPERATOR : HintCode.UNDEFINED_OPERATOR);
-      if (leftBracket == null || rightBracket == null) {
-        _recordUndefinedNode(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, node, [
-            methodName,
-            shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
-      } else {
-        int offset = leftBracket.offset;
-        int length = rightBracket.offset - offset + 1;
-        _recordUndefinedOffset(shouldReportMissingMember_static ? staticType.element : propagatedType.element, errorCode, offset, length, [
-            methodName,
-            shouldReportMissingMember_static ? staticType.displayName : propagatedType.displayName]);
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Given a list of arguments and the element that will be invoked using those argument, compute
-   * the list of parameters that correspond to the list of arguments. Return the parameters that
-   * correspond to the arguments, or `null` if no correspondence could be computed.
-   *
-   * @param argumentList the list of arguments being passed to the element
-   * @param executableElement the element that will be invoked with the arguments
-   * @return the parameters that correspond to the arguments
-   */
-  List<ParameterElement> _computeCorrespondingParameters(ArgumentList argumentList, Element element) {
-    if (element is PropertyAccessorElement) {
-      //
-      // This is an invocation of the call method defined on the value returned by the getter.
-      //
-      FunctionType getterType = element.type;
-      if (getterType != null) {
-        DartType getterReturnType = getterType.returnType;
-        if (getterReturnType is InterfaceType) {
-          MethodElement callMethod = getterReturnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
-          if (callMethod != null) {
-            return _resolveArgumentsToFunction(false, argumentList, callMethod);
-          }
-        } else if (getterReturnType is FunctionType) {
-          List<ParameterElement> parameters = getterReturnType.parameters;
-          return _resolveArgumentsToParameters(false, argumentList, parameters);
-        }
-      }
-    } else if (element is ExecutableElement) {
-      return _resolveArgumentsToFunction(false, argumentList, element);
-    } else if (element is VariableElement) {
-      VariableElement variable = element;
-      DartType type = _promoteManager.getStaticType(variable);
-      if (type is FunctionType) {
-        FunctionType functionType = type;
-        List<ParameterElement> parameters = functionType.parameters;
-        return _resolveArgumentsToParameters(false, argumentList, parameters);
-      } else if (type is InterfaceType) {
-        // "call" invocation
-        MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
-        if (callMethod != null) {
-          List<ParameterElement> parameters = callMethod.parameters;
-          return _resolveArgumentsToParameters(false, argumentList, parameters);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given element is a setter, return the getter associated with it. Otherwise, return the
-   * element unchanged.
-   *
-   * @param element the element to be normalized
-   * @return a non-setter element derived from the given element
-   */
-  Element _convertSetterToGetter(Element element) {
-    // TODO(brianwilkerson) Determine whether and why the element could ever be a setter.
-    if (element is PropertyAccessorElement) {
-      return element.variable.getter;
-    }
-    return element;
-  }
-
-  /**
-   * Return `true` if the given element is not a proxy.
-   *
-   * @param element the enclosing element. If null, `true` will be returned.
-   * @return `false` iff the passed [Element] is a [ClassElement] that is a proxy
-   *         or inherits proxy
-   * @see ClassElement#isOrInheritsProxy()
-   */
-  bool _doesntHaveProxy(Element element) => !(element is ClassElement && element.isOrInheritsProxy);
-
-  /**
-   * Look for any declarations of the given identifier that are imported using a prefix. Return the
-   * element that was found, or `null` if the name is not imported using a prefix.
-   *
-   * @param identifier the identifier that might have been imported using a prefix
-   * @return the element that was found
-   */
-  Element _findImportWithoutPrefix(SimpleIdentifier identifier) {
-    Element element = null;
-    Scope nameScope = _resolver.nameScope;
-    for (ImportElement importElement in _definingLibrary.imports) {
-      PrefixElement prefixElement = importElement.prefix;
-      if (prefixElement != null) {
-        Identifier prefixedIdentifier = new ElementResolver_SyntheticIdentifier("${prefixElement.name}.${identifier.name}");
-        Element importedElement = nameScope.lookup(prefixedIdentifier, _definingLibrary);
-        if (importedElement != null) {
-          if (element == null) {
-            element = importedElement;
-          } else {
-            element = MultiplyDefinedElementImpl.fromElements(_definingLibrary.context, element, importedElement);
-          }
-        }
-      }
-    }
-    return element;
-  }
-
-  /**
-   * Assuming that the given expression is a prefix for a deferred import, return the library that
-   * is being imported.
-   *
-   * @param expression the expression representing the deferred import's prefix
-   * @return the library that is being imported by the import associated with the prefix
-   */
-  LibraryElement _getImportedLibrary(Expression expression) {
-    PrefixElement prefixElement = (expression as SimpleIdentifier).staticElement as PrefixElement;
-    List<ImportElement> imports = prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
-    return imports[0].importedLibrary;
-  }
-
-  /**
-   * Return the name of the method invoked by the given postfix expression.
-   *
-   * @param node the postfix expression being invoked
-   * @return the name of the method invoked by the expression
-   */
-  String _getPostfixOperator(PostfixExpression node) => (node.operator.type == sc.TokenType.PLUS_PLUS) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
-
-  /**
-   * Return the name of the method invoked by the given postfix expression.
-   *
-   * @param node the postfix expression being invoked
-   * @return the name of the method invoked by the expression
-   */
-  String _getPrefixOperator(PrefixExpression node) {
-    sc.Token operator = node.operator;
-    sc.TokenType operatorType = operator.type;
-    if (operatorType == sc.TokenType.PLUS_PLUS) {
-      return sc.TokenType.PLUS.lexeme;
-    } else if (operatorType == sc.TokenType.MINUS_MINUS) {
-      return sc.TokenType.MINUS.lexeme;
-    } else if (operatorType == sc.TokenType.MINUS) {
-      return "unary-";
-    } else {
-      return operator.lexeme;
-    }
-  }
-
-  /**
-   * Return the propagated type of the given expression that is to be used for type analysis.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the type of the given expression
-   */
-  DartType _getPropagatedType(Expression expression) {
-    DartType propagatedType = _resolveTypeParameter(expression.propagatedType);
-    if (propagatedType is FunctionType) {
-      //
-      // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
-      //
-      propagatedType = _resolver.typeProvider.functionType;
-    }
-    return propagatedType;
-  }
-
-  /**
-   * Return the static type of the given expression that is to be used for type analysis.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the type of the given expression
-   */
-  DartType _getStaticType(Expression expression) {
-    if (expression is NullLiteral) {
-      return _resolver.typeProvider.bottomType;
-    }
-    DartType staticType = _resolveTypeParameter(expression.staticType);
-    if (staticType is FunctionType) {
-      //
-      // All function types are subtypes of 'Function', which is itself a subclass of 'Object'.
-      //
-      staticType = _resolver.typeProvider.functionType;
-    }
-    return staticType;
-  }
-
-  /**
-   * Return `true` if the given expression is a prefix for a deferred import.
-   *
-   * @param expression the expression being tested
-   * @return `true` if the given expression is a prefix for a deferred import
-   */
-  bool _isDeferredPrefix(Expression expression) {
-    if (expression is! SimpleIdentifier) {
-      return false;
-    }
-    Element element = (expression as SimpleIdentifier).staticElement;
-    if (element is! PrefixElement) {
-      return false;
-    }
-    PrefixElement prefixElement = element as PrefixElement;
-    List<ImportElement> imports = prefixElement.enclosingElement.getImportsWithPrefix(prefixElement);
-    if (imports.length != 1) {
-      return false;
-    }
-    return imports[0].isDeferred;
-  }
-
-  /**
-   * Return `true` if the given type represents an object that could be invoked using the call
-   * operator '()'.
-   *
-   * @param type the type being tested
-   * @return `true` if the given type represents an object that could be invoked
-   */
-  bool _isExecutableType(DartType type) {
-    if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || type.isObject) {
-      return true;
-    } else if (type is InterfaceType) {
-      ClassElement classElement = type.element;
-      // 16078 from Gilad: If the type is a Functor with the @proxy annotation, treat it as an
-      // executable type.
-      // example code: NonErrorResolverTest.test_invocationOfNonFunction_proxyOnFunctionClass()
-      if (classElement.isProxy && type.isSubtypeOf(_resolver.typeProvider.functionType)) {
-        return true;
-      }
-      MethodElement methodElement = classElement.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
-      return methodElement != null;
-    }
-    return false;
-  }
-
-  /**
-   * @return `true` iff current enclosing function is constant constructor declaration.
-   */
-  bool get isInConstConstructor {
-    ExecutableElement function = _resolver.enclosingFunction;
-    if (function is ConstructorElement) {
-      return function.isConst;
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given element is a static element.
-   *
-   * @param element the element being tested
-   * @return `true` if the given element is a static element
-   */
-  bool _isStatic(Element element) {
-    if (element is ExecutableElement) {
-      return element.isStatic;
-    } else if (element is PropertyInducingElement) {
-      return element.isStatic;
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given node can validly be resolved to a prefix:
-   * * it is the prefix in an import directive, or
-   * * it is the prefix in a prefixed identifier.
-   *
-   * @param node the node being tested
-   * @return `true` if the given node is the prefix in an import directive
-   */
-  bool _isValidAsPrefix(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent is ImportDirective) {
-      return identical(parent.prefix, node);
-    } else if (parent is PrefixedIdentifier) {
-      return true;
-    } else if (parent is MethodInvocation) {
-      return identical(parent.target, node);
-    }
-    return false;
-  }
-
-  /**
-   * Look up the getter with the given name in the given type. Return the element representing the
-   * getter that was found, or `null` if there is no getter with the given name.
-   *
-   * @param target the target of the invocation, or `null` if there is no target
-   * @param type the type in which the getter is defined
-   * @param getterName the name of the getter being looked up
-   * @return the element representing the getter that was found
-   */
-  PropertyAccessorElement _lookUpGetter(Expression target, DartType type, String getterName) {
-    type = _resolveTypeParameter(type);
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      PropertyAccessorElement accessor;
-      if (target is SuperExpression) {
-        accessor = interfaceType.lookUpGetterInSuperclass(getterName, _definingLibrary);
-      } else {
-        accessor = interfaceType.lookUpGetter(getterName, _definingLibrary);
-      }
-      if (accessor != null) {
-        return accessor;
-      }
-      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new HashSet<ClassElement>());
-    }
-    return null;
-  }
-
-  /**
-   * Look up the getter with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the getter that was found, or
-   * `null` if there is no getter with the given name.
-   *
-   * @param targetType the type in which the getter might be defined
-   * @param includeTargetType `true` if the search should include the target type
-   * @param getterName the name of the getter being looked up
-   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
-   *          to prevent infinite recursion and to optimize the search
-   * @return the element representing the getter that was found
-   */
-  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, HashSet<ClassElement> visitedInterfaces) {
-    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
-    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
-    // finding the inherited member. We need to follow that scheme. The code below should cover the
-    // 80% case.
-    ClassElement targetClass = targetType.element;
-    if (visitedInterfaces.contains(targetClass)) {
-      return null;
-    }
-    visitedInterfaces.add(targetClass);
-    if (includeTargetType) {
-      PropertyAccessorElement getter = targetType.getGetter(getterName);
-      if (getter != null && getter.isAccessibleIn(_definingLibrary)) {
-        return getter;
-      }
-    }
-    for (InterfaceType interfaceType in targetType.interfaces) {
-      PropertyAccessorElement getter = _lookUpGetterInInterfaces(interfaceType, true, getterName, visitedInterfaces);
-      if (getter != null) {
-        return getter;
-      }
-    }
-    for (InterfaceType mixinType in targetType.mixins) {
-      PropertyAccessorElement getter = _lookUpGetterInInterfaces(mixinType, true, getterName, visitedInterfaces);
-      if (getter != null) {
-        return getter;
-      }
-    }
-    InterfaceType superclass = targetType.superclass;
-    if (superclass == null) {
-      return null;
-    }
-    return _lookUpGetterInInterfaces(superclass, true, getterName, visitedInterfaces);
-  }
-
-  /**
-   * Look up the method or getter with the given name in the given type. Return the element
-   * representing the method or getter that was found, or `null` if there is no method or
-   * getter with the given name.
-   *
-   * @param type the type in which the method or getter is defined
-   * @param memberName the name of the method or getter being looked up
-   * @return the element representing the method or getter that was found
-   */
-  ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
-    type = _resolveTypeParameter(type);
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      ExecutableElement member = interfaceType.lookUpMethod(memberName, _definingLibrary);
-      if (member != null) {
-        return member;
-      }
-      member = interfaceType.lookUpGetter(memberName, _definingLibrary);
-      if (member != null) {
-        return member;
-      }
-      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new HashSet<ClassElement>());
-    }
-    return null;
-  }
-
-  /**
-   * Look up the method or getter with the given name in the interfaces implemented by the given
-   * type, either directly or indirectly. Return the element representing the method or getter that
-   * was found, or `null` if there is no method or getter with the given name.
-   *
-   * @param targetType the type in which the method or getter might be defined
-   * @param includeTargetType `true` if the search should include the target type
-   * @param memberName the name of the method or getter being looked up
-   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
-   *          to prevent infinite recursion and to optimize the search
-   * @return the element representing the method or getter that was found
-   */
-  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, HashSet<ClassElement> visitedInterfaces) {
-    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
-    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
-    // finding the inherited member. We need to follow that scheme. The code below should cover the
-    // 80% case.
-    ClassElement targetClass = targetType.element;
-    if (visitedInterfaces.contains(targetClass)) {
-      return null;
-    }
-    visitedInterfaces.add(targetClass);
-    if (includeTargetType) {
-      ExecutableElement member = targetType.getMethod(memberName);
-      if (member != null) {
-        return member;
-      }
-      member = targetType.getGetter(memberName);
-      if (member != null) {
-        return member;
-      }
-    }
-    for (InterfaceType interfaceType in targetType.interfaces) {
-      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(interfaceType, true, memberName, visitedInterfaces);
-      if (member != null) {
-        return member;
-      }
-    }
-    for (InterfaceType mixinType in targetType.mixins) {
-      ExecutableElement member = _lookUpGetterOrMethodInInterfaces(mixinType, true, memberName, visitedInterfaces);
-      if (member != null) {
-        return member;
-      }
-    }
-    InterfaceType superclass = targetType.superclass;
-    if (superclass == null) {
-      return null;
-    }
-    return _lookUpGetterOrMethodInInterfaces(superclass, true, memberName, visitedInterfaces);
-  }
-
-  /**
-   * Find the element corresponding to the given label node in the current label scope.
-   *
-   * @param parentNode the node containing the given label
-   * @param labelNode the node representing the label being looked up
-   * @return the element corresponding to the given label node in the current scope
-   */
-  LabelElementImpl _lookupLabel(AstNode parentNode, SimpleIdentifier labelNode) {
-    LabelScope labelScope = _resolver.labelScope;
-    LabelElementImpl labelElement = null;
-    if (labelNode == null) {
-      if (labelScope == null) {
-        // TODO(brianwilkerson) Do we need to report this error, or is this condition always caught in the parser?
-        // reportError(ResolverErrorCode.BREAK_OUTSIDE_LOOP);
-      } else {
-        labelElement = labelScope.lookup(LabelScope.EMPTY_LABEL) as LabelElementImpl;
-        if (labelElement == null) {
-          // TODO(brianwilkerson) Do we need to report this error, or is this condition always caught in the parser?
-          // reportError(ResolverErrorCode.BREAK_OUTSIDE_LOOP);
-        }
-        //
-        // The label element that was returned was a marker for look-up and isn't stored in the
-        // element model.
-        //
-        labelElement = null;
-      }
-    } else {
-      if (labelScope == null) {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
-      } else {
-        labelElement = labelScope.lookup(labelNode.name) as LabelElementImpl;
-        if (labelElement == null) {
-          _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_UNDEFINED, labelNode, [labelNode.name]);
-        } else {
-          labelNode.staticElement = labelElement;
-        }
-      }
-    }
-    if (labelElement != null) {
-      ExecutableElement labelContainer = labelElement.getAncestor((element) => element is ExecutableElement);
-      if (!identical(labelContainer, _resolver.enclosingFunction)) {
-        _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
-        labelElement = null;
-      }
-    }
-    return labelElement;
-  }
-
-  /**
-   * Look up the method with the given name in the given type. Return the element representing the
-   * method that was found, or `null` if there is no method with the given name.
-   *
-   * @param target the target of the invocation, or `null` if there is no target
-   * @param type the type in which the method is defined
-   * @param methodName the name of the method being looked up
-   * @return the element representing the method that was found
-   */
-  MethodElement _lookUpMethod(Expression target, DartType type, String methodName) {
-    type = _resolveTypeParameter(type);
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      MethodElement method;
-      if (target is SuperExpression) {
-        method = interfaceType.lookUpMethodInSuperclass(methodName, _definingLibrary);
-      } else {
-        method = interfaceType.lookUpMethod(methodName, _definingLibrary);
-      }
-      if (method != null) {
-        return method;
-      }
-      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
-    } else if (type is UnionType) {
-      // TODO (collinsn): I want [computeMergedExecutableElement] to be general
-      // and work with functions, methods, constructors, and property accessors. However,
-      // I won't be able to assume it returns [MethodElement] here then.
-      return _maybeMergeExecutableElements(_lookupMethods(target, type, methodName)) as MethodElement;
-    }
-    return null;
-  }
-
-  /**
-   * Look up the method with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the method that was found, or
-   * `null` if there is no method with the given name.
-   *
-   * @param targetType the type in which the member might be defined
-   * @param includeTargetType `true` if the search should include the target type
-   * @param methodName the name of the method being looked up
-   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
-   *          to prevent infinite recursion and to optimize the search
-   * @return the element representing the method that was found
-   */
-  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, HashSet<ClassElement> visitedInterfaces) {
-    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
-    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
-    // finding the inherited member. We need to follow that scheme. The code below should cover the
-    // 80% case.
-    ClassElement targetClass = targetType.element;
-    if (visitedInterfaces.contains(targetClass)) {
-      return null;
-    }
-    visitedInterfaces.add(targetClass);
-    if (includeTargetType) {
-      MethodElement method = targetType.getMethod(methodName);
-      if (method != null && method.isAccessibleIn(_definingLibrary)) {
-        return method;
-      }
-    }
-    for (InterfaceType interfaceType in targetType.interfaces) {
-      MethodElement method = _lookUpMethodInInterfaces(interfaceType, true, methodName, visitedInterfaces);
-      if (method != null) {
-        return method;
-      }
-    }
-    for (InterfaceType mixinType in targetType.mixins) {
-      MethodElement method = _lookUpMethodInInterfaces(mixinType, true, methodName, visitedInterfaces);
-      if (method != null) {
-        return method;
-      }
-    }
-    InterfaceType superclass = targetType.superclass;
-    if (superclass == null) {
-      return null;
-    }
-    return _lookUpMethodInInterfaces(superclass, true, methodName, visitedInterfaces);
-  }
-
-  /**
-   * Look up all methods of a given name defined on a union type.
-   *
-   * @param target
-   * @param type
-   * @param methodName
-   * @return all methods named `methodName` defined on the union type `type`.
-   */
-  Set<ExecutableElement> _lookupMethods(Expression target, UnionType type, String methodName) {
-    Set<ExecutableElement> methods = new HashSet<ExecutableElement>();
-    bool allElementsHaveMethod = true;
-    for (DartType t in type.elements) {
-      MethodElement m = _lookUpMethod(target, t, methodName);
-      if (m != null) {
-        methods.add(m);
-      } else {
-        allElementsHaveMethod = false;
-      }
-    }
-    // For strict union types we require that all types in the union define the method.
-    if (AnalysisEngine.instance.strictUnionTypes) {
-      if (allElementsHaveMethod) {
-        return methods;
-      } else {
-        return new Set<ExecutableElement>();
-      }
-    } else {
-      return methods;
-    }
-  }
-
-  /**
-   * Look up the setter with the given name in the given type. Return the element representing the
-   * setter that was found, or `null` if there is no setter with the given name.
-   *
-   * @param target the target of the invocation, or `null` if there is no target
-   * @param type the type in which the setter is defined
-   * @param setterName the name of the setter being looked up
-   * @return the element representing the setter that was found
-   */
-  PropertyAccessorElement _lookUpSetter(Expression target, DartType type, String setterName) {
-    type = _resolveTypeParameter(type);
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      PropertyAccessorElement accessor;
-      if (target is SuperExpression) {
-        accessor = interfaceType.lookUpSetterInSuperclass(setterName, _definingLibrary);
-      } else {
-        accessor = interfaceType.lookUpSetter(setterName, _definingLibrary);
-      }
-      if (accessor != null) {
-        return accessor;
-      }
-      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new HashSet<ClassElement>());
-    }
-    return null;
-  }
-
-  /**
-   * Look up the setter with the given name in the interfaces implemented by the given type, either
-   * directly or indirectly. Return the element representing the setter that was found, or
-   * `null` if there is no setter with the given name.
-   *
-   * @param targetType the type in which the setter might be defined
-   * @param includeTargetType `true` if the search should include the target type
-   * @param setterName the name of the setter being looked up
-   * @param visitedInterfaces a set containing all of the interfaces that have been examined, used
-   *          to prevent infinite recursion and to optimize the search
-   * @return the element representing the setter that was found
-   */
-  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, HashSet<ClassElement> visitedInterfaces) {
-    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
-    // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
-    // finding the inherited member. We need to follow that scheme. The code below should cover the
-    // 80% case.
-    ClassElement targetClass = targetType.element;
-    if (visitedInterfaces.contains(targetClass)) {
-      return null;
-    }
-    visitedInterfaces.add(targetClass);
-    if (includeTargetType) {
-      PropertyAccessorElement setter = targetType.getSetter(setterName);
-      if (setter != null && setter.isAccessibleIn(_definingLibrary)) {
-        return setter;
-      }
-    }
-    for (InterfaceType interfaceType in targetType.interfaces) {
-      PropertyAccessorElement setter = _lookUpSetterInInterfaces(interfaceType, true, setterName, visitedInterfaces);
-      if (setter != null) {
-        return setter;
-      }
-    }
-    for (InterfaceType mixinType in targetType.mixins) {
-      PropertyAccessorElement setter = _lookUpSetterInInterfaces(mixinType, true, setterName, visitedInterfaces);
-      if (setter != null) {
-        return setter;
-      }
-    }
-    InterfaceType superclass = targetType.superclass;
-    if (superclass == null) {
-      return null;
-    }
-    return _lookUpSetterInInterfaces(superclass, true, setterName, visitedInterfaces);
-  }
-
-  /**
-   * Given some class element, this method uses [subtypeManager] to find the set of all
-   * subtypes; the subtypes are then searched for a member (method, getter, or setter), that matches
-   * a passed
-   *
-   * @param element the class element to search the subtypes of, if a non-ClassElement element is
-   *          passed, then `false` is returned
-   * @param memberName the member name to search for
-   * @param asMethod `true` if the methods should be searched for in the subtypes
-   * @param asAccessor `true` if the accessors (getters and setters) should be searched for in
-   *          the subtypes
-   * @return `true` if and only if the passed memberName was found in a subtype
-   */
-  bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
-    if (element is ClassElement) {
-      _subtypeManager.ensureLibraryVisited(_definingLibrary);
-      HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
-      for (ClassElement subtypeElement in subtypeElements) {
-        if (asMethod && subtypeElement.getMethod(memberName) != null) {
-          return true;
-        } else if (asAccessor && (subtypeElement.getGetter(memberName) != null || subtypeElement.getSetter(memberName) != null)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return the binary operator that is invoked by the given compound assignment operator.
-   *
-   * @param operator the assignment operator being mapped
-   * @return the binary operator that invoked by the given assignment operator
-   */
-  sc.TokenType _operatorFromCompoundAssignment(sc.TokenType operator) {
-    while (true) {
-      if (operator == sc.TokenType.AMPERSAND_EQ) {
-        return sc.TokenType.AMPERSAND;
-      } else if (operator == sc.TokenType.BAR_EQ) {
-        return sc.TokenType.BAR;
-      } else if (operator == sc.TokenType.CARET_EQ) {
-        return sc.TokenType.CARET;
-      } else if (operator == sc.TokenType.GT_GT_EQ) {
-        return sc.TokenType.GT_GT;
-      } else if (operator == sc.TokenType.LT_LT_EQ) {
-        return sc.TokenType.LT_LT;
-      } else if (operator == sc.TokenType.MINUS_EQ) {
-        return sc.TokenType.MINUS;
-      } else if (operator == sc.TokenType.PERCENT_EQ) {
-        return sc.TokenType.PERCENT;
-      } else if (operator == sc.TokenType.PLUS_EQ) {
-        return sc.TokenType.PLUS;
-      } else if (operator == sc.TokenType.SLASH_EQ) {
-        return sc.TokenType.SLASH;
-      } else if (operator == sc.TokenType.STAR_EQ) {
-        return sc.TokenType.STAR;
-      } else if (operator == sc.TokenType.TILDE_SLASH_EQ) {
-        return sc.TokenType.TILDE_SLASH;
-      } else {
-        // Internal error: Unmapped assignment operator.
-        AnalysisEngine.instance.logger.logError("Failed to map ${operator.lexeme} to it's corresponding operator");
-        return operator;
-      }
-      break;
-    }
-  }
-
-  /**
-   * Record that the given node is undefined, causing an error to be reported if appropriate.
-   *
-   * @param declaringElement the element inside which no declaration was found. If this element is a
-   *          proxy, no error will be reported. If null, then an error will always be reported.
-   * @param errorCode the error code to report.
-   * @param node the node which is undefined.
-   * @param arguments arguments to the error message.
-   */
-  void _recordUndefinedNode(Element declaringElement, ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    if (_doesntHaveProxy(declaringElement)) {
-      _resolver.reportErrorForNode(errorCode, node, arguments);
-    }
-  }
-
-  /**
-   * Record that the given offset/length is undefined, causing an error to be reported if
-   * appropriate.
-   *
-   * @param declaringElement the element inside which no declaration was found. If this element is a
-   *          proxy, no error will be reported. If null, then an error will always be reported.
-   * @param errorCode the error code to report.
-   * @param offset the offset to the text which is undefined.
-   * @param length the length of the text which is undefined.
-   * @param arguments arguments to the error message.
-   */
-  void _recordUndefinedOffset(Element declaringElement, ErrorCode errorCode, int offset, int length, List<Object> arguments) {
-    if (_doesntHaveProxy(declaringElement)) {
-      _resolver.reportErrorForOffset(errorCode, offset, length, arguments);
-    }
-  }
-
-  /**
-   * Record that the given token is undefined, causing an error to be reported if appropriate.
-   *
-   * @param declaringElement the element inside which no declaration was found. If this element is a
-   *          proxy, no error will be reported. If null, then an error will always be reported.
-   * @param errorCode the error code to report.
-   * @param token the token which is undefined.
-   * @param arguments arguments to the error message.
-   */
-  void _recordUndefinedToken(Element declaringElement, ErrorCode errorCode, sc.Token token, List<Object> arguments) {
-    if (_doesntHaveProxy(declaringElement)) {
-      _resolver.reportErrorForToken(errorCode, token, arguments);
-    }
-  }
-
-  void _resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
-    ArgumentList argumentList = annotation.arguments;
-    // error will be reported in ConstantVerifier
-    if (argumentList == null) {
-      return;
-    }
-    // resolve arguments to parameters
-    List<ParameterElement> parameters = _resolveArgumentsToFunction(true, argumentList, constructor);
-    if (parameters != null) {
-      argumentList.correspondingStaticParameters = parameters;
-    }
-  }
-
-  /**
-   * Continues resolution of the given [Annotation].
-   *
-   * @param annotation the [Annotation] to resolve
-   */
-  void _resolveAnnotationElement(Annotation annotation) {
-    SimpleIdentifier nameNode1;
-    SimpleIdentifier nameNode2;
-    {
-      Identifier annName = annotation.name;
-      if (annName is PrefixedIdentifier) {
-        PrefixedIdentifier prefixed = annName;
-        nameNode1 = prefixed.prefix;
-        nameNode2 = prefixed.identifier;
-      } else {
-        nameNode1 = annName as SimpleIdentifier;
-        nameNode2 = null;
-      }
-    }
-    SimpleIdentifier nameNode3 = annotation.constructorName;
-    ConstructorElement constructor = null;
-    //
-    // CONST or Class(args)
-    //
-    if (nameNode1 != null && nameNode2 == null && nameNode3 == null) {
-      Element element1 = nameNode1.staticElement;
-      // CONST
-      if (element1 is PropertyAccessorElement) {
-        _resolveAnnotationElementGetter(annotation, element1);
-        return;
-      }
-      // Class(args)
-      if (element1 is ClassElement) {
-        ClassElement classElement = element1;
-        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(null, _definingLibrary);
-      }
-    }
-    //
-    // prefix.CONST or prefix.Class() or Class.CONST or Class.constructor(args)
-    //
-    if (nameNode1 != null && nameNode2 != null && nameNode3 == null) {
-      Element element1 = nameNode1.staticElement;
-      Element element2 = nameNode2.staticElement;
-      // Class.CONST - not resolved yet
-      if (element1 is ClassElement) {
-        ClassElement classElement = element1;
-        element2 = classElement.lookUpGetter(nameNode2.name, _definingLibrary);
-      }
-      // prefix.CONST or Class.CONST
-      if (element2 is PropertyAccessorElement) {
-        nameNode2.staticElement = element2;
-        annotation.element = element2;
-        _resolveAnnotationElementGetter(annotation, element2 as PropertyAccessorElement);
-        return;
-      }
-      // prefix.Class()
-      if (element2 is ClassElement) {
-        ClassElement classElement = element2 as ClassElement;
-        constructor = classElement.unnamedConstructor;
-      }
-      // Class.constructor(args)
-      if (element1 is ClassElement) {
-        ClassElement classElement = element1;
-        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(nameNode2.name, _definingLibrary);
-        nameNode2.staticElement = constructor;
-      }
-    }
-    //
-    // prefix.Class.CONST or prefix.Class.constructor(args)
-    //
-    if (nameNode1 != null && nameNode2 != null && nameNode3 != null) {
-      Element element2 = nameNode2.staticElement;
-      // element2 should be ClassElement
-      if (element2 is ClassElement) {
-        ClassElement classElement = element2;
-        String name3 = nameNode3.name;
-        // prefix.Class.CONST
-        PropertyAccessorElement getter = classElement.lookUpGetter(name3, _definingLibrary);
-        if (getter != null) {
-          nameNode3.staticElement = getter;
-          annotation.element = element2;
-          _resolveAnnotationElementGetter(annotation, getter);
-          return;
-        }
-        // prefix.Class.constructor(args)
-        constructor = new InterfaceTypeImpl.con1(classElement).lookUpConstructor(name3, _definingLibrary);
-        nameNode3.staticElement = constructor;
-      }
-    }
-    // we need constructor
-    if (constructor == null) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
-      return;
-    }
-    // record element
-    annotation.element = constructor;
-    // resolve arguments
-    _resolveAnnotationConstructorInvocationArguments(annotation, constructor);
-  }
-
-  void _resolveAnnotationElementGetter(Annotation annotation, PropertyAccessorElement accessorElement) {
-    // accessor should be synthetic
-    if (!accessorElement.isSynthetic) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
-      return;
-    }
-    // variable should be constant
-    VariableElement variableElement = accessorElement.variable;
-    if (!variableElement.isConst) {
-      _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
-    }
-    // OK
-    return;
-  }
-
-  /**
-   * Given a list of arguments and the element that will be invoked using those argument, compute
-   * the list of parameters that correspond to the list of arguments. Return the parameters that
-   * correspond to the arguments, or `null` if no correspondence could be computed.
-   *
-   * @param reportError if `true` then compile-time error should be reported; if `false`
-   *          then compile-time warning
-   * @param argumentList the list of arguments being passed to the element
-   * @param executableElement the element that will be invoked with the arguments
-   * @return the parameters that correspond to the arguments
-   */
-  List<ParameterElement> _resolveArgumentsToFunction(bool reportError, ArgumentList argumentList, ExecutableElement executableElement) {
-    if (executableElement == null) {
-      return null;
-    }
-    List<ParameterElement> parameters = executableElement.parameters;
-    return _resolveArgumentsToParameters(reportError, argumentList, parameters);
-  }
-
-  /**
-   * Given a list of arguments and the parameters related to the element that will be invoked using
-   * those argument, compute the list of parameters that correspond to the list of arguments. Return
-   * the parameters that correspond to the arguments.
-   *
-   * @param reportError if `true` then compile-time error should be reported; if `false`
-   *          then compile-time warning
-   * @param argumentList the list of arguments being passed to the element
-   * @param parameters the of the function that will be invoked with the arguments
-   * @return the parameters that correspond to the arguments
-   */
-  List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
-    List<ParameterElement> requiredParameters = new List<ParameterElement>();
-    List<ParameterElement> positionalParameters = new List<ParameterElement>();
-    HashMap<String, ParameterElement> namedParameters = new HashMap<String, ParameterElement>();
-    for (ParameterElement parameter in parameters) {
-      ParameterKind kind = parameter.parameterKind;
-      if (kind == ParameterKind.REQUIRED) {
-        requiredParameters.add(parameter);
-      } else if (kind == ParameterKind.POSITIONAL) {
-        positionalParameters.add(parameter);
-      } else {
-        namedParameters[parameter.name] = parameter;
-      }
-    }
-    List<ParameterElement> unnamedParameters = new List<ParameterElement>.from(requiredParameters);
-    unnamedParameters.addAll(positionalParameters);
-    int unnamedParameterCount = unnamedParameters.length;
-    int unnamedIndex = 0;
-    NodeList<Expression> arguments = argumentList.arguments;
-    int argumentCount = arguments.length;
-    List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
-    int positionalArgumentCount = 0;
-    HashSet<String> usedNames = new HashSet<String>();
-    bool noBlankArguments = true;
-    for (int i = 0; i < argumentCount; i++) {
-      Expression argument = arguments[i];
-      if (argument is NamedExpression) {
-        SimpleIdentifier nameNode = argument.name.label;
-        String name = nameNode.name;
-        ParameterElement element = namedParameters[name];
-        if (element == null) {
-          ErrorCode errorCode = (reportError ? CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER : StaticWarningCode.UNDEFINED_NAMED_PARAMETER);
-          _resolver.reportErrorForNode(errorCode, nameNode, [name]);
-        } else {
-          resolvedParameters[i] = element;
-          nameNode.staticElement = element;
-        }
-        if (!usedNames.add(name)) {
-          _resolver.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT, nameNode, [name]);
-        }
-      } else {
-        if (argument is SimpleIdentifier && argument.name.isEmpty) {
-          noBlankArguments = false;
-        }
-        positionalArgumentCount++;
-        if (unnamedIndex < unnamedParameterCount) {
-          resolvedParameters[i] = unnamedParameters[unnamedIndex++];
-        }
-      }
-    }
-    if (positionalArgumentCount < requiredParameters.length && noBlankArguments) {
-      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS : StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
-      _resolver.reportErrorForNode(errorCode, argumentList, [requiredParameters.length, positionalArgumentCount]);
-    } else if (positionalArgumentCount > unnamedParameterCount && noBlankArguments) {
-      ErrorCode errorCode = (reportError ? CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS : StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
-      _resolver.reportErrorForNode(errorCode, argumentList, [unnamedParameterCount, positionalArgumentCount]);
-    }
-    return resolvedParameters;
-  }
-
-  /**
-   * Resolve the names in the given combinators in the scope of the given library.
-   *
-   * @param library the library that defines the names
-   * @param combinators the combinators containing the names to be resolved
-   */
-  void _resolveCombinators(LibraryElement library, NodeList<Combinator> combinators) {
-    if (library == null) {
-      //
-      // The library will be null if the directive containing the combinators has a URI that is not
-      // valid.
-      //
-      return;
-    }
-    Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(library);
-    for (Combinator combinator in combinators) {
-      NodeList<SimpleIdentifier> names;
-      if (combinator is HideCombinator) {
-        names = combinator.hiddenNames;
-      } else {
-        names = (combinator as ShowCombinator).shownNames;
-      }
-      for (SimpleIdentifier name in names) {
-        String nameStr = name.name;
-        Element element = namespace.get(nameStr);
-        if (element == null) {
-          element = namespace.get("$nameStr=");
-        }
-        if (element != null) {
-          // Ensure that the name always resolves to a top-level variable
-          // rather than a getter or setter
-          if (element is PropertyAccessorElement) {
-            element = (element as PropertyAccessorElement).variable;
-          }
-          name.staticElement = element;
-        }
-      }
-    }
-  }
-
-  /**
-   * Given an invocation of the form 'C.x()' where 'C' is a class, find and return the element 'x'
-   * in 'C'.
-   *
-   * @param classElement the class element
-   * @param nameNode the member name node
-   */
-  Element _resolveElement(ClassElementImpl classElement, SimpleIdentifier nameNode) {
-    String name = nameNode.name;
-    Element element = classElement.getMethod(name);
-    if (element == null && nameNode.inSetterContext()) {
-      element = classElement.getSetter(name);
-    }
-    if (element == null && nameNode.inGetterContext()) {
-      element = classElement.getGetter(name);
-    }
-    if (element != null && element.isAccessibleIn(_definingLibrary)) {
-      return element;
-    }
-    return null;
-  }
-
-  /**
-   * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the element being invoked. If
-   * the returned element is a method, then the method will be invoked. If the returned element is a
-   * getter, the getter will be invoked without arguments and the result of that invocation will
-   * then be invoked with the arguments.
-   *
-   * @param methodName the name of the method being invoked ('m')
-   * @return the element being invoked
-   */
-  Element _resolveInvokedElement(SimpleIdentifier methodName) {
-    //
-    // Look first in the lexical scope.
-    //
-    Element element = _resolver.nameScope.lookup(methodName, _definingLibrary);
-    if (element == null) {
-      //
-      // If it isn't defined in the lexical scope, and the invocation is within a class, then look
-      // in the inheritance scope.
-      //
-      ClassElement enclosingClass = _resolver.enclosingClass;
-      if (enclosingClass != null) {
-        InterfaceType enclosingType = enclosingClass.type;
-        element = _lookUpMethod(null, enclosingType, methodName.name);
-        if (element == null) {
-          //
-          // If there's no method, then it's possible that 'm' is a getter that returns a function.
-          //
-          element = _lookUpGetter(null, enclosingType, methodName.name);
-        }
-      }
-    }
-    // TODO(brianwilkerson) Report this error.
-    return element;
-  }
-
-  /**
-   * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the element being invoked.
-   * If the returned element is a method, then the method will be invoked. If the returned element
-   * is a getter, the getter will be invoked without arguments and the result of that invocation
-   * will then be invoked with the arguments.
-   *
-   * @param target the target of the invocation ('e')
-   * @param targetType the type of the target
-   * @param methodName the name of the method being invoked ('m')
-   * @return the element being invoked
-   */
-  Element _resolveInvokedElementWithTarget(Expression target, DartType targetType, SimpleIdentifier methodName) {
-    if (targetType is InterfaceType || targetType is UnionType) {
-      Element element = _lookUpMethod(target, targetType, methodName.name);
-      if (element == null) {
-        //
-        // If there's no method, then it's possible that 'm' is a getter that returns a function.
-        //
-        // TODO (collinsn): need to add union type support here too, in the style of [lookUpMethod].
-        element = _lookUpGetter(target, targetType, methodName.name);
-      }
-      return element;
-    } else if (target is SimpleIdentifier) {
-      Element targetElement = target.staticElement;
-      if (targetElement is PrefixElement) {
-        //
-        // Look to see whether the name of the method is really part of a prefixed identifier for an
-        // imported top-level function or top-level getter that returns a function.
-        //
-        String name = "${target.name}.$methodName";
-        Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
-        Element element = _resolver.nameScope.lookup(functionName, _definingLibrary);
-        if (element != null) {
-          // TODO(brianwilkerson) This isn't a method invocation, it's a function invocation where
-          // the function name is a prefixed identifier. Consider re-writing the AST.
-          return element;
-        }
-      }
-    }
-    // TODO(brianwilkerson) Report this error.
-    return null;
-  }
-
-  /**
-   * Given that we are accessing a property of the given type with the given name, return the
-   * element that represents the property.
-   *
-   * @param target the target of the invocation ('e')
-   * @param targetType the type in which the search for the property should begin
-   * @param propertyName the name of the property being accessed
-   * @return the element that represents the property
-   */
-  ExecutableElement _resolveProperty(Expression target, DartType targetType, SimpleIdentifier propertyName) {
-    ExecutableElement memberElement = null;
-    if (propertyName.inSetterContext()) {
-      memberElement = _lookUpSetter(target, targetType, propertyName.name);
-    }
-    if (memberElement == null) {
-      memberElement = _lookUpGetter(target, targetType, propertyName.name);
-    }
-    if (memberElement == null) {
-      memberElement = _lookUpMethod(target, targetType, propertyName.name);
-    }
-    return memberElement;
-  }
-
-  void _resolvePropertyAccess(Expression target, SimpleIdentifier propertyName) {
-    DartType staticType = _getStaticType(target);
-    DartType propagatedType = _getPropagatedType(target);
-    Element staticElement = null;
-    Element propagatedElement = null;
-    //
-    // If this property access is of the form 'C.m' where 'C' is a class, then we don't call
-    // resolveProperty(..) which walks up the class hierarchy, instead we just look for the
-    // member in the type only.
-    //
-    ClassElementImpl typeReference = getTypeReference(target);
-    if (typeReference != null) {
-      // TODO(brianwilkerson) Why are we setting the propagated element here? It looks wrong.
-      staticElement = propagatedElement = _resolveElement(typeReference, propertyName);
-    } else {
-      staticElement = _resolveProperty(target, staticType, propertyName);
-      propagatedElement = _resolveProperty(target, propagatedType, propertyName);
-    }
-    // May be part of annotation, record property element only if exists.
-    // Error was already reported in validateAnnotationElement().
-    if (target.parent.parent is Annotation) {
-      if (staticElement != null) {
-        propertyName.staticElement = staticElement;
-      }
-      return;
-    }
-    propertyName.staticElement = staticElement;
-    propertyName.propagatedElement = propagatedElement;
-    bool shouldReportMissingMember_static = _shouldReportMissingMember(staticType, staticElement);
-    bool shouldReportMissingMember_propagated = !shouldReportMissingMember_static && _enableHints && _shouldReportMissingMember(propagatedType, propagatedElement) && !_memberFoundInSubclass(propagatedType.element, propertyName.name, false, true);
-    // TODO(collinsn): add support for errors on union types by extending
-    // [lookupGetter] and [lookupSetter] in analogy with the earlier [lookupMethod] extensions.
-    if (propagatedType is UnionType) {
-      shouldReportMissingMember_propagated = false;
-    }
-    if (shouldReportMissingMember_static || shouldReportMissingMember_propagated) {
-      Element staticOrPropagatedEnclosingElt = shouldReportMissingMember_static ? staticType.element : propagatedType.element;
-      bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt);
-      String displayName = staticOrPropagatedEnclosingElt != null ? staticOrPropagatedEnclosingElt.displayName : propagatedType != null ? propagatedType.displayName : staticType.displayName;
-      // Special getter cases.
-      if (propertyName.inGetterContext()) {
-        if (!isStaticProperty && staticOrPropagatedEnclosingElt is ClassElement) {
-          ClassElement classElement = staticOrPropagatedEnclosingElt;
-          InterfaceType targetType = classElement.type;
-          if (targetType != null && targetType.isDartCoreFunction && propertyName.name == FunctionElement.CALL_METHOD_NAME) {
-            // TODO(brianwilkerson) Can we ever resolve the function being invoked?
-            //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
-            return;
-          } else if (classElement.isEnum && propertyName.name == "_name") {
-            _resolver.reportErrorForNode(CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, propertyName, [propertyName.name]);
-            return;
-          }
-        }
-      }
-      Element declaringElement = staticType.isVoid ? null : staticOrPropagatedEnclosingElt;
-      if (propertyName.inSetterContext()) {
-        ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? StaticWarningCode.UNDEFINED_SETTER : StaticTypeWarningCode.UNDEFINED_SETTER);
-        ErrorCode errorCode = shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFINED_SETTER;
-        _recordUndefinedNode(declaringElement, errorCode, propertyName, [propertyName.name, displayName]);
-      } else if (propertyName.inGetterContext()) {
-        ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? StaticWarningCode.UNDEFINED_GETTER : StaticTypeWarningCode.UNDEFINED_GETTER);
-        ErrorCode errorCode = shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFINED_GETTER;
-        _recordUndefinedNode(declaringElement, errorCode, propertyName, [propertyName.name, displayName]);
-      } else {
-        _recordUndefinedNode(declaringElement, StaticWarningCode.UNDEFINED_IDENTIFIER, propertyName, [propertyName.name]);
-      }
-    }
-  }
-
-  /**
-   * Resolve the given simple identifier if possible. Return the element to which it could be
-   * resolved, or `null` if it could not be resolved. This does not record the results of the
-   * resolution.
-   *
-   * @param node the identifier to be resolved
-   * @return the element to which the identifier could be resolved
-   */
-  Element _resolveSimpleIdentifier(SimpleIdentifier node) {
-    Element element = _resolver.nameScope.lookup(node, _definingLibrary);
-    if (element is PropertyAccessorElement && node.inSetterContext()) {
-      PropertyInducingElement variable = (element as PropertyAccessorElement).variable;
-      if (variable != null) {
-        PropertyAccessorElement setter = variable.setter;
-        if (setter == null) {
-          //
-          // Check to see whether there might be a locally defined getter and an inherited setter.
-          //
-          ClassElement enclosingClass = _resolver.enclosingClass;
-          if (enclosingClass != null) {
-            setter = _lookUpSetter(null, enclosingClass.type, node.name);
-          }
-        }
-        if (setter != null) {
-          element = setter;
-        }
-      }
-    } else if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
-      element = _resolver.nameScope.lookup(new ElementResolver_SyntheticIdentifier("${node.name}="), _definingLibrary);
-    }
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    if (element == null && enclosingClass != null) {
-      InterfaceType enclosingType = enclosingClass.type;
-      if (element == null && (node.inSetterContext() || node.parent is CommentReference)) {
-        element = _lookUpSetter(null, enclosingType, node.name);
-      }
-      if (element == null && node.inGetterContext()) {
-        element = _lookUpGetter(null, enclosingType, node.name);
-      }
-      if (element == null) {
-        element = _lookUpMethod(null, enclosingType, node.name);
-      }
-    }
-    return element;
-  }
-
-  /**
-   * If the given type is a type parameter, resolve it to the type that should be used when looking
-   * up members. Otherwise, return the original type.
-   *
-   * @param type the type that is to be resolved if it is a type parameter
-   * @return the type that should be used in place of the argument if it is a type parameter, or the
-   *         original argument if it isn't a type parameter
-   */
-  DartType _resolveTypeParameter(DartType type) {
-    if (type is TypeParameterType) {
-      DartType bound = type.element.bound;
-      if (bound == null) {
-        return _resolver.typeProvider.objectType;
-      }
-      return bound;
-    }
-    return type;
-  }
-
-  /**
-   * Given a node that can have annotations associated with it and the element to which that node
-   * has been resolved, create the annotations in the element model representing the annotations on
-   * the node.
-   *
-   * @param element the element to which the node has been resolved
-   * @param node the node that can have annotations associated with it
-   */
-  void _setMetadata(Element element, AnnotatedNode node) {
-    if (element is! ElementImpl) {
-      return;
-    }
-    List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
-    _addAnnotations(annotationList, node.metadata);
-    if (node is VariableDeclaration && node.parent is VariableDeclarationList) {
-      VariableDeclarationList list = node.parent as VariableDeclarationList;
-      _addAnnotations(annotationList, list.metadata);
-      if (list.parent is FieldDeclaration) {
-        FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration;
-        _addAnnotations(annotationList, fieldDeclaration.metadata);
-      } else if (list.parent is TopLevelVariableDeclaration) {
-        TopLevelVariableDeclaration variableDeclaration = list.parent as TopLevelVariableDeclaration;
-        _addAnnotations(annotationList, variableDeclaration.metadata);
-      }
-    }
-    if (!annotationList.isEmpty) {
-      (element as ElementImpl).metadata = annotationList;
-    }
-  }
-
-  /**
-   * Given a node that can have annotations associated with it and the element to which that node
-   * has been resolved, create the annotations in the element model representing the annotations on
-   * the node.
-   *
-   * @param element the element to which the node has been resolved
-   * @param node the node that can have annotations associated with it
-   */
-  void _setMetadataForParameter(Element element, NormalFormalParameter node) {
-    if (element is! ElementImpl) {
-      return;
-    }
-    List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
-    _addAnnotations(annotationList, node.metadata);
-    if (!annotationList.isEmpty) {
-      (element as ElementImpl).metadata = annotationList;
-    }
-  }
-
-  /**
-   * Return `true` if we should report an error as a result of looking up a member in the
-   * given type and not finding any member.
-   *
-   * @param type the type in which we attempted to perform the look-up
-   * @param member the result of the look-up
-   * @return `true` if we should report an error
-   */
-  bool _shouldReportMissingMember(DartType type, Element member) {
-    if (member != null || type == null || type.isDynamic || type.isBottom) {
-      return false;
-    }
-    return true;
-  }
-}
-
-/**
- * Instances of the class `SyntheticIdentifier` implement an identifier that can be used to
- * look up names in the lexical scope when there is no identifier in the AST structure. There is
- * no identifier in the AST when the parser could not distinguish between a method invocation and
- * an invocation of a top-level function imported with a prefix.
- */
-class ElementResolver_SyntheticIdentifier extends Identifier {
-  /**
-   * The name of the synthetic identifier.
-   */
-  final String name;
-
-  /**
-   * Initialize a newly created synthetic identifier to have the given name.
-   *
-   * @param name the name of the synthetic identifier
-   */
-  ElementResolver_SyntheticIdentifier(this.name);
-
-  @override
-  accept(AstVisitor visitor) => null;
-
-  @override
-  sc.Token get beginToken => null;
-
-  @override
-  Element get bestElement => null;
-
-  @override
-  sc.Token get endToken => null;
-
-  @override
-  int get precedence => 16;
-
-  @override
-  Element get propagatedElement => null;
-
-  @override
-  Element get staticElement => null;
-
-  @override
-  void visitChildren(AstVisitor visitor) {
-  }
-}
-
-/**
  * Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
  * another scope.
  */
@@ -7428,5405 +4814,6 @@
 }
 
 /**
- * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
- * errors and warnings not covered by the parser and resolver.
- */
-class ErrorVerifier extends RecursiveAstVisitor<Object> {
-  /**
-   * Return the static type of the given expression that is to be used for type analysis.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the static type of the given expression
-   */
-  static DartType getStaticType(Expression expression) {
-    DartType type = expression.staticType;
-    if (type == null) {
-      // TODO(brianwilkerson) This should never happen.
-      return DynamicTypeImpl.instance;
-    }
-    return type;
-  }
-
-  /**
-   * Return the variable element represented by the given expression, or `null` if there is no
-   * such element.
-   *
-   * @param expression the expression whose element is to be returned
-   * @return the variable element represented by the expression
-   */
-  static VariableElement getVariableElement(Expression expression) {
-    if (expression is Identifier) {
-      Element element = expression.staticElement;
-      if (element is VariableElement) {
-        return element;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The error reporter by which errors will be reported.
-   */
-  final ErrorReporter _errorReporter;
-
-  /**
-   * The current library that is being analyzed.
-   */
-  final LibraryElement _currentLibrary;
-
-  /**
-   * The type representing the type 'bool'.
-   */
-  InterfaceType _boolType;
-
-  /**
-   * The type representing the type 'int'.
-   */
-  InterfaceType _intType;
-
-  /**
-   * The object providing access to the types defined by the language.
-   */
-  final TypeProvider _typeProvider;
-
-  /**
-   * The manager for the inheritance mappings.
-   */
-  final InheritanceManager _inheritanceManager;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a
-   * [ConstructorDeclaration] and the constructor is 'const'.
-   *
-   * @see #visitConstructorDeclaration(ConstructorDeclaration)
-   */
-  bool _isEnclosingConstructorConst = false;
-
-  /**
-   * A flag indicating whether we are currently within a function body marked as being asynchronous.
-   */
-  bool _inAsync = false;
-
-  /**
-   * A flag indicating whether we are currently within a function body marked as being a generator.
-   */
-  bool _inGenerator = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a
-   * [CatchClause].
-   *
-   * @see #visitCatchClause(CatchClause)
-   */
-  bool _isInCatchClause = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of an
-   * [Comment].
-   */
-  bool _isInComment = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of an
-   * [InstanceCreationExpression].
-   */
-  bool _isInConstInstanceCreation = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting children nodes of a native
-   * [ClassDeclaration].
-   */
-  bool _isInNativeClass = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a static variable
-   * declaration.
-   */
-  bool _isInStaticVariableDeclaration = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting an instance variable
-   * declaration.
-   */
-  bool _isInInstanceVariableDeclaration = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting an instance variable
-   * initializer.
-   */
-  bool _isInInstanceVariableInitializer = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a
-   * [ConstructorInitializer].
-   */
-  bool _isInConstructorInitializer = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a
-   * [FunctionTypedFormalParameter].
-   */
-  bool _isInFunctionTypedFormalParameter = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a static method. By "method"
-   * here getter, setter and operator declarations are also implied since they are all represented
-   * with a [MethodDeclaration] in the AST structure.
-   */
-  bool _isInStaticMethod = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting a factory constructor.
-   */
-  bool _isInFactory = false;
-
-  /**
-   * This is set to `true` iff the visitor is currently visiting code in the SDK.
-   */
-  bool _isInSystemLibrary = false;
-
-  /**
-   * A flag indicating whether the current library contains at least one import directive with a URI
-   * that uses the "dart-ext" scheme.
-   */
-  bool _hasExtUri = false;
-
-  /**
-   * This is set to `false` on the entry of every [BlockFunctionBody], and is restored
-   * to the enclosing value on exit. The value is used in
-   * [checkForMixedReturns] to prevent both
-   * [StaticWarningCode#MIXED_RETURN_TYPES] and [StaticWarningCode#RETURN_WITHOUT_VALUE]
-   * from being generated in the same function body.
-   */
-  bool _hasReturnWithoutValue = false;
-
-  /**
-   * The class containing the AST nodes being visited, or `null` if we are not in the scope of
-   * a class.
-   */
-  ClassElement _enclosingClass;
-
-  /**
-   * The method or function that we are currently visiting, or `null` if we are not inside a
-   * method or function.
-   */
-  ExecutableElement _enclosingFunction;
-
-  /**
-   * The return statements found in the method or function that we are currently visiting that have
-   * a return value.
-   */
-  List<ReturnStatement> _returnsWith = new List<ReturnStatement>();
-
-  /**
-   * The return statements found in the method or function that we are currently visiting that do
-   * not have a return value.
-   */
-  List<ReturnStatement> _returnsWithout = new List<ReturnStatement>();
-
-  /**
-   * This map is initialized when visiting the contents of a class declaration. If the visitor is
-   * not in an enclosing class declaration, then the map is set to `null`.
-   *
-   * When set the map maps the set of [FieldElement]s in the class to an
-   * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
-   * methods, specifically [checkForAllFinalInitializedErrorCodes],
-   * can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
-   * only ever make a copy, or read from this map after it has been set in
-   * [visitClassDeclaration].
-   *
-   * @see #visitClassDeclaration(ClassDeclaration)
-   * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
-   */
-  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
-
-  /**
-   * A table mapping name of the library to the export directive which export this library.
-   */
-  HashMap<String, LibraryElement> _nameToExportElement = new HashMap<String, LibraryElement>();
-
-  /**
-   * A table mapping name of the library to the import directive which import this library.
-   */
-  HashMap<String, LibraryElement> _nameToImportElement = new HashMap<String, LibraryElement>();
-
-  /**
-   * A table mapping names to the exported elements.
-   */
-  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
-
-  /**
-   * A set of the names of the variable initializers we are visiting now.
-   */
-  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer = new HashSet<String>();
-
-  /**
-   * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
-   * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
-   */
-  List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
-
-  /**
-   * Static final string with value `"getter "` used in the construction of the
-   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
-   * code messages.
-   *
-   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
-   */
-  static String _GETTER_SPACE = "getter ";
-
-  /**
-   * Static final string with value `"setter "` used in the construction of the
-   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
-   * code messages.
-   *
-   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
-   */
-  static String _SETTER_SPACE = "setter ";
-
-  /**
-   * Initialize the [ErrorVerifier] visitor.
-   */
-  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider, this._inheritanceManager) {
-    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
-    this._hasExtUri = _currentLibrary.hasExtUri;
-    _isEnclosingConstructorConst = false;
-    _isInCatchClause = false;
-    _isInStaticVariableDeclaration = false;
-    _isInInstanceVariableDeclaration = false;
-    _isInInstanceVariableInitializer = false;
-    _isInConstructorInitializer = false;
-    _isInStaticMethod = false;
-    _boolType = _typeProvider.boolType;
-    _intType = _typeProvider.intType;
-    _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
-        _typeProvider.nullType,
-        _typeProvider.numType,
-        _intType,
-        _typeProvider.doubleType,
-        _boolType,
-        _typeProvider.stringType];
-  }
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    _checkForInvalidAnnotationFromDeferredLibrary(node);
-    return super.visitAnnotation(node);
-  }
-
-  @override
-  Object visitArgumentList(ArgumentList node) {
-    _checkForArgumentTypesNotAssignableInList(node);
-    return super.visitArgumentList(node);
-  }
-
-  @override
-  Object visitAsExpression(AsExpression node) {
-    _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitAsExpression(node);
-  }
-
-  @override
-  Object visitAssertStatement(AssertStatement node) {
-    _checkForNonBoolExpression(node);
-    return super.visitAssertStatement(node);
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.TokenType operatorType = node.operator.type;
-    Expression lhs = node.leftHandSide;
-    Expression rhs = node.rightHandSide;
-    if (operatorType == sc.TokenType.EQ) {
-      _checkForInvalidAssignment(lhs, rhs);
-    } else {
-      _checkForInvalidCompoundAssignment(node, lhs, rhs);
-      _checkForArgumentTypeNotAssignableForArgument(rhs);
-    }
-    _checkForAssignmentToFinal(lhs);
-    return super.visitAssignmentExpression(node);
-  }
-
-  @override
-  Object visitAwaitExpression(AwaitExpression node) {
-    if (!_inAsync) {
-      _errorReporter.reportErrorForToken(CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword, []);
-    }
-    return super.visitAwaitExpression(node);
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    sc.Token operator = node.operator;
-    sc.TokenType type = operator.type;
-    if (type == sc.TokenType.AMPERSAND_AMPERSAND || type == sc.TokenType.BAR_BAR) {
-      String lexeme = operator.lexeme;
-      _checkForAssignability(node.leftOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
-      _checkForAssignability(node.rightOperand, _boolType, StaticTypeWarningCode.NON_BOOL_OPERAND, [lexeme]);
-    } else {
-      _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
-    }
-    return super.visitBinaryExpression(node);
-  }
-
-  @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
-    bool wasInAsync = _inAsync;
-    bool wasInGenerator = _inGenerator;
-    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
-    _hasReturnWithoutValue = false;
-    List<ReturnStatement> previousReturnsWith = _returnsWith;
-    List<ReturnStatement> previousReturnsWithout = _returnsWithout;
-    try {
-      _inAsync = node.isAsynchronous;
-      _inGenerator = node.isGenerator;
-      _returnsWith = new List<ReturnStatement>();
-      _returnsWithout = new List<ReturnStatement>();
-      super.visitBlockFunctionBody(node);
-      _checkForMixedReturns(node);
-    } finally {
-      _inAsync = wasInAsync;
-      _inGenerator = wasInGenerator;
-      _returnsWith = previousReturnsWith;
-      _returnsWithout = previousReturnsWithout;
-      _hasReturnWithoutValue = previousHasReturnWithoutValue;
-    }
-    return null;
-  }
-
-  @override
-  Object visitBreakStatement(BreakStatement node) {
-    SimpleIdentifier labelNode = node.label;
-    if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
-      if (labelElement is LabelElementImpl && labelElement.isOnSwitchMember) {
-        _errorReporter.reportErrorForNode(ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode, []);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    bool previousIsInCatchClause = _isInCatchClause;
-    try {
-      _isInCatchClause = true;
-      _checkForTypeAnnotationDeferredClass(node.exceptionType);
-      return super.visitCatchClause(node);
-    } finally {
-      _isInCatchClause = previousIsInCatchClause;
-    }
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
-    try {
-      _isInNativeClass = node.nativeClause != null;
-      _enclosingClass = node.element;
-      ExtendsClause extendsClause = node.extendsClause;
-      ImplementsClause implementsClause = node.implementsClause;
-      WithClause withClause = node.withClause;
-      _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
-      _checkForMemberWithClassName();
-      _checkForNoDefaultSuperConstructorImplicit(node);
-      _checkForConflictingTypeVariableErrorCodes(node);
-      // Only do error checks on the clause nodes if there is a non-null clause
-      if (implementsClause != null || extendsClause != null || withClause != null) {
-        // Only check for all of the inheritance logic around clauses if there isn't an error code
-        // such as "Cannot extend double" already on the class.
-        if (!_checkForImplementsDisallowedClass(implementsClause) && !_checkForExtendsDisallowedClass(extendsClause) && !_checkForAllMixinErrorCodes(withClause)) {
-          _checkForExtendsDeferredClass(extendsClause);
-          _checkForImplementsDeferredClass(implementsClause);
-          _checkForNonAbstractClassInheritsAbstractMember(node.name);
-          _checkForInconsistentMethodInheritance();
-          _checkForRecursiveInterfaceInheritance(_enclosingClass);
-          _checkForConflictingGetterAndMethod();
-          _checkForConflictingInstanceGetterAndSuperclassMember();
-          _checkImplementsSuperClass(node);
-          _checkImplementsFunctionWithoutCall(node);
-        }
-      }
-      // initialize initialFieldElementsMap
-      if (_enclosingClass != null) {
-        List<FieldElement> fieldElements = _enclosingClass.fields;
-        _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
-        for (FieldElement fieldElement in fieldElements) {
-          if (!fieldElement.isSynthetic) {
-            _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
-          }
-        }
-      }
-      _checkForFinalNotInitializedInClass(node);
-      _checkForDuplicateDefinitionInheritance();
-      _checkForConflictingInstanceMethodSetter(node);
-      return super.visitClassDeclaration(node);
-    } finally {
-      _isInNativeClass = false;
-      _initialFieldElementsMap = null;
-      _enclosingClass = outerClass;
-    }
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    ClassElement outerClassElement = _enclosingClass;
-    try {
-      _enclosingClass = node.element;
-      ImplementsClause implementsClause = node.implementsClause;
-      // Only check for all of the inheritance logic around clauses if there isn't an error code
-      // such as "Cannot extend double" already on the class.
-      if (!_checkForExtendsDisallowedClassInTypeAlias(node) && !_checkForImplementsDisallowedClass(implementsClause) && !_checkForAllMixinErrorCodes(node.withClause)) {
-        _checkForExtendsDeferredClassInTypeAlias(node);
-        _checkForImplementsDeferredClass(implementsClause);
-        _checkForRecursiveInterfaceInheritance(_enclosingClass);
-        _checkForNonAbstractClassInheritsAbstractMember(node.name);
-      }
-    } finally {
-      _enclosingClass = outerClassElement;
-    }
-    return super.visitClassTypeAlias(node);
-  }
-
-  @override
-  Object visitComment(Comment node) {
-    _isInComment = true;
-    try {
-      return super.visitComment(node);
-    } finally {
-      _isInComment = false;
-    }
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    _checkForDeferredPrefixCollisions(node);
-    return super.visitCompilationUnit(node);
-  }
-
-  @override
-  Object visitConditionalExpression(ConditionalExpression node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitConditionalExpression(node);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    try {
-      ConstructorElement constructorElement = node.element;
-      _enclosingFunction = constructorElement;
-      _isEnclosingConstructorConst = node.constKeyword != null;
-      _isInFactory = node.factoryKeyword != null;
-      _checkForInvalidModifierOnBody(node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR);
-      _checkForConstConstructorWithNonFinalField(node, constructorElement);
-      _checkForConstConstructorWithNonConstSuper(node);
-      _checkForConflictingConstructorNameAndMember(node, constructorElement);
-      _checkForAllFinalInitializedErrorCodes(node);
-      _checkForRedirectingConstructorErrorCodes(node);
-      _checkForMultipleSuperInitializers(node);
-      _checkForRecursiveConstructorRedirect(node, constructorElement);
-      if (!_checkForRecursiveFactoryRedirect(node, constructorElement)) {
-        _checkForAllRedirectConstructorErrorCodes(node);
-      }
-      _checkForUndefinedConstructorInInitializerImplicit(node);
-      _checkForRedirectToNonConstConstructor(node, constructorElement);
-      _checkForReturnInGenerativeConstructor(node);
-      return super.visitConstructorDeclaration(node);
-    } finally {
-      _isEnclosingConstructorConst = false;
-      _isInFactory = false;
-      _enclosingFunction = outerFunction;
-    }
-  }
-
-  @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    _isInConstructorInitializer = true;
-    try {
-      SimpleIdentifier fieldName = node.fieldName;
-      Element staticElement = fieldName.staticElement;
-      _checkForInvalidField(node, fieldName, staticElement);
-      _checkForFieldInitializerNotAssignable(node, staticElement);
-      return super.visitConstructorFieldInitializer(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitContinueStatement(ContinueStatement node) {
-    SimpleIdentifier labelNode = node.label;
-    if (labelNode != null) {
-      Element labelElement = labelNode.staticElement;
-      if (labelElement is LabelElementImpl && labelElement.isOnSwitchStatement) {
-        _errorReporter.reportErrorForNode(ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode, []);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
-    _checkForInvalidAssignment(node.identifier, node.defaultValue);
-    _checkForDefaultValueInFunctionTypedParameter(node);
-    return super.visitDefaultFormalParameter(node);
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitDoStatement(node);
-  }
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    ExportElement exportElement = node.element;
-    if (exportElement != null) {
-      LibraryElement exportedLibrary = exportElement.exportedLibrary;
-      _checkForAmbiguousExport(node, exportElement, exportedLibrary);
-      _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
-      _checkForExportInternalLibrary(node, exportElement);
-    }
-    return super.visitExportDirective(node);
-  }
-
-  @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    bool wasInAsync = _inAsync;
-    bool wasInGenerator = _inGenerator;
-    try {
-      _inAsync = node.isAsynchronous;
-      _inGenerator = node.isGenerator;
-      FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-      DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-      _checkForReturnOfInvalidType(node.expression, expectedReturnType);
-      return super.visitExpressionFunctionBody(node);
-    } finally {
-      _inAsync = wasInAsync;
-      _inGenerator = wasInGenerator;
-    }
-  }
-
-  @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
-    _isInStaticVariableDeclaration = node.isStatic;
-    _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
-    if (_isInInstanceVariableDeclaration) {
-      VariableDeclarationList variables = node.fields;
-      if (variables.isConst) {
-        _errorReporter.reportErrorForToken(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
-      }
-    }
-    try {
-      _checkForAllInvalidOverrideErrorCodesForField(node);
-      return super.visitFieldDeclaration(node);
-    } finally {
-      _isInStaticVariableDeclaration = false;
-      _isInInstanceVariableDeclaration = false;
-    }
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    _checkForValidField(node);
-    _checkForConstFormalParameter(node);
-    _checkForPrivateOptionalParameter(node);
-    _checkForFieldInitializingFormalRedirectingConstructor(node);
-    _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitFieldFormalParameter(node);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    ExecutableElement outerFunction = _enclosingFunction;
-    try {
-      SimpleIdentifier identifier = node.name;
-      String methodName = "";
-      if (identifier != null) {
-        methodName = identifier.name;
-      }
-      _enclosingFunction = node.element;
-      TypeName returnType = node.returnType;
-      if (node.isSetter || node.isGetter) {
-        _checkForMismatchedAccessorTypes(node, methodName);
-        if (node.isSetter) {
-          FunctionExpression functionExpression = node.functionExpression;
-          if (functionExpression != null) {
-            _checkForWrongNumberOfParametersForSetter(identifier, functionExpression.parameters);
-          }
-          _checkForNonVoidReturnTypeForSetter(returnType);
-        }
-      }
-      if (node.isSetter) {
-        _checkForInvalidModifierOnBody(node.functionExpression.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
-      }
-      _checkForTypeAnnotationDeferredClass(returnType);
-      return super.visitFunctionDeclaration(node);
-    } finally {
-      _enclosingFunction = outerFunction;
-    }
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    // If this function expression is wrapped in a function declaration, don't change the
-    // enclosingFunction field.
-    if (node.parent is! FunctionDeclaration) {
-      ExecutableElement outerFunction = _enclosingFunction;
-      try {
-        _enclosingFunction = node.element;
-        return super.visitFunctionExpression(node);
-      } finally {
-        _enclosingFunction = outerFunction;
-      }
-    } else {
-      return super.visitFunctionExpression(node);
-    }
-  }
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    Expression functionExpression = node.function;
-    DartType expressionType = functionExpression.staticType;
-    if (!_isFunctionType(expressionType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, functionExpression, []);
-    }
-    return super.visitFunctionExpressionInvocation(node);
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    _checkForDefaultValueInFunctionTypeAlias(node);
-    _checkForTypeAliasCannotReferenceItself_function(node);
-    return super.visitFunctionTypeAlias(node);
-  }
-
-  @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    bool old = _isInFunctionTypedFormalParameter;
-    _isInFunctionTypedFormalParameter = true;
-    try {
-      _checkForTypeAnnotationDeferredClass(node.returnType);
-      return super.visitFunctionTypedFormalParameter(node);
-    } finally {
-      _isInFunctionTypedFormalParameter = old;
-    }
-  }
-
-  @override
-  Object visitIfStatement(IfStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitIfStatement(node);
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    ImportElement importElement = node.element;
-    if (importElement != null) {
-      _checkForImportDuplicateLibraryName(node, importElement);
-      _checkForImportInternalLibrary(node, importElement);
-    }
-    return super.visitImportDirective(node);
-  }
-
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    _checkForArgumentTypeNotAssignableForArgument(node.index);
-    return super.visitIndexExpression(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _isInConstInstanceCreation = node.isConst;
-    try {
-      ConstructorName constructorName = node.constructorName;
-      TypeName typeName = constructorName.type;
-      DartType type = typeName.type;
-      if (type is InterfaceType) {
-        InterfaceType interfaceType = type;
-        _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
-        _checkForConstOrNewWithEnum(node, typeName, interfaceType);
-        if (_isInConstInstanceCreation) {
-          _checkForConstWithNonConst(node);
-          _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
-          _checkForConstWithTypeParameters(typeName);
-          _checkForConstDeferredClass(node, constructorName, typeName);
-        } else {
-          _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
-        }
-      }
-      return super.visitInstanceCreationExpression(node);
-    } finally {
-      _isInConstInstanceCreation = false;
-    }
-  }
-
-  @override
-  Object visitIsExpression(IsExpression node) {
-    _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitIsExpression(node);
-  }
-
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      if (node.constKeyword != null) {
-        NodeList<TypeName> arguments = typeArguments.arguments;
-        if (arguments.length != 0) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
-        }
-      }
-      _checkForExpectedOneListTypeArgument(node, typeArguments);
-      _checkForListElementTypeNotAssignable(node, typeArguments);
-    }
-    return super.visitListLiteral(node);
-  }
-
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      NodeList<TypeName> arguments = typeArguments.arguments;
-      if (arguments.length != 0) {
-        if (node.constKeyword != null) {
-          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
-        }
-      }
-      _checkExpectedTwoMapTypeArguments(typeArguments);
-      _checkForMapTypeNotAssignable(node, typeArguments);
-    }
-    _checkForNonConstMapAsExpressionStatement(node);
-    return super.visitMapLiteral(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    ExecutableElement previousFunction = _enclosingFunction;
-    try {
-      _isInStaticMethod = node.isStatic;
-      _enclosingFunction = node.element;
-      SimpleIdentifier identifier = node.name;
-      String methodName = "";
-      if (identifier != null) {
-        methodName = identifier.name;
-      }
-      TypeName returnTypeName = node.returnType;
-      if (node.isSetter || node.isGetter) {
-        _checkForMismatchedAccessorTypes(node, methodName);
-      }
-      if (node.isGetter) {
-        _checkForVoidReturnType(node);
-        _checkForConflictingStaticGetterAndInstanceSetter(node);
-      } else if (node.isSetter) {
-        _checkForInvalidModifierOnBody(node.body, CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER);
-        _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
-        _checkForNonVoidReturnTypeForSetter(returnTypeName);
-        _checkForConflictingStaticSetterAndInstanceMember(node);
-      } else if (node.isOperator) {
-        _checkForOptionalParameterInOperator(node);
-        _checkForWrongNumberOfParametersForOperator(node);
-        _checkForNonVoidReturnTypeForOperator(node);
-      }
-      _checkForConcreteClassWithAbstractMember(node);
-      _checkForAllInvalidOverrideErrorCodesForMethod(node);
-      _checkForTypeAnnotationDeferredClass(returnTypeName);
-      return super.visitMethodDeclaration(node);
-    } finally {
-      _enclosingFunction = previousFunction;
-      _isInStaticMethod = false;
-    }
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    Expression target = node.realTarget;
-    SimpleIdentifier methodName = node.methodName;
-    if (target != null) {
-      ClassElement typeReference = ElementResolver.getTypeReference(target);
-      _checkForStaticAccessToInstanceMember(typeReference, methodName);
-      _checkForInstanceAccessToStaticMember(typeReference, methodName);
-    } else {
-      _checkForUnqualifiedReferenceToNonLocalStaticMember(methodName);
-    }
-    return super.visitMethodInvocation(node);
-  }
-
-  @override
-  Object visitNativeClause(NativeClause node) {
-    // TODO(brianwilkerson) Figure out the right rule for when 'native' is allowed.
-    if (!_isInSystemLibrary) {
-      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node, []);
-    }
-    return super.visitNativeClause(node);
-  }
-
-  @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
-    _checkForNativeFunctionBodyInNonSDKCode(node);
-    return super.visitNativeFunctionBody(node);
-  }
-
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    _checkForAssignmentToFinal(node.operand);
-    _checkForIntNotAssignable(node.operand);
-    return super.visitPostfixExpression(node);
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (node.parent is! Annotation) {
-      ClassElement typeReference = ElementResolver.getTypeReference(node.prefix);
-      SimpleIdentifier name = node.identifier;
-      _checkForStaticAccessToInstanceMember(typeReference, name);
-      _checkForInstanceAccessToStaticMember(typeReference, name);
-    }
-    return super.visitPrefixedIdentifier(node);
-  }
-
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    sc.TokenType operatorType = node.operator.type;
-    Expression operand = node.operand;
-    if (operatorType == sc.TokenType.BANG) {
-      _checkForNonBoolNegationExpression(operand);
-    } else if (operatorType.isIncrementOperator) {
-      _checkForAssignmentToFinal(operand);
-    }
-    _checkForIntNotAssignable(operand);
-    return super.visitPrefixExpression(node);
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    ClassElement typeReference = ElementResolver.getTypeReference(node.realTarget);
-    SimpleIdentifier propertyName = node.propertyName;
-    _checkForStaticAccessToInstanceMember(typeReference, propertyName);
-    _checkForInstanceAccessToStaticMember(typeReference, propertyName);
-    return super.visitPropertyAccess(node);
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    _isInConstructorInitializer = true;
-    try {
-      return super.visitRedirectingConstructorInvocation(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitRethrowExpression(RethrowExpression node) {
-    _checkForRethrowOutsideCatch(node);
-    return super.visitRethrowExpression(node);
-  }
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    if (node.expression == null) {
-      _returnsWithout.add(node);
-    } else {
-      _returnsWith.add(node);
-    }
-    _checkForAllReturnStatementErrorCodes(node);
-    return super.visitReturnStatement(node);
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    _checkForConstFormalParameter(node);
-    _checkForPrivateOptionalParameter(node);
-    _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    _checkForImplicitThisReferenceInInitializer(node);
-    if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
-      _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
-    }
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    _isInConstructorInitializer = true;
-    try {
-      return super.visitSuperConstructorInvocation(node);
-    } finally {
-      _isInConstructorInitializer = false;
-    }
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    _checkForSwitchExpressionNotAssignable(node);
-    _checkForCaseBlocksNotTerminated(node);
-    _checkForMissingEnumConstantInSwitch(node);
-    return super.visitSwitchStatement(node);
-  }
-
-  @override
-  Object visitThisExpression(ThisExpression node) {
-    _checkForInvalidReferenceToThis(node);
-    return super.visitThisExpression(node);
-  }
-
-  @override
-  Object visitThrowExpression(ThrowExpression node) {
-    _checkForConstEvalThrowsException(node);
-    return super.visitThrowExpression(node);
-  }
-
-  @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    _checkForFinalNotInitialized(node.variables);
-    return super.visitTopLevelVariableDeclaration(node);
-  }
-
-  @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
-    NodeList<TypeName> list = node.arguments;
-    for (TypeName typeName in list) {
-      _checkForTypeAnnotationDeferredClass(typeName);
-    }
-    return super.visitTypeArgumentList(node);
-  }
-
-  @override
-  Object visitTypeName(TypeName node) {
-    _checkForTypeArgumentNotMatchingBounds(node);
-    _checkForTypeParameterReferencedByStatic(node);
-    return super.visitTypeName(node);
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    _checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
-    _checkForTypeParameterSupertypeOfItsBound(node);
-    _checkForTypeAnnotationDeferredClass(node.bound);
-    return super.visitTypeParameter(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    SimpleIdentifier nameNode = node.name;
-    Expression initializerNode = node.initializer;
-    // do checks
-    _checkForInvalidAssignment(nameNode, initializerNode);
-    // visit name
-    nameNode.accept(this);
-    // visit initializer
-    String name = nameNode.name;
-    _namesForReferenceToDeclaredVariableInInitializer.add(name);
-    _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
-    try {
-      if (initializerNode != null) {
-        initializerNode.accept(this);
-      }
-    } finally {
-      _isInInstanceVariableInitializer = false;
-      _namesForReferenceToDeclaredVariableInInitializer.remove(name);
-    }
-    // done
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitVariableDeclarationList(node);
-  }
-
-  @override
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    _checkForFinalNotInitialized(node.variables);
-    return super.visitVariableDeclarationStatement(node);
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    _checkForNonBoolCondition(node.condition);
-    return super.visitWhileStatement(node);
-  }
-
-  @override
-  Object visitYieldStatement(YieldStatement node) {
-    if (!_inGenerator) {
-      CompileTimeErrorCode errorCode;
-      if (node.star != null) {
-        errorCode = CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR;
-      } else {
-        errorCode = CompileTimeErrorCode.YIELD_IN_NON_GENERATOR;
-      }
-      _errorReporter.reportErrorForNode(errorCode, node, []);
-    }
-    return super.visitYieldStatement(node);
-  }
-
-  /**
-   * This verifies if the passed map literal has type arguments then there is exactly two.
-   *
-   * @param typeArguments the type arguments, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#EXPECTED_TWO_MAP_TYPE_ARGUMENTS
-   */
-  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
-    // check number of type arguments
-    int num = typeArguments.arguments.length;
-    if (num == 2) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, [num]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed constructor declaration does not violate any of the error codes
-   * relating to the initialization of fields in the enclosing class.
-   *
-   * @param node the [ConstructorDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #initialFieldElementsMap
-   * @see CompileTimeErrorCode#FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR
-   * @see CompileTimeErrorCode#FINAL_INITIALIZED_MULTIPLE_TIMES
-   */
-  bool _checkForAllFinalInitializedErrorCodes(ConstructorDeclaration node) {
-    if (node.factoryKeyword != null || node.redirectedConstructor != null || node.externalKeyword != null) {
-      return false;
-    }
-    // Ignore if native class.
-    if (_isInNativeClass) {
-      return false;
-    }
-    bool foundError = false;
-    HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
-    // Visit all of the field formal parameters
-    NodeList<FormalParameter> formalParameters = node.parameters.parameters;
-    for (FormalParameter formalParameter in formalParameters) {
-      FormalParameter parameter = formalParameter;
-      if (parameter is DefaultFormalParameter) {
-        parameter = (parameter as DefaultFormalParameter).parameter;
-      }
-      if (parameter is FieldFormalParameter) {
-        FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
-        INIT_STATE state = fieldElementsMap[fieldElement];
-        if (state == INIT_STATE.NOT_INIT) {
-          fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
-        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
-            foundError = true;
-          }
-        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
-          if (fieldElement.isFinal || fieldElement.isConst) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    // Visit all of the initializers
-    NodeList<ConstructorInitializer> initializers = node.initializers;
-    for (ConstructorInitializer constructorInitializer in initializers) {
-      if (constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
-      }
-      if (constructorInitializer is ConstructorFieldInitializer) {
-        ConstructorFieldInitializer constructorFieldInitializer = constructorInitializer;
-        SimpleIdentifier fieldName = constructorFieldInitializer.fieldName;
-        Element element = fieldName.staticElement;
-        if (element is FieldElement) {
-          FieldElement fieldElement = element;
-          INIT_STATE state = fieldElementsMap[fieldElement];
-          if (state == INIT_STATE.NOT_INIT) {
-            fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
-          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
-            if (fieldElement.isFinal || fieldElement.isConst) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
-              foundError = true;
-            }
-          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
-            foundError = true;
-          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    // Visit all of the states in the map to ensure that none were never
-    // initialized.
-    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
-      if (state == INIT_STATE.NOT_INIT) {
-        if (fieldElement.isConst) {
-          _errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.CONST_NOT_INITIALIZED,
-                  node.returnType,
-                  [fieldElement.name]);
-          foundError = true;
-        } else if (fieldElement.isFinal) {
-          _errorReporter.reportErrorForNode(
-              StaticWarningCode.FINAL_NOT_INITIALIZED,
-                  node.returnType,
-                  [fieldElement.name]);
-          foundError = true;
-        }
-      }
-    });
-    return foundError;
-  }
-
-  /**
-   * This checks the passed executable element against override-error codes.
-   *
-   * @param executableElement a non-null [ExecutableElement] to evaluate
-   * @param overriddenExecutable the element that the executableElement is overriding
-   * @param parameters the parameters of the executable element
-   * @param errorNameTarget the node to report problems on
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL
-   * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED
-   * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE
-   * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-   */
-  bool _checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, ExecutableElement overriddenExecutable, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
-    bool isGetter = false;
-    bool isSetter = false;
-    if (executableElement is PropertyAccessorElement) {
-      PropertyAccessorElement accessorElement = executableElement;
-      isGetter = accessorElement.isGetter;
-      isSetter = accessorElement.isSetter;
-    }
-    String executableElementName = executableElement.name;
-    FunctionType overridingFT = executableElement.type;
-    FunctionType overriddenFT = overriddenExecutable.type;
-    InterfaceType enclosingType = _enclosingClass.type;
-    overriddenFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(overriddenFT, executableElementName, enclosingType);
-    if (overridingFT == null || overriddenFT == null) {
-      return false;
-    }
-    DartType overridingFTReturnType = overridingFT.returnType;
-    DartType overriddenFTReturnType = overriddenFT.returnType;
-    List<DartType> overridingNormalPT = overridingFT.normalParameterTypes;
-    List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes;
-    List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes;
-    List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes;
-    Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes;
-    Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes;
-    // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and CTEC.INVALID_OVERRIDE_NAMED
-    if (overridingNormalPT.length > overriddenNormalPT.length) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
-          overriddenNormalPT.length,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    if (overridingNormalPT.length + overridingPositionalPT.length < overriddenPositionalPT.length + overriddenNormalPT.length) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
-          overriddenPositionalPT.length + overriddenNormalPT.length,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    // For each named parameter in the overridden method, verify that there is
-    // the same name in the overriding method.
-    for (String overriddenParamName in overriddenNamedPT.keys) {
-      if (!overridingNamedPT.containsKey(overriddenParamName)) {
-        // The overridden method expected the overriding method to have
-        // overridingParamName, but it does not.
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.INVALID_OVERRIDE_NAMED,
-            errorNameTarget,
-            [overriddenParamName,
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
-    if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportTypeErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
-          overridingFTReturnType,
-          overriddenFTReturnType,
-          overriddenExecutable.enclosingElement.displayName]);
-      return true;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
-    if (parameterLocations == null) {
-      return false;
-    }
-    int parameterIndex = 0;
-    for (int i = 0; i < overridingNormalPT.length; i++) {
-      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportTypeErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingNormalPT[i],
-            overriddenNormalPT[i],
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-      parameterIndex++;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
-    for (int i = 0; i < overriddenPositionalPT.length; i++) {
-      if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingPositionalPT[i],
-            overriddenPositionalPT[i],
-            overriddenExecutable.enclosingElement.displayName]);
-        return true;
-      }
-      parameterIndex++;
-    }
-    // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    for (String overriddenName in overriddenNamedPT.keys) {
-      DartType overridingType = overridingNamedPT[overriddenName];
-      if (overridingType == null) {
-        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been
-        // created above if this could be reached.
-        continue;
-      }
-      DartType overriddenType = overriddenNamedPT[overriddenName];
-      if (!overriddenType.isAssignableTo(overridingType)) {
-        // lookup the parameter for the error to select
-        ParameterElement parameterToSelect = null;
-        AstNode parameterLocationToSelect = null;
-        for (int i = 0; i < parameters.length; i++) {
-          ParameterElement parameter = parameters[i];
-          if (parameter.parameterKind == ParameterKind.NAMED
-              && overriddenName == parameter.name) {
-            parameterToSelect = parameter;
-            parameterLocationToSelect = parameterLocations[i];
-            break;
-          }
-        }
-        if (parameterToSelect != null) {
-          _errorReporter.reportTypeErrorForNode(
-              StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
-              parameterLocationToSelect,
-              [overridingType,
-              overriddenType,
-              overriddenExecutable.enclosingElement.displayName]);
-          return true;
-        }
-      }
-    }
-    // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    //
-    // Create three arrays: an array of the optional parameter ASTs (FormalParameters), an array of
-    // the optional parameters elements from our method, and finally an array of the optional
-    // parameter elements from the method we are overriding.
-    //
-    bool foundError = false;
-    List<AstNode> formalParameters = new List<AstNode>();
-    List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>();
-    List<ParameterElementImpl> overriddenParameterElts = new List<ParameterElementImpl>();
-    List<ParameterElement> overriddenPEs = overriddenExecutable.parameters;
-    for (int i = 0; i < parameters.length; i++) {
-      ParameterElement parameter = parameters[i];
-      if (parameter.parameterKind.isOptional) {
-        formalParameters.add(parameterLocations[i]);
-        parameterElts.add(parameter as ParameterElementImpl);
-      }
-    }
-    for (ParameterElement parameterElt in overriddenPEs) {
-      if (parameterElt.parameterKind.isOptional) {
-        if (parameterElt is ParameterElementImpl) {
-          overriddenParameterElts.add(parameterElt);
-        }
-      }
-    }
-    //
-    // Next compare the list of optional parameter elements to the list of overridden optional
-    // parameter elements.
-    //
-    if (parameterElts.length > 0) {
-      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
-        // Named parameters, consider the names when matching the parameterElts to the overriddenParameterElts
-        for (int i = 0; i < parameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (_isUserDefinedObject(result)) {
-            continue;
-          }
-          String parameterName = parameterElt.name;
-          for (int j = 0; j < overriddenParameterElts.length; j++) {
-            ParameterElementImpl overriddenParameterElt = overriddenParameterElts[j];
-            String overriddenParameterName = overriddenParameterElt.name;
-            if (parameterName != null && parameterName == overriddenParameterName) {
-              EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-              if (_isUserDefinedObject(overriddenResult)) {
-                break;
-              }
-              if (!result.equalValues(_typeProvider, overriddenResult)) {
-                _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, formalParameters[i], [
-                    overriddenExecutable.enclosingElement.displayName,
-                    overriddenExecutable.displayName,
-                    parameterName]);
-                foundError = true;
-              }
-            }
-          }
-        }
-      } else {
-        // Positional parameters, consider the positions when matching the parameterElts to the overriddenParameterElts
-        for (int i = 0; i < parameterElts.length && i < overriddenParameterElts.length; i++) {
-          ParameterElementImpl parameterElt = parameterElts[i];
-          EvaluationResultImpl result = parameterElt.evaluationResult;
-          // TODO (jwren) Ignore Object types, see Dart bug 11287
-          if (_isUserDefinedObject(result)) {
-            continue;
-          }
-          ParameterElementImpl overriddenParameterElt = overriddenParameterElts[i];
-          EvaluationResultImpl overriddenResult = overriddenParameterElt.evaluationResult;
-          if (_isUserDefinedObject(overriddenResult)) {
-            continue;
-          }
-          if (!result.equalValues(_typeProvider, overriddenResult)) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, formalParameters[i], [
-                overriddenExecutable.enclosingElement.displayName,
-                overriddenExecutable.displayName]);
-            foundError = true;
-          }
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks the passed executable element against override-error codes. This method computes
-   * the passed executableElement is overriding and calls
-   * [checkForAllInvalidOverrideErrorCodes]
-   * when the [InheritanceManager] returns a [MultiplyInheritedExecutableElement], this
-   * method loops through the array in the [MultiplyInheritedExecutableElement].
-   *
-   * @param executableElement a non-null [ExecutableElement] to evaluate
-   * @param parameters the parameters of the executable element
-   * @param errorNameTarget the node to report problems on
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForExecutable(ExecutableElement executableElement, List<ParameterElement> parameters, List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) {
-    //
-    // Compute the overridden executable from the InheritanceManager
-    //
-    List<ExecutableElement> overriddenExecutables = _inheritanceManager.lookupOverrides(_enclosingClass, executableElement.name);
-    if (overriddenExecutables.isEmpty) {
-      // Nothing is overridden, so we just have to check if the new name collides
-      // with a static defined in the superclass.
-      // TODO(paulberry): currently we don't do this check if the new element
-      // overrides a method in an interface (see issue 18947).
-      return _checkForInstanceMethodNameCollidesWithSuperclassStatic(executableElement, errorNameTarget);
-    }
-    for (ExecutableElement overriddenElement in overriddenExecutables) {
-      if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement, parameters, parameterLocations, errorNameTarget)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This checks the passed field declaration against override-error codes.
-   *
-   * @param node the [MethodDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForField(FieldDeclaration node) {
-    if (_enclosingClass == null || node.isStatic) {
-      return false;
-    }
-    bool hasProblems = false;
-    VariableDeclarationList fields = node.fields;
-    for (VariableDeclaration field in fields.variables) {
-      FieldElement element = field.element as FieldElement;
-      if (element == null) {
-        continue;
-      }
-      PropertyAccessorElement getter = element.getter;
-      PropertyAccessorElement setter = element.setter;
-      SimpleIdentifier fieldName = field.name;
-      if (getter != null) {
-        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
-            getter,
-            ParameterElementImpl.EMPTY_ARRAY,
-            AstNode.EMPTY_ARRAY,
-            fieldName)) {
-          hasProblems = true;
-        }
-      }
-      if (setter != null) {
-        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
-            setter,
-            setter.parameters,
-            <AstNode> [fieldName],
-            fieldName)) {
-          hasProblems = true;
-        }
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This checks the passed method declaration against override-error codes.
-   *
-   * @param node the [MethodDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForAllInvalidOverrideErrorCodes(ExecutableElement)
-   */
-  bool _checkForAllInvalidOverrideErrorCodesForMethod(MethodDeclaration node) {
-    if (_enclosingClass == null || node.isStatic || node.body is NativeFunctionBody) {
-      return false;
-    }
-    ExecutableElement executableElement = node.element;
-    if (executableElement == null) {
-      return false;
-    }
-    SimpleIdentifier methodName = node.name;
-    if (methodName.isSynthetic) {
-      return false;
-    }
-    FormalParameterList formalParameterList = node.parameters;
-    NodeList<FormalParameter> parameterList = formalParameterList != null ? formalParameterList.parameters : null;
-    List<AstNode> parameters = parameterList != null ? new List.from(parameterList) : null;
-    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement, executableElement.parameters, parameters, methodName);
-  }
-
-  /**
-   * This verifies that all classes of the passed 'with' clause are valid.
-   *
-   * @param node the 'with' clause to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
-   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
-   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
-   */
-  bool _checkForAllMixinErrorCodes(WithClause withClause) {
-    if (withClause == null) {
-      return false;
-    }
-    bool problemReported = false;
-    for (TypeName mixinName in withClause.mixinTypes) {
-      DartType mixinType = mixinName.type;
-      if (mixinType is! InterfaceType) {
-        continue;
-      }
-      if (_checkForExtendsOrImplementsDisallowedClass(
-          mixinName,
-          CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
-        problemReported = true;
-      } else {
-        ClassElement mixinElement = (mixinType as InterfaceType).element;
-        if (_checkForExtendsOrImplementsDeferredClass(
-            mixinName,
-            CompileTimeErrorCode.MIXIN_DEFERRED_CLASS)) {
-          problemReported = true;
-        }
-        if (_checkForMixinDeclaresConstructor(mixinName, mixinElement)) {
-          problemReported = true;
-        }
-        if (_checkForMixinInheritsNotFromObject(mixinName, mixinElement)) {
-          problemReported = true;
-        }
-        if (_checkForMixinReferencesSuper(mixinName, mixinElement)) {
-          problemReported = true;
-        }
-      }
-    }
-    return problemReported;
-  }
-
-  /**
-   * This checks error related to the redirected constructors.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
-   * @see StaticWarningCode#REDIRECT_TO_INVALID_FUNCTION_TYPE
-   * @see StaticWarningCode#REDIRECT_TO_MISSING_CONSTRUCTOR
-   */
-  bool _checkForAllRedirectConstructorErrorCodes(ConstructorDeclaration node) {
-    //
-    // Prepare redirected constructor node
-    //
-    ConstructorName redirectedConstructor = node.redirectedConstructor;
-    if (redirectedConstructor == null) {
-      return false;
-    }
-    //
-    // Prepare redirected constructor type
-    //
-    ConstructorElement redirectedElement = redirectedConstructor.staticElement;
-    if (redirectedElement == null) {
-      //
-      // If the element is null, we check for the REDIRECT_TO_MISSING_CONSTRUCTOR case
-      //
-      TypeName constructorTypeName = redirectedConstructor.type;
-      DartType redirectedType = constructorTypeName.type;
-      if (redirectedType != null && redirectedType.element != null && !redirectedType.isDynamic) {
-        //
-        // Prepare the constructor name
-        //
-        String constructorStrName = constructorTypeName.name.name;
-        if (redirectedConstructor.name != null) {
-          constructorStrName += ".${redirectedConstructor.name.name}";
-        }
-        ErrorCode errorCode = (node.constKeyword != null ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
-        _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [constructorStrName, redirectedType.displayName]);
-        return true;
-      }
-      return false;
-    }
-    FunctionType redirectedType = redirectedElement.type;
-    DartType redirectedReturnType = redirectedType.returnType;
-    //
-    // Report specific problem when return type is incompatible
-    //
-    FunctionType constructorType = node.element.type;
-    DartType constructorReturnType = constructorType.returnType;
-    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, redirectedConstructor, [redirectedReturnType, constructorReturnType]);
-      return true;
-    }
-    //
-    // Check parameters
-    //
-    if (!redirectedType.isSubtypeOf(constructorType)) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, redirectedConstructor, [redirectedType, constructorType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This checks that the return statement of the form <i>return e;</i> is not in a generative
-   * constructor.
-   *
-   * This checks that return statements without expressions are not in a generative constructor and
-   * the return type is not assignable to `null`; that is, we don't have `return;` if
-   * the enclosing method has a return type.
-   *
-   * This checks that the return type matches the type of the declared return type in the enclosing
-   * method or function.
-   *
-   * @param node the return statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
-   * @see StaticWarningCode#RETURN_WITHOUT_VALUE
-   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
-   */
-  bool _checkForAllReturnStatementErrorCodes(ReturnStatement node) {
-    FunctionType functionType = _enclosingFunction == null ? null : _enclosingFunction.type;
-    DartType expectedReturnType = functionType == null ? DynamicTypeImpl.instance : functionType.returnType;
-    Expression returnExpression = node.expression;
-    // RETURN_IN_GENERATIVE_CONSTRUCTOR
-    bool isGenerativeConstructor = _enclosingFunction is ConstructorElement && !(_enclosingFunction as ConstructorElement).isFactory;
-    if (isGenerativeConstructor) {
-      if (returnExpression == null) {
-        return false;
-      }
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, returnExpression, []);
-      return true;
-    }
-    // RETURN_WITHOUT_VALUE
-    if (returnExpression == null) {
-      if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
-        return false;
-      }
-      _hasReturnWithoutValue = true;
-      _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
-      return true;
-    } else if (_inGenerator) {
-      // RETURN_IN_GENERATOR
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATOR, node, []);
-    }
-    // RETURN_OF_INVALID_TYPE
-    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
-  }
-
-  /**
-   * This verifies that the export namespace of the passed export directive does not export any name
-   * already exported by other export directive.
-   *
-   * @param node the export directive node to report problem on
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @param exportedLibrary the library element containing the exported element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
-   */
-  bool _checkForAmbiguousExport(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
-    if (exportedLibrary == null) {
-      return false;
-    }
-    // check exported names
-    Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
-    Map<String, Element> definedNames = namespace.definedNames;
-    for (String name in definedNames.keys) {
-      Element element = definedNames[name];
-      Element prevElement = _exportedElements[name];
-      if (element != null && prevElement != null && prevElement != element) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
-            name,
-            prevElement.library.definingCompilationUnit.displayName,
-            element.library.definingCompilationUnit.displayName]);
-        return true;
-      } else {
-        _exportedElements[name] = element;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignable.
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type of the parameter
-   * @param actualStaticType the actual static type of the argument
-   * @param expectedPropagatedType the expected propagated type of the parameter, may be
-   *          `null`
-   * @param actualPropagatedType the expected propagated type of the parameter, may be `null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignable(Expression expression, DartType expectedStaticType, DartType actualStaticType, ErrorCode errorCode) {
-    //
-    // Warning case: test static type information
-    //
-    if (actualStaticType != null && expectedStaticType != null) {
-      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        _errorReporter.reportTypeErrorForNode(errorCode, expression, [actualStaticType, expectedStaticType]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed argument can be assigned to its corresponding parameter.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypeNotAssignableForArgument.
-   *
-   * @param argument the argument to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
-    if (argument == null) {
-      return false;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
-  }
-
-  /**
-   * This verifies that the passed expression can be assigned to its corresponding parameters.
-   *
-   * This method corresponds to
-   * BestPracticesVerifier.checkForArgumentTypeNotAssignableWithExpectedTypes.
-   *
-   * @param expression the expression to evaluate
-   * @param expectedStaticType the expected static type
-   * @param expectedPropagatedType the expected propagated type, may be `null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, DartType expectedStaticType, ErrorCode errorCode) => _checkForArgumentTypeNotAssignable(expression, expectedStaticType, getStaticType(expression), errorCode);
-
-  /**
-   * This verifies that the passed arguments can be assigned to their corresponding parameters.
-   *
-   * This method corresponds to BestPracticesVerifier.checkForArgumentTypesNotAssignableInList.
-   *
-   * @param node the arguments to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
-    if (argumentList == null) {
-      return false;
-    }
-    bool problemReported = false;
-    for (Expression argument in argumentList.arguments) {
-      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
-        problemReported = true;
-      }
-    }
-    return problemReported;
-  }
-
-  /**
-   * Check that the static type of the given expression is assignable to the given type. If it
-   * isn't, report an error with the given error code.
-   *
-   * @param expression the expression being tested
-   * @param type the type that the expression must be assignable to
-   * @param errorCode the error code to be reported
-   * @param arguments the arguments to pass in when creating the error
-   * @return `true` if an error was reported
-   */
-  bool _checkForAssignability(Expression expression, InterfaceType type, ErrorCode errorCode, List<Object> arguments) {
-    if (expression == null) {
-      return false;
-    }
-    DartType expressionType = expression.staticType;
-    if (expressionType == null) {
-      return false;
-    }
-    if (expressionType.isAssignableTo(type)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(errorCode, expression, arguments);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed expression is not final.
-   *
-   * @param node the expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ASSIGNMENT_TO_CONST
-   * @see StaticWarningCode#ASSIGNMENT_TO_FINAL
-   * @see StaticWarningCode#ASSIGNMENT_TO_METHOD
-   */
-  bool _checkForAssignmentToFinal(Expression expression) {
-    // prepare element
-    Element element = null;
-    AstNode highlightedNode = expression;
-    if (expression is Identifier) {
-      element = expression.staticElement;
-      if (expression is PrefixedIdentifier) {
-        highlightedNode = expression.identifier;
-      }
-    } else if (expression is PropertyAccess) {
-      PropertyAccess propertyAccess = expression;
-      element = propertyAccess.propertyName.staticElement;
-      highlightedNode = propertyAccess.propertyName;
-    }
-    // check if element is assignable
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement accessor = element as PropertyAccessorElement;
-      element = accessor.variable;
-    }
-    if (element is VariableElement) {
-      VariableElement variable = element as VariableElement;
-      if (variable.isConst) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_CONST, expression, []);
-        return true;
-      }
-      if (variable.isFinal) {
-        if (variable is FieldElementImpl && variable.setter == null && variable.isSynthetic) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, highlightedNode, [variable.name, variable.enclosingElement.displayName]);
-          return true;
-        }
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
-        return true;
-      }
-      return false;
-    }
-    if (element is FunctionElement) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FUNCTION, expression, []);
-      return true;
-    }
-    if (element is MethodElement) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_METHOD, expression, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed identifier is not a keyword, and generates the passed error code
-   * on the identifier if it is a keyword.
-   *
-   * @param identifier the identifier to check to ensure that it is not a keyword
-   * @param errorCode if the passed identifier is a keyword then this error code is created on the
-   *          identifier, the error code will be one of
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME] or
-   *          [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME
-   * @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME
-   */
-  bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
-    sc.Token token = identifier.token;
-    if (token.type == sc.TokenType.KEYWORD) {
-      _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
-   * 'throw'.
-   *
-   * @param node the switch case to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
-   */
-  bool _checkForCaseBlockNotTerminated(SwitchCase node) {
-    NodeList<Statement> statements = node.statements;
-    if (statements.isEmpty) {
-      // fall-through without statements at all
-      AstNode parent = node.parent;
-      if (parent is SwitchStatement) {
-        SwitchStatement switchStatement = parent;
-        NodeList<SwitchMember> members = switchStatement.members;
-        int index = members.indexOf(node);
-        if (index != -1 && index < members.length - 1) {
-          return false;
-        }
-      }
-      // no other switch member after this one
-    } else {
-      Statement statement = statements[statements.length - 1];
-      // terminated with statement
-      if (statement is BreakStatement || statement is ContinueStatement || statement is ReturnStatement) {
-        return false;
-      }
-      // terminated with 'throw' expression
-      if (statement is ExpressionStatement) {
-        Expression expression = statement.expression;
-        if (expression is ThrowExpression) {
-          return false;
-        }
-      }
-    }
-    // report error
-    _errorReporter.reportErrorForToken(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, node.keyword, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the switch cases in the given switch statement is terminated with 'break',
-   * 'continue', 'return' or 'throw'.
-   *
-   * @param node the switch statement containing the cases to be checked
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
-   */
-  bool _checkForCaseBlocksNotTerminated(SwitchStatement node) {
-    bool foundError = false;
-    NodeList<SwitchMember> members = node.members;
-    int lastMember = members.length - 1;
-    for (int i = 0; i < lastMember; i++) {
-      SwitchMember member = members[i];
-      if (member is SwitchCase && _checkForCaseBlockNotTerminated(member)) {
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the passed method declaration is abstract only if the enclosing class is
-   * also abstract.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
-   */
-  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
-    if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
-      SimpleIdentifier nameNode = node.name;
-      String memberName = nameNode.name;
-      ExecutableElement overriddenMember;
-      if (node.isGetter) {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(memberName, _currentLibrary);
-      } else if (node.isSetter) {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(memberName, _currentLibrary);
-      } else {
-        overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(memberName, _currentLibrary);
-      }
-      if (overriddenMember == null) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, nameNode, [memberName, _enclosingClass.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies all possible conflicts of the constructor name with other constructors and
-   * members of the same class.
-   *
-   * @param node the constructor declaration to evaluate
-   * @param constructorElement the constructor element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
-   * @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_NAME
-   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD
-   * @see CompileTimeErrorCode#CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD
-   */
-  bool _checkForConflictingConstructorNameAndMember(ConstructorDeclaration node, ConstructorElement constructorElement) {
-    SimpleIdentifier constructorName = node.name;
-    String name = constructorElement.name;
-    ClassElement classElement = constructorElement.enclosingElement;
-    // constructors
-    List<ConstructorElement> constructors = classElement.constructors;
-    for (ConstructorElement otherConstructor in constructors) {
-      if (identical(otherConstructor, constructorElement)) {
-        continue;
-      }
-      if (name == otherConstructor.name) {
-        if (name == null || name.length == 0) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, node, []);
-        } else {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, node, [name]);
-        }
-        return true;
-      }
-    }
-    // conflict with class member
-    if (constructorName != null && constructorElement != null && !constructorName.isSynthetic) {
-      // fields
-      FieldElement field = classElement.getField(name);
-      if (field != null) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, node, [name]);
-        return true;
-      }
-      // methods
-      MethodElement method = classElement.getMethod(name);
-      if (method != null) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, node, [name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the [enclosingClass] does not have a method and getter pair with the
-   * same name on, via inheritance.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
-   * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
-   */
-  bool _checkForConflictingGetterAndMethod() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    bool hasProblem = false;
-    // method declared in the enclosing class vs. inherited getter
-    for (MethodElement method in _enclosingClass.methods) {
-      String name = method.name;
-      // find inherited property accessor (and can be only getter)
-      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-      if (inherited is! PropertyAccessorElement) {
-        continue;
-      }
-      // report problem
-      hasProblem = true;
-      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [
-          _enclosingClass.displayName,
-          inherited.enclosingElement.displayName,
-          name]);
-    }
-    // getter declared in the enclosing class vs. inherited method
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      if (!accessor.isGetter) {
-        continue;
-      }
-      String name = accessor.name;
-      // find inherited method
-      ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-      if (inherited is! MethodElement) {
-        continue;
-      }
-      // report problem
-      hasProblem = true;
-      _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [
-          _enclosingClass.displayName,
-          inherited.enclosingElement.displayName,
-          name]);
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the superclass of the [enclosingClass] does not declare accessible
-   * static members with the same name as the instance getters/setters declared in
-   * [enclosingClass].
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER
-   */
-  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // check every accessor
-    bool hasProblem = false;
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      // we analyze instance accessors here
-      if (accessor.isStatic) {
-        continue;
-      }
-      // prepare accessor properties
-      String name = accessor.displayName;
-      bool getter = accessor.isGetter;
-      // if non-final variable, ignore setter - we alreay reported problem for getter
-      if (accessor.isSetter && accessor.isSynthetic) {
-        continue;
-      }
-      // try to find super element
-      ExecutableElement superElement;
-      superElement = enclosingType.lookUpGetterInSuperclass(name, _currentLibrary);
-      if (superElement == null) {
-        superElement = enclosingType.lookUpSetterInSuperclass(name, _currentLibrary);
-      }
-      if (superElement == null) {
-        superElement = enclosingType.lookUpMethodInSuperclass(name, _currentLibrary);
-      }
-      if (superElement == null) {
-        continue;
-      }
-      // OK, not static
-      if (!superElement.isStatic) {
-        continue;
-      }
-      // prepare "super" type to report its name
-      ClassElement superElementClass = superElement.enclosingElement as ClassElement;
-      InterfaceType superElementType = superElementClass.type;
-      // report problem
-      hasProblem = true;
-      if (getter) {
-        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
-      } else {
-        _errorReporter.reportErrorForElement(StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, accessor, [superElementType.displayName]);
-      }
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have a setter with the same name as the passed
-   * instance method declaration.
-   *
-   * TODO(jwren) add other "conflicting" error codes into algorithm/ data structure
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_INSTANCE_METHOD_SETTER
-   */
-  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration node) {
-    // Reference all of the class members in this class.
-    NodeList<ClassMember> classMembers = node.members;
-    if (classMembers.isEmpty) {
-      return false;
-    }
-    // Create a HashMap to track conflicting members, and then loop through members in the class to
-    // construct the HashMap, at the same time, look for violations.  Don't add members if they are
-    // part of a conflict, this prevents multiple warnings for one issue.
-    bool foundError = false;
-    HashMap<String, ClassMember> memberHashMap = new HashMap<String, ClassMember>();
-    for (ClassMember classMember in classMembers) {
-      if (classMember is MethodDeclaration) {
-        MethodDeclaration method = classMember;
-        if (method.isStatic) {
-          continue;
-        }
-        // prepare name
-        SimpleIdentifier name = method.name;
-        if (name == null) {
-          continue;
-        }
-        bool addThisMemberToTheMap = true;
-        bool isGetter = method.isGetter;
-        bool isSetter = method.isSetter;
-        bool isOperator = method.isOperator;
-        bool isMethod = !isGetter && !isSetter && !isOperator;
-        // Do lookups in the enclosing class (and the inherited member) if the member is a method or
-        // a setter for StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning.
-        if (isMethod) {
-          String setterName = "${name.name}=";
-          Element enclosingElementOfSetter = null;
-          ClassMember conflictingSetter = memberHashMap[setterName];
-          if (conflictingSetter != null) {
-            enclosingElementOfSetter = conflictingSetter.element.enclosingElement;
-          } else {
-            ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, setterName);
-            if (elementFromInheritance != null) {
-              enclosingElementOfSetter = elementFromInheritance.enclosingElement;
-            }
-          }
-          if (enclosingElementOfSetter != null) {
-            // report problem
-            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
-                _enclosingClass.displayName,
-                name.name,
-                enclosingElementOfSetter.displayName]);
-            foundError = true;
-            addThisMemberToTheMap = false;
-          }
-        } else if (isSetter) {
-          String methodName = name.name;
-          ClassMember conflictingMethod = memberHashMap[methodName];
-          if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
-            // report problem
-            _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
-            foundError = true;
-            addThisMemberToTheMap = false;
-          }
-        }
-        // Finally, add this member into the HashMap.
-        if (addThisMemberToTheMap) {
-          if (method.isSetter) {
-            memberHashMap["${name.name}="] = method;
-          } else {
-            memberHashMap[name.name] = method;
-          }
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the same name as
-   * the passed static getter method declaration.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
-   */
-  bool _checkForConflictingStaticGetterAndInstanceSetter(MethodDeclaration node) {
-    if (!node.isStatic) {
-      return false;
-    }
-    // prepare name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // prepare enclosing type
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // try to find setter
-    ExecutableElement setter = enclosingType.lookUpSetter(name, _currentLibrary);
-    if (setter == null) {
-      return false;
-    }
-    // OK, also static
-    if (setter.isStatic) {
-      return false;
-    }
-    // prepare "setter" type to report its name
-    ClassElement setterClass = setter.enclosingElement as ClassElement;
-    InterfaceType setterType = setterClass.type;
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, nameNode, [setterType.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the same name as
-   * the passed static getter method declaration.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
-   */
-  bool _checkForConflictingStaticSetterAndInstanceMember(MethodDeclaration node) {
-    if (!node.isStatic) {
-      return false;
-    }
-    // prepare name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // prepare enclosing type
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType enclosingType = _enclosingClass.type;
-    // try to find member
-    ExecutableElement member;
-    member = enclosingType.lookUpMethod(name, _currentLibrary);
-    if (member == null) {
-      member = enclosingType.lookUpGetter(name, _currentLibrary);
-    }
-    if (member == null) {
-      member = enclosingType.lookUpSetter(name, _currentLibrary);
-    }
-    if (member == null) {
-      return false;
-    }
-    // OK, also static
-    if (member.isStatic) {
-      return false;
-    }
-    // prepare "member" type to report its name
-    ClassElement memberClass = member.enclosingElement as ClassElement;
-    InterfaceType memberType = memberClass.type;
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, nameNode, [memberType.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies all conflicts between type variable and enclosing class. TODO(scheglov)
-   *
-   * @param node the class declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_CLASS
-   * @see CompileTimeErrorCode#CONFLICTING_TYPE_VARIABLE_AND_MEMBER
-   */
-  bool _checkForConflictingTypeVariableErrorCodes(ClassDeclaration node) {
-    bool problemReported = false;
-    for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
-      String name = typeParameter.name;
-      // name is same as the name of the enclosing class
-      if (_enclosingClass.name == name) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, typeParameter.nameOffset, name.length, [name]);
-        problemReported = true;
-      }
-      // check members
-      if (_enclosingClass.getMethod(name) != null || _enclosingClass.getGetter(name) != null || _enclosingClass.getSetter(name) != null) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, typeParameter.nameOffset, name.length, [name]);
-        problemReported = true;
-      }
-    }
-    return problemReported;
-  }
-
-  /**
-   * This verifies that if the passed constructor declaration is 'const' then there are no
-   * invocations of non-'const' super constructors.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
-   */
-  bool _checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
-    if (!_isEnclosingConstructorConst) {
-      return false;
-    }
-    // OK, const factory, checked elsewhere
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // check for mixins
-    if (_enclosingClass.mixins.length != 0) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN, node.returnType, []);
-      return true;
-    }
-    // try to find and check super constructor invocation
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        SuperConstructorInvocation superInvocation = initializer;
-        ConstructorElement element = superInvocation.staticElement;
-        if (element == null || element.isConst) {
-          return false;
-        }
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, [element.enclosingElement.displayName]);
-        return true;
-      }
-    }
-    // no explicit super constructor invocation, check default constructor
-    InterfaceType supertype = _enclosingClass.supertype;
-    if (supertype == null) {
-      return false;
-    }
-    if (supertype.isObject) {
-      return false;
-    }
-    ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
-    if (unnamedConstructor == null) {
-      return false;
-    }
-    if (unnamedConstructor.isConst) {
-      return false;
-    }
-    // default constructor is not 'const', report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, [supertype.displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies that if the passed constructor declaration is 'const' then there are no non-final
-   * instance variable.
-   *
-   * @param node the constructor declaration to evaluate
-   * @param constructorElement the constructor element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
-   */
-  bool _checkForConstConstructorWithNonFinalField(ConstructorDeclaration node, ConstructorElement constructorElement) {
-    if (!_isEnclosingConstructorConst) {
-      return false;
-    }
-    // check if there is non-final field
-    ClassElement classElement = constructorElement.enclosingElement;
-    if (!classElement.hasNonFinalField) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed 'const' instance creation expression is not creating a deferred
-   * type.
-   *
-   * @param node the instance creation expression to evaluate
-   * @param constructorName the constructor name, always non-`null`
-   * @param typeName the name of the type defining the constructor, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_DEFERRED_CLASS
-   */
-  bool _checkForConstDeferredClass(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
-    if (typeName.isDeferred) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName, [typeName.name.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed throw expression is not enclosed in a 'const' constructor
-   * declaration.
-   *
-   * @param node the throw expression expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
-   */
-  bool _checkForConstEvalThrowsException(ThrowExpression node) {
-    if (_isEnclosingConstructorConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed normal formal parameter is not 'const'.
-   *
-   * @param node the normal formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
-   */
-  bool _checkForConstFormalParameter(NormalFormalParameter node) {
-    if (node.isConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FORMAL_PARAMETER, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed instance creation expression is not being invoked on an abstract
-   * class.
-   *
-   * @param node the instance creation expression to evaluate
-   * @param typeName the [TypeName] of the [ConstructorName] from the
-   *          [InstanceCreationExpression], this is the AST node that the error is attached to
-   * @param type the type being constructed with this [InstanceCreationExpression]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
-   * @see StaticWarningCode#NEW_WITH_ABSTRACT_CLASS
-   */
-  bool _checkForConstOrNewWithAbstractClass(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
-    if (type.element.isAbstract) {
-      ConstructorElement element = node.staticElement;
-      if (element != null && !element.isFactory) {
-        if ((node.keyword as sc.KeywordToken).keyword == sc.Keyword.CONST) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
-        } else {
-          _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed instance creation expression is not being invoked on an enum.
-   *
-   * @param node the instance creation expression to verify
-   * @param typeName the [TypeName] of the [ConstructorName] from the
-   *          [InstanceCreationExpression], this is the AST node that the error is attached to
-   * @param type the type being constructed with this [InstanceCreationExpression]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INSTANTIATE_ENUM
-   */
-  bool _checkForConstOrNewWithEnum(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
-    if (type.element.isEnum) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANTIATE_ENUM, typeName, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed 'const' instance creation expression is not being invoked on a
-   * constructor that is not 'const'.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to verify
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
-   */
-  bool _checkForConstWithNonConst(InstanceCreationExpression node) {
-    ConstructorElement constructorElement = node.staticElement;
-    if (constructorElement != null && !constructorElement.isConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_CONST, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed type name does not reference any type parameters.
-   *
-   * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
-   */
-  bool _checkForConstWithTypeParameters(TypeName typeName) {
-    // something wrong with AST
-    if (typeName == null) {
-      return false;
-    }
-    Identifier name = typeName.name;
-    if (name == null) {
-      return false;
-    }
-    // should not be a type parameter
-    if (name.staticElement is TypeParameterElement) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS, name, []);
-    }
-    // check type arguments
-    TypeArgumentList typeArguments = typeName.typeArguments;
-    if (typeArguments != null) {
-      bool hasError = false;
-      for (TypeName argument in typeArguments.arguments) {
-        if (_checkForConstWithTypeParameters(argument)) {
-          hasError = true;
-        }
-      }
-      return hasError;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies that if the passed 'const' instance creation expression is being invoked on the
-   * resolved constructor.
-   *
-   * This method assumes that the instance creation was tested to be 'const' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @param constructorName the constructor name, always non-`null`
-   * @param typeName the name of the type defining the constructor, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
-   * @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT
-   */
-  bool _checkForConstWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
-    // OK if resolved
-    if (node.staticElement != null) {
-      return false;
-    }
-    DartType type = typeName.type;
-    if (type is InterfaceType) {
-      ClassElement element = type.element;
-      if (element != null && element.isEnum) {
-        // We have already reported the error.
-        return false;
-      }
-    }
-    Identifier className = typeName.name;
-    // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
-    if (name != null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies that there are no default parameters in the passed function type alias.
-   *
-   * @param node the function type alias to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
-   */
-  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias node) {
-    bool result = false;
-    FormalParameterList formalParameterList = node.parameters;
-    NodeList<FormalParameter> parameters = formalParameterList.parameters;
-    for (FormalParameter formalParameter in parameters) {
-      if (formalParameter is DefaultFormalParameter) {
-        DefaultFormalParameter defaultFormalParameter = formalParameter;
-        if (defaultFormalParameter.defaultValue != null) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, node, []);
-          result = true;
-        }
-      }
-    }
-    return result;
-  }
-
-  /**
-   * This verifies that the given default formal parameter is not part of a function typed
-   * parameter.
-   *
-   * @param node the default formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
-   */
-  bool _checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
-    // OK, not in a function typed parameter.
-    if (!_isInFunctionTypedFormalParameter) {
-      return false;
-    }
-    // OK, no default value.
-    if (node.defaultValue == null) {
-      return false;
-    }
-    // Report problem.
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that any deferred imports in the given compilation unit have a unique prefix.
-   *
-   * @param node the compilation unit containing the imports to be checked
-   * @return `true` if an error was generated
-   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
-   */
-  bool _checkForDeferredPrefixCollisions(CompilationUnit node) {
-    bool foundError = false;
-    NodeList<Directive> directives = node.directives;
-    int count = directives.length;
-    if (count > 0) {
-      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new HashMap<PrefixElement, List<ImportDirective>>();
-      for (int i = 0; i < count; i++) {
-        Directive directive = directives[i];
-        if (directive is ImportDirective) {
-          ImportDirective importDirective = directive;
-          SimpleIdentifier prefix = importDirective.prefix;
-          if (prefix != null) {
-            Element element = prefix.staticElement;
-            if (element is PrefixElement) {
-              PrefixElement prefixElement = element;
-              List<ImportDirective> elements = prefixToDirectivesMap[prefixElement];
-              if (elements == null) {
-                elements = new List<ImportDirective>();
-                prefixToDirectivesMap[prefixElement] = elements;
-              }
-              elements.add(importDirective);
-            }
-          }
-        }
-      }
-      for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
-        if (_hasDeferredPrefixCollision(imports)) {
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the given name of
-   * the static member.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
-   */
-  bool _checkForDuplicateDefinitionInheritance() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    bool hasProblem = false;
-    for (ExecutableElement member in _enclosingClass.methods) {
-      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
-        hasProblem = true;
-      }
-    }
-    for (ExecutableElement member in _enclosingClass.accessors) {
-      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
-        hasProblem = true;
-      }
-    }
-    return hasProblem;
-  }
-
-  /**
-   * This verifies that the enclosing class does not have an instance member with the given name of
-   * the static member.
-   *
-   * @param staticMember the static member to check conflict for
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
-   */
-  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
-    // prepare name
-    String name = staticMember.name;
-    if (name == null) {
-      return false;
-    }
-    // try to find member
-    ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_enclosingClass, name);
-    if (inheritedMember == null) {
-      return false;
-    }
-    // OK, also static
-    if (inheritedMember.isStatic) {
-      return false;
-    }
-    // determine the display name, use the extended display name if the enclosing class of the
-    // inherited member is in a different source
-    String displayName;
-    Element enclosingElement = inheritedMember.enclosingElement;
-    if (enclosingElement.source == _enclosingClass.source) {
-      displayName = enclosingElement.displayName;
-    } else {
-      displayName = enclosingElement.getExtendedDisplayName(null);
-    }
-    // report problem
-    _errorReporter.reportErrorForOffset(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, displayName]);
-    return true;
-  }
-
-  /**
-   * This verifies if the passed list literal has type arguments then there is exactly one.
-   *
-   * @param node the list literal to evaluate
-   * @param typeArguments the type arguments, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#EXPECTED_ONE_LIST_TYPE_ARGUMENTS
-   */
-  bool _checkForExpectedOneListTypeArgument(ListLiteral node, TypeArgumentList typeArguments) {
-    // check number of type arguments
-    int num = typeArguments.arguments.length;
-    if (num == 1) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, [num]);
-    return true;
-  }
-
-  /**
-   * This verifies the passed import has unique name among other exported libraries.
-   *
-   * @param node the export directive to evaluate
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @param exportedLibrary the library element containing the exported element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
-   */
-  bool _checkForExportDuplicateLibraryName(ExportDirective node, ExportElement exportElement, LibraryElement exportedLibrary) {
-    if (exportedLibrary == null) {
-      return false;
-    }
-    String name = exportedLibrary.name;
-    // check if there is other exported library with the same name
-    LibraryElement prevLibrary = _nameToExportElement[name];
-    if (prevLibrary != null) {
-      if (prevLibrary != exportedLibrary) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME, node, [
-            prevLibrary.definingCompilationUnit.displayName,
-            exportedLibrary.definingCompilationUnit.displayName,
-            name]);
-        return true;
-      }
-    } else {
-      _nameToExportElement[name] = exportedLibrary;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * Check that if the visiting library is not system, then any passed library should not be SDK
-   * internal library.
-   *
-   * @param node the export directive to evaluate
-   * @param exportElement the [ExportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
-   */
-  bool _checkForExportInternalLibrary(ExportDirective node, ExportElement exportElement) {
-    if (_isInSystemLibrary) {
-      return false;
-    }
-    // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = exportElement.uri;
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
-    if (sdkLibrary == null) {
-      return false;
-    }
-    if (!sdkLibrary.isInternal) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, node, [node.uri]);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed extends clause does not extend a deferred class.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
-   */
-  bool _checkForExtendsDeferredClass(ExtendsClause node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed type alias does not extend a deferred class.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDeferredClass(node.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed extends clause does not extend classes such as num or String.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsDisallowedClass(ExtendsClause node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed type alias does not extend classes such as num or String.
-   *
-   * @param node the extends clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias node) {
-    if (node == null) {
-      return false;
-    }
-    return _checkForExtendsOrImplementsDisallowedClass(node.superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
-  }
-
-  /**
-   * This verifies that the passed type name does not extend, implement or mixin classes that are
-   * deferred.
-   *
-   * @param node the type name to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForExtendsDeferredClass(ExtendsClause)
-   * @see #checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias)
-   * @see #checkForImplementsDeferredClass(ImplementsClause)
-   * @see #checkForAllMixinErrorCodes(WithClause)
-   * @see CompileTimeErrorCode#EXTENDS_DEFERRED_CLASS
-   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
-   * @see CompileTimeErrorCode#MIXIN_DEFERRED_CLASS
-   */
-  bool _checkForExtendsOrImplementsDeferredClass(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
-      return false;
-    }
-    if (typeName.isDeferred) {
-      _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name.name]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed type name does not extend, implement or mixin classes such as
-   * 'num' or 'String'.
-   *
-   * @param node the type name to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see #checkForExtendsDisallowedClass(ExtendsClause)
-   * @see #checkForExtendsDisallowedClassInTypeAlias(ClassTypeAlias)
-   * @see #checkForImplementsDisallowedClass(ImplementsClause)
-   * @see #checkForAllMixinErrorCodes(WithClause)
-   * @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
-   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
-   * @see CompileTimeErrorCode#MIXIN_OF_DISALLOWED_CLASS
-   */
-  bool _checkForExtendsOrImplementsDisallowedClass(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
-      return false;
-    }
-    DartType superType = typeName.type;
-    for (InterfaceType disallowedType in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
-      if (superType != null && superType == disallowedType) {
-        // if the violating type happens to be 'num', we need to rule out the case where the
-        // enclosing class is 'int' or 'double'
-        if (superType == _typeProvider.numType) {
-          AstNode grandParent = typeName.parent.parent;
-          // Note: this is a corner case that won't happen often, so adding a field currentClass
-          // (see currentFunction) to ErrorVerifier isn't worth if for this case, but if the field
-          // currentClass is added, then this message should become a todo to not lookup the
-          // grandparent node
-          if (grandParent is ClassDeclaration) {
-            ClassElement classElement = grandParent.element;
-            DartType classType = classElement.type;
-            if (classType != null && (classType == _intType || classType == _typeProvider.doubleType)) {
-              return false;
-            }
-          }
-        }
-        // otherwise, report the error
-        _errorReporter.reportErrorForNode(errorCode, typeName, [disallowedType.displayName]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed constructor field initializer has compatible field and
-   * initializer expression types.
-   *
-   * @param node the constructor field initializer to test
-   * @param staticElement the static element from the name in the
-   *          [ConstructorFieldInitializer]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
-   * @see StaticWarningCode#FIELD_INITIALIZER_NOT_ASSIGNABLE
-   */
-  bool _checkForFieldInitializerNotAssignable(ConstructorFieldInitializer node, Element staticElement) {
-    // prepare field element
-    if (staticElement is! FieldElement) {
-      return false;
-    }
-    FieldElement fieldElement = staticElement as FieldElement;
-    // prepare field type
-    DartType fieldType = fieldElement.type;
-    // prepare expression type
-    Expression expression = node.expression;
-    if (expression == null) {
-      return false;
-    }
-    // test the static type of the expression
-    DartType staticType = getStaticType(expression);
-    if (staticType == null) {
-      return false;
-    }
-    if (staticType.isAssignableTo(fieldType)) {
-      return false;
-    }
-    // report problem
-    if (_isEnclosingConstructorConst) {
-      // TODO(paulberry): this error should be based on the actual type of the constant, not the
-      // static type.  See dartbug.com/21119.
-      _errorReporter.reportTypeErrorForNode(CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
-    }
-    _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
-    return true;
-    // TODO(brianwilkerson) Define a hint corresponding to these errors and report it if appropriate.
-    //    // test the propagated type of the expression
-    //    Type propagatedType = expression.getPropagatedType();
-    //    if (propagatedType != null && propagatedType.isAssignableTo(fieldType)) {
-    //      return false;
-    //    }
-    //    // report problem
-    //    if (isEnclosingConstructorConst) {
-    //      errorReporter.reportTypeErrorForNode(
-    //          CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
-    //          expression,
-    //          propagatedType == null ? staticType : propagatedType,
-    //          fieldType);
-    //    } else {
-    //      errorReporter.reportTypeErrorForNode(
-    //          StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
-    //          expression,
-    //          propagatedType == null ? staticType : propagatedType,
-    //          fieldType);
-    //    }
-    //    return true;
-  }
-
-  /**
-   * This verifies that the passed field formal parameter is in a constructor declaration.
-   *
-   * @param node the field formal parameter to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
-   */
-  bool _checkForFieldInitializingFormalRedirectingConstructor(FieldFormalParameter node) {
-    ConstructorDeclaration constructor = node.getAncestor((node) => node is ConstructorDeclaration);
-    if (constructor == null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []);
-      return true;
-    }
-    // constructor cannot be a factory
-    if (constructor.factoryKeyword != null) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR, node, []);
-      return true;
-    }
-    // constructor cannot have a redirection
-    for (ConstructorInitializer initializer in constructor.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, node, []);
-        return true;
-      }
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies that the passed variable declaration list has only initialized variables if the
-   * list is final or const. This method is called by
-   * [checkForFinalNotInitializedInClass],
-   * [visitTopLevelVariableDeclaration] and
-   * [visitVariableDeclarationStatement].
-   *
-   * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
-   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
-   */
-  bool _checkForFinalNotInitialized(VariableDeclarationList node) {
-    if (_isInNativeClass) {
-      return false;
-    }
-    bool foundError = false;
-    if (!node.isSynthetic) {
-      NodeList<VariableDeclaration> variables = node.variables;
-      for (VariableDeclaration variable in variables) {
-        if (variable.initializer == null) {
-          if (node.isConst) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, [variable.name.name]);
-          } else if (node.isFinal) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, [variable.name.name]);
-          }
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that final fields that are declared, without any constructors in the enclosing
-   * class, are initialized. Cases in which there is at least one constructor are handled at the end
-   * of [checkForAllFinalInitializedErrorCodes].
-   *
-   * @param node the class declaration to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#CONST_NOT_INITIALIZED
-   * @see StaticWarningCode#FINAL_NOT_INITIALIZED
-   */
-  bool _checkForFinalNotInitializedInClass(ClassDeclaration node) {
-    NodeList<ClassMember> classMembers = node.members;
-    for (ClassMember classMember in classMembers) {
-      if (classMember is ConstructorDeclaration) {
-        return false;
-      }
-    }
-    bool foundError = false;
-    for (ClassMember classMember in classMembers) {
-      if (classMember is FieldDeclaration
-          && _checkForFinalNotInitialized(classMember.fields)) {
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the passed implements clause does not implement classes that are deferred.
-   *
-   * @param node the implements clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLEMENTS_DEFERRED_CLASS
-   */
-  bool _checkForImplementsDeferredClass(ImplementsClause node) {
-    if (node == null) {
-      return false;
-    }
-    bool foundError = false;
-    for (TypeName type in node.interfaces) {
-      if (_checkForExtendsOrImplementsDeferredClass(
-          type,
-          CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS)) {
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the passed implements clause does not implement classes such as 'num' or
-   * 'String'.
-   *
-   * @param node the implements clause to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
-   */
-  bool _checkForImplementsDisallowedClass(ImplementsClause node) {
-    if (node == null) {
-      return false;
-    }
-    bool foundError = false;
-    for (TypeName type in node.interfaces) {
-      if (_checkForExtendsOrImplementsDisallowedClass(
-          type,
-          CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that if the passed identifier is part of constructor initializer, then it does
-   * not reference implicitly 'this' expression.
-   *
-   * @param node the simple identifier to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
-   * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
-   */
-  bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
-    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInFactory && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
-      return false;
-    }
-    // prepare element
-    Element element = node.staticElement;
-    if (!(element is MethodElement || element is PropertyAccessorElement)) {
-      return false;
-    }
-    // static element
-    ExecutableElement executableElement = element as ExecutableElement;
-    if (executableElement.isStatic) {
-      return false;
-    }
-    // not a class member
-    Element enclosingElement = element.enclosingElement;
-    if (enclosingElement is! ClassElement) {
-      return false;
-    }
-    // comment
-    AstNode parent = node.parent;
-    if (parent is CommentReference) {
-      return false;
-    }
-    // qualified method invocation
-    if (parent is MethodInvocation) {
-      MethodInvocation invocation = parent;
-      if (identical(invocation.methodName, node) && invocation.realTarget != null) {
-        return false;
-      }
-    }
-    // qualified property access
-    if (parent is PropertyAccess) {
-      PropertyAccess access = parent;
-      if (identical(access.propertyName, node) && access.realTarget != null) {
-        return false;
-      }
-    }
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (identical(prefixed.identifier, node)) {
-        return false;
-      }
-    }
-    // report problem
-    if (_isInStaticMethod) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
-    } else if (_isInFactory) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, node, []);
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies the passed import has unique name among other imported libraries.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
-   */
-  bool _checkForImportDuplicateLibraryName(ImportDirective node, ImportElement importElement) {
-    // prepare imported library
-    LibraryElement nodeLibrary = importElement.importedLibrary;
-    if (nodeLibrary == null) {
-      return false;
-    }
-    String name = nodeLibrary.name;
-    // check if there is other imported library with the same name
-    LibraryElement prevLibrary = _nameToImportElement[name];
-    if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME, node, [
-            prevLibrary.definingCompilationUnit.displayName,
-            nodeLibrary.definingCompilationUnit.displayName,
-            name]);
-        return true;
-      }
-    } else {
-      _nameToImportElement[name] = nodeLibrary;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * Check that if the visiting library is not system, then any passed library should not be SDK
-   * internal library.
-   *
-   * @param node the import directive to evaluate
-   * @param importElement the [ImportElement] retrieved from the node, if the element in the
-   *          node was `null`, then this method is not called
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
-   */
-  bool _checkForImportInternalLibrary(ImportDirective node, ImportElement importElement) {
-    if (_isInSystemLibrary) {
-      return false;
-    }
-    // should be private
-    DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
-    String uri = importElement.uri;
-    SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
-    if (sdkLibrary == null) {
-      return false;
-    }
-    if (!sdkLibrary.isInternal) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, node, [node.uri]);
-    return true;
-  }
-
-  /**
-   * For each class declaration, this method is called which verifies that all inherited members are
-   * inherited consistently.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
-   */
-  bool _checkForInconsistentMethodInheritance() {
-    // Ensure that the inheritance manager has a chance to generate all errors we may care about,
-    // note that we ensure that the interfaces data since there are no errors.
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    HashSet<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
-    if (errors == null || errors.isEmpty) {
-      return false;
-    }
-    for (AnalysisError error in errors) {
-      _errorReporter.reportError(error);
-    }
-    return true;
-  }
-
-  /**
-   * This checks the given "typeReference" is not a type reference and that then the "name" is
-   * reference to an instance member.
-   *
-   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
-   *          or `null`, aka, the class element of 'C' in 'C.x', see
-   *          [getTypeReference]
-   * @param name the accessed name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
-   */
-  bool _checkForInstanceAccessToStaticMember(ClassElement typeReference, SimpleIdentifier name) {
-    // OK, in comment
-    if (_isInComment) {
-      return false;
-    }
-    // OK, target is a type
-    if (typeReference != null) {
-      return false;
-    }
-    // prepare member Element
-    Element element = name.staticElement;
-    if (element is! ExecutableElement) {
-      return false;
-    }
-    ExecutableElement executableElement = element as ExecutableElement;
-    // OK, top-level element
-    if (executableElement.enclosingElement is! ClassElement) {
-      return false;
-    }
-    // OK, instance member
-    if (!executableElement.isStatic) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  /**
-   * This checks whether the given [executableElement] collides with the name of a static
-   * method in one of its superclasses, and reports the appropriate warning if it does.
-   *
-   * @param executableElement the method to check.
-   * @param errorNameTarget the node to report problems on.
-   * @return `true` if and only if a warning was generated.
-   * @see StaticTypeWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-   */
-  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
-    String executableElementName = executableElement.name;
-    if (executableElement is! PropertyAccessorElement && !executableElement.isOperator) {
-      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
-      InterfaceType superclassType = _enclosingClass.supertype;
-      ClassElement superclassElement = superclassType == null ? null : superclassType.element;
-      bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
-      while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
-        visitedClasses.add(superclassElement);
-        LibraryElement superclassLibrary = superclassElement.library;
-        // Check fields.
-        List<FieldElement> fieldElts = superclassElement.fields;
-        for (FieldElement fieldElt in fieldElts) {
-          // We need the same name.
-          if (fieldElt.name != executableElementName) {
-            continue;
-          }
-          // Ignore if private in a different library - cannot collide.
-          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-            continue;
-          }
-          // instance vs. static
-          if (fieldElt.isStatic) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                executableElementName,
-                fieldElt.enclosingElement.displayName]);
-            return true;
-          }
-        }
-        // Check methods.
-        List<MethodElement> methodElements = superclassElement.methods;
-        for (MethodElement methodElement in methodElements) {
-          // We need the same name.
-          if (methodElement.name != executableElementName) {
-            continue;
-          }
-          // Ignore if private in a different library - cannot collide.
-          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-            continue;
-          }
-          // instance vs. static
-          if (methodElement.isStatic) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                executableElementName,
-                methodElement.enclosingElement.displayName]);
-            return true;
-          }
-        }
-        superclassType = superclassElement.supertype;
-        superclassElement = superclassType == null ? null : superclassType.element;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that an 'int' can be assigned to the parameter corresponding to the given
-   * expression. This is used for prefix and postfix expressions where the argument value is
-   * implicit.
-   *
-   * @param argument the expression to which the operator is being applied
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForIntNotAssignable(Expression argument) {
-    if (argument == null) {
-      return false;
-    }
-    ParameterElement staticParameterElement = argument.staticParameterElement;
-    DartType staticParameterType = staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
-  }
-
-  /**
-   * This verifies that the passed [Annotation] isn't defined in a deferred library.
-   *
-   * @param node the [Annotation]
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY
-   */
-  bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation node) {
-    Identifier nameIdentifier = node.name;
-    if (nameIdentifier is PrefixedIdentifier) {
-      if (nameIdentifier.isDeferred) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY, node.name, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed left hand side and right hand side represent a valid assignment.
-   *
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
-   */
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
-    if (lhs == null || rhs == null) {
-      return false;
-    }
-    VariableElement leftVariableElement = getVariableElement(lhs);
-    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
-    DartType staticRightType = getStaticType(rhs);
-    if (!staticRightType.isAssignableTo(leftType)) {
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType, leftType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Given an assignment using a compound assignment operator, this verifies that the given
-   * assignment is valid.
-   *
-   * @param node the assignment expression being tested
-   * @param lhs the left hand side expression
-   * @param rhs the right hand side expression
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
-   */
-  bool _checkForInvalidCompoundAssignment(AssignmentExpression node, Expression lhs, Expression rhs) {
-    if (lhs == null) {
-      return false;
-    }
-    VariableElement leftVariableElement = getVariableElement(lhs);
-    DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
-    MethodElement invokedMethod = node.staticElement;
-    if (invokedMethod == null) {
-      return false;
-    }
-    DartType rightType = invokedMethod.type.returnType;
-    if (leftType == null || rightType == null) {
-      return false;
-    }
-    if (!rightType.isAssignableTo(leftType)) {
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Check the given initializer to ensure that the field being initialized is a valid field.
-   *
-   * @param node the field initializer being checked
-   * @param fieldName the field name from the [ConstructorFieldInitializer]
-   * @param staticElement the static element from the name in the
-   *          [ConstructorFieldInitializer]
-   */
-  void _checkForInvalidField(ConstructorFieldInitializer node, SimpleIdentifier fieldName, Element staticElement) {
-    if (staticElement is FieldElement) {
-      FieldElement fieldElement = staticElement;
-      if (fieldElement.isSynthetic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, node, [fieldName]);
-      } else if (fieldElement.isStatic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, node, [fieldName]);
-      }
-    } else {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, node, [fieldName]);
-      return;
-    }
-  }
-
-  /**
-   * Check to see whether the given function body has a modifier associated with it, and report it
-   * as an error if it does.
-   *
-   * @param body the function body being checked
-   * @param errorCode the error code to be reported if a modifier is found
-   * @return `true` if an error was reported
-   */
-  bool _checkForInvalidModifierOnBody(FunctionBody body, CompileTimeErrorCode errorCode) {
-    sc.Token keyword = body.keyword;
-    if (keyword != null) {
-      _errorReporter.reportErrorForToken(errorCode, keyword, [keyword.lexeme]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the usage of the passed 'this' is valid.
-   *
-   * @param node the 'this' expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
-   */
-  bool _checkForInvalidReferenceToThis(ThisExpression node) {
-    if (!_isThisInValidContext(node)) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
-   * parameter as a type argument.
-   *
-   * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
-   *          [ListLiteral] or [MapLiteral]
-   * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
-   *          [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
-    bool foundError = false;
-    for (TypeName typeName in arguments) {
-      if (typeName.type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This verifies that the elements given [ListLiteral] are subtypes of the specified element
-   * type.
-   *
-   * @param node the list literal to evaluate
-   * @param typeArguments the type arguments, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForListElementTypeNotAssignable(ListLiteral node, TypeArgumentList typeArguments) {
-    NodeList<TypeName> typeNames = typeArguments.arguments;
-    if (typeNames.length < 1) {
-      return false;
-    }
-    DartType listElementType = typeNames[0].type;
-    // Check every list element.
-    bool hasProblems = false;
-    for (Expression element in node.elements) {
-      if (node.constKeyword != null) {
-        // TODO(paulberry): this error should be based on the actual type of the
-        // list element, not the static type.  See dartbug.com/21119.
-        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-            element,
-            listElementType,
-            CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
-          hasProblems = true;
-        }
-      }
-      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-          element,
-          listElementType,
-          StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
-        hasProblems = true;
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This verifies that the key/value of entries of the given [MapLiteral] are subtypes of the
-   * key/value types specified in the type arguments.
-   *
-   * @param node the map literal to evaluate
-   * @param typeArguments the type arguments, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see CompileTimeErrorCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_KEY_TYPE_NOT_ASSIGNABLE
-   * @see StaticWarningCode#MAP_VALUE_TYPE_NOT_ASSIGNABLE
-   */
-  bool _checkForMapTypeNotAssignable(MapLiteral node, TypeArgumentList typeArguments) {
-    // Prepare maps key/value types.
-    NodeList<TypeName> typeNames = typeArguments.arguments;
-    if (typeNames.length < 2) {
-      return false;
-    }
-    DartType keyType = typeNames[0].type;
-    DartType valueType = typeNames[1].type;
-    // Check every map entry.
-    bool hasProblems = false;
-    NodeList<MapLiteralEntry> entries = node.entries;
-    for (MapLiteralEntry entry in entries) {
-      Expression key = entry.key;
-      Expression value = entry.value;
-      if (node.constKeyword != null) {
-        // TODO(paulberry): this error should be based on the actual type of the
-        // list element, not the static type.  See dartbug.com/21119.
-        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-            key,
-            keyType,
-            CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
-          hasProblems = true;
-        }
-        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-            value,
-            valueType,
-            CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
-          hasProblems = true;
-        }
-      }
-      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-          key,
-          keyType,
-          StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
-        hasProblems = true;
-      }
-      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
-          value,
-          valueType,
-          StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
-        hasProblems = true;
-      }
-    }
-    return hasProblems;
-  }
-
-  /**
-   * This verifies that the [enclosingClass] does not define members with the same name as
-   * the enclosing class.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
-   */
-  bool _checkForMemberWithClassName() {
-    if (_enclosingClass == null) {
-      return false;
-    }
-    String className = _enclosingClass.name;
-    if (className == null) {
-      return false;
-    }
-    bool problemReported = false;
-    // check accessors
-    for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
-      if (className == accessor.name) {
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, className.length, []);
-        problemReported = true;
-      }
-    }
-    // don't check methods, they would be constructors
-    // done
-    return problemReported;
-  }
-
-  /**
-   * Check to make sure that all similarly typed accessors are of the same type (including inherited
-   * accessors).
-   *
-   * @param node the accessor currently being visited
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES
-   * @see StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE
-   */
-  bool _checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
-    ExecutableElement accessorElement = accessorDeclaration.element as ExecutableElement;
-    if (accessorElement is! PropertyAccessorElement) {
-      return false;
-    }
-    PropertyAccessorElement propertyAccessorElement = accessorElement as PropertyAccessorElement;
-    PropertyAccessorElement counterpartAccessor = null;
-    ClassElement enclosingClassForCounterpart = null;
-    if (propertyAccessorElement.isGetter) {
-      counterpartAccessor = propertyAccessorElement.correspondingSetter;
-    } else {
-      counterpartAccessor = propertyAccessorElement.correspondingGetter;
-      // If the setter and getter are in the same enclosing element, return, this prevents having
-      // MISMATCHED_GETTER_AND_SETTER_TYPES reported twice.
-      if (counterpartAccessor != null && identical(counterpartAccessor.enclosingElement, propertyAccessorElement.enclosingElement)) {
-        return false;
-      }
-    }
-    if (counterpartAccessor == null) {
-      // If the accessor is declared in a class, check the superclasses.
-      if (_enclosingClass != null) {
-        // Figure out the correct identifier to lookup in the inheritance graph, if 'x', then 'x=',
-        // or if 'x=', then 'x'.
-        String lookupIdentifier = propertyAccessorElement.name;
-        if (StringUtilities.endsWithChar(lookupIdentifier, 0x3D)) {
-          lookupIdentifier = lookupIdentifier.substring(0, lookupIdentifier.length - 1);
-        } else {
-          lookupIdentifier += "=";
-        }
-        // lookup with the identifier.
-        ExecutableElement elementFromInheritance = _inheritanceManager.lookupInheritance(_enclosingClass, lookupIdentifier);
-        // Verify that we found something, and that it is an accessor
-        if (elementFromInheritance != null && elementFromInheritance is PropertyAccessorElement) {
-          enclosingClassForCounterpart = elementFromInheritance.enclosingElement as ClassElement;
-          counterpartAccessor = elementFromInheritance;
-        }
-      }
-      if (counterpartAccessor == null) {
-        return false;
-      }
-    }
-    // Default of null == no accessor or no type (dynamic)
-    DartType getterType = null;
-    DartType setterType = null;
-    // Get an existing counterpart accessor if any.
-    if (propertyAccessorElement.isGetter) {
-      getterType = _getGetterType(propertyAccessorElement);
-      setterType = _getSetterType(counterpartAccessor);
-    } else if (propertyAccessorElement.isSetter) {
-      setterType = _getSetterType(propertyAccessorElement);
-      getterType = _getGetterType(counterpartAccessor);
-    }
-    // If either types are not assignable to each other, report an error (if the getter is null,
-    // it is dynamic which is assignable to everything).
-    if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
-      if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType, getterType]);
-        return true;
-      } else {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
-            accessorTextName,
-            setterType,
-            getterType,
-            enclosingClassForCounterpart.displayName]);
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Check to make sure that switch statements whose static type is an enum type either have a
-   * default case or include all of the enum constants.
-   *
-   * @param statement the switch statement to check
-   * @return `true` if and only if an error code is generated on the passed node
-   */
-  bool _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
-    // TODO(brianwilkerson) This needs to be checked after constant values have been computed.
-    Expression expression = statement.expression;
-    DartType expressionType = getStaticType(expression);
-    if (expressionType == null) {
-      return false;
-    }
-    Element expressionElement = expressionType.element;
-    if (expressionElement is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = expressionElement as ClassElement;
-    if (!classElement.isEnum) {
-      return false;
-    }
-    List<String> constantNames = new List<String>();
-    List<FieldElement> fields = classElement.fields;
-    int fieldCount = fields.length;
-    for (int i = 0; i < fieldCount; i++) {
-      FieldElement field = fields[i];
-      if (field.isStatic && !field.isSynthetic) {
-        constantNames.add(field.name);
-      }
-    }
-    NodeList<SwitchMember> members = statement.members;
-    int memberCount = members.length;
-    for (int i = 0; i < memberCount; i++) {
-      SwitchMember member = members[i];
-      if (member is SwitchDefault) {
-        return false;
-      }
-      String constantName = _getConstantName((member as SwitchCase).expression);
-      if (constantName != null) {
-        constantNames.remove(constantName);
-      }
-    }
-    int nameCount = constantNames.length;
-    if (nameCount == 0) {
-      return false;
-    }
-    for (int i = 0; i < nameCount; i++) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH, statement, [constantNames[i]]);
-    }
-    return true;
-  }
-
-  /**
-   * This verifies that the given function body does not contain return statements that both have
-   * and do not have return values.
-   *
-   * @param node the function body being tested
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#MIXED_RETURN_TYPES
-   */
-  bool _checkForMixedReturns(BlockFunctionBody node) {
-    if (_hasReturnWithoutValue) {
-      return false;
-    }
-    int withCount = _returnsWith.length;
-    int withoutCount = _returnsWithout.length;
-    if (withCount > 0 && withoutCount > 0) {
-      for (int i = 0; i < withCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWith[i].keyword, []);
-      }
-      for (int i = 0; i < withoutCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES, _returnsWithout[i].keyword, []);
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin does not have an explicitly declared constructor.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
-   */
-  bool _checkForMixinDeclaresConstructor(TypeName mixinName, ClassElement mixinElement) {
-    for (ConstructorElement constructor in mixinElement.constructors) {
-      if (!constructor.isSynthetic && !constructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, [mixinElement.name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin has the 'Object' superclass.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_INHERITS_FROM_NOT_OBJECT
-   */
-  bool _checkForMixinInheritsNotFromObject(TypeName mixinName, ClassElement mixinElement) {
-    InterfaceType mixinSupertype = mixinElement.supertype;
-    if (mixinSupertype != null) {
-      if (!mixinSupertype.isObject || !mixinElement.isTypedef && mixinElement.mixins.length != 0) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, [mixinElement.name]);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed mixin does not reference 'super'.
-   *
-   * @param mixinName the node to report problem on
-   * @param mixinElement the mixing to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MIXIN_REFERENCES_SUPER
-   */
-  bool _checkForMixinReferencesSuper(TypeName mixinName, ClassElement mixinElement) {
-    if (mixinElement.hasReferenceToSuper) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, [mixinElement.name]);
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed constructor has at most one 'super' initializer.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
-   */
-  bool _checkForMultipleSuperInitializers(ConstructorDeclaration node) {
-    int numSuperInitializers = 0;
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        numSuperInitializers++;
-        if (numSuperInitializers > 1) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer, []);
-        }
-      }
-    }
-    return numSuperInitializers > 0;
-  }
-
-  /**
-   * Checks to ensure that native function bodies can only in SDK code.
-   *
-   * @param node the native function body to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
-   */
-  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody node) {
-    if (!_isInSystemLibrary && !_hasExtUri) {
-      _errorReporter.reportErrorForNode(ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed 'new' instance creation expression invokes existing constructor.
-   *
-   * This method assumes that the instance creation was tested to be 'new' before being called.
-   *
-   * @param node the instance creation expression to evaluate
-   * @param constructorName the constructor name, always non-`null`
-   * @param typeName the name of the type defining the constructor, always non-`null`
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
-   */
-  bool _checkForNewWithUndefinedConstructor(InstanceCreationExpression node, ConstructorName constructorName, TypeName typeName) {
-    // OK if resolved
-    if (node.staticElement != null) {
-      return false;
-    }
-    DartType type = typeName.type;
-    if (type is InterfaceType) {
-      ClassElement element = type.element;
-      if (element != null && element.isEnum) {
-        // We have already reported the error.
-        return false;
-      }
-    }
-    // prepare class name
-    Identifier className = typeName.name;
-    // report as named or default constructor absence
-    SimpleIdentifier name = constructorName.name;
-    if (name != null) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [className, name]);
-    } else {
-      _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, constructorName, [className]);
-    }
-    return true;
-  }
-
-  /**
-   * This checks that if the passed class declaration implicitly calls default constructor of its
-   * superclass, there should be such default constructor - implicit or explicit.
-   *
-   * @param node the [ClassDeclaration] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
-   */
-  bool _checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
-    // do nothing if there is explicit constructor
-    List<ConstructorElement> constructors = _enclosingClass.constructors;
-    if (!constructors[0].isSynthetic) {
-      return false;
-    }
-    // prepare super
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    ClassElement superElement = superType.element;
-    // try to find default generative super constructor
-    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
-        return true;
-      }
-      if (superUnnamedConstructor.isDefaultConstructor) {
-        return true;
-      }
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
-    return true;
-  }
-
-  /**
-   * This checks that passed class declaration overrides all members required by its superclasses
-   * and interfaces.
-   *
-   * @param classNameNode the [SimpleIdentifier] to be used if there is a violation, this is
-   *          either the named from the [ClassDeclaration] or from the [ClassTypeAlias].
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR
-   * @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS
-   */
-  bool _checkForNonAbstractClassInheritsAbstractMember(SimpleIdentifier classNameNode) {
-    if (_enclosingClass.isAbstract) {
-      return false;
-    }
-    //
-    // Store in local sets the set of all method and accessor names
-    //
-    List<MethodElement> methods = _enclosingClass.methods;
-    for (MethodElement method in methods) {
-      String methodName = method.name;
-      // If the enclosing class declares the method noSuchMethod(), then return.
-      // From Spec:  It is a static warning if a concrete class does not have an implementation for
-      // a method in any of its superinterfaces unless it declares its own noSuchMethod
-      // method (7.10).
-      if (methodName == FunctionElement.NO_SUCH_METHOD_METHOD_NAME) {
-        return false;
-      }
-    }
-    HashSet<ExecutableElement> missingOverrides = new HashSet<ExecutableElement>();
-    //
-    // Loop through the set of all executable elements declared in the implicit interface.
-    //
-    MemberMap membersInheritedFromInterfaces = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    MemberMap membersInheritedFromSuperclasses = _inheritanceManager.getMapOfMembersInheritedFromClasses(_enclosingClass);
-    for (int i = 0; i < membersInheritedFromInterfaces.size; i++) {
-      String memberName = membersInheritedFromInterfaces.getKey(i);
-      ExecutableElement executableElt = membersInheritedFromInterfaces.getValue(i);
-      if (memberName == null) {
-        break;
-      }
-      // If the element is not synthetic and can be determined to be defined in Object, skip it.
-      if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
-        continue;
-      }
-      // Check to see if some element is in local enclosing class that matches the name of the
-      // required member.
-      if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
-        // We do not have to verify that this implementation of the found method matches the
-        // required function type: the set of StaticWarningCode.INVALID_METHOD_OVERRIDE_* warnings
-        // break out the different specific situations.
-        continue;
-      }
-      // First check to see if this element was declared in the superclass chain, in which case
-      // there is already a concrete implementation.
-      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
-      // Check to see if an element was found in the superclass chain with the correct name.
-      if (elt != null) {
-        // Reference the types, if any are null then continue.
-        InterfaceType enclosingType = _enclosingClass.type;
-        FunctionType concreteType = elt.type;
-        FunctionType requiredMemberType = executableElt.type;
-        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
-          continue;
-        }
-        // Some element was found in the superclass chain that matches the name of the required
-        // member.
-        // If it is not abstract and it is the correct one (types match- the version of this method
-        // that we have has the correct number of parameters, etc), then this class has a valid
-        // implementation of this method, so skip it.
-        if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
-          // Since we are comparing two function types, we need to do the appropriate type
-          // substitutions first ().
-          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
-          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
-          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
-            continue;
-          }
-        }
-      }
-      // The not qualifying concrete executable element was found, add it to the list.
-      missingOverrides.add(executableElt);
-    }
-    // Now that we have the set of missing overrides, generate a warning on this class
-    int missingOverridesSize = missingOverrides.length;
-    if (missingOverridesSize == 0) {
-      return false;
-    }
-    List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
-    List<String> stringMembersArrayListSet = new List<String>();
-    for (int i = 0; i < missingOverridesArray.length; i++) {
-      String newStrMember;
-      Element enclosingElement = missingOverridesArray[i].enclosingElement;
-      String prefix = StringUtilities.EMPTY;
-      if (missingOverridesArray[i] is PropertyAccessorElement) {
-        PropertyAccessorElement propertyAccessorElement = missingOverridesArray[i] as PropertyAccessorElement;
-        if (propertyAccessorElement.isGetter) {
-          prefix = _GETTER_SPACE;
-          // "getter "
-        } else {
-          prefix = _SETTER_SPACE;
-          // "setter "
-        }
-      }
-      if (enclosingElement != null) {
-        newStrMember = "$prefix'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
-      } else {
-        newStrMember = "$prefix'${missingOverridesArray[i].displayName}'";
-      }
-      stringMembersArrayListSet.add(newStrMember);
-    }
-    List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
-    AnalysisErrorWithProperties analysisError;
-    if (stringMembersArray.length == 1) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, classNameNode, [stringMembersArray[0]]);
-    } else if (stringMembersArray.length == 2) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, classNameNode, [stringMembersArray[0], stringMembersArray[1]]);
-    } else if (stringMembersArray.length == 3) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2]]);
-    } else if (stringMembersArray.length == 4) {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2],
-          stringMembersArray[3]]);
-    } else {
-      analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, classNameNode, [
-          stringMembersArray[0],
-          stringMembersArray[1],
-          stringMembersArray[2],
-          stringMembersArray[3],
-          stringMembersArray.length - 4]);
-    }
-    analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
-    _errorReporter.reportError(analysisError);
-    return true;
-  }
-
-  /**
-   * Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
-   * reported on the expression.
-   *
-   * @param condition the conditional expression to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_CONDITION
-   */
-  bool _checkForNonBoolCondition(Expression condition) {
-    DartType conditionType = getStaticType(condition);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_CONDITION, condition, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
-   *
-   * @param node the assert statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
-   */
-  bool _checkForNonBoolExpression(AssertStatement node) {
-    Expression expression = node.condition;
-    DartType type = getStaticType(expression);
-    if (type is InterfaceType) {
-      if (!type.isAssignableTo(_boolType)) {
-        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
-        return true;
-      }
-    } else if (type is FunctionType) {
-      FunctionType functionType = type;
-      if (functionType.typeArguments.length == 0 && !functionType.returnType.isAssignableTo(_boolType)) {
-        _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Checks to ensure that the given expression is assignable to bool.
-   *
-   * @param expression the expression expression to test
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#NON_BOOL_NEGATION_EXPRESSION
-   */
-  bool _checkForNonBoolNegationExpression(Expression expression) {
-    DartType conditionType = getStaticType(expression);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies the passed map literal either:
-   * * has `const modifier`
-   * * has explicit type arguments
-   * * is not start of the statement
-   *
-   * @param node the map literal to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
-   */
-  bool _checkForNonConstMapAsExpressionStatement(MapLiteral node) {
-    // "const"
-    if (node.constKeyword != null) {
-      return false;
-    }
-    // has type arguments
-    if (node.typeArguments != null) {
-      return false;
-    }
-    // prepare statement
-    Statement statement = node.getAncestor((node) => node is ExpressionStatement);
-    if (statement == null) {
-      return false;
-    }
-    // OK, statement does not start with map
-    if (!identical(statement.beginToken, node.beginToken)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies the passed method declaration of operator `[]=`, has `void` return
-   * type.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
-   */
-  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration node) {
-    // check that []= operator
-    SimpleIdentifier name = node.name;
-    if (name.name != "[]=") {
-      return false;
-    }
-    // check return type
-    TypeName typeName = node.returnType;
-    if (typeName != null) {
-      DartType type = typeName.type;
-      if (type != null && !type.isVoid) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName, []);
-      }
-    }
-    // no warning
-    return false;
-  }
-
-  /**
-   * This verifies the passed setter has no return type or the `void` return type.
-   *
-   * @param typeName the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
-   */
-  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
-    if (typeName != null) {
-      DartType type = typeName.type;
-      if (type != null && !type.isVoid) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName, []);
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This verifies the passed operator-method declaration, does not have an optional parameter.
-   *
-   * This method assumes that the method declaration was tested to be an operator declaration before
-   * being called.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
-   */
-  bool _checkForOptionalParameterInOperator(MethodDeclaration node) {
-    FormalParameterList parameterList = node.parameters;
-    if (parameterList == null) {
-      return false;
-    }
-    bool foundError = false;
-    NodeList<FormalParameter> formalParameters = parameterList.parameters;
-    for (FormalParameter formalParameter in formalParameters) {
-      if (formalParameter.kind.isOptional) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR, formalParameter, []);
-        foundError = true;
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks for named optional parameters that begin with '_'.
-   *
-   * @param node the default formal parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#PRIVATE_OPTIONAL_PARAMETER
-   */
-  bool _checkForPrivateOptionalParameter(FormalParameter node) {
-    // should be named parameter
-    if (node.kind != ParameterKind.NAMED) {
-      return false;
-    }
-    // name should start with '_'
-    SimpleIdentifier name = node.identifier;
-    if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, node, []);
-    return true;
-  }
-
-  /**
-   * This checks if the passed constructor declaration is the redirecting generative constructor and
-   * references itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @param constructorElement the constructor element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
-   */
-  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
-    // we check generative constructor here
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // try to find redirecting constructor invocation and analyzer it for recursion
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        // OK if no cycle
-        if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
-          return false;
-        }
-        // report error
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer, []);
-        return true;
-      }
-    }
-    // OK, no redirecting constructor invocation
-    return false;
-  }
-
-  /**
-   * This checks if the passed constructor declaration has redirected constructor and references
-   * itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @param constructorElement the constructor element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
-   */
-  bool _checkForRecursiveFactoryRedirect(ConstructorDeclaration node, ConstructorElement constructorElement) {
-    // prepare redirected constructor
-    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
-    if (redirectedConstructorNode == null) {
-      return false;
-    }
-    // OK if no cycle
-    if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT, redirectedConstructorNode, []);
-    return true;
-  }
-
-  /**
-   * This checks the class declaration is not a superinterface to itself.
-   *
-   * @param classElt the class element to test
-   * @return `true` if and only if an error code is generated on the passed element
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
-   */
-  bool _checkForRecursiveInterfaceInheritance(ClassElement classElt) {
-    if (classElt == null) {
-      return false;
-    }
-    return _safeCheckForRecursiveInterfaceInheritance(classElt, new List<ClassElement>());
-  }
-
-  /**
-   * This checks the passed constructor declaration has a valid combination of redirected
-   * constructor invocation(s), super constructor invocations and field initializers.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR
-   * @see CompileTimeErrorCode#FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
-   * @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
-   * @see CompileTimeErrorCode#SUPER_IN_REDIRECTING_CONSTRUCTOR
-   * @see CompileTimeErrorCode#REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR
-   */
-  bool _checkForRedirectingConstructorErrorCodes(ConstructorDeclaration node) {
-    bool errorReported = false;
-    //
-    // Check for default values in the parameters
-    //
-    ConstructorName redirectedConstructor = node.redirectedConstructor;
-    if (redirectedConstructor != null) {
-      for (FormalParameter parameter in node.parameters.parameters) {
-        if (parameter is DefaultFormalParameter && parameter.defaultValue != null) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR, parameter.identifier, []);
-          errorReported = true;
-        }
-      }
-    }
-    // check if there are redirected invocations
-    int numRedirections = 0;
-    for (ConstructorInitializer initializer in node.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        if (numRedirections > 0) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS, initializer, []);
-          errorReported = true;
-        }
-        if (node.factoryKeyword == null) {
-          RedirectingConstructorInvocation invocation = initializer;
-          ConstructorElement redirectingElement = invocation.staticElement;
-          if (redirectingElement == null) {
-            String enclosingTypeName = _enclosingClass.displayName;
-            String constructorStrName = enclosingTypeName;
-            if (invocation.constructorName != null) {
-              constructorStrName += ".${invocation.constructorName.name}";
-            }
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR, invocation, [constructorStrName, enclosingTypeName]);
-          } else {
-            if (redirectingElement.isFactory) {
-              _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR, initializer, []);
-            }
-          }
-        }
-        numRedirections++;
-      }
-    }
-    // check for other initializers
-    if (numRedirections > 0) {
-      for (ConstructorInitializer initializer in node.initializers) {
-        if (initializer is SuperConstructorInvocation) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, initializer, []);
-          errorReported = true;
-        }
-        if (initializer is ConstructorFieldInitializer) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR, initializer, []);
-          errorReported = true;
-        }
-      }
-    }
-    // done
-    return errorReported;
-  }
-
-  /**
-   * This checks if the passed constructor declaration has redirected constructor and references
-   * itself directly or indirectly.
-   *
-   * @param node the constructor declaration to evaluate
-   * @param constructorElement the constructor element
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
-   */
-  bool _checkForRedirectToNonConstConstructor(ConstructorDeclaration node, ConstructorElement constructorElement) {
-    // prepare redirected constructor
-    ConstructorName redirectedConstructorNode = node.redirectedConstructor;
-    if (redirectedConstructorNode == null) {
-      return false;
-    }
-    // prepare element
-    if (constructorElement == null) {
-      return false;
-    }
-    // OK, it is not 'const'
-    if (!constructorElement.isConst) {
-      return false;
-    }
-    // prepare redirected constructor
-    ConstructorElement redirectedConstructor = constructorElement.redirectedConstructor;
-    if (redirectedConstructor == null) {
-      return false;
-    }
-    // OK, it is also 'const'
-    if (redirectedConstructor.isConst) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR, redirectedConstructorNode, []);
-    return true;
-  }
-
-  /**
-   * This checks that the rethrow is inside of a catch clause.
-   *
-   * @param node the rethrow expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
-   */
-  bool _checkForRethrowOutsideCatch(RethrowExpression node) {
-    if (!_isInCatchClause) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, node, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This checks that if the the given constructor declaration is generative, then it does not have
-   * an expression function body.
-   *
-   * @param node the constructor to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
-   */
-  bool _checkForReturnInGenerativeConstructor(ConstructorDeclaration node) {
-    // ignore factory
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    // block body (with possible return statement) is checked elsewhere
-    FunctionBody body = node.body;
-    if (body is! ExpressionFunctionBody) {
-      return false;
-    }
-    // report error
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body, []);
-    return true;
-  }
-
-  /**
-   * This checks that a type mis-match between the return type and the expressed return type by the
-   * enclosing method or function.
-   *
-   * This method is called both by [checkForAllReturnStatementErrorCodes]
-   * and [visitExpressionFunctionBody].
-   *
-   * @param returnExpression the returned expression to evaluate
-   * @param expectedReturnType the expressed return type by the enclosing method or function
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
-   */
-  bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
-    if (_enclosingFunction == null) {
-      return false;
-    }
-    DartType staticReturnType = getStaticType(returnExpression);
-    if (expectedReturnType.isVoid) {
-      if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
-        return false;
-      }
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-          staticReturnType,
-          expectedReturnType,
-          _enclosingFunction.displayName]);
-      return true;
-    }
-    if (_enclosingFunction.isAsynchronous && !_enclosingFunction.isGenerator) {
-      // TODO(brianwilkerson) Figure out how to get the type "Future" so that we can build the type
-      // we need to test against.
-      //      InterfaceType impliedType = "Future<" + flatten(staticReturnType) + ">"
-      //      if (impliedType.isAssignableTo(expectedReturnType)) {
-      //        return false;
-      //      }
-      //      errorReporter.reportTypeErrorForNode(
-      //          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
-      //          returnExpression,
-      //          impliedType,
-      //          expectedReturnType.getDisplayName(),
-      //          enclosingFunction.getDisplayName());
-      //      return true;
-      return false;
-    }
-    if (staticReturnType.isAssignableTo(expectedReturnType)) {
-      return false;
-    }
-    _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-        staticReturnType,
-        expectedReturnType,
-        _enclosingFunction.displayName]);
-    return true;
-    // TODO(brianwilkerson) Define a hint corresponding to the warning and report it if appropriate.
-    //    Type propagatedReturnType = returnExpression.getPropagatedType();
-    //    boolean isPropagatedAssignable = propagatedReturnType.isAssignableTo(expectedReturnType);
-    //    if (isStaticAssignable || isPropagatedAssignable) {
-    //      return false;
-    //    }
-    //    errorReporter.reportTypeErrorForNode(
-    //        StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
-    //        returnExpression,
-    //        staticReturnType,
-    //        expectedReturnType,
-    //        enclosingFunction.getDisplayName());
-    //    return true;
-  }
-
-  /**
-   * This checks the given "typeReference" and that the "name" is not the reference to an instance
-   * member.
-   *
-   * @param typeReference the resolved [ClassElement] of the left hand side of the expression,
-   *          or `null`, aka, the class element of 'C' in 'C.x', see
-   *          [getTypeReference]
-   * @param name the accessed name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#STATIC_ACCESS_TO_INSTANCE_MEMBER
-   */
-  bool _checkForStaticAccessToInstanceMember(ClassElement typeReference, SimpleIdentifier name) {
-    // OK, target is not a type
-    if (typeReference == null) {
-      return false;
-    }
-    // prepare member Element
-    Element element = name.staticElement;
-    if (element is! ExecutableElement) {
-      return false;
-    }
-    ExecutableElement memberElement = element as ExecutableElement;
-    // OK, static
-    if (memberElement.isStatic) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  /**
-   * This checks that the type of the passed 'switch' expression is assignable to the type of the
-   * 'case' members.
-   *
-   * @param node the 'switch' statement to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
-   */
-  bool _checkForSwitchExpressionNotAssignable(SwitchStatement node) {
-    // prepare 'switch' expression type
-    Expression expression = node.expression;
-    DartType expressionType = getStaticType(expression);
-    if (expressionType == null) {
-      return false;
-    }
-    // compare with type of the first 'case'
-    NodeList<SwitchMember> members = node.members;
-    for (SwitchMember switchMember in members) {
-      if (switchMember is! SwitchCase) {
-        continue;
-      }
-      SwitchCase switchCase = switchMember as SwitchCase;
-      // prepare 'case' type
-      Expression caseExpression = switchCase.expression;
-      DartType caseType = getStaticType(caseExpression);
-      // check types
-      if (expressionType.isAssignableTo(caseType)) {
-        return false;
-      }
-      // report problem
-      _errorReporter.reportErrorForNode(StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [expressionType, caseType]);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the passed function type alias does not reference itself directly.
-   *
-   * @param node the function type alias to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
-   */
-  bool _checkForTypeAliasCannotReferenceItself_function(FunctionTypeAlias node) {
-    FunctionTypeAliasElement element = node.element;
-    if (!_hasTypedefSelfReference(element)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
-    return true;
-  }
-
-  /**
-   * This verifies that the passed type name is not a deferred type.
-   *
-   * @param expression the expression to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#TYPE_ANNOTATION_DEFERRED_CLASS
-   */
-  bool _checkForTypeAnnotationDeferredClass(TypeName node) {
-    if (node != null && node.isDeferred) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS, node, [node.name]);
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the type arguments in the passed type name are all within their bounds.
-   *
-   * @param node the [TypeName] to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-   */
-  bool _checkForTypeArgumentNotMatchingBounds(TypeName node) {
-    if (node.typeArguments == null) {
-      return false;
-    }
-    // prepare Type
-    DartType type = node.type;
-    if (type == null) {
-      return false;
-    }
-    // prepare ClassElement
-    Element element = type.element;
-    if (element is! ClassElement) {
-      return false;
-    }
-    ClassElement classElement = element as ClassElement;
-    // prepare type parameters
-    List<DartType> typeParameters = classElement.type.typeArguments;
-    List<TypeParameterElement> boundingElts = classElement.typeParameters;
-    // iterate over each bounded type parameter and corresponding argument
-    NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
-    List<DartType> typeArguments = (type as InterfaceType).typeArguments;
-    int loopThroughIndex = math.min(typeNameArgList.length, boundingElts.length);
-    bool foundError = false;
-    for (int i = 0; i < loopThroughIndex; i++) {
-      TypeName argTypeName = typeNameArgList[i];
-      DartType argType = argTypeName.type;
-      DartType boundType = boundingElts[i].bound;
-      if (argType != null && boundType != null) {
-        if (typeArguments.length != 0 && typeArguments.length == typeParameters.length) {
-          boundType = boundType.substitute2(typeArguments, typeParameters);
-        }
-        if (!argType.isSubtypeOf(boundType)) {
-          ErrorCode errorCode;
-          if (_isInConstInstanceCreation) {
-            errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
-          } else {
-            errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
-          }
-          _errorReporter.reportTypeErrorForNode(errorCode, argTypeName, [argType, boundType]);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * This checks that if the passed type name is a type parameter being used to define a static
-   * member.
-   *
-   * @param node the type name to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#TYPE_PARAMETER_REFERENCED_BY_STATIC
-   */
-  bool _checkForTypeParameterReferencedByStatic(TypeName node) {
-    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
-      DartType type = node.type;
-      if (type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, node, []);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * This checks that if the passed type parameter is a supertype of its bound.
-   *
-   * @param node the type parameter to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
-   */
-  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter node) {
-    TypeParameterElement element = node.element;
-    // prepare bound
-    DartType bound = element.bound;
-    if (bound == null) {
-      return false;
-    }
-    // OK, type parameter is not supertype of its bound
-    if (!bound.isMoreSpecificThan(element.type)) {
-      return false;
-    }
-    // report problem
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, node, [element.displayName]);
-    return true;
-  }
-
-  /**
-   * This checks that if the passed generative constructor has neither an explicit super constructor
-   * invocation nor a redirecting constructor invocation, that the superclass has a default
-   * generative constructor.
-   *
-   * @param node the constructor declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
-   * @see CompileTimeErrorCode#NON_GENERATIVE_CONSTRUCTOR
-   * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT
-   */
-  bool _checkForUndefinedConstructorInInitializerImplicit(ConstructorDeclaration node) {
-    //
-    // Ignore if the constructor is not generative.
-    //
-    if (node.factoryKeyword != null) {
-      return false;
-    }
-    //
-    // Ignore if the constructor has either an implicit super constructor invocation or a
-    // redirecting constructor invocation.
-    //
-    for (ConstructorInitializer constructorInitializer in node.initializers) {
-      if (constructorInitializer is SuperConstructorInvocation || constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
-      }
-    }
-    //
-    // Check to see whether the superclass has a non-factory unnamed constructor.
-    //
-    if (_enclosingClass == null) {
-      return false;
-    }
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    ClassElement superElement = superType.element;
-    ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
-    if (superUnnamedConstructor != null) {
-      if (superUnnamedConstructor.isFactory) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.returnType, [superUnnamedConstructor]);
-        return true;
-      }
-      if (!superUnnamedConstructor.isDefaultConstructor) {
-        int offset;
-        int length;
-        {
-          Identifier returnType = node.returnType;
-          SimpleIdentifier name = node.name;
-          offset = returnType.offset;
-          length = (name != null ? name.end : returnType.end) - offset;
-        }
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
-      }
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, node.returnType, [superElement.name]);
-    return true;
-  }
-
-  /**
-   * This checks that if the given name is a reference to a static member it is defined in the
-   * enclosing class rather than in a superclass.
-   *
-   * @param name the name to be evaluated
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticTypeWarningCode#UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
-   */
-  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(SimpleIdentifier name) {
-    Element element = name.staticElement;
-    if (element == null || element is TypeParameterElement) {
-      return false;
-    }
-    Element enclosingElement = element.enclosingElement;
-    if (enclosingElement is! ClassElement) {
-      return false;
-    }
-    if ((element is MethodElement && !element.isStatic) || (element is PropertyAccessorElement && !element.isStatic)) {
-      return false;
-    }
-    if (identical(enclosingElement, _enclosingClass)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, name, [name.name]);
-    return true;
-  }
-
-  void _checkForValidField(FieldFormalParameter node) {
-    ParameterElement element = node.element;
-    if (element is FieldFormalParameterElement) {
-      FieldElement fieldElement = element.field;
-      if (fieldElement == null || fieldElement.isSynthetic) {
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
-      } else {
-        ParameterElement parameterElement = node.element;
-        if (parameterElement is FieldFormalParameterElementImpl) {
-          FieldFormalParameterElementImpl fieldFormal = parameterElement;
-          DartType declaredType = fieldFormal.type;
-          DartType fieldType = fieldElement.type;
-          if (fieldElement.isSynthetic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
-          } else if (fieldElement.isStatic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
-          } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType, fieldType]);
-          }
-        } else {
-          if (fieldElement.isSynthetic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, node, [node.identifier.name]);
-          } else if (fieldElement.isStatic) {
-            _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
-          }
-        }
-      }
-    }
-    //    else {
-    //    // TODO(jwren) Report error, constructor initializer variable is a top level element
-    //    // (Either here or in ErrorVerifier#checkForAllFinalInitializedErrorCodes)
-    //    }
-  }
-
-  /**
-   * This verifies that the given getter does not have a return type of 'void'.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#VOID_RETURN_FOR_GETTER
-   */
-  bool _checkForVoidReturnType(MethodDeclaration node) {
-    TypeName returnType = node.returnType;
-    if (returnType == null || returnType.name.name != "void") {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType, []);
-    return true;
-  }
-
-  /**
-   * This verifies the passed operator-method declaration, has correct number of parameters.
-   *
-   * This method assumes that the method declaration was tested to be an operator declaration before
-   * being called.
-   *
-   * @param node the method declaration to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
-   */
-  bool _checkForWrongNumberOfParametersForOperator(MethodDeclaration node) {
-    // prepare number of parameters
-    FormalParameterList parameterList = node.parameters;
-    if (parameterList == null) {
-      return false;
-    }
-    int numParameters = parameterList.parameters.length;
-    // prepare operator name
-    SimpleIdentifier nameNode = node.name;
-    if (nameNode == null) {
-      return false;
-    }
-    String name = nameNode.name;
-    // check for exact number of parameters
-    int expected = -1;
-    if ("[]=" == name) {
-      expected = 2;
-    } else if ("<" == name || ">" == name || "<=" == name || ">=" == name || "==" == name || "+" == name || "/" == name || "~/" == name || "*" == name || "%" == name || "|" == name || "^" == name || "&" == name || "<<" == name || ">>" == name || "[]" == name) {
-      expected = 1;
-    } else if ("~" == name) {
-      expected = 0;
-    }
-    if (expected != -1 && numParameters != expected) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, nameNode, [name, expected, numParameters]);
-      return true;
-    }
-    // check for operator "-"
-    if ("-" == name && numParameters > 1) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, nameNode, [numParameters]);
-      return true;
-    }
-    // OK
-    return false;
-  }
-
-  /**
-   * This verifies if the passed setter parameter list have only one required parameter.
-   *
-   * This method assumes that the method declaration was tested to be a setter before being called.
-   *
-   * @param setterName the name of the setter to report problems on
-   * @param parameterList the parameter list to evaluate
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
-   */
-  bool _checkForWrongNumberOfParametersForSetter(SimpleIdentifier setterName, FormalParameterList parameterList) {
-    if (setterName == null) {
-      return false;
-    }
-    if (parameterList == null) {
-      return false;
-    }
-    NodeList<FormalParameter> parameters = parameterList.parameters;
-    if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that if the given class declaration implements the class Function that it has a
-   * concrete implementation of the call method.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see StaticWarningCode#FUNCTION_WITHOUT_CALL
-   */
-  bool _checkImplementsFunctionWithoutCall(ClassDeclaration node) {
-    if (node.isAbstract) {
-      return false;
-    }
-    ClassElement classElement = node.element;
-    if (classElement == null) {
-      return false;
-    }
-    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
-      return false;
-    }
-    // If there is a noSuchMethod method, then don't report the warning, see dartbug.com/16078
-    if (classElement.getMethod(FunctionElement.NO_SUCH_METHOD_METHOD_NAME) != null) {
-      return false;
-    }
-    ExecutableElement callMethod = _inheritanceManager.lookupMember(classElement, "call");
-    if (callMethod == null || callMethod is! MethodElement || (callMethod as MethodElement).isAbstract) {
-      _errorReporter.reportErrorForNode(StaticWarningCode.FUNCTION_WITHOUT_CALL, node.name, []);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * This verifies that the given class declaration does not have the same class in the 'extends'
-   * and 'implements' clauses.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#IMPLEMENTS_SUPER_CLASS
-   */
-  bool _checkImplementsSuperClass(ClassDeclaration node) {
-    // prepare super type
-    InterfaceType superType = _enclosingClass.supertype;
-    if (superType == null) {
-      return false;
-    }
-    // prepare interfaces
-    ImplementsClause implementsClause = node.implementsClause;
-    if (implementsClause == null) {
-      return false;
-    }
-    // check interfaces
-    bool hasProblem = false;
-    for (TypeName interfaceNode in implementsClause.interfaces) {
-      if (interfaceNode.type == superType) {
-        hasProblem = true;
-        _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, [superType.displayName]);
-      }
-    }
-    // done
-    return hasProblem;
-  }
-
-  /**
-   * Return the error code that should be used when the given class references itself directly.
-   *
-   * @param classElt the class that references itself
-   * @return the error code that should be used
-   */
-  ErrorCode _getBaseCaseErrorCode(ClassElement classElt) {
-    InterfaceType supertype = classElt.supertype;
-    if (supertype != null && _enclosingClass == supertype.element) {
-      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS;
-    }
-    List<InterfaceType> mixins = classElt.mixins;
-    for (int i = 0; i < mixins.length; i++) {
-      if (_enclosingClass == mixins[i].element) {
-        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH;
-      }
-    }
-    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
-  }
-
-  /**
-   * Given an expression in a switch case whose value is expected to be an enum constant, return the
-   * name of the constant.
-   *
-   * @param expression the expression from the switch case
-   * @return the name of the constant referenced by the expression
-   */
-  String _getConstantName(Expression expression) {
-    // TODO(brianwilkerson) Convert this to return the element representing the constant.
-    if (expression is SimpleIdentifier) {
-      return expression.name;
-    } else if (expression is PrefixedIdentifier) {
-      return expression.identifier.name;
-    } else if (expression is PropertyAccess) {
-      return expression.propertyName.name;
-    }
-    return null;
-  }
-
-  /**
-   * Returns the Type (return type) for a given getter.
-   *
-   * @param propertyAccessorElement
-   * @return The type of the given getter.
-   */
-  DartType _getGetterType(PropertyAccessorElement propertyAccessorElement) {
-    FunctionType functionType = propertyAccessorElement.type;
-    if (functionType != null) {
-      return functionType.returnType;
-    } else {
-      return null;
-    }
-  }
-
-  /**
-   * Returns the Type (first and only parameter) for a given setter.
-   *
-   * @param propertyAccessorElement
-   * @return The type of the given setter.
-   */
-  DartType _getSetterType(PropertyAccessorElement propertyAccessorElement) {
-    // Get the parameters for MethodDeclaration or FunctionDeclaration
-    List<ParameterElement> setterParameters = propertyAccessorElement.parameters;
-    // If there are no setter parameters, return no type.
-    if (setterParameters.length == 0) {
-      return null;
-    }
-    return setterParameters[0].type;
-  }
-
-  /**
-   * Given a list of directives that have the same prefix, generate an error if there is more than
-   * one import and any of those imports is deferred.
-   *
-   * @param directives the list of directives that have the same prefix
-   * @return `true` if an error was generated
-   * @see CompileTimeErrorCode#SHARED_DEFERRED_PREFIX
-   */
-  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
-    bool foundError = false;
-    int count = directives.length;
-    if (count > 1) {
-      for (int i = 0; i < count; i++) {
-        sc.Token deferredToken = directives[i].deferredToken;
-        if (deferredToken != null) {
-          _errorReporter.reportErrorForToken(CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken, []);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
-   * @return `true` if the given constructor redirects to itself, directly or indirectly
-   */
-  bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
-    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
-    ConstructorElement current = element;
-    while (current != null) {
-      if (constructors.contains(current)) {
-        return identical(current, element);
-      }
-      constructors.add(current);
-      current = current.redirectedConstructor;
-      if (current is ConstructorMember) {
-        current = (current as ConstructorMember).baseElement;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * @return <code>true</code> if given [Element] has direct or indirect reference to itself
-   *         from anywhere except [ClassElement] or type parameter bounds.
-   */
-  bool _hasTypedefSelfReference(Element target) {
-    Set<Element> checked = new HashSet<Element>();
-    List<Element> toCheck = new List<Element>();
-    toCheck.add(target);
-    bool firstIteration = true;
-    while (true) {
-      Element current;
-      // get next element
-      while (true) {
-        // may be no more elements to check
-        if (toCheck.isEmpty) {
-          return false;
-        }
-        // try to get next element
-        current = toCheck.removeAt(toCheck.length - 1);
-        if (target == current) {
-          if (firstIteration) {
-            firstIteration = false;
-            break;
-          } else {
-            return true;
-          }
-        }
-        if (current != null && !checked.contains(current)) {
-          break;
-        }
-      }
-      // check current element
-      current.accept(new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(target, toCheck));
-      checked.add(current);
-    }
-  }
-
-  bool _isFunctionType(DartType type) {
-    if (type.isDynamic || type.isBottom) {
-      return true;
-    } else if (type is FunctionType || type.isDartCoreFunction) {
-      return true;
-    } else if (type is InterfaceType) {
-      MethodElement callMethod = type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _currentLibrary);
-      return callMethod != null;
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given type represents the class `Future` from the
-   * `dart:async` library.
-   *
-   * @param type the type to be tested
-   * @return `true` if the given type represents the class `Future` from the
-   *         `dart:async` library
-   */
-  bool _isFuture(DartType type) {
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      if (interfaceType.name == "Future") {
-        ClassElement element = interfaceType.element;
-        if (element != null) {
-          LibraryElement library = element.library;
-          if (library.name == "dart.async") {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` iff the passed [ClassElement] has a method, getter or setter that
-   * matches the name of the passed [ExecutableElement] in either the class itself, or one of
-   * its' mixins that is concrete.
-   *
-   * By "match", only the name of the member is tested to match, it does not have to equal or be a
-   * subtype of the passed executable element, this is due to the specific use where this method is
-   * used in [checkForNonAbstractClassInheritsAbstractMember].
-   *
-   * @param executableElt the executable to search for in the passed class element
-   * @param classElt the class method to search through the members of
-   * @return `true` iff the passed member is found in the passed class element
-   */
-  bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
-    ExecutableElement foundElt = null;
-    String executableName = executableElt.name;
-    if (executableElt is MethodElement) {
-      foundElt = classElt.getMethod(executableName);
-      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElt.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getMethod(executableName);
-      }
-      if (foundElt != null && !(foundElt as MethodElement).isAbstract) {
-        return true;
-      }
-    } else if (executableElt is PropertyAccessorElement) {
-      PropertyAccessorElement propertyAccessorElement = executableElt;
-      if (propertyAccessorElement.isGetter) {
-        foundElt = classElt.getGetter(executableName);
-      }
-      if (foundElt == null && propertyAccessorElement.isSetter) {
-        foundElt = classElt.getSetter(executableName);
-      }
-      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
-        return true;
-      }
-      List<InterfaceType> mixins = classElt.mixins;
-      for (int i = 0; i < mixins.length && foundElt == null; i++) {
-        foundElt = mixins[i].getGetter(executableName);
-        if (foundElt == null) {
-          foundElt = mixins[i].getSetter(executableName);
-        }
-      }
-      if (foundElt != null && !(foundElt as PropertyAccessorElement).isAbstract) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * @param node the 'this' expression to analyze
-   * @return `true` if the given 'this' expression is in the valid context
-   */
-  bool _isThisInValidContext(ThisExpression node) {
-    for (AstNode n = node; n != null; n = n.parent) {
-      if (n is CompilationUnit) {
-        return false;
-      }
-      if (n is ConstructorDeclaration) {
-        ConstructorDeclaration constructor = n as ConstructorDeclaration;
-        return constructor.factoryKeyword == null;
-      }
-      if (n is ConstructorInitializer) {
-        return false;
-      }
-      if (n is MethodDeclaration) {
-        MethodDeclaration method = n as MethodDeclaration;
-        return !method.isStatic;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Return `true` if the given identifier is in a location where it is allowed to resolve to
-   * a static member of a supertype.
-   *
-   * @param node the node being tested
-   * @return `true` if the given identifier is in a location where it is allowed to resolve to
-   *         a static member of a supertype
-   */
-  bool _isUnqualifiedReferenceToNonLocalStaticMemberAllowed(SimpleIdentifier node) {
-    if (node.inDeclarationContext()) {
-      return true;
-    }
-    AstNode parent = node.parent;
-    if (parent is ConstructorName || parent is MethodInvocation || parent is PropertyAccess || parent is SuperConstructorInvocation) {
-      return true;
-    }
-    if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
-      return true;
-    }
-    if (parent is Annotation && identical(parent.constructorName, node)) {
-      return true;
-    }
-    if (parent is CommentReference) {
-      CommentReference commentReference = parent;
-      if (commentReference.newKeyword != null) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool _isUserDefinedObject(EvaluationResultImpl result) => result == null || (result.value != null && result.value.isUserDefinedObject);
-
-  /**
-   * This checks the class declaration is not a superinterface to itself.
-   *
-   * @param classElt the class element to test
-   * @param path a list containing the potentially cyclic implements path
-   * @return `true` if and only if an error code is generated on the passed element
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
-   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
-   */
-  bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
-    // Detect error condition.
-    int size = path.length;
-    // If this is not the base case (size > 0), and the enclosing class is the passed class
-    // element then an error an error.
-    if (size > 0 && _enclosingClass == classElt) {
-      String enclosingClassName = _enclosingClass.displayName;
-      if (size > 1) {
-        // Construct a string showing the cyclic implements path: "A, B, C, D, A"
-        String separator = ", ";
-        StringBuffer buffer = new StringBuffer();
-        for (int i = 0; i < size; i++) {
-          buffer.write(path[i].displayName);
-          buffer.write(separator);
-        }
-        buffer.write(classElt.displayName);
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, buffer.toString()]);
-        return true;
-      } else {
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
-        _errorReporter.reportErrorForOffset(_getBaseCaseErrorCode(classElt), _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
-        return true;
-      }
-    }
-    if (path.indexOf(classElt) > 0) {
-      return false;
-    }
-    path.add(classElt);
-    // n-case
-    InterfaceType supertype = classElt.supertype;
-    if (supertype != null && _safeCheckForRecursiveInterfaceInheritance(supertype.element, path)) {
-      return true;
-    }
-    List<InterfaceType> interfaceTypes = classElt.interfaces;
-    for (InterfaceType interfaceType in interfaceTypes) {
-      if (_safeCheckForRecursiveInterfaceInheritance(interfaceType.element, path)) {
-        return true;
-      }
-    }
-    List<InterfaceType> mixinTypes = classElt.mixins;
-    for (InterfaceType mixinType in mixinTypes) {
-      if (_safeCheckForRecursiveInterfaceInheritance(mixinType.element, path)) {
-        return true;
-      }
-    }
-    path.removeAt(path.length - 1);
-    return false;
-  }
-}
-
-/**
  * Instances of the class `ExitDetector` determine whether the visited AST node is guaranteed
  * to terminate by executing a `return` statement, `throw` expression, `rethrow`
  * expression, or simple infinite loop such as `while(true)`.
@@ -12950,7 +4937,7 @@
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
     try {
-      return _nodeExits(node.iterator);
+      return _nodeExits(node.iterable);
     } finally {
       _enclosingBlockContainsBreak = outerBreakValue;
     }
@@ -13332,34 +5319,6 @@
   }
 }
 
-class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
-  DartType result = null;
-
-  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
-
-  @override
-  Object visitExpression(Expression node) => null;
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    // prepare this 'return' type
-    DartType type;
-    Expression expression = node.expression;
-    if (expression != null) {
-      type = expression.bestType;
-    } else {
-      type = BottomTypeImpl.instance;
-    }
-    // merge types
-    if (result == null) {
-      result = type;
-    } else {
-      result = result.getLeastUpperBound(type);
-    }
-    return null;
-  }
-}
-
 class GeneralizingElementVisitor_DeclarationMatcher_gatherElements extends GeneralizingElementVisitor<Object> {
   final DeclarationMatcher DeclarationMatcher_this;
 
@@ -13373,83 +5332,6 @@
   }
 }
 
-class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
-  Element target;
-
-  List<Element> toCheck;
-
-  GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.target, this.toCheck) : super();
-
-  bool _inClass = false;
-
-  @override
-  Object visitClassElement(ClassElement element) {
-    _addTypeToCheck(element.supertype);
-    for (InterfaceType mixin in element.mixins) {
-      _addTypeToCheck(mixin);
-    }
-    _inClass = !element.isTypedef;
-    try {
-      return super.visitClassElement(element);
-    } finally {
-      _inClass = false;
-    }
-  }
-
-  @override
-  Object visitExecutableElement(ExecutableElement element) {
-    if (element.isSynthetic) {
-      return null;
-    }
-    _addTypeToCheck(element.returnType);
-    return super.visitExecutableElement(element);
-  }
-
-  @override
-  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    _addTypeToCheck(element.returnType);
-    return super.visitFunctionTypeAliasElement(element);
-  }
-
-  @override
-  Object visitParameterElement(ParameterElement element) {
-    _addTypeToCheck(element.type);
-    return super.visitParameterElement(element);
-  }
-
-  @override
-  Object visitTypeParameterElement(TypeParameterElement element) {
-    _addTypeToCheck(element.bound);
-    return super.visitTypeParameterElement(element);
-  }
-
-  @override
-  Object visitVariableElement(VariableElement element) {
-    _addTypeToCheck(element.type);
-    return super.visitVariableElement(element);
-  }
-
-  void _addTypeToCheck(DartType type) {
-    if (type == null) {
-      return;
-    }
-    Element element = type.element;
-    // it is OK to reference target from class
-    if (_inClass && target == element) {
-      return;
-    }
-    // schedule for checking
-    toCheck.add(element);
-    // type arguments
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      for (DartType typeArgument in interfaceType.typeArguments) {
-        _addTypeToCheck(typeArgument);
-      }
-    }
-  }
-}
-
 /**
  * Instances of the class `HintGenerator` traverse a library's worth of dart code at a time to
  * generate hints over the set of sources.
@@ -13626,7 +5508,9 @@
           _errorListener.addAll(resolver.errorListener);
         } on AnalysisException catch (exception, stackTrace) {
           //TODO (danrubel): Handle or forward the exception
-          AnalysisEngine.instance.logger.logError2("Could not resolve script tag", new CaughtException(exception, stackTrace));
+          AnalysisEngine.instance.logger.logError(
+              "Could not resolve script tag",
+              new CaughtException(exception, stackTrace));
         }
         node.scriptElement = script;
         _scripts.add(script);
@@ -15610,7 +7494,9 @@
       try {
         _libraryElement = _analysisContext.computeLibraryElement(librarySource) as LibraryElementImpl;
       } on AnalysisException catch (exception, stackTrace) {
-        AnalysisEngine.instance.logger.logError2("Could not compute library element for ${librarySource.fullName}", new CaughtException(exception, stackTrace));
+        AnalysisEngine.instance.logger.logError(
+            "Could not compute library element for ${librarySource.fullName}",
+            new CaughtException(exception, stackTrace));
       }
     }
     return _libraryElement;
@@ -16917,7 +8803,9 @@
               computer.add(unit);
             }
           } on AnalysisException catch (exception, stackTrace) {
-            AnalysisEngine.instance.logger.logError2("Internal Error: Could not access AST for ${source.fullName} during constant evaluation", new CaughtException(exception, stackTrace));
+            AnalysisEngine.instance.logger.logError(
+                "Internal Error: Could not access AST for ${source.fullName} during constant evaluation",
+                new CaughtException(exception, stackTrace));
           }
         }
       }
@@ -19806,8 +11694,8 @@
     // We visit the iterator before the loop variable because the loop variable cannot be in scope
     // while visiting the iterator.
     //
-    Expression iterator = node.iterator;
-    safelyVisit(iterator);
+    Expression iterable = node.iterable;
+    safelyVisit(iterable);
     DeclaredIdentifier loopVariable = node.loopVariable;
     SimpleIdentifier identifier = node.identifier;
     safelyVisit(loopVariable);
@@ -19816,17 +11704,17 @@
     if (body != null) {
       _overrideManager.enterScope();
       try {
-        if (loopVariable != null && iterator != null) {
+        if (loopVariable != null && iterable != null) {
           LocalVariableElement loopElement = loopVariable.element;
           if (loopElement != null) {
-            DartType iteratorElementType = _getIteratorElementType(iterator);
+            DartType iteratorElementType = _getIteratorElementType(iterable);
             overrideVariable(loopElement, iteratorElementType, true);
             _recordPropagatedType(loopVariable.identifier, iteratorElementType);
           }
-        } else if (identifier != null && iterator != null) {
+        } else if (identifier != null && iterable != null) {
           Element identifierElement = identifier.staticElement;
           if (identifierElement is VariableElement) {
-            DartType iteratorElementType = _getIteratorElementType(iterator);
+            DartType iteratorElementType = _getIteratorElementType(iterable);
             overrideVariable(identifierElement, iteratorElementType, true);
             _recordPropagatedType(identifier, iteratorElementType);
           }
@@ -20707,7 +12595,9 @@
     Scope outerScope = _nameScope;
     try {
       if (classElement == null) {
-        AnalysisEngine.instance.logger.logInformation2("Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
         super.visitClassDeclaration(node);
       } else {
         _nameScope = new TypeParameterScope(_nameScope, classElement);
@@ -20749,7 +12639,9 @@
         }
         buffer.write(" in ");
         buffer.write(definingLibrary.source.fullName);
-        AnalysisEngine.instance.logger.logInformation2(buffer.toString(), new JavaException());
+        AnalysisEngine.instance.logger.logInformation(
+            buffer.toString(),
+            new CaughtException(new AnalysisException(), null));
       } else {
         _nameScope = new FunctionScope(_nameScope, constructorElement);
       }
@@ -20832,7 +12724,9 @@
     Scope outerScope = _nameScope;
     try {
       if (functionElement == null) {
-        AnalysisEngine.instance.logger.logInformation2("Missing element for top-level function ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for top-level function ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
       } else {
         _nameScope = new FunctionScope(_nameScope, functionElement);
       }
@@ -20868,7 +12762,9 @@
           }
           buffer.write("in ");
           buffer.write(definingLibrary.source.fullName);
-          AnalysisEngine.instance.logger.logInformation2(buffer.toString(), new JavaException());
+          AnalysisEngine.instance.logger.logInformation(
+              buffer.toString(),
+              new CaughtException(new AnalysisException(), null));
         } else {
           _nameScope = new FunctionScope(_nameScope, functionElement);
         }
@@ -20917,7 +12813,9 @@
     try {
       ExecutableElement methodElement = node.element;
       if (methodElement == null) {
-        AnalysisEngine.instance.logger.logInformation2("Missing element for method ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for method ${node.name.name} in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
       } else {
         _nameScope = new FunctionScope(_nameScope, methodElement);
       }
@@ -21084,7 +12982,7 @@
     // while visiting the iterator.
     //
     safelyVisit(node.identifier);
-    safelyVisit(node.iterator);
+    safelyVisit(node.iterable);
     safelyVisit(node.loopVariable);
     visitStatementInScope(node.body);
   }
@@ -21168,1690 +13066,6 @@
 }
 
 /**
- * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
- * compute the static type of every expression. Second, they look for any static type errors or
- * warnings that might need to be generated. The requirements for the type analyzer are:
- * <ol>
- * * Every element that refers to types should be fully populated.
- * * Every node representing an expression should be resolved to the Type of the expression.
- * </ol>
- */
-class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
-  /**
-   * Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
-   * implement those tags.
-   *
-   * @return the table that was created
-   */
-  static HashMap<String, String> _createHtmlTagToClassMap() {
-    HashMap<String, String> map = new HashMap<String, String>();
-    map["a"] = "AnchorElement";
-    map["area"] = "AreaElement";
-    map["br"] = "BRElement";
-    map["base"] = "BaseElement";
-    map["body"] = "BodyElement";
-    map["button"] = "ButtonElement";
-    map["canvas"] = "CanvasElement";
-    map["content"] = "ContentElement";
-    map["dl"] = "DListElement";
-    map["datalist"] = "DataListElement";
-    map["details"] = "DetailsElement";
-    map["div"] = "DivElement";
-    map["embed"] = "EmbedElement";
-    map["fieldset"] = "FieldSetElement";
-    map["form"] = "FormElement";
-    map["hr"] = "HRElement";
-    map["head"] = "HeadElement";
-    map["h1"] = "HeadingElement";
-    map["h2"] = "HeadingElement";
-    map["h3"] = "HeadingElement";
-    map["h4"] = "HeadingElement";
-    map["h5"] = "HeadingElement";
-    map["h6"] = "HeadingElement";
-    map["html"] = "HtmlElement";
-    map["iframe"] = "IFrameElement";
-    map["img"] = "ImageElement";
-    map["input"] = "InputElement";
-    map["keygen"] = "KeygenElement";
-    map["li"] = "LIElement";
-    map["label"] = "LabelElement";
-    map["legend"] = "LegendElement";
-    map["link"] = "LinkElement";
-    map["map"] = "MapElement";
-    map["menu"] = "MenuElement";
-    map["meter"] = "MeterElement";
-    map["ol"] = "OListElement";
-    map["object"] = "ObjectElement";
-    map["optgroup"] = "OptGroupElement";
-    map["output"] = "OutputElement";
-    map["p"] = "ParagraphElement";
-    map["param"] = "ParamElement";
-    map["pre"] = "PreElement";
-    map["progress"] = "ProgressElement";
-    map["script"] = "ScriptElement";
-    map["select"] = "SelectElement";
-    map["source"] = "SourceElement";
-    map["span"] = "SpanElement";
-    map["style"] = "StyleElement";
-    map["caption"] = "TableCaptionElement";
-    map["td"] = "TableCellElement";
-    map["col"] = "TableColElement";
-    map["table"] = "TableElement";
-    map["tr"] = "TableRowElement";
-    map["textarea"] = "TextAreaElement";
-    map["title"] = "TitleElement";
-    map["track"] = "TrackElement";
-    map["ul"] = "UListElement";
-    map["video"] = "VideoElement";
-    return map;
-  }
-
-  /**
-   * The resolver driving the resolution and type analysis.
-   */
-  final ResolverVisitor _resolver;
-
-  /**
-   * The object providing access to the types defined by the language.
-   */
-  TypeProvider _typeProvider;
-
-  /**
-   * The type representing the type 'dynamic'.
-   */
-  DartType _dynamicType;
-
-  /**
-   * The type representing the class containing the nodes being analyzed, or `null` if the
-   * nodes are not within a class.
-   */
-  InterfaceType _thisType;
-
-  /**
-   * The object keeping track of which elements have had their types overridden.
-   */
-  TypeOverrideManager _overrideManager;
-
-  /**
-   * The object keeping track of which elements have had their types promoted.
-   */
-  TypePromotionManager _promoteManager;
-
-  /**
-   * A table mapping [ExecutableElement]s to their propagated return types.
-   */
-  HashMap<ExecutableElement, DartType> _propagatedReturnTypes = new HashMap<ExecutableElement, DartType>();
-
-  /**
-   * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
-   * those tags.
-   */
-  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
-
-  /**
-   * Initialize a newly created type analyzer.
-   *
-   * @param resolver the resolver driving this participant
-   */
-  StaticTypeAnalyzer(this._resolver) {
-    _typeProvider = _resolver.typeProvider;
-    _dynamicType = _typeProvider.dynamicType;
-    _overrideManager = _resolver.overrideManager;
-    _promoteManager = _resolver.promoteManager;
-  }
-
-  /**
-   * Set the type of the class being analyzed to the given type.
-   *
-   * @param thisType the type representing the class containing the nodes being analyzed
-   */
-  void set thisType(InterfaceType thisType) {
-    this._thisType = thisType;
-  }
-
-  /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
-   * `String`.</blockquote>
-   */
-  @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
-    _recordStaticType(node, _typeProvider.stringType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
-   *
-   * It is a static warning if <i>T</i> does not denote a type available in the current lexical
-   * scope.
-   *
-   * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
-   */
-  @override
-  Object visitAsExpression(AsExpression node) {
-    _recordStaticType(node, _getType(node.type));
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
-   * = e</i> ...
-   *
-   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
-   * type of <i>v</i>.
-   *
-   * The static type of the expression <i>v = e</i> is the static type of <i>e</i>.
-   *
-   * ... an assignment of the form <i>C.v = e</i> ...
-   *
-   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
-   * type of <i>C.v</i>.
-   *
-   * The static type of the expression <i>C.v = e</i> is the static type of <i>e</i>.
-   *
-   * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ...
-   *
-   * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type warning if
-   * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type
-   * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
-   *
-   * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
-   * <i>e<sub>2</sub></i>.
-   *
-   * ... an assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> ...
-   *
-   * The static type of the expression <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> is the
-   * static type of <i>e<sub>3</sub></i>.
-   *
-   * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
-   * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e</i>. A compound
-   * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivalent to <i>((x) => x.v
-   * = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable that is not used in
-   * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] op=
-   * e<sub>3</sub></i> is equivalent to <i>((a, i) => a[i] = a[i] op e<sub>3</sub>)(e<sub>1</sub>,
-   * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
-   * <i>e<sub>3</sub></i>.</blockquote>
-   */
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    sc.TokenType operator = node.operator.type;
-    if (operator == sc.TokenType.EQ) {
-      Expression rightHandSide = node.rightHandSide;
-      DartType staticType = _getStaticType(rightHandSide);
-      _recordStaticType(node, staticType);
-      DartType overrideType = staticType;
-      DartType propagatedType = rightHandSide.propagatedType;
-      if (propagatedType != null) {
-        if (propagatedType.isMoreSpecificThan(staticType)) {
-          _recordPropagatedType(node, propagatedType);
-        }
-        overrideType = propagatedType;
-      }
-      _resolver.overrideExpression(node.leftHandSide, overrideType, true);
-    } else {
-      ExecutableElement staticMethodElement = node.staticElement;
-      DartType staticType = _computeStaticReturnType(staticMethodElement);
-      _recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.propagatedElement;
-      if (!identical(propagatedMethodElement, staticMethodElement)) {
-        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
-        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          _recordPropagatedType(node, propagatedType);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
-   * expression is `bool`.</blockquote>
-   *
-   * The Dart Language Specification, 12.21:<blockquote>A bitwise expression of the form
-   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A bitwise expression of the form <i>super op
-   * e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
-   * The Dart Language Specification, 12.22: <blockquote>The static type of an equality expression
-   * is `bool`.</blockquote>
-   *
-   * The Dart Language Specification, 12.23: <blockquote>A relational expression of the form
-   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A relational expression of the form <i>super op
-   * e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
-   * The Dart Language Specification, 12.24: <blockquote>A shift expression of the form
-   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A shift expression of the form <i>super op
-   * e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
-   * The Dart Language Specification, 12.25: <blockquote>An additive expression of the form
-   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. An additive expression of the form <i>super op
-   * e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   *
-   * The Dart Language Specification, 12.26: <blockquote>A multiplicative expression of the form
-   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op
-   * e<sub>2</sub></i> is equivalent to the method invocation
-   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
-   */
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    ExecutableElement staticMethodElement = node.staticElement;
-    DartType staticType = _computeStaticReturnType(staticMethodElement);
-    staticType = _refineBinaryExpressionType(node, staticType);
-    _recordStaticType(node, staticType);
-    MethodElement propagatedMethodElement = node.propagatedElement;
-    if (!identical(propagatedMethodElement, staticMethodElement)) {
-      DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
-      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        _recordPropagatedType(node, propagatedType);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
-   * bool.</blockquote>
-   */
-  @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
-    _recordStaticType(node, _typeProvider.boolType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method invocation expression
-   * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suffix; return
-   * t;}(e)</i>.</blockquote>
-   */
-  @override
-  Object visitCascadeExpression(CascadeExpression node) {
-    _recordStaticType(node, _getStaticType(node.target));
-    _recordPropagatedType(node, node.target.propagatedType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
-   * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
-   *
-   * It is a static type warning if the type of e<sub>1</sub> may not be assigned to `bool`.
-   *
-   * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
-   * and the static type of <i>e<sub>3</sub></i>.</blockquote>
-   */
-  @override
-  Object visitConditionalExpression(ConditionalExpression node) {
-    DartType staticThenType = _getStaticType(node.thenExpression);
-    DartType staticElseType = _getStaticType(node.elseExpression);
-    if (staticThenType == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticThenType = _dynamicType;
-    }
-    if (staticElseType == null) {
-      // TODO(brianwilkerson) Determine whether this can still happen.
-      staticElseType = _dynamicType;
-    }
-    DartType staticType = staticThenType.getLeastUpperBound(staticElseType);
-    if (staticType == null) {
-      staticType = _dynamicType;
-    }
-    _recordStaticType(node, staticType);
-    DartType propagatedThenType = node.thenExpression.propagatedType;
-    DartType propagatedElseType = node.elseExpression.propagatedType;
-    if (propagatedThenType != null || propagatedElseType != null) {
-      if (propagatedThenType == null) {
-        propagatedThenType = staticThenType;
-      }
-      if (propagatedElseType == null) {
-        propagatedElseType = staticElseType;
-      }
-      DartType propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
-      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        _recordPropagatedType(node, propagatedType);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
-   * double.</blockquote>
-   */
-  @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
-    _recordStaticType(node, _typeProvider.doubleType);
-    return null;
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    FunctionExpression function = node.functionExpression;
-    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = _computeStaticReturnTypeOfFunctionDeclaration(node);
-    _recordPropagatedTypeOfFunction(functionElement, function.body);
-    _recordStaticType(function, functionElement.type);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the
-   * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub>
-   * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk]) => e</i> is
-   * <i>(T<sub>1</sub>, &hellip;, Tn, [T<sub>n+1</sub> x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>
-   * x<sub>n+k</sub>]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
-   * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
-   * considered to have been specified as dynamic.
-   *
-   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
-   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
-   * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
-   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0</sub></i>, where
-   * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T<sub>i</sub>, 1
-   * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specified as dynamic.
-   *
-   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
-   * T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
-   * x<sub>n+k</sub> = dk]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
-   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>]) &rarr; dynamic</i>. In any case
-   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
-   * specified as dynamic.
-   *
-   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
-   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
-   * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
-   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; dynamic</i>. In any case
-   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
-   * specified as dynamic.</blockquote>
-   */
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parent is FunctionDeclaration) {
-      // The function type will be resolved and set when we visit the parent node.
-      return null;
-    }
-    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
-    functionElement.returnType = _computeStaticReturnTypeOfFunctionExpression(node);
-    _recordPropagatedTypeOfFunction(functionElement, node.body);
-    _recordStaticType(node, node.element.type);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i>
-   * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is
-   * an expression.
-   *
-   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
-   * assigned to a function type.
-   *
-   * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
-   * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
-   */
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    ExecutableElement staticMethodElement = node.staticElement;
-    // Record static return type of the static element.
-    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
-    _recordStaticType(node, staticStaticType);
-    // Record propagated return type of the static element.
-    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
-    if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
-      _recordPropagatedType(node, staticPropagatedType);
-    }
-    ExecutableElement propagatedMethodElement = node.propagatedElement;
-    if (!identical(propagatedMethodElement, staticMethodElement)) {
-      // Record static return type of the propagated element.
-      DartType propagatedStaticType = _computeStaticReturnType(propagatedMethodElement);
-      if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
-        _recordPropagatedType(node, propagatedStaticType);
-      }
-      // Record propagated return type of the propagated element.
-      DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedMethodElement);
-      if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
-        _recordPropagatedType(node, propagatedPropagatedType);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.29: <blockquote>An assignable expression of the form
-   * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
-   * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
-   */
-  @override
-  Object visitIndexExpression(IndexExpression node) {
-    if (node.inSetterContext()) {
-      ExecutableElement staticMethodElement = node.staticElement;
-      DartType staticType = _computeArgumentType(staticMethodElement);
-      _recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.propagatedElement;
-      if (!identical(propagatedMethodElement, staticMethodElement)) {
-        DartType propagatedType = _computeArgumentType(propagatedMethodElement);
-        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          _recordPropagatedType(node, propagatedType);
-        }
-      }
-    } else {
-      ExecutableElement staticMethodElement = node.staticElement;
-      DartType staticType = _computeStaticReturnType(staticMethodElement);
-      _recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.propagatedElement;
-      if (!identical(propagatedMethodElement, staticMethodElement)) {
-        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
-        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          _recordPropagatedType(node, propagatedType);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
-   * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
-   * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
-   *
-   * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
-   * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the
-   * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
-   */
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _recordStaticType(node, node.constructorName.type.type);
-    ConstructorElement element = node.staticElement;
-    if (element != null && "Element" == element.enclosingElement.name) {
-      LibraryElement library = element.library;
-      if (_isHtmlLibrary(library)) {
-        String constructorName = element.name;
-        if ("tag" == constructorName) {
-          DartType returnType = _getFirstArgumentAsTypeWithMap(library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
-          if (returnType != null) {
-            _recordPropagatedType(node, returnType);
-          }
-        } else {
-          DartType returnType = _getElementNameAsType(library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
-          if (returnType != null) {
-            _recordPropagatedType(node, returnType);
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is
-   * `int`.</blockquote>
-   */
-  @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
-    _recordStaticType(node, _typeProvider.intType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
-   * denote a type available in the current lexical scope.
-   *
-   * The static type of an is-expression is `bool`.</blockquote>
-   */
-  @override
-  Object visitIsExpression(IsExpression node) {
-    _recordStaticType(node, _typeProvider.boolType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
-   * form <i><b>const</b> &lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or the form
-   * <i>&lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;E&gt;`. The static
-   * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or
-   * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynamic&gt;`
-   * .</blockquote>
-   */
-  @override
-  Object visitListLiteral(ListLiteral node) {
-    DartType staticType = _dynamicType;
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      NodeList<TypeName> arguments = typeArguments.arguments;
-      if (arguments != null && arguments.length == 1) {
-        TypeName argumentTypeName = arguments[0];
-        DartType argumentType = _getType(argumentTypeName);
-        if (argumentType != null) {
-          staticType = argumentType;
-        }
-      }
-    }
-    _recordStaticType(node, _typeProvider.listType.substitute4(<DartType> [staticType]));
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
-   * <i><b>const</b> &lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
-   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>,
-   * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;K, V&gt;`. The static type a map
-   * literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
-   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub>, &hellip;,
-   * k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;dynamic, dynamic&gt;`.
-   *
-   * It is a compile-time error if the first type argument to a map literal is not
-   * <i>String</i>.</blockquote>
-   */
-  @override
-  Object visitMapLiteral(MapLiteral node) {
-    DartType staticKeyType = _dynamicType;
-    DartType staticValueType = _dynamicType;
-    TypeArgumentList typeArguments = node.typeArguments;
-    if (typeArguments != null) {
-      NodeList<TypeName> arguments = typeArguments.arguments;
-      if (arguments != null && arguments.length == 2) {
-        TypeName entryKeyTypeName = arguments[0];
-        DartType entryKeyType = _getType(entryKeyTypeName);
-        if (entryKeyType != null) {
-          staticKeyType = entryKeyType;
-        }
-        TypeName entryValueTypeName = arguments[1];
-        DartType entryValueType = _getType(entryValueTypeName);
-        if (entryValueType != null) {
-          staticValueType = entryValueType;
-        }
-      }
-    }
-    _recordStaticType(node, _typeProvider.mapType.substitute4(<DartType> [staticKeyType, staticValueType]));
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
-   * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
-   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
-   * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if <i>T</i> does not
-   * have an accessible instance member named <i>m</i>. If <i>T.m</i> exists, it is a static warning
-   * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type.
-   *
-   * If <i>T.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
-   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
-   * <i>F</i>.</blockquote>
-   *
-   * The Dart Language Specification, 11.15.3: <blockquote>A static method invocation <i>i</i> has
-   * the form <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
-   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
-   * It is a static type warning if the type <i>F</i> of <i>C.m</i> may not be assigned to a
-   * function type.
-   *
-   * If <i>F</i> is not a function type, or if <i>C.m</i> does not exist, the static type of i is
-   * dynamic. Otherwise the static type of <i>i</i> is the declared return type of
-   * <i>F</i>.</blockquote>
-   *
-   * The Dart Language Specification, 11.15.4: <blockquote>A super method invocation <i>i</i> has
-   * the form <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
-   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
-   * It is a static type warning if <i>S</i> does not have an accessible instance member named m. If
-   * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of <i>S.m</i> may not be
-   * assigned to a function type.
-   *
-   * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
-   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
-   * <i>F</i>.</blockquote>
-   */
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    SimpleIdentifier methodNameNode = node.methodName;
-    Element staticMethodElement = methodNameNode.staticElement;
-    // Record types of the variable invoked as a function.
-    if (staticMethodElement is VariableElement) {
-      VariableElement variable = staticMethodElement;
-      DartType staticType = variable.type;
-      _recordStaticType(methodNameNode, staticType);
-      DartType propagatedType = _overrideManager.getType(variable);
-      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-        _recordPropagatedType(methodNameNode, propagatedType);
-      }
-    }
-    // Record static return type of the static element.
-    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
-    _recordStaticType(node, staticStaticType);
-    // Record propagated return type of the static element.
-    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
-    if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
-      _recordPropagatedType(node, staticPropagatedType);
-    }
-    bool needPropagatedType = true;
-    String methodName = methodNameNode.name;
-    if (methodName == "then") {
-      Expression target = node.realTarget;
-      if (target != null) {
-        DartType targetType = target.bestType;
-        if (_isAsyncFutureType(targetType)) {
-          // Future.then(closure) return type is:
-          // 1) the returned Future type, if the closure returns a Future;
-          // 2) Future<valueType>, if the closure returns a value.
-          NodeList<Expression> arguments = node.argumentList.arguments;
-          if (arguments.length == 1) {
-            // TODO(brianwilkerson) Handle the case where both arguments are provided.
-            Expression closureArg = arguments[0];
-            if (closureArg is FunctionExpression) {
-              FunctionExpression closureExpr = closureArg;
-              DartType returnType = _computePropagatedReturnType(closureExpr.element);
-              if (returnType != null) {
-                // prepare the type of the returned Future
-                InterfaceTypeImpl newFutureType;
-                if (_isAsyncFutureType(returnType)) {
-                  newFutureType = returnType as InterfaceTypeImpl;
-                } else {
-                  InterfaceType futureType = targetType as InterfaceType;
-                  newFutureType = new InterfaceTypeImpl.con1(futureType.element);
-                  newFutureType.typeArguments = <DartType> [returnType];
-                }
-                // set the 'then' invocation type
-                _recordPropagatedType(node, newFutureType);
-                needPropagatedType = false;
-                return null;
-              }
-            }
-          }
-        }
-      }
-    } else if (methodName == "\$dom_createEvent") {
-      Expression target = node.realTarget;
-      if (target != null) {
-        DartType targetType = target.bestType;
-        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-          LibraryElement library = targetType.element.library;
-          if (_isHtmlLibrary(library)) {
-            DartType returnType = _getFirstArgumentAsType(library, node.argumentList);
-            if (returnType != null) {
-              _recordPropagatedType(node, returnType);
-              needPropagatedType = false;
-            }
-          }
-        }
-      }
-    } else if (methodName == "query") {
-      Expression target = node.realTarget;
-      if (target == null) {
-        Element methodElement = methodNameNode.bestElement;
-        if (methodElement != null) {
-          LibraryElement library = methodElement.library;
-          if (_isHtmlLibrary(library)) {
-            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
-            if (returnType != null) {
-              _recordPropagatedType(node, returnType);
-              needPropagatedType = false;
-            }
-          }
-        }
-      } else {
-        DartType targetType = target.bestType;
-        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-          LibraryElement library = targetType.element.library;
-          if (_isHtmlLibrary(library)) {
-            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
-            if (returnType != null) {
-              _recordPropagatedType(node, returnType);
-              needPropagatedType = false;
-            }
-          }
-        }
-      }
-    } else if (methodName == "\$dom_createElement") {
-      Expression target = node.realTarget;
-      if (target != null) {
-        DartType targetType = target.bestType;
-        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-          LibraryElement library = targetType.element.library;
-          if (_isHtmlLibrary(library)) {
-            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
-            if (returnType != null) {
-              _recordPropagatedType(node, returnType);
-              needPropagatedType = false;
-            }
-          }
-        }
-      }
-    } else if (methodName == "JS") {
-      DartType returnType = _getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
-      if (returnType != null) {
-        _recordPropagatedType(node, returnType);
-        needPropagatedType = false;
-      }
-    } else if (methodName == "getContext") {
-      Expression target = node.realTarget;
-      if (target != null) {
-        DartType targetType = target.bestType;
-        if (targetType is InterfaceType && (targetType.name == "CanvasElement")) {
-          NodeList<Expression> arguments = node.argumentList.arguments;
-          if (arguments.length == 1) {
-            Expression argument = arguments[0];
-            if (argument is StringLiteral) {
-              String value = argument.stringValue;
-              if ("2d" == value) {
-                PropertyAccessorElement getter = targetType.element.getGetter("context2D");
-                if (getter != null) {
-                  DartType returnType = getter.returnType;
-                  if (returnType != null) {
-                    _recordPropagatedType(node, returnType);
-                    needPropagatedType = false;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    if (needPropagatedType) {
-      Element propagatedElement = methodNameNode.propagatedElement;
-      // HACK: special case for object methods ([toString]) on dynamic expressions.
-      // More special cases in [visitPrefixedIdentfier].
-      if (propagatedElement == null) {
-        propagatedElement = _typeProvider.objectType.getMethod(methodNameNode.name);
-      }
-      if (!identical(propagatedElement, staticMethodElement)) {
-        // Record static return type of the propagated element.
-        DartType propagatedStaticType = _computeStaticReturnType(propagatedElement);
-        if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
-          _recordPropagatedType(node, propagatedStaticType);
-        }
-        // Record propagated return type of the propagated element.
-        DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedElement);
-        if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
-          _recordPropagatedType(node, propagatedPropagatedType);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitNamedExpression(NamedExpression node) {
-    Expression expression = node.expression;
-    _recordStaticType(node, _getStaticType(expression));
-    _recordPropagatedType(node, expression.propagatedType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
-   * </blockquote>
-   */
-  @override
-  Object visitNullLiteral(NullLiteral node) {
-    _recordStaticType(node, _typeProvider.bottomType);
-    return null;
-  }
-
-  @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
-    Expression expression = node.expression;
-    _recordStaticType(node, _getStaticType(expression));
-    _recordPropagatedType(node, expression.propagatedType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
-   * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
-   * return r}()</i>.
-   *
-   * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
-   * return r}()</i>.
-   *
-   * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
-   * 1; return r}(e1)</i>.
-   *
-   * A postfix expression of the form <i>e1[e2]++</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
-   * = r + 1; return r}(e1, e2)</i>
-   *
-   * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifier, is equivalent to
-   * <i>(){var r = v; v = r - 1; return r}()</i>.
-   *
-   * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
-   * return r}()</i>.
-   *
-   * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
-   * 1; return r}(e1)</i>.
-   *
-   * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
-   * = r - 1; return r}(e1, e2)</i></blockquote>
-   */
-  @override
-  Object visitPostfixExpression(PostfixExpression node) {
-    Expression operand = node.operand;
-    DartType staticType = _getStaticType(operand);
-    sc.TokenType operator = node.operator.type;
-    if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
-      DartType intType = _typeProvider.intType;
-      if (identical(_getStaticType(node.operand), intType)) {
-        staticType = intType;
-      }
-    }
-    _recordStaticType(node, staticType);
-    _recordPropagatedType(node, operand.propagatedType);
-    return null;
-  }
-
-  /**
-   * See [visitSimpleIdentifier].
-   */
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    SimpleIdentifier prefixedIdentifier = node.identifier;
-    Element staticElement = prefixedIdentifier.staticElement;
-    DartType staticType = _dynamicType;
-    DartType propagatedType = null;
-    if (staticElement is ClassElement) {
-      if (_isNotTypeLiteral(node)) {
-        staticType = staticElement.type;
-      } else {
-        staticType = _typeProvider.typeType;
-      }
-    } else if (staticElement is FunctionTypeAliasElement) {
-      if (_isNotTypeLiteral(node)) {
-        staticType = staticElement.type;
-      } else {
-        staticType = _typeProvider.typeType;
-      }
-    } else if (staticElement is MethodElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
-      propagatedType = _getPropertyPropagatedType(staticElement, propagatedType);
-    } else if (staticElement is ExecutableElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is TypeParameterElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is VariableElement) {
-      staticType = staticElement.type;
-    }
-    _recordStaticType(prefixedIdentifier, staticType);
-    _recordStaticType(node, staticType);
-    Element propagatedElement = prefixedIdentifier.propagatedElement;
-    // HACK: special case for object getters ([hashCode] and [runtimeType]) on dynamic expressions.
-    // More special cases in [visitMethodInvocation].
-    if (propagatedElement == null) {
-      propagatedElement = _typeProvider.objectType.getGetter(prefixedIdentifier.name);
-    }
-    if (propagatedElement is ClassElement) {
-      if (_isNotTypeLiteral(node)) {
-        propagatedType = (propagatedElement as ClassElement).type;
-      } else {
-        propagatedType = _typeProvider.typeType;
-      }
-    } else if (propagatedElement is FunctionTypeAliasElement) {
-      propagatedType = (propagatedElement as FunctionTypeAliasElement).type;
-    } else if (propagatedElement is MethodElement) {
-      propagatedType = (propagatedElement as MethodElement).type;
-    } else if (propagatedElement is PropertyAccessorElement) {
-      propagatedType = _getTypeOfProperty(propagatedElement as PropertyAccessorElement, node.prefix.staticType);
-      propagatedType = _getPropertyPropagatedType(propagatedElement, propagatedType);
-    } else if (propagatedElement is ExecutableElement) {
-      propagatedType = (propagatedElement as ExecutableElement).type;
-    } else if (propagatedElement is TypeParameterElement) {
-      propagatedType = (propagatedElement as TypeParameterElement).type;
-    } else if (propagatedElement is VariableElement) {
-      propagatedType = (propagatedElement as VariableElement).type;
-    }
-    DartType overriddenType = _overrideManager.getType(propagatedElement);
-    if (propagatedType == null || (overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType))) {
-      propagatedType = overriddenType;
-    }
-    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      _recordPropagatedType(prefixedIdentifier, propagatedType);
-      _recordPropagatedType(node, propagatedType);
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u</i> of the form
-   * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
-   * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i>.</blockquote>
-   */
-  @override
-  Object visitPrefixExpression(PrefixExpression node) {
-    sc.TokenType operator = node.operator.type;
-    if (operator == sc.TokenType.BANG) {
-      _recordStaticType(node, _typeProvider.boolType);
-    } else {
-      // The other cases are equivalent to invoking a method.
-      ExecutableElement staticMethodElement = node.staticElement;
-      DartType staticType = _computeStaticReturnType(staticMethodElement);
-      if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
-        DartType intType = _typeProvider.intType;
-        if (identical(_getStaticType(node.operand), intType)) {
-          staticType = intType;
-        }
-      }
-      _recordStaticType(node, staticType);
-      MethodElement propagatedMethodElement = node.propagatedElement;
-      if (!identical(propagatedMethodElement, staticMethodElement)) {
-        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
-        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-          _recordPropagatedType(node, propagatedType);
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.13: <blockquote> Property extraction allows for a member of
-   * an object to be concisely extracted from the object. If <i>o</i> is an object, and if <i>m</i>
-   * is the name of a method member of <i>o</i>, then
-   * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
-   * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){return
-   * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, &hellip;,
-   * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i>r<sub>1</sub>,
-   * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
-   * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
-   * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, [p<sub>1</sub> = d<sub>1</sub>, &hellip;,
-   * p<sub>k</sub> = d<sub>k</sub>]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
-   * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required parameters
-   * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional parameters
-   * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
-   * d<sub>k</sub></i>.
-   * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or
-   * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote>
-   *
-   * The Dart Language Specification, 12.17: <blockquote> ... a getter invocation <i>i</i> of the
-   * form <i>e.m</i> ...
-   *
-   * Let <i>T</i> be the static type of <i>e</i>. It is a static type warning if <i>T</i> does not
-   * have a getter named <i>m</i>.
-   *
-   * The static type of <i>i</i> is the declared return type of <i>T.m</i>, if <i>T.m</i> exists;
-   * otherwise the static type of <i>i</i> is dynamic.
-   *
-   * ... a getter invocation <i>i</i> of the form <i>C.m</i> ...
-   *
-   * It is a static warning if there is no class <i>C</i> in the enclosing lexical scope of
-   * <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter named <i>m</i>.
-   *
-   * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic
-   * otherwise.
-   *
-   * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m</i> is an
-   * identifier ...
-   *
-   * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
-   */
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    SimpleIdentifier propertyName = node.propertyName;
-    Element staticElement = propertyName.staticElement;
-    DartType staticType = _dynamicType;
-    if (staticElement is MethodElement) {
-      staticType = staticElement.type;
-    } else if (staticElement is PropertyAccessorElement) {
-      Expression realTarget = node.realTarget;
-      staticType = _getTypeOfProperty(staticElement, realTarget != null ? _getStaticType(realTarget) : null);
-    } else {
-      // TODO(brianwilkerson) Report this internal error.
-    }
-    _recordStaticType(propertyName, staticType);
-    _recordStaticType(node, staticType);
-    Element propagatedElement = propertyName.propagatedElement;
-    DartType propagatedType = _overrideManager.getType(propagatedElement);
-    if (propagatedElement is MethodElement) {
-      propagatedType = propagatedElement.type;
-    } else if (propagatedElement is PropertyAccessorElement) {
-      Expression realTarget = node.realTarget;
-      propagatedType = _getTypeOfProperty(propagatedElement, realTarget != null ? realTarget.bestType : null);
-    } else {
-      // TODO(brianwilkerson) Report this internal error.
-    }
-    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      _recordPropagatedType(propertyName, propagatedType);
-      _recordPropagatedType(node, propagatedType);
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
-   * bottom.</blockquote>
-   */
-  @override
-  Object visitRethrowExpression(RethrowExpression node) {
-    _recordStaticType(node, _typeProvider.bottomType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identifier expression
-   * <i>e</i> of the form <i>id</i> proceeds as follows:
-   *
-   * Let <i>d</i> be the innermost declaration in the enclosing lexical scope whose name is
-   * <i>id</i>. If no such declaration exists in the lexical scope, let <i>d</i> be the declaration
-   * of the inherited member named <i>id</i> if it exists.
-   * * If <i>d</i> is a class or type alias <i>T</i>, the value of <i>e</i> is the unique instance
-   * of class `Type` reifying <i>T</i>.
-   * * If <i>d</i> is a type parameter <i>T</i>, then the value of <i>e</i> is the value of the
-   * actual type argument corresponding to <i>T</i> that was passed to the generative constructor
-   * that created the current binding of this. We are assured that this is well defined, because if
-   * we were in a static member the reference to <i>T</i> would be a compile-time error.
-   * * If <i>d</i> is a library variable then:
-   * * If <i>d</i> is of one of the forms <i>var v = e<sub>i</sub>;</i>, <i>T v =
-   * e<sub>i</sub>;</i>, <i>final v = e<sub>i</sub>;</i>, <i>final T v = e<sub>i</sub>;</i>, and no
-   * value has yet been stored into <i>v</i> then the initializer expression <i>e<sub>i</sub></i> is
-   * evaluated. If, during the evaluation of <i>e<sub>i</sub></i>, the getter for <i>v</i> is
-   * referenced, a CyclicInitializationError is thrown. If the evaluation succeeded yielding an
-   * object <i>o</i>, let <i>r = o</i>, otherwise let <i>r = null</i>. In any case, <i>r</i> is
-   * stored into <i>v</i>. The value of <i>e</i> is <i>r</i>.
-   * * If <i>d</i> is of one of the forms <i>const v = e;</i> or <i>const T v = e;</i> the result
-   * of the getter is the value of the compile time constant <i>e</i>. Otherwise
-   * * <i>e</i> evaluates to the current binding of <i>id</i>.
-   * * If <i>d</i> is a local variable or formal parameter then <i>e</i> evaluates to the current
-   * binding of <i>id</i>.
-   * * If <i>d</i> is a static method, top level function or local function then <i>e</i>
-   * evaluates to the function defined by <i>d</i>.
-   * * If <i>d</i> is the declaration of a static variable or static getter declared in class
-   * <i>C</i>, then <i>e</i> is equivalent to the getter invocation <i>C.id</i>.
-   * * If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
-   * getter invocation <i>id</i>.
-   * * Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
-   * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError
-   * to be thrown.
-   * * Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
-   * </blockquote>
-   */
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    DartType staticType = _dynamicType;
-    if (element is ClassElement) {
-      if (_isNotTypeLiteral(node)) {
-        staticType = element.type;
-      } else {
-        staticType = _typeProvider.typeType;
-      }
-    } else if (element is FunctionTypeAliasElement) {
-      if (_isNotTypeLiteral(node)) {
-        staticType = element.type;
-      } else {
-        staticType = _typeProvider.typeType;
-      }
-    } else if (element is MethodElement) {
-      staticType = element.type;
-    } else if (element is PropertyAccessorElement) {
-      staticType = _getTypeOfProperty(element, null);
-    } else if (element is ExecutableElement) {
-      staticType = element.type;
-    } else if (element is TypeParameterElement) {
-      staticType = _typeProvider.typeType;
-    } else if (element is VariableElement) {
-      VariableElement variable = element;
-      staticType = _promoteManager.getStaticType(variable);
-    } else if (element is PrefixElement) {
-      return null;
-    } else {
-      staticType = _dynamicType;
-    }
-    _recordStaticType(node, staticType);
-    // TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element
-    // to get another candidate for the propagated type.
-    DartType propagatedType = _getPropertyPropagatedType(element, null);
-    if (propagatedType == null) {
-      DartType overriddenType = _overrideManager.getType(element);
-      if (propagatedType == null || overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType)) {
-        propagatedType = overriddenType;
-      }
-    }
-    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
-      _recordPropagatedType(node, propagatedType);
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
-   * `String`.</blockquote>
-   */
-  @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    _recordStaticType(node, _typeProvider.stringType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
-   * `String`.</blockquote>
-   */
-  @override
-  Object visitStringInterpolation(StringInterpolation node) {
-    _recordStaticType(node, _typeProvider.stringType);
-    return null;
-  }
-
-  @override
-  Object visitSuperExpression(SuperExpression node) {
-    if (_thisType == null) {
-      // TODO(brianwilkerson) Report this error if it hasn't already been reported
-      _recordStaticType(node, _dynamicType);
-    } else {
-      _recordStaticType(node, _thisType);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
-    _recordStaticType(node, _typeProvider.symbolType);
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
-   * interface of the immediately enclosing class.</blockquote>
-   */
-  @override
-  Object visitThisExpression(ThisExpression node) {
-    if (_thisType == null) {
-      // TODO(brianwilkerson) Report this error if it hasn't already been reported
-      _recordStaticType(node, _dynamicType);
-    } else {
-      _recordStaticType(node, _thisType);
-    }
-    return null;
-  }
-
-  /**
-   * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
-   * bottom.</blockquote>
-   */
-  @override
-  Object visitThrowExpression(ThrowExpression node) {
-    _recordStaticType(node, _typeProvider.bottomType);
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    Expression initializer = node.initializer;
-    if (initializer != null) {
-      DartType rightType = initializer.bestType;
-      SimpleIdentifier name = node.name;
-      _recordPropagatedType(name, rightType);
-      VariableElement element = name.staticElement as VariableElement;
-      if (element != null) {
-        _resolver.overrideVariable(element, rightType, true);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Record that the static type of the given node is the type of the second argument to the method
-   * represented by the given element.
-   *
-   * @param element the element representing the method invoked by the given node
-   */
-  DartType _computeArgumentType(ExecutableElement element) {
-    if (element != null) {
-      List<ParameterElement> parameters = element.parameters;
-      if (parameters != null && parameters.length == 2) {
-        return parameters[1].type;
-      }
-    }
-    return _dynamicType;
-  }
-
-  /**
-   * Compute the propagated return type of the method or function represented by the given element.
-   *
-   * @param element the element representing the method or function invoked by the given node
-   * @return the propagated return type that was computed
-   */
-  DartType _computePropagatedReturnType(Element element) {
-    if (element is ExecutableElement) {
-      return _propagatedReturnTypes[element];
-    }
-    return null;
-  }
-
-  /**
-   * Given a function body, compute the propagated return type of the function. The propagated
-   * return type of functions with a block body is the least upper bound of all
-   * [ReturnStatement] expressions, with an expression body it is the type of the expression.
-   *
-   * @param body the boy of the function whose propagated return type is to be computed
-   * @return the propagated return type that was computed
-   */
-  DartType _computePropagatedReturnTypeOfFunction(FunctionBody body) {
-    if (body is ExpressionFunctionBody) {
-      ExpressionFunctionBody expressionBody = body;
-      return expressionBody.expression.bestType;
-    }
-    if (body is BlockFunctionBody) {
-      GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction visitor
-          = new GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
-      body.accept(visitor);
-      return visitor.result;
-    }
-    return null;
-  }
-
-  /**
-   * Compute the static return type of the method or function represented by the given element.
-   *
-   * @param element the element representing the method or function invoked by the given node
-   * @return the static return type that was computed
-   */
-  DartType _computeStaticReturnType(Element element) {
-    if (element is PropertyAccessorElement) {
-      //
-      // This is a function invocation expression disguised as something else. We are invoking a
-      // getter and then invoking the returned function.
-      //
-      FunctionType propertyType = element.type;
-      if (propertyType != null) {
-        DartType returnType = propertyType.returnType;
-        if (returnType.isDartCoreFunction) {
-          return _dynamicType;
-        } else if (returnType is InterfaceType) {
-          MethodElement callMethod = returnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
-          if (callMethod != null) {
-            return callMethod.type.returnType;
-          }
-        } else if (returnType is FunctionType) {
-          DartType innerReturnType = returnType.returnType;
-          if (innerReturnType != null) {
-            return innerReturnType;
-          }
-        }
-        if (returnType != null) {
-          return returnType;
-        }
-      }
-    } else if (element is ExecutableElement) {
-      FunctionType type = element.type;
-      if (type != null) {
-        // TODO(brianwilkerson) Figure out the conditions under which the type is null.
-        return type.returnType;
-      }
-    } else if (element is VariableElement) {
-      VariableElement variable = element;
-      DartType variableType = _promoteManager.getStaticType(variable);
-      if (variableType is FunctionType) {
-        return variableType.returnType;
-      }
-    }
-    return _dynamicType;
-  }
-
-  /**
-   * Given a function declaration, compute the return static type of the function. The return type
-   * of functions with a block body is `dynamicType`, with an expression body it is the type
-   * of the expression.
-   *
-   * @param node the function expression whose static return type is to be computed
-   * @return the static return type that was computed
-   */
-  DartType _computeStaticReturnTypeOfFunctionDeclaration(FunctionDeclaration node) {
-    TypeName returnType = node.returnType;
-    if (returnType == null) {
-      return _dynamicType;
-    }
-    return returnType.type;
-  }
-
-  /**
-   * Given a function expression, compute the return type of the function. The return type of
-   * functions with a block body is `dynamicType`, with an expression body it is the type of
-   * the expression.
-   *
-   * @param node the function expression whose return type is to be computed
-   * @return the return type that was computed
-   */
-  DartType _computeStaticReturnTypeOfFunctionExpression(FunctionExpression node) {
-    FunctionBody body = node.body;
-    if (body is ExpressionFunctionBody) {
-      return _getStaticType(body.expression);
-    }
-    return _dynamicType;
-  }
-
-  /**
-   * If the given element name can be mapped to the name of a class defined within the given
-   * library, return the type specified by the argument.
-   *
-   * @param library the library in which the specified type would be defined
-   * @param elementName the name of the element for which a type is being sought
-   * @param nameMap an optional map used to map the element name to a type name
-   * @return the type specified by the first argument in the argument list
-   */
-  DartType _getElementNameAsType(LibraryElement library, String elementName, HashMap<String, String> nameMap) {
-    if (elementName != null) {
-      if (nameMap != null) {
-        elementName = nameMap[elementName.toLowerCase()];
-      }
-      ClassElement returnType = library.getType(elementName);
-      if (returnType != null) {
-        return returnType.type;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given argument list contains at least one argument, and if the argument is a simple
-   * string literal, then parse that argument as a query string and return the type specified by the
-   * argument.
-   *
-   * @param library the library in which the specified type would be defined
-   * @param argumentList the list of arguments from which a type is to be extracted
-   * @return the type specified by the first argument in the argument list
-   */
-  DartType _getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentList) {
-    String argumentValue = _getFirstArgumentAsString(argumentList);
-    if (argumentValue != null) {
-      //
-      // If the query has spaces, full parsing is required because it might be:
-      //   E[text='warning text']
-      //
-      if (StringUtilities.indexOf1(argumentValue, 0, 0x20) >= 0) {
-        return null;
-      }
-      //
-      // Otherwise, try to extract the tag based on http://www.w3.org/TR/CSS2/selector.html.
-      //
-      String tag = argumentValue;
-      tag = StringUtilities.substringBeforeChar(tag, 0x3A);
-      tag = StringUtilities.substringBeforeChar(tag, 0x5B);
-      tag = StringUtilities.substringBeforeChar(tag, 0x2E);
-      tag = StringUtilities.substringBeforeChar(tag, 0x23);
-      tag = _HTML_ELEMENT_TO_CLASS_MAP[tag.toLowerCase()];
-      ClassElement returnType = library.getType(tag);
-      if (returnType != null) {
-        return returnType.type;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given argument list contains at least one argument, and if the argument is a simple
-   * string literal, return the String value of the argument.
-   *
-   * @param argumentList the list of arguments from which a string value is to be extracted
-   * @return the string specified by the first argument in the argument list
-   */
-  String _getFirstArgumentAsString(ArgumentList argumentList) {
-    NodeList<Expression> arguments = argumentList.arguments;
-    if (arguments.length > 0) {
-      Expression argument = arguments[0];
-      if (argument is SimpleStringLiteral) {
-        return argument.value;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * If the given argument list contains at least one argument, and if the argument is a simple
-   * string literal, and if the value of the argument is the name of a class defined within the
-   * given library, return the type specified by the argument.
-   *
-   * @param library the library in which the specified type would be defined
-   * @param argumentList the list of arguments from which a type is to be extracted
-   * @return the type specified by the first argument in the argument list
-   */
-  DartType _getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList) => _getFirstArgumentAsTypeWithMap(library, argumentList, null);
-
-  /**
-   * If the given argument list contains at least one argument, and if the argument is a simple
-   * string literal, and if the value of the argument is the name of a class defined within the
-   * given library, return the type specified by the argument.
-   *
-   * @param library the library in which the specified type would be defined
-   * @param argumentList the list of arguments from which a type is to be extracted
-   * @param nameMap an optional map used to map the element name to a type name
-   * @return the type specified by the first argument in the argument list
-   */
-  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, HashMap<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
-
-  /**
-   * Return the propagated type of the given [Element], or `null`.
-   */
-  DartType _getPropertyPropagatedType(Element element, DartType currentType) {
-    if (element is PropertyAccessorElement) {
-      PropertyAccessorElement accessor = element;
-      if (accessor.isGetter) {
-        PropertyInducingElement variable = accessor.variable;
-        DartType propagatedType = variable.propagatedType;
-        if (currentType == null || propagatedType != null && propagatedType.isMoreSpecificThan(currentType)) {
-          return propagatedType;
-        }
-      }
-    }
-    return currentType;
-  }
-
-  /**
-   * Return the static type of the given expression.
-   *
-   * @param expression the expression whose type is to be returned
-   * @return the static type of the given expression
-   */
-  DartType _getStaticType(Expression expression) {
-    DartType type = expression.staticType;
-    if (type == null) {
-      // TODO(brianwilkerson) Determine the conditions for which the static type is null.
-      return _dynamicType;
-    }
-    return type;
-  }
-
-  /**
-   * Return the type represented by the given type name.
-   *
-   * @param typeName the type name representing the type to be returned
-   * @return the type represented by the type name
-   */
-  DartType _getType(TypeName typeName) {
-    DartType type = typeName.type;
-    if (type == null) {
-      //TODO(brianwilkerson) Determine the conditions for which the type is null.
-      return _dynamicType;
-    }
-    return type;
-  }
-
-  /**
-   * Return the type that should be recorded for a node that resolved to the given accessor.
-   *
-   * @param accessor the accessor that the node resolved to
-   * @param context if the accessor element has context [by being the RHS of a
-   *          [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
-   *          accessor is a parameter type, then the type of the LHS can be used to get more
-   *          specific type information
-   * @return the type that should be recorded for a node that resolved to the given accessor
-   */
-  DartType _getTypeOfProperty(PropertyAccessorElement accessor, DartType context) {
-    FunctionType functionType = accessor.type;
-    if (functionType == null) {
-      // TODO(brianwilkerson) Report this internal error. This happens when we are analyzing a
-      // reference to a property before we have analyzed the declaration of the property or when
-      // the property does not have a defined type.
-      return _dynamicType;
-    }
-    if (accessor.isSetter) {
-      List<DartType> parameterTypes = functionType.normalParameterTypes;
-      if (parameterTypes != null && parameterTypes.length > 0) {
-        return parameterTypes[0];
-      }
-      PropertyAccessorElement getter = accessor.variable.getter;
-      if (getter != null) {
-        functionType = getter.type;
-        if (functionType != null) {
-          return functionType.returnType;
-        }
-      }
-      return _dynamicType;
-    }
-    DartType returnType = functionType.returnType;
-    if (returnType is TypeParameterType && context is InterfaceType) {
-      // if the return type is a TypeParameter, we try to use the context [that the function is being
-      // called on] to get a more accurate returnType type
-      InterfaceType interfaceTypeContext = context;
-      //      Type[] argumentTypes = interfaceTypeContext.getTypeArguments();
-      List<TypeParameterElement> typeParameterElements = interfaceTypeContext.element != null ? interfaceTypeContext.element.typeParameters : null;
-      if (typeParameterElements != null) {
-        for (int i = 0; i < typeParameterElements.length; i++) {
-          TypeParameterElement typeParameterElement = typeParameterElements[i];
-          if (returnType.name == typeParameterElement.name) {
-            return interfaceTypeContext.typeArguments[i];
-          }
-        }
-        // TODO(jwren) troubleshoot why call to substitute doesn't work
-        //        Type[] parameterTypes = TypeParameterTypeImpl.getTypes(parameterElements);
-        //        return returnType.substitute(argumentTypes, parameterTypes);
-      }
-    }
-    return returnType;
-  }
-
-  /**
-   * Return `true` if the given [Type] is the `Future` form the 'dart:async'
-   * library.
-   */
-  bool _isAsyncFutureType(DartType type) => type is InterfaceType && type.name == "Future" && _isAsyncLibrary(type.element.library);
-
-  /**
-   * Return `true` if the given library is the 'dart:async' library.
-   *
-   * @param library the library being tested
-   * @return `true` if the library is 'dart:async'
-   */
-  bool _isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
-
-  /**
-   * Return `true` if the given library is the 'dart:html' library.
-   *
-   * @param library the library being tested
-   * @return `true` if the library is 'dart:html'
-   */
-  bool _isHtmlLibrary(LibraryElement library) => library != null && "dart.dom.html" == library.name;
-
-  /**
-   * Return `true` if the given node is not a type literal.
-   *
-   * @param node the node being tested
-   * @return `true` if the given node is not a type literal
-   */
-  bool _isNotTypeLiteral(Identifier node) {
-    AstNode parent = node.parent;
-    return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(parent.prefix, node))) || (parent is PropertyAccess && identical(parent.target, node)) || (parent is MethodInvocation && identical(node, parent.target));
-  }
-
-  /**
-   * Record that the propagated type of the given node is the given type.
-   *
-   * @param expression the node whose type is to be recorded
-   * @param type the propagated type of the node
-   */
-  void _recordPropagatedType(Expression expression, DartType type) {
-    if (type != null && !type.isDynamic && !type.isBottom) {
-      expression.propagatedType = type;
-    }
-  }
-
-  /**
-   * Given a function element and its body, compute and record the propagated return type of the
-   * function.
-   *
-   * @param functionElement the function element to record propagated return type for
-   * @param body the boy of the function whose propagated return type is to be computed
-   * @return the propagated return type that was computed, may be `null` if it is not more
-   *         specific than the static return type.
-   */
-  void _recordPropagatedTypeOfFunction(ExecutableElement functionElement, FunctionBody body) {
-    DartType propagatedReturnType = _computePropagatedReturnTypeOfFunction(body);
-    if (propagatedReturnType == null) {
-      return;
-    }
-    // Ignore 'bottom' type.
-    if (propagatedReturnType.isBottom) {
-      return;
-    }
-    // Record only if we inferred more specific type.
-    DartType staticReturnType = functionElement.returnType;
-    if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
-      return;
-    }
-    // OK, do record.
-    _propagatedReturnTypes[functionElement] = propagatedReturnType;
-  }
-
-  /**
-   * Record that the static type of the given node is the given type.
-   *
-   * @param expression the node whose type is to be recorded
-   * @param type the static type of the node
-   */
-  void _recordStaticType(Expression expression, DartType type) {
-    if (type == null) {
-      expression.staticType = _dynamicType;
-    } else {
-      expression.staticType = type;
-    }
-  }
-
-  /**
-   * Attempts to make a better guess for the static type of the given binary expression.
-   *
-   * @param node the binary expression to analyze
-   * @param staticType the static type of the expression as resolved
-   * @return the better type guess, or the same static type as given
-   */
-  DartType _refineBinaryExpressionType(BinaryExpression node, DartType staticType) {
-    sc.TokenType operator = node.operator.type;
-    // bool
-    if (operator == sc.TokenType.AMPERSAND_AMPERSAND || operator == sc.TokenType.BAR_BAR || operator == sc.TokenType.EQ_EQ || operator == sc.TokenType.BANG_EQ) {
-      return _typeProvider.boolType;
-    }
-    DartType intType = _typeProvider.intType;
-    if (_getStaticType(node.leftOperand) == intType) {
-      // int op double
-      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR) {
-        DartType doubleType = _typeProvider.doubleType;
-        if (_getStaticType(node.rightOperand) == doubleType) {
-          return doubleType;
-        }
-      }
-      // int op int
-      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR || operator == sc.TokenType.TILDE_SLASH) {
-        if (_getStaticType(node.rightOperand) == intType) {
-          staticType = intType;
-        }
-      }
-    }
-    // default
-    return staticType;
-  }
-
-  get thisType_J2DAccessor => _thisType;
-
-  set thisType_J2DAccessor(__v) => _thisType = __v;
-}
-
-/**
  * Instances of this class manage the knowledge of what the set of subtypes are for a given type.
  */
 class SubtypeManager {
@@ -24033,7 +14247,9 @@
       buffer.write(" in ");
       buffer.write(source.fullName);
       buffer.write(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
+      AnalysisEngine.instance.logger.logError(
+          buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
     } else {
       ClassElement definingClass = element.enclosingElement as ClassElement;
       element.returnType = definingClass.type;
@@ -24101,7 +14317,9 @@
       buffer.write(" in ");
       buffer.write(source.fullName);
       buffer.write(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
+      AnalysisEngine.instance.logger.logError(
+          buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
     }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
@@ -24154,7 +14372,9 @@
       buffer.write(" in ");
       buffer.write(source.fullName);
       buffer.write(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
+      AnalysisEngine.instance.logger.logError(
+          buffer.toString(),
+          new CaughtException(new AnalysisException(), null));
     }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 920dccc..565f080 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -7,6 +7,8 @@
 
 library engine.sdk.io;
 
+import 'package:analyzer/src/generated/java_engine.dart';
+
 import 'java_core.dart';
 import 'java_io.dart';
 import 'java_engine_io.dart';
@@ -253,8 +255,10 @@
         String path = library.shortName;
         try {
           return new FileBasedSource.con2(parseUriWithException(path), file);
-        } on URISyntaxException catch (exception) {
-          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: $path", exception);
+        } on URISyntaxException catch (exception, stackTrace) {
+          AnalysisEngine.instance.logger.logInformation(
+              "Failed to create URI: $path",
+              new CaughtException(exception, stackTrace));
           return null;
         }
       }
@@ -263,8 +267,10 @@
         String path = "${library.shortName}/${filePath.substring(libraryPath.length + 1)}";
         try {
           return new FileBasedSource.con2(parseUriWithException(path), file);
-        } on URISyntaxException catch (exception) {
-          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: $path", exception);
+        } on URISyntaxException catch (exception, stackTrace) {
+          AnalysisEngine.instance.logger.logInformation(
+              "Failed to create URI: $path",
+              new CaughtException(exception, stackTrace));
           return null;
         }
       }
@@ -497,8 +503,10 @@
     try {
       String contents = librariesFile.readAsStringSync();
       return new SdkLibrariesReader(useDart2jsPaths).readFromFile(librariesFile, contents);
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not initialize the library map from ${librariesFile.getAbsolutePath()}", exception);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Could not initialize the library map from ${librariesFile.getAbsolutePath()}",
+          new CaughtException(exception, stackTrace));
       return new LibraryMap();
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 3b3d79b..47bb620 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -156,6 +156,12 @@
   final List<int> _lineStarts;
 
   /**
+   * The zero-based [_lineStarts] index resulting from the last call to
+   * [getLocation].
+   */
+  int _previousLine = 0;
+
+  /**
    * Initialize a newly created set of line information to represent the data encoded in the given
    * array.
    *
@@ -176,13 +182,37 @@
    * @return the location information for the character at the given offset
    */
   LineInfo_Location getLocation(int offset) {
-    int lineCount = _lineStarts.length;
-    for (int i = 1; i < lineCount; i++) {
-      if (offset < _lineStarts[i]) {
-        return new LineInfo_Location(i, offset - _lineStarts[i - 1] + 1);
+    var min = 0;
+    var max = _lineStarts.length - 1;
+
+    // Subsequent calls to [getLocation] are often for offsets near each other.
+    // To take advantage of that, we cache the index of the line start we found
+    // when this was last called. If the current offset is on that line or
+    // later, we'll skip those early indices completely when searching.
+    if (offset >= _lineStarts[_previousLine]) {
+      min = _previousLine;
+
+      // Before kicking off a full binary search, do a quick check here to see
+      // if the new offset is on that exact line.
+      if (min == _lineStarts.length - 1 || offset < _lineStarts[min + 1]) {
+        return new LineInfo_Location(min + 1, offset - _lineStarts[min] + 1);
       }
     }
-    return new LineInfo_Location(lineCount, offset - _lineStarts[lineCount - 1] + 1);
+
+    // Binary search to fine the line containing this offset.
+    while (min < max) {
+      var midpoint = (max - min + 1) ~/ 2 + min;
+
+      if (_lineStarts[midpoint] > offset) {
+        max = midpoint - 1;
+      } else {
+        min = midpoint;
+      }
+    }
+
+    _previousLine = min;
+
+    return new LineInfo_Location(min + 1, offset - _lineStarts[min] + 1);
   }
 }
 
@@ -521,8 +551,10 @@
       if (uri.isAbsolute) {
         return _internalResolveUri(null, uri);
       }
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not resolve URI: $absoluteUri", exception);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Could not resolve URI: $absoluteUri",
+          new CaughtException(exception, stackTrace));
     }
     return null;
   }
@@ -539,7 +571,9 @@
       try {
         return _internalResolveUri(null, absoluteUri);
       } on AnalysisException catch (exception, stackTrace) {
-        AnalysisEngine.instance.logger.logError2("Could not resolve URI: $absoluteUri", new CaughtException(exception, stackTrace));
+        AnalysisEngine.instance.logger.logError(
+            "Could not resolve URI: $absoluteUri",
+            new CaughtException(exception, stackTrace));
       }
     }
     return null;
@@ -603,8 +637,10 @@
     try {
       // Force the creation of an escaped URI to deal with spaces, etc.
       return _internalResolveUri(containingSource, parseUriWithException(containedUri));
-    } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not resolve URI ($containedUri) relative to source (${containingSource.fullName})", exception);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Could not resolve URI ($containedUri) relative to source (${containingSource.fullName})",
+          new CaughtException(exception, stackTrace));
       return null;
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 60740c1..9fa796a 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -399,20 +399,18 @@
 
   @override
   Uri restoreAbsolute(Source source) {
-    if (source is FileBasedSource) {
-      String sourcePath = source.file.getPath();
-      for (JavaFile packagesDirectory in _packagesDirectories) {
-        List<JavaFile> pkgFolders = packagesDirectory.listFiles();
-        if (pkgFolders != null) {
-          for (JavaFile pkgFolder in pkgFolders) {
-            try {
-              String pkgCanonicalPath = pkgFolder.getCanonicalPath();
-              if (sourcePath.startsWith(pkgCanonicalPath)) {
-                String relPath = sourcePath.substring(pkgCanonicalPath.length);
-                return parseUriWithException("$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
-              }
-            } catch (e) {
+    String sourcePath = source.fullName;
+    for (JavaFile packagesDirectory in _packagesDirectories) {
+      List<JavaFile> pkgFolders = packagesDirectory.listFiles();
+      if (pkgFolders != null) {
+        for (JavaFile pkgFolder in pkgFolders) {
+          try {
+            String pkgCanonicalPath = pkgFolder.getCanonicalPath();
+            if (sourcePath.startsWith(pkgCanonicalPath)) {
+              String relPath = sourcePath.substring(pkgCanonicalPath.length);
+              return parseUriWithException("$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
             }
+          } catch (e) {
           }
         }
       }
@@ -433,12 +431,16 @@
     JavaFile pkgDir = new JavaFile.relative(packagesDirectory, pkgName);
     try {
       pkgDir = pkgDir.getCanonicalFile();
-    } on JavaIOException catch (e) {
-      if (!e.toString().contains("Required key not available")) {
-        AnalysisEngine.instance.logger.logError2("Canonical failed: $pkgDir", e);
+    } on JavaIOException catch (exception, stackTrace) {
+      if (!exception.toString().contains("Required key not available")) {
+        AnalysisEngine.instance.logger.logError(
+            "Canonical failed: $pkgDir",
+            new CaughtException(exception, stackTrace));
       } else if (_CanLogRequiredKeyIoException) {
         _CanLogRequiredKeyIoException = false;
-        AnalysisEngine.instance.logger.logError2("Canonical failed: $pkgDir", e);
+        AnalysisEngine.instance.logger.logError(
+            "Canonical failed: $pkgDir",
+            new CaughtException(exception, stackTrace));
       }
     }
     return new JavaFile.relative(pkgDir, relPath.replaceAll('/', new String.fromCharCode(JavaFile.separatorChar)));
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
new file mode 100644
index 0000000..4744470
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -0,0 +1,1727 @@
+// Copyright (c) 2014, 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.
+
+library engine.resolver.static_type_analyzer;
+
+import 'dart:collection';
+
+import 'java_engine.dart';
+import 'scanner.dart' as sc;
+import 'ast.dart';
+import 'element.dart';
+import 'resolver.dart';
+
+class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
+  DartType result = null;
+
+  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
+
+  @override
+  Object visitExpression(Expression node) => null;
+
+  @override
+  Object visitReturnStatement(ReturnStatement node) {
+    // prepare this 'return' type
+    DartType type;
+    Expression expression = node.expression;
+    if (expression != null) {
+      type = expression.bestType;
+    } else {
+      type = BottomTypeImpl.instance;
+    }
+    // merge types
+    if (result == null) {
+      result = type;
+    } else {
+      result = result.getLeastUpperBound(type);
+    }
+    return null;
+  }
+}
+
+/**
+ * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
+ * compute the static type of every expression. Second, they look for any static type errors or
+ * warnings that might need to be generated. The requirements for the type analyzer are:
+ * <ol>
+ * * Every element that refers to types should be fully populated.
+ * * Every node representing an expression should be resolved to the Type of the expression.
+ * </ol>
+ */
+class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
+  /**
+   * Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
+   * implement those tags.
+   *
+   * @return the table that was created
+   */
+  static HashMap<String, String> _createHtmlTagToClassMap() {
+    HashMap<String, String> map = new HashMap<String, String>();
+    map["a"] = "AnchorElement";
+    map["area"] = "AreaElement";
+    map["br"] = "BRElement";
+    map["base"] = "BaseElement";
+    map["body"] = "BodyElement";
+    map["button"] = "ButtonElement";
+    map["canvas"] = "CanvasElement";
+    map["content"] = "ContentElement";
+    map["dl"] = "DListElement";
+    map["datalist"] = "DataListElement";
+    map["details"] = "DetailsElement";
+    map["div"] = "DivElement";
+    map["embed"] = "EmbedElement";
+    map["fieldset"] = "FieldSetElement";
+    map["form"] = "FormElement";
+    map["hr"] = "HRElement";
+    map["head"] = "HeadElement";
+    map["h1"] = "HeadingElement";
+    map["h2"] = "HeadingElement";
+    map["h3"] = "HeadingElement";
+    map["h4"] = "HeadingElement";
+    map["h5"] = "HeadingElement";
+    map["h6"] = "HeadingElement";
+    map["html"] = "HtmlElement";
+    map["iframe"] = "IFrameElement";
+    map["img"] = "ImageElement";
+    map["input"] = "InputElement";
+    map["keygen"] = "KeygenElement";
+    map["li"] = "LIElement";
+    map["label"] = "LabelElement";
+    map["legend"] = "LegendElement";
+    map["link"] = "LinkElement";
+    map["map"] = "MapElement";
+    map["menu"] = "MenuElement";
+    map["meter"] = "MeterElement";
+    map["ol"] = "OListElement";
+    map["object"] = "ObjectElement";
+    map["optgroup"] = "OptGroupElement";
+    map["output"] = "OutputElement";
+    map["p"] = "ParagraphElement";
+    map["param"] = "ParamElement";
+    map["pre"] = "PreElement";
+    map["progress"] = "ProgressElement";
+    map["script"] = "ScriptElement";
+    map["select"] = "SelectElement";
+    map["source"] = "SourceElement";
+    map["span"] = "SpanElement";
+    map["style"] = "StyleElement";
+    map["caption"] = "TableCaptionElement";
+    map["td"] = "TableCellElement";
+    map["col"] = "TableColElement";
+    map["table"] = "TableElement";
+    map["tr"] = "TableRowElement";
+    map["textarea"] = "TextAreaElement";
+    map["title"] = "TitleElement";
+    map["track"] = "TrackElement";
+    map["ul"] = "UListElement";
+    map["video"] = "VideoElement";
+    return map;
+  }
+
+  /**
+   * The resolver driving the resolution and type analysis.
+   */
+  final ResolverVisitor _resolver;
+
+  /**
+   * The object providing access to the types defined by the language.
+   */
+  TypeProvider _typeProvider;
+
+  /**
+   * The type representing the type 'dynamic'.
+   */
+  DartType _dynamicType;
+
+  /**
+   * The type representing the class containing the nodes being analyzed, or `null` if the
+   * nodes are not within a class.
+   */
+  InterfaceType _thisType;
+
+  /**
+   * The object keeping track of which elements have had their types overridden.
+   */
+  TypeOverrideManager _overrideManager;
+
+  /**
+   * The object keeping track of which elements have had their types promoted.
+   */
+  TypePromotionManager _promoteManager;
+
+  /**
+   * A table mapping [ExecutableElement]s to their propagated return types.
+   */
+  HashMap<ExecutableElement, DartType> _propagatedReturnTypes = new HashMap<ExecutableElement, DartType>();
+
+  /**
+   * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
+   * those tags.
+   */
+  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
+
+  /**
+   * Initialize a newly created type analyzer.
+   *
+   * @param resolver the resolver driving this participant
+   */
+  StaticTypeAnalyzer(this._resolver) {
+    _typeProvider = _resolver.typeProvider;
+    _dynamicType = _typeProvider.dynamicType;
+    _overrideManager = _resolver.overrideManager;
+    _promoteManager = _resolver.promoteManager;
+  }
+
+  /**
+   * Set the type of the class being analyzed to the given type.
+   *
+   * @param thisType the type representing the class containing the nodes being analyzed
+   */
+  void set thisType(InterfaceType thisType) {
+    this._thisType = thisType;
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitAdjacentStrings(AdjacentStrings node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.32: <blockquote>... the cast expression <i>e as T</i> ...
+   *
+   * It is a static warning if <i>T</i> does not denote a type available in the current lexical
+   * scope.
+   *
+   * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
+   */
+  @override
+  Object visitAsExpression(AsExpression node) {
+    _recordStaticType(node, _getType(node.type));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.18: <blockquote>... an assignment <i>a</i> of the form <i>v
+   * = e</i> ...
+   *
+   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
+   * type of <i>v</i>.
+   *
+   * The static type of the expression <i>v = e</i> is the static type of <i>e</i>.
+   *
+   * ... an assignment of the form <i>C.v = e</i> ...
+   *
+   * It is a static type warning if the static type of <i>e</i> may not be assigned to the static
+   * type of <i>C.v</i>.
+   *
+   * The static type of the expression <i>C.v = e</i> is the static type of <i>e</i>.
+   *
+   * ... an assignment of the form <i>e<sub>1</sub>.v = e<sub>2</sub></i> ...
+   *
+   * Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type warning if
+   * <i>T</i> does not have an accessible instance setter named <i>v=</i>. It is a static type
+   * warning if the static type of <i>e<sub>2</sub></i> may not be assigned to <i>T</i>.
+   *
+   * The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
+   * <i>e<sub>2</sub></i>.
+   *
+   * ... an assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> ...
+   *
+   * The static type of the expression <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> is the
+   * static type of <i>e<sub>3</sub></i>.
+   *
+   * A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
+   * assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e</i>. A compound
+   * assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivalent to <i>((x) => x.v
+   * = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable that is not used in
+   * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] op=
+   * e<sub>3</sub></i> is equivalent to <i>((a, i) => a[i] = a[i] op e<sub>3</sub>)(e<sub>1</sub>,
+   * e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
+   * <i>e<sub>3</sub></i>.</blockquote>
+   */
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.EQ) {
+      Expression rightHandSide = node.rightHandSide;
+      DartType staticType = _getStaticType(rightHandSide);
+      _recordStaticType(node, staticType);
+      DartType overrideType = staticType;
+      DartType propagatedType = rightHandSide.propagatedType;
+      if (propagatedType != null) {
+        if (propagatedType.isMoreSpecificThan(staticType)) {
+          _recordPropagatedType(node, propagatedType);
+        }
+        overrideType = propagatedType;
+      }
+      _resolver.overrideExpression(node.leftHandSide, overrideType, true);
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          _recordPropagatedType(node, propagatedType);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.20: <blockquote>The static type of a logical boolean
+   * expression is `bool`.</blockquote>
+   *
+   * The Dart Language Specification, 12.21:<blockquote>A bitwise expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A bitwise expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.22: <blockquote>The static type of an equality expression
+   * is `bool`.</blockquote>
+   *
+   * The Dart Language Specification, 12.23: <blockquote>A relational expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A relational expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.24: <blockquote>A shift expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A shift expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.25: <blockquote>An additive expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. An additive expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.26: <blockquote>A multiplicative expression of the form
+   * <i>e<sub>1</sub> op e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>e<sub>1</sub>.op(e<sub>2</sub>)</i>. A multiplicative expression of the form <i>super op
+   * e<sub>2</sub></i> is equivalent to the method invocation
+   * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
+   */
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    ExecutableElement staticMethodElement = node.staticElement;
+    DartType staticType = _computeStaticReturnType(staticMethodElement);
+    staticType = _refineBinaryExpressionType(node, staticType);
+    _recordStaticType(node, staticType);
+    MethodElement propagatedMethodElement = node.propagatedElement;
+    if (!identical(propagatedMethodElement, staticMethodElement)) {
+      DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
+      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+        _recordPropagatedType(node, propagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.4: <blockquote>The static type of a boolean literal is
+   * bool.</blockquote>
+   */
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    _recordStaticType(node, _typeProvider.boolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.15.2: <blockquote>A cascaded method invocation expression
+   * of the form <i>e..suffix</i> is equivalent to the expression <i>(t) {t.suffix; return
+   * t;}(e)</i>.</blockquote>
+   */
+  @override
+  Object visitCascadeExpression(CascadeExpression node) {
+    _recordStaticType(node, _getStaticType(node.target));
+    _recordPropagatedType(node, node.target.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.19: <blockquote> ... a conditional expression <i>c</i> of
+   * the form <i>e<sub>1</sub> ? e<sub>2</sub> : e<sub>3</sub></i> ...
+   *
+   * It is a static type warning if the type of e<sub>1</sub> may not be assigned to `bool`.
+   *
+   * The static type of <i>c</i> is the least upper bound of the static type of <i>e<sub>2</sub></i>
+   * and the static type of <i>e<sub>3</sub></i>.</blockquote>
+   */
+  @override
+  Object visitConditionalExpression(ConditionalExpression node) {
+    DartType staticThenType = _getStaticType(node.thenExpression);
+    DartType staticElseType = _getStaticType(node.elseExpression);
+    if (staticThenType == null) {
+      // TODO(brianwilkerson) Determine whether this can still happen.
+      staticThenType = _dynamicType;
+    }
+    if (staticElseType == null) {
+      // TODO(brianwilkerson) Determine whether this can still happen.
+      staticElseType = _dynamicType;
+    }
+    DartType staticType = staticThenType.getLeastUpperBound(staticElseType);
+    if (staticType == null) {
+      staticType = _dynamicType;
+    }
+    _recordStaticType(node, staticType);
+    DartType propagatedThenType = node.thenExpression.propagatedType;
+    DartType propagatedElseType = node.elseExpression.propagatedType;
+    if (propagatedThenType != null || propagatedElseType != null) {
+      if (propagatedThenType == null) {
+        propagatedThenType = staticThenType;
+      }
+      if (propagatedElseType == null) {
+        propagatedElseType = staticElseType;
+      }
+      DartType propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
+      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+        _recordPropagatedType(node, propagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.3: <blockquote>The static type of a literal double is
+   * double.</blockquote>
+   */
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) {
+    _recordStaticType(node, _typeProvider.doubleType);
+    return null;
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionExpression function = node.functionExpression;
+    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
+    functionElement.returnType = _computeStaticReturnTypeOfFunctionDeclaration(node);
+    _recordPropagatedTypeOfFunction(functionElement, function.body);
+    _recordStaticType(function, functionElement.type);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the
+   * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub>
+   * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk]) => e</i> is
+   * <i>(T<sub>1</sub>, &hellip;, Tn, [T<sub>n+1</sub> x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub>]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
+   * <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
+   * considered to have been specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> : dk}) => e</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; T<sub>0</sub></i>, where
+   * <i>T<sub>0</sub></i> is the static type of <i>e</i>. In any case where <i>T<sub>i</sub>, 1
+   * &lt;= i &lt;= n</i>, is not specified, it is considered to have been specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> = dk]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>]) &rarr; dynamic</i>. In any case
+   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
+   * specified as dynamic.
+   *
+   * The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
+   * T<sub>n</sub> a<sub>n</sub>, {T<sub>n+1</sub> x<sub>n+1</sub> : d1, &hellip;, T<sub>n+k</sub>
+   * x<sub>n+k</sub> : dk}) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>n+1</sub>
+   * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>}) &rarr; dynamic</i>. In any case
+   * where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
+   * specified as dynamic.</blockquote>
+   */
+  @override
+  Object visitFunctionExpression(FunctionExpression node) {
+    if (node.parent is FunctionDeclaration) {
+      // The function type will be resolved and set when we visit the parent node.
+      return null;
+    }
+    ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
+    functionElement.returnType = _computeStaticReturnTypeOfFunctionExpression(node);
+    _recordPropagatedTypeOfFunction(functionElement, node.body);
+    _recordStaticType(node, node.element.type);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.14.4: <blockquote>A function expression invocation <i>i</i>
+   * has the form <i>e<sub>f</sub>(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
+   * a<sub>n+1</sub>, &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>, where <i>e<sub>f</sub></i> is
+   * an expression.
+   *
+   * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
+   * assigned to a function type.
+   *
+   * If <i>F</i> is not a function type, the static type of <i>i</i> is dynamic. Otherwise the
+   * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
+   */
+  @override
+  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    ExecutableElement staticMethodElement = node.staticElement;
+    // Record static return type of the static element.
+    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
+    _recordStaticType(node, staticStaticType);
+    // Record propagated return type of the static element.
+    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
+    if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
+      _recordPropagatedType(node, staticPropagatedType);
+    }
+    ExecutableElement propagatedMethodElement = node.propagatedElement;
+    if (!identical(propagatedMethodElement, staticMethodElement)) {
+      // Record static return type of the propagated element.
+      DartType propagatedStaticType = _computeStaticReturnType(propagatedMethodElement);
+      if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
+        _recordPropagatedType(node, propagatedStaticType);
+      }
+      // Record propagated return type of the propagated element.
+      DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedMethodElement);
+      if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
+        _recordPropagatedType(node, propagatedPropagatedType);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.29: <blockquote>An assignable expression of the form
+   * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
+   * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
+   */
+  @override
+  Object visitIndexExpression(IndexExpression node) {
+    if (node.inSetterContext()) {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeArgumentType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType = _computeArgumentType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          _recordPropagatedType(node, propagatedType);
+        }
+      }
+    } else {
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          _recordPropagatedType(node, propagatedType);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.11.1: <blockquote>The static type of a new expression of
+   * either the form <i>new T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the form <i>new
+   * T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>.</blockquote>
+   *
+   * The Dart Language Specification, 12.11.2: <blockquote>The static type of a constant object
+   * expression of either the form <i>const T.id(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> or the
+   * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
+   */
+  @override
+  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _recordStaticType(node, node.constructorName.type.type);
+    ConstructorElement element = node.staticElement;
+    if (element != null && "Element" == element.enclosingElement.name) {
+      LibraryElement library = element.library;
+      if (_isHtmlLibrary(library)) {
+        String constructorName = element.name;
+        if ("tag" == constructorName) {
+          DartType returnType = _getFirstArgumentAsTypeWithMap(library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
+          if (returnType != null) {
+            _recordPropagatedType(node, returnType);
+          }
+        } else {
+          DartType returnType = _getElementNameAsType(library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
+          if (returnType != null) {
+            _recordPropagatedType(node, returnType);
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is
+   * `int`.</blockquote>
+   */
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    _recordStaticType(node, _typeProvider.intType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.31: <blockquote>It is a static warning if <i>T</i> does not
+   * denote a type available in the current lexical scope.
+   *
+   * The static type of an is-expression is `bool`.</blockquote>
+   */
+  @override
+  Object visitIsExpression(IsExpression node) {
+    _recordStaticType(node, _typeProvider.boolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
+   * form <i><b>const</b> &lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or the form
+   * <i>&lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;E&gt;`. The static
+   * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or
+   * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynamic&gt;`
+   * .</blockquote>
+   */
+  @override
+  Object visitListLiteral(ListLiteral node) {
+    DartType staticType = _dynamicType;
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments != null && arguments.length == 1) {
+        TypeName argumentTypeName = arguments[0];
+        DartType argumentType = _getType(argumentTypeName);
+        if (argumentType != null) {
+          staticType = argumentType;
+        }
+      }
+    }
+    _recordStaticType(node, _typeProvider.listType.substitute4(<DartType> [staticType]));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.7: <blockquote>The static type of a map literal of the form
+   * <i><b>const</b> &lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>&lt;K, V&gt; {k<sub>1</sub>:e<sub>1</sub>,
+   * &hellip;, k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;K, V&gt;`. The static type a map
+   * literal of the form <i><b>const</b> {k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> or the form <i>{k<sub>1</sub>:e<sub>1</sub>, &hellip;,
+   * k<sub>n</sub>:e<sub>n</sub>}</i> is `Map&lt;dynamic, dynamic&gt;`.
+   *
+   * It is a compile-time error if the first type argument to a map literal is not
+   * <i>String</i>.</blockquote>
+   */
+  @override
+  Object visitMapLiteral(MapLiteral node) {
+    DartType staticKeyType = _dynamicType;
+    DartType staticValueType = _dynamicType;
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      NodeList<TypeName> arguments = typeArguments.arguments;
+      if (arguments != null && arguments.length == 2) {
+        TypeName entryKeyTypeName = arguments[0];
+        DartType entryKeyType = _getType(entryKeyTypeName);
+        if (entryKeyType != null) {
+          staticKeyType = entryKeyType;
+        }
+        TypeName entryValueTypeName = arguments[1];
+        DartType entryValueType = _getType(entryValueTypeName);
+        if (entryValueType != null) {
+          staticValueType = entryValueType;
+        }
+      }
+    }
+    _recordStaticType(node, _typeProvider.mapType.substitute4(<DartType> [staticKeyType, staticValueType]));
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.15.1: <blockquote>An ordinary method invocation <i>i</i>
+   * has the form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if <i>T</i> does not
+   * have an accessible instance member named <i>m</i>. If <i>T.m</i> exists, it is a static warning
+   * if the type <i>F</i> of <i>T.m</i> may not be assigned to a function type.
+   *
+   * If <i>T.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
+   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   *
+   * The Dart Language Specification, 11.15.3: <blockquote>A static method invocation <i>i</i> has
+   * the form <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * It is a static type warning if the type <i>F</i> of <i>C.m</i> may not be assigned to a
+   * function type.
+   *
+   * If <i>F</i> is not a function type, or if <i>C.m</i> does not exist, the static type of i is
+   * dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   *
+   * The Dart Language Specification, 11.15.4: <blockquote>A super method invocation <i>i</i> has
+   * the form <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>: a<sub>n+1</sub>,
+   * &hellip;, x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
+   *
+   * It is a static type warning if <i>S</i> does not have an accessible instance member named m. If
+   * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of <i>S.m</i> may not be
+   * assigned to a function type.
+   *
+   * If <i>S.m</i> does not exist, or if <i>F</i> is not a function type, the static type of
+   * <i>i</i> is dynamic. Otherwise the static type of <i>i</i> is the declared return type of
+   * <i>F</i>.</blockquote>
+   */
+  @override
+  Object visitMethodInvocation(MethodInvocation node) {
+    SimpleIdentifier methodNameNode = node.methodName;
+    Element staticMethodElement = methodNameNode.staticElement;
+    // Record types of the variable invoked as a function.
+    if (staticMethodElement is VariableElement) {
+      VariableElement variable = staticMethodElement;
+      DartType staticType = variable.type;
+      _recordStaticType(methodNameNode, staticType);
+      DartType propagatedType = _overrideManager.getType(variable);
+      if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+        _recordPropagatedType(methodNameNode, propagatedType);
+      }
+    }
+    // Record static return type of the static element.
+    DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
+    _recordStaticType(node, staticStaticType);
+    // Record propagated return type of the static element.
+    DartType staticPropagatedType = _computePropagatedReturnType(staticMethodElement);
+    if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
+      _recordPropagatedType(node, staticPropagatedType);
+    }
+    bool needPropagatedType = true;
+    String methodName = methodNameNode.name;
+    if (methodName == "then") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (_isAsyncFutureType(targetType)) {
+          // Future.then(closure) return type is:
+          // 1) the returned Future type, if the closure returns a Future;
+          // 2) Future<valueType>, if the closure returns a value.
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            // TODO(brianwilkerson) Handle the case where both arguments are provided.
+            Expression closureArg = arguments[0];
+            if (closureArg is FunctionExpression) {
+              FunctionExpression closureExpr = closureArg;
+              DartType returnType = _computePropagatedReturnType(closureExpr.element);
+              if (returnType != null) {
+                // prepare the type of the returned Future
+                InterfaceTypeImpl newFutureType;
+                if (_isAsyncFutureType(returnType)) {
+                  newFutureType = returnType as InterfaceTypeImpl;
+                } else {
+                  InterfaceType futureType = targetType as InterfaceType;
+                  newFutureType = new InterfaceTypeImpl.con1(futureType.element);
+                  newFutureType.typeArguments = <DartType> [returnType];
+                }
+                // set the 'then' invocation type
+                _recordPropagatedType(node, newFutureType);
+                needPropagatedType = false;
+                return null;
+              }
+            }
+          }
+        }
+      }
+    } else if (methodName == "\$dom_createEvent") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsType(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "query") {
+      Expression target = node.realTarget;
+      if (target == null) {
+        Element methodElement = methodNameNode.bestElement;
+        if (methodElement != null) {
+          LibraryElement library = methodElement.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      } else {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "\$dom_createElement") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
+          }
+        }
+      }
+    } else if (methodName == "JS") {
+      DartType returnType = _getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
+      if (returnType != null) {
+        _recordPropagatedType(node, returnType);
+        needPropagatedType = false;
+      }
+    } else if (methodName == "getContext") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "CanvasElement")) {
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            Expression argument = arguments[0];
+            if (argument is StringLiteral) {
+              String value = argument.stringValue;
+              if ("2d" == value) {
+                PropertyAccessorElement getter = targetType.element.getGetter("context2D");
+                if (getter != null) {
+                  DartType returnType = getter.returnType;
+                  if (returnType != null) {
+                    _recordPropagatedType(node, returnType);
+                    needPropagatedType = false;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    if (needPropagatedType) {
+      Element propagatedElement = methodNameNode.propagatedElement;
+      // HACK: special case for object methods ([toString]) on dynamic expressions.
+      // More special cases in [visitPrefixedIdentfier].
+      if (propagatedElement == null) {
+        propagatedElement = _typeProvider.objectType.getMethod(methodNameNode.name);
+      }
+      if (!identical(propagatedElement, staticMethodElement)) {
+        // Record static return type of the propagated element.
+        DartType propagatedStaticType = _computeStaticReturnType(propagatedElement);
+        if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
+          _recordPropagatedType(node, propagatedStaticType);
+        }
+        // Record propagated return type of the propagated element.
+        DartType propagatedPropagatedType = _computePropagatedReturnType(propagatedElement);
+        if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
+          _recordPropagatedType(node, propagatedPropagatedType);
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitNamedExpression(NamedExpression node) {
+    Expression expression = node.expression;
+    _recordStaticType(node, _getStaticType(expression));
+    _recordPropagatedType(node, expression.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.2: <blockquote>The static type of `null` is bottom.
+   * </blockquote>
+   */
+  @override
+  Object visitNullLiteral(NullLiteral node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  @override
+  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+    Expression expression = node.expression;
+    _recordStaticType(node, _getStaticType(expression));
+    _recordPropagatedType(node, expression.propagatedType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.28: <blockquote>A postfix expression of the form
+   * <i>v++</i>, where <i>v</i> is an identifier, is equivalent to <i>(){var r = v; v = r + 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>C.v++</i> is equivalent to <i>(){var r = C.v; C.v = r + 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
+   * 1; return r}(e1)</i>.
+   *
+   * A postfix expression of the form <i>e1[e2]++</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
+   * = r + 1; return r}(e1, e2)</i>
+   *
+   * A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifier, is equivalent to
+   * <i>(){var r = v; v = r - 1; return r}()</i>.
+   *
+   * A postfix expression of the form <i>C.v--</i> is equivalent to <i>(){var r = C.v; C.v = r - 1;
+   * return r}()</i>.
+   *
+   * A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
+   * 1; return r}(e1)</i>.
+   *
+   * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
+   * = r - 1; return r}(e1, e2)</i></blockquote>
+   */
+  @override
+  Object visitPostfixExpression(PostfixExpression node) {
+    Expression operand = node.operand;
+    DartType staticType = _getStaticType(operand);
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
+      DartType intType = _typeProvider.intType;
+      if (identical(_getStaticType(node.operand), intType)) {
+        staticType = intType;
+      }
+    }
+    _recordStaticType(node, staticType);
+    _recordPropagatedType(node, operand.propagatedType);
+    return null;
+  }
+
+  /**
+   * See [visitSimpleIdentifier].
+   */
+  @override
+  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+    SimpleIdentifier prefixedIdentifier = node.identifier;
+    Element staticElement = prefixedIdentifier.staticElement;
+    DartType staticType = _dynamicType;
+    DartType propagatedType = null;
+    if (staticElement is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = staticElement.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (staticElement is FunctionTypeAliasElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = staticElement.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (staticElement is MethodElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is PropertyAccessorElement) {
+      staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(staticElement, propagatedType);
+    } else if (staticElement is ExecutableElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is TypeParameterElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is VariableElement) {
+      staticType = staticElement.type;
+    }
+    _recordStaticType(prefixedIdentifier, staticType);
+    _recordStaticType(node, staticType);
+    Element propagatedElement = prefixedIdentifier.propagatedElement;
+    // HACK: special case for object getters ([hashCode] and [runtimeType]) on dynamic expressions.
+    // More special cases in [visitMethodInvocation].
+    if (propagatedElement == null) {
+      propagatedElement = _typeProvider.objectType.getGetter(prefixedIdentifier.name);
+    }
+    if (propagatedElement is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        propagatedType = (propagatedElement as ClassElement).type;
+      } else {
+        propagatedType = _typeProvider.typeType;
+      }
+    } else if (propagatedElement is FunctionTypeAliasElement) {
+      propagatedType = (propagatedElement as FunctionTypeAliasElement).type;
+    } else if (propagatedElement is MethodElement) {
+      propagatedType = (propagatedElement as MethodElement).type;
+    } else if (propagatedElement is PropertyAccessorElement) {
+      propagatedType = _getTypeOfProperty(propagatedElement as PropertyAccessorElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(propagatedElement, propagatedType);
+    } else if (propagatedElement is ExecutableElement) {
+      propagatedType = (propagatedElement as ExecutableElement).type;
+    } else if (propagatedElement is TypeParameterElement) {
+      propagatedType = (propagatedElement as TypeParameterElement).type;
+    } else if (propagatedElement is VariableElement) {
+      propagatedType = (propagatedElement as VariableElement).type;
+    }
+    DartType overriddenType = _overrideManager.getType(propagatedElement);
+    if (propagatedType == null || (overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType))) {
+      propagatedType = overriddenType;
+    }
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      _recordPropagatedType(prefixedIdentifier, propagatedType);
+      _recordPropagatedType(node, propagatedType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.27: <blockquote>A unary expression <i>u</i> of the form
+   * <i>op e</i> is equivalent to a method invocation <i>expression e.op()</i>. An expression of the
+   * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i>.</blockquote>
+   */
+  @override
+  Object visitPrefixExpression(PrefixExpression node) {
+    sc.TokenType operator = node.operator.type;
+    if (operator == sc.TokenType.BANG) {
+      _recordStaticType(node, _typeProvider.boolType);
+    } else {
+      // The other cases are equivalent to invoking a method.
+      ExecutableElement staticMethodElement = node.staticElement;
+      DartType staticType = _computeStaticReturnType(staticMethodElement);
+      if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
+        DartType intType = _typeProvider.intType;
+        if (identical(_getStaticType(node.operand), intType)) {
+          staticType = intType;
+        }
+      }
+      _recordStaticType(node, staticType);
+      MethodElement propagatedMethodElement = node.propagatedElement;
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
+        DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
+        if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+          _recordPropagatedType(node, propagatedType);
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.13: <blockquote> Property extraction allows for a member of
+   * an object to be concisely extracted from the object. If <i>o</i> is an object, and if <i>m</i>
+   * is the name of a method member of <i>o</i>, then
+   * * <i>o.m</i> is defined to be equivalent to: <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+   * {p<sub>1</sub> : d<sub>1</sub>, &hellip;, p<sub>k</sub> : d<sub>k</sub>}){return
+   * o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>, p<sub>1</sub>: p<sub>1</sub>, &hellip;,
+   * p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i>r<sub>1</sub>,
+   * &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
+   * with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
+   * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, [p<sub>1</sub> = d<sub>1</sub>, &hellip;,
+   * p<sub>k</sub> = d<sub>k</sub>]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+   * p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required parameters
+   * <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional parameters
+   * <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
+   * d<sub>k</sub></i>.
+   * Otherwise, if <i>m</i> is the name of a getter member of <i>o</i> (declared implicitly or
+   * explicitly) then <i>o.m</i> evaluates to the result of invoking the getter. </blockquote>
+   *
+   * The Dart Language Specification, 12.17: <blockquote> ... a getter invocation <i>i</i> of the
+   * form <i>e.m</i> ...
+   *
+   * Let <i>T</i> be the static type of <i>e</i>. It is a static type warning if <i>T</i> does not
+   * have a getter named <i>m</i>.
+   *
+   * The static type of <i>i</i> is the declared return type of <i>T.m</i>, if <i>T.m</i> exists;
+   * otherwise the static type of <i>i</i> is dynamic.
+   *
+   * ... a getter invocation <i>i</i> of the form <i>C.m</i> ...
+   *
+   * It is a static warning if there is no class <i>C</i> in the enclosing lexical scope of
+   * <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter named <i>m</i>.
+   *
+   * The static type of <i>i</i> is the declared return type of <i>C.m</i> if it exists or dynamic
+   * otherwise.
+   *
+   * ... a top-level getter invocation <i>i</i> of the form <i>m</i>, where <i>m</i> is an
+   * identifier ...
+   *
+   * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
+   */
+  @override
+  Object visitPropertyAccess(PropertyAccess node) {
+    SimpleIdentifier propertyName = node.propertyName;
+    Element staticElement = propertyName.staticElement;
+    DartType staticType = _dynamicType;
+    if (staticElement is MethodElement) {
+      staticType = staticElement.type;
+    } else if (staticElement is PropertyAccessorElement) {
+      Expression realTarget = node.realTarget;
+      staticType = _getTypeOfProperty(staticElement, realTarget != null ? _getStaticType(realTarget) : null);
+    } else {
+      // TODO(brianwilkerson) Report this internal error.
+    }
+    _recordStaticType(propertyName, staticType);
+    _recordStaticType(node, staticType);
+    Element propagatedElement = propertyName.propagatedElement;
+    DartType propagatedType = _overrideManager.getType(propagatedElement);
+    if (propagatedElement is MethodElement) {
+      propagatedType = propagatedElement.type;
+    } else if (propagatedElement is PropertyAccessorElement) {
+      Expression realTarget = node.realTarget;
+      propagatedType = _getTypeOfProperty(propagatedElement, realTarget != null ? realTarget.bestType : null);
+    } else {
+      // TODO(brianwilkerson) Report this internal error.
+    }
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      _recordPropagatedType(propertyName, propagatedType);
+      _recordPropagatedType(node, propagatedType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.9: <blockquote>The static type of a rethrow expression is
+   * bottom.</blockquote>
+   */
+  @override
+  Object visitRethrowExpression(RethrowExpression node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.30: <blockquote>Evaluation of an identifier expression
+   * <i>e</i> of the form <i>id</i> proceeds as follows:
+   *
+   * Let <i>d</i> be the innermost declaration in the enclosing lexical scope whose name is
+   * <i>id</i>. If no such declaration exists in the lexical scope, let <i>d</i> be the declaration
+   * of the inherited member named <i>id</i> if it exists.
+   * * If <i>d</i> is a class or type alias <i>T</i>, the value of <i>e</i> is the unique instance
+   * of class `Type` reifying <i>T</i>.
+   * * If <i>d</i> is a type parameter <i>T</i>, then the value of <i>e</i> is the value of the
+   * actual type argument corresponding to <i>T</i> that was passed to the generative constructor
+   * that created the current binding of this. We are assured that this is well defined, because if
+   * we were in a static member the reference to <i>T</i> would be a compile-time error.
+   * * If <i>d</i> is a library variable then:
+   * * If <i>d</i> is of one of the forms <i>var v = e<sub>i</sub>;</i>, <i>T v =
+   * e<sub>i</sub>;</i>, <i>final v = e<sub>i</sub>;</i>, <i>final T v = e<sub>i</sub>;</i>, and no
+   * value has yet been stored into <i>v</i> then the initializer expression <i>e<sub>i</sub></i> is
+   * evaluated. If, during the evaluation of <i>e<sub>i</sub></i>, the getter for <i>v</i> is
+   * referenced, a CyclicInitializationError is thrown. If the evaluation succeeded yielding an
+   * object <i>o</i>, let <i>r = o</i>, otherwise let <i>r = null</i>. In any case, <i>r</i> is
+   * stored into <i>v</i>. The value of <i>e</i> is <i>r</i>.
+   * * If <i>d</i> is of one of the forms <i>const v = e;</i> or <i>const T v = e;</i> the result
+   * of the getter is the value of the compile time constant <i>e</i>. Otherwise
+   * * <i>e</i> evaluates to the current binding of <i>id</i>.
+   * * If <i>d</i> is a local variable or formal parameter then <i>e</i> evaluates to the current
+   * binding of <i>id</i>.
+   * * If <i>d</i> is a static method, top level function or local function then <i>e</i>
+   * evaluates to the function defined by <i>d</i>.
+   * * If <i>d</i> is the declaration of a static variable or static getter declared in class
+   * <i>C</i>, then <i>e</i> is equivalent to the getter invocation <i>C.id</i>.
+   * * If <i>d</i> is the declaration of a top level getter, then <i>e</i> is equivalent to the
+   * getter invocation <i>id</i>.
+   * * Otherwise, if <i>e</i> occurs inside a top level or static function (be it function,
+   * method, getter, or setter) or variable initializer, evaluation of e causes a NoSuchMethodError
+   * to be thrown.
+   * * Otherwise <i>e</i> is equivalent to the property extraction <i>this.id</i>.
+   * </blockquote>
+   */
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    DartType staticType = _dynamicType;
+    if (element is ClassElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = element.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (element is FunctionTypeAliasElement) {
+      if (_isNotTypeLiteral(node)) {
+        staticType = element.type;
+      } else {
+        staticType = _typeProvider.typeType;
+      }
+    } else if (element is MethodElement) {
+      staticType = element.type;
+    } else if (element is PropertyAccessorElement) {
+      staticType = _getTypeOfProperty(element, null);
+    } else if (element is ExecutableElement) {
+      staticType = element.type;
+    } else if (element is TypeParameterElement) {
+      staticType = _typeProvider.typeType;
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      staticType = _promoteManager.getStaticType(variable);
+    } else if (element is PrefixElement) {
+      return null;
+    } else if (element is DynamicElementImpl) {
+      staticType = _typeProvider.typeType;
+    } else {
+      staticType = _dynamicType;
+    }
+    _recordStaticType(node, staticType);
+    // TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element
+    // to get another candidate for the propagated type.
+    DartType propagatedType = _getPropertyPropagatedType(element, null);
+    if (propagatedType == null) {
+      DartType overriddenType = _overrideManager.getType(element);
+      if (propagatedType == null || overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType)) {
+        propagatedType = overriddenType;
+      }
+    }
+    if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
+      _recordPropagatedType(node, propagatedType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+   * `String`.</blockquote>
+   */
+  @override
+  Object visitStringInterpolation(StringInterpolation node) {
+    _recordStaticType(node, _typeProvider.stringType);
+    return null;
+  }
+
+  @override
+  Object visitSuperExpression(SuperExpression node) {
+    if (_thisType == null) {
+      // TODO(brianwilkerson) Report this error if it hasn't already been reported
+      _recordStaticType(node, _dynamicType);
+    } else {
+      _recordStaticType(node, _thisType);
+    }
+    return null;
+  }
+
+  @override
+  Object visitSymbolLiteral(SymbolLiteral node) {
+    _recordStaticType(node, _typeProvider.symbolType);
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.10: <blockquote>The static type of `this` is the
+   * interface of the immediately enclosing class.</blockquote>
+   */
+  @override
+  Object visitThisExpression(ThisExpression node) {
+    if (_thisType == null) {
+      // TODO(brianwilkerson) Report this error if it hasn't already been reported
+      _recordStaticType(node, _dynamicType);
+    } else {
+      _recordStaticType(node, _thisType);
+    }
+    return null;
+  }
+
+  /**
+   * The Dart Language Specification, 12.8: <blockquote>The static type of a throw expression is
+   * bottom.</blockquote>
+   */
+  @override
+  Object visitThrowExpression(ThrowExpression node) {
+    _recordStaticType(node, _typeProvider.bottomType);
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    Expression initializer = node.initializer;
+    if (initializer != null) {
+      DartType rightType = initializer.bestType;
+      SimpleIdentifier name = node.name;
+      _recordPropagatedType(name, rightType);
+      VariableElement element = name.staticElement as VariableElement;
+      if (element != null) {
+        _resolver.overrideVariable(element, rightType, true);
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record that the static type of the given node is the type of the second argument to the method
+   * represented by the given element.
+   *
+   * @param element the element representing the method invoked by the given node
+   */
+  DartType _computeArgumentType(ExecutableElement element) {
+    if (element != null) {
+      List<ParameterElement> parameters = element.parameters;
+      if (parameters != null && parameters.length == 2) {
+        return parameters[1].type;
+      }
+    }
+    return _dynamicType;
+  }
+
+  /**
+   * Compute the propagated return type of the method or function represented by the given element.
+   *
+   * @param element the element representing the method or function invoked by the given node
+   * @return the propagated return type that was computed
+   */
+  DartType _computePropagatedReturnType(Element element) {
+    if (element is ExecutableElement) {
+      return _propagatedReturnTypes[element];
+    }
+    return null;
+  }
+
+  /**
+   * Given a function body, compute the propagated return type of the function. The propagated
+   * return type of functions with a block body is the least upper bound of all
+   * [ReturnStatement] expressions, with an expression body it is the type of the expression.
+   *
+   * @param body the boy of the function whose propagated return type is to be computed
+   * @return the propagated return type that was computed
+   */
+  DartType _computePropagatedReturnTypeOfFunction(FunctionBody body) {
+    if (body is ExpressionFunctionBody) {
+      ExpressionFunctionBody expressionBody = body;
+      return expressionBody.expression.bestType;
+    }
+    if (body is BlockFunctionBody) {
+      GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction visitor
+          = new GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
+      body.accept(visitor);
+      return visitor.result;
+    }
+    return null;
+  }
+
+  /**
+   * Compute the static return type of the method or function represented by the given element.
+   *
+   * @param element the element representing the method or function invoked by the given node
+   * @return the static return type that was computed
+   */
+  DartType _computeStaticReturnType(Element element) {
+    if (element is PropertyAccessorElement) {
+      //
+      // This is a function invocation expression disguised as something else. We are invoking a
+      // getter and then invoking the returned function.
+      //
+      FunctionType propertyType = element.type;
+      if (propertyType != null) {
+        DartType returnType = propertyType.returnType;
+        if (returnType.isDartCoreFunction) {
+          return _dynamicType;
+        } else if (returnType is InterfaceType) {
+          MethodElement callMethod = returnType.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
+          if (callMethod != null) {
+            return callMethod.type.returnType;
+          }
+        } else if (returnType is FunctionType) {
+          DartType innerReturnType = returnType.returnType;
+          if (innerReturnType != null) {
+            return innerReturnType;
+          }
+        }
+        if (returnType != null) {
+          return returnType;
+        }
+      }
+    } else if (element is ExecutableElement) {
+      FunctionType type = element.type;
+      if (type != null) {
+        // TODO(brianwilkerson) Figure out the conditions under which the type is null.
+        return type.returnType;
+      }
+    } else if (element is VariableElement) {
+      VariableElement variable = element;
+      DartType variableType = _promoteManager.getStaticType(variable);
+      if (variableType is FunctionType) {
+        return variableType.returnType;
+      }
+    }
+    return _dynamicType;
+  }
+
+  /**
+   * Given a function declaration, compute the return static type of the function. The return type
+   * of functions with a block body is `dynamicType`, with an expression body it is the type
+   * of the expression.
+   *
+   * @param node the function expression whose static return type is to be computed
+   * @return the static return type that was computed
+   */
+  DartType _computeStaticReturnTypeOfFunctionDeclaration(FunctionDeclaration node) {
+    TypeName returnType = node.returnType;
+    if (returnType == null) {
+      return _dynamicType;
+    }
+    return returnType.type;
+  }
+
+  /**
+   * Given a function expression, compute the return type of the function. The return type of
+   * functions with a block body is `dynamicType`, with an expression body it is the type of
+   * the expression.
+   *
+   * @param node the function expression whose return type is to be computed
+   * @return the return type that was computed
+   */
+  DartType _computeStaticReturnTypeOfFunctionExpression(FunctionExpression node) {
+    FunctionBody body = node.body;
+    if (body is ExpressionFunctionBody) {
+      return _getStaticType(body.expression);
+    }
+    return _dynamicType;
+  }
+
+  /**
+   * If the given element name can be mapped to the name of a class defined within the given
+   * library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param elementName the name of the element for which a type is being sought
+   * @param nameMap an optional map used to map the element name to a type name
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getElementNameAsType(LibraryElement library, String elementName, HashMap<String, String> nameMap) {
+    if (elementName != null) {
+      if (nameMap != null) {
+        elementName = nameMap[elementName.toLowerCase()];
+      }
+      ClassElement returnType = library.getType(elementName);
+      if (returnType != null) {
+        return returnType.type;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, then parse that argument as a query string and return the type specified by the
+   * argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsQuery(LibraryElement library, ArgumentList argumentList) {
+    String argumentValue = _getFirstArgumentAsString(argumentList);
+    if (argumentValue != null) {
+      //
+      // If the query has spaces, full parsing is required because it might be:
+      //   E[text='warning text']
+      //
+      if (StringUtilities.indexOf1(argumentValue, 0, 0x20) >= 0) {
+        return null;
+      }
+      //
+      // Otherwise, try to extract the tag based on http://www.w3.org/TR/CSS2/selector.html.
+      //
+      String tag = argumentValue;
+      tag = StringUtilities.substringBeforeChar(tag, 0x3A);
+      tag = StringUtilities.substringBeforeChar(tag, 0x5B);
+      tag = StringUtilities.substringBeforeChar(tag, 0x2E);
+      tag = StringUtilities.substringBeforeChar(tag, 0x23);
+      tag = _HTML_ELEMENT_TO_CLASS_MAP[tag.toLowerCase()];
+      ClassElement returnType = library.getType(tag);
+      if (returnType != null) {
+        return returnType.type;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, return the String value of the argument.
+   *
+   * @param argumentList the list of arguments from which a string value is to be extracted
+   * @return the string specified by the first argument in the argument list
+   */
+  String _getFirstArgumentAsString(ArgumentList argumentList) {
+    NodeList<Expression> arguments = argumentList.arguments;
+    if (arguments.length > 0) {
+      Expression argument = arguments[0];
+      if (argument is SimpleStringLiteral) {
+        return argument.value;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, and if the value of the argument is the name of a class defined within the
+   * given library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsType(LibraryElement library, ArgumentList argumentList) => _getFirstArgumentAsTypeWithMap(library, argumentList, null);
+
+  /**
+   * If the given argument list contains at least one argument, and if the argument is a simple
+   * string literal, and if the value of the argument is the name of a class defined within the
+   * given library, return the type specified by the argument.
+   *
+   * @param library the library in which the specified type would be defined
+   * @param argumentList the list of arguments from which a type is to be extracted
+   * @param nameMap an optional map used to map the element name to a type name
+   * @return the type specified by the first argument in the argument list
+   */
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, HashMap<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
+
+  /**
+   * Return the propagated type of the given [Element], or `null`.
+   */
+  DartType _getPropertyPropagatedType(Element element, DartType currentType) {
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element;
+      if (accessor.isGetter) {
+        PropertyInducingElement variable = accessor.variable;
+        DartType propagatedType = variable.propagatedType;
+        if (currentType == null || propagatedType != null && propagatedType.isMoreSpecificThan(currentType)) {
+          return propagatedType;
+        }
+      }
+    }
+    return currentType;
+  }
+
+  /**
+   * Return the static type of the given expression.
+   *
+   * @param expression the expression whose type is to be returned
+   * @return the static type of the given expression
+   */
+  DartType _getStaticType(Expression expression) {
+    DartType type = expression.staticType;
+    if (type == null) {
+      // TODO(brianwilkerson) Determine the conditions for which the static type is null.
+      return _dynamicType;
+    }
+    return type;
+  }
+
+  /**
+   * Return the type represented by the given type name.
+   *
+   * @param typeName the type name representing the type to be returned
+   * @return the type represented by the type name
+   */
+  DartType _getType(TypeName typeName) {
+    DartType type = typeName.type;
+    if (type == null) {
+      //TODO(brianwilkerson) Determine the conditions for which the type is null.
+      return _dynamicType;
+    }
+    return type;
+  }
+
+  /**
+   * Return the type that should be recorded for a node that resolved to the given accessor.
+   *
+   * @param accessor the accessor that the node resolved to
+   * @param context if the accessor element has context [by being the RHS of a
+   *          [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
+   *          accessor is a parameter type, then the type of the LHS can be used to get more
+   *          specific type information
+   * @return the type that should be recorded for a node that resolved to the given accessor
+   */
+  DartType _getTypeOfProperty(PropertyAccessorElement accessor, DartType context) {
+    FunctionType functionType = accessor.type;
+    if (functionType == null) {
+      // TODO(brianwilkerson) Report this internal error. This happens when we are analyzing a
+      // reference to a property before we have analyzed the declaration of the property or when
+      // the property does not have a defined type.
+      return _dynamicType;
+    }
+    if (accessor.isSetter) {
+      List<DartType> parameterTypes = functionType.normalParameterTypes;
+      if (parameterTypes != null && parameterTypes.length > 0) {
+        return parameterTypes[0];
+      }
+      PropertyAccessorElement getter = accessor.variable.getter;
+      if (getter != null) {
+        functionType = getter.type;
+        if (functionType != null) {
+          return functionType.returnType;
+        }
+      }
+      return _dynamicType;
+    }
+    DartType returnType = functionType.returnType;
+    if (returnType is TypeParameterType && context is InterfaceType) {
+      // if the return type is a TypeParameter, we try to use the context [that the function is being
+      // called on] to get a more accurate returnType type
+      InterfaceType interfaceTypeContext = context;
+      //      Type[] argumentTypes = interfaceTypeContext.getTypeArguments();
+      List<TypeParameterElement> typeParameterElements = interfaceTypeContext.element != null ? interfaceTypeContext.element.typeParameters : null;
+      if (typeParameterElements != null) {
+        for (int i = 0; i < typeParameterElements.length; i++) {
+          TypeParameterElement typeParameterElement = typeParameterElements[i];
+          if (returnType.name == typeParameterElement.name) {
+            return interfaceTypeContext.typeArguments[i];
+          }
+        }
+        // TODO(jwren) troubleshoot why call to substitute doesn't work
+        //        Type[] parameterTypes = TypeParameterTypeImpl.getTypes(parameterElements);
+        //        return returnType.substitute(argumentTypes, parameterTypes);
+      }
+    }
+    return returnType;
+  }
+
+  /**
+   * Return `true` if the given [Type] is the `Future` form the 'dart:async'
+   * library.
+   */
+  bool _isAsyncFutureType(DartType type) => type is InterfaceType && type.name == "Future" && _isAsyncLibrary(type.element.library);
+
+  /**
+   * Return `true` if the given library is the 'dart:async' library.
+   *
+   * @param library the library being tested
+   * @return `true` if the library is 'dart:async'
+   */
+  bool _isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
+
+  /**
+   * Return `true` if the given library is the 'dart:html' library.
+   *
+   * @param library the library being tested
+   * @return `true` if the library is 'dart:html'
+   */
+  bool _isHtmlLibrary(LibraryElement library) => library != null && "dart.dom.html" == library.name;
+
+  /**
+   * Return `true` if the given node is not a type literal.
+   *
+   * @param node the node being tested
+   * @return `true` if the given node is not a type literal
+   */
+  bool _isNotTypeLiteral(Identifier node) {
+    AstNode parent = node.parent;
+    return parent is TypeName || (parent is PrefixedIdentifier && (parent.parent is TypeName || identical(parent.prefix, node))) || (parent is PropertyAccess && identical(parent.target, node)) || (parent is MethodInvocation && identical(node, parent.target));
+  }
+
+  /**
+   * Record that the propagated type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the propagated type of the node
+   */
+  void _recordPropagatedType(Expression expression, DartType type) {
+    if (type != null && !type.isDynamic && !type.isBottom) {
+      expression.propagatedType = type;
+    }
+  }
+
+  /**
+   * Given a function element and its body, compute and record the propagated return type of the
+   * function.
+   *
+   * @param functionElement the function element to record propagated return type for
+   * @param body the boy of the function whose propagated return type is to be computed
+   * @return the propagated return type that was computed, may be `null` if it is not more
+   *         specific than the static return type.
+   */
+  void _recordPropagatedTypeOfFunction(ExecutableElement functionElement, FunctionBody body) {
+    DartType propagatedReturnType = _computePropagatedReturnTypeOfFunction(body);
+    if (propagatedReturnType == null) {
+      return;
+    }
+    // Ignore 'bottom' type.
+    if (propagatedReturnType.isBottom) {
+      return;
+    }
+    // Record only if we inferred more specific type.
+    DartType staticReturnType = functionElement.returnType;
+    if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
+      return;
+    }
+    // OK, do record.
+    _propagatedReturnTypes[functionElement] = propagatedReturnType;
+  }
+
+  /**
+   * Record that the static type of the given node is the given type.
+   *
+   * @param expression the node whose type is to be recorded
+   * @param type the static type of the node
+   */
+  void _recordStaticType(Expression expression, DartType type) {
+    if (type == null) {
+      expression.staticType = _dynamicType;
+    } else {
+      expression.staticType = type;
+    }
+  }
+
+  /**
+   * Attempts to make a better guess for the static type of the given binary expression.
+   *
+   * @param node the binary expression to analyze
+   * @param staticType the static type of the expression as resolved
+   * @return the better type guess, or the same static type as given
+   */
+  DartType _refineBinaryExpressionType(BinaryExpression node, DartType staticType) {
+    sc.TokenType operator = node.operator.type;
+    // bool
+    if (operator == sc.TokenType.AMPERSAND_AMPERSAND || operator == sc.TokenType.BAR_BAR || operator == sc.TokenType.EQ_EQ || operator == sc.TokenType.BANG_EQ) {
+      return _typeProvider.boolType;
+    }
+    DartType intType = _typeProvider.intType;
+    if (_getStaticType(node.leftOperand) == intType) {
+      // int op double
+      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR) {
+        DartType doubleType = _typeProvider.doubleType;
+        if (_getStaticType(node.rightOperand) == doubleType) {
+          return doubleType;
+        }
+      }
+      // int op int
+      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR || operator == sc.TokenType.TILDE_SLASH) {
+        if (_getStaticType(node.rightOperand) == intType) {
+          staticType = intType;
+        }
+      }
+    }
+    // default
+    return staticType;
+  }
+
+  get thisType_J2DAccessor => _thisType;
+
+  set thisType_J2DAccessor(__v) => _thisType = __v;
+}
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index d35bd2b..68725e7 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -828,7 +828,7 @@
     space();
     token(node.inKeyword);
     space();
-    visit(node.iterator);
+    visit(node.iterable);
     token(node.rightParenthesis);
     space();
     visit(node.body);
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 54c3359..4bb0356 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
 dependencies:
-  args: '>=0.10.0 <0.13.0'
+  args: '>=0.12.1 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   watcher: '>=0.9.0 <0.10.0'
diff --git a/pkg/analyzer/test/generated/all_the_rest.dart b/pkg/analyzer/test/generated/all_the_rest.dart
index 7aa42b0..4e86f49 100644
--- a/pkg/analyzer/test/generated/all_the_rest.dart
+++ b/pkg/analyzer/test/generated/all_the_rest.dart
@@ -5394,6 +5394,85 @@
     expect(_stringValue(null).hasExactValue, isTrue);
   }
 
+  void test_identical_bool_false() {
+    _assertIdentical(_boolValue(false), _boolValue(false), _boolValue(true));
+  }
+
+  void test_identical_bool_true() {
+    _assertIdentical(_boolValue(true), _boolValue(true), _boolValue(true));
+  }
+
+  void test_identical_bool_unknown() {
+    _assertIdentical(_boolValue(null), _boolValue(null), _boolValue(false));
+  }
+
+  void test_identical_double_false() {
+    _assertIdentical(_boolValue(false), _doubleValue(2.0), _doubleValue(4.0));
+  }
+
+  void test_identical_double_true() {
+    _assertIdentical(_boolValue(true), _doubleValue(2.0), _doubleValue(2.0));
+  }
+
+  void test_identical_double_unknown() {
+    _assertIdentical(_boolValue(null), _doubleValue(1.0), _doubleValue(null));
+  }
+
+  void test_identical_int_false() {
+    _assertIdentical(_boolValue(false), _intValue(-5), _intValue(5));
+  }
+
+  void test_identical_int_true() {
+    _assertIdentical(_boolValue(true), _intValue(5), _intValue(5));
+  }
+
+  void test_identical_int_unknown() {
+    _assertIdentical(_boolValue(null), _intValue(null), _intValue(3));
+  }
+
+  void test_identical_list_empty() {
+    _assertIdentical(_boolValue(true), _listValue([]), _listValue([]));
+  }
+
+  void test_identical_list_false() {
+    _assertIdentical(_boolValue(false), _listValue([]),
+        _listValue([_intValue(3)]));
+  }
+
+  void test_identical_map_empty() {
+    _assertIdentical(_boolValue(true), _mapValue([]), _mapValue([]));
+  }
+
+  void test_identical_map_false() {
+    _assertIdentical(_boolValue(false), _mapValue([]),
+        _mapValue([_intValue(1), _intValue(2)]));
+  }
+
+  void test_identical_null() {
+    _assertIdentical(_boolValue(true), _nullValue(), _nullValue());
+  }
+
+  void test_identical_string_false() {
+    _assertIdentical(
+        _boolValue(false),
+        _stringValue("abc"),
+        _stringValue("def"));
+  }
+
+  void test_identical_string_true() {
+    _assertIdentical(
+        _boolValue(true),
+        _stringValue("abc"),
+        _stringValue("abc"));
+  }
+
+  void test_identical_string_unknown() {
+    _assertIdentical(
+        _boolValue(null),
+        _stringValue(null),
+        _stringValue("def"));
+  }
+
   void test_integerDivide_knownDouble_knownDouble() {
     _assertIntegerDivide(_intValue(3), _doubleValue(6.0), _doubleValue(2.0));
   }
@@ -6441,6 +6520,22 @@
     }
   }
 
+  /**
+   * Assert that the result of comparing the left and right operands using
+   * identical() is the expected value.
+   *
+   * @param expected the expected result of the operation
+   * @param leftOperand the left operand to the operation
+   * @param rightOperand the left operand to the operation
+   */
+  void _assertIdentical(DartObjectImpl expected, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand) {
+    DartObjectImpl result =
+        leftOperand.isIdentical(_typeProvider, rightOperand);
+    expect(result, isNotNull);
+    expect(result, expected);
+  }
+
   void _assertInstanceOfObjectArray(Object result) {
     // TODO(scheglov) implement
   }
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 3a13b38..58ea86f 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -953,6 +953,15 @@
     }
   }
 
+  void test_inGetterContext_forEachLoop() {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression iterator = AstFactory.listLiteral([]);
+    Statement body = AstFactory.block([]);
+    ForEachStatement forEachStatement =
+        AstFactory.forEachStatement2(identifier, iterator, body);
+    expect(identifier.inGetterContext(), isFalse);
+  }
+
   void test_inReferenceContext() {
     SimpleIdentifier identifier = AstFactory.identifier3("id");
     AstFactory.namedExpression(AstFactory.label(identifier), AstFactory.identifier3("_"));
@@ -977,6 +986,15 @@
     }
   }
 
+  void test_inSetterContext_forEachLoop() {
+    SimpleIdentifier identifier = AstFactory.identifier3("a");
+    Expression iterator = AstFactory.listLiteral([]);
+    Statement body = AstFactory.block([]);
+    ForEachStatement forEachStatement =
+        AstFactory.forEachStatement2(identifier, iterator, body);
+    expect(identifier.inSetterContext(), isTrue);
+  }
+
   void test_isQualified_inMethodInvocation_noTarget() {
     MethodInvocation invocation = AstFactory.methodInvocation2("test", [AstFactory.identifier3("arg0")]);
     SimpleIdentifier identifier = invocation.methodName;
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index c72aea8..a3193bc 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -2721,6 +2721,43 @@
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
 
+  void test_isInConstInstanceCreation_restored() {
+    // If ErrorVerifier._isInConstInstanceCreation is not properly restored on
+    // exit from visitInstanceCreationExpression, the error at (1) will be
+    // treated as a warning rather than an error.
+    Source source = addSource(r'''
+class Foo<T extends num> {
+  const Foo(x, y);
+}
+const x = const Foo<int>(const Foo<int>(0, 1),
+    const <Foo<String>>[]); // (1)
+''');
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
+    verify([source]);
+  }
+
+  void test_isInInstanceVariableInitializer_restored() {
+    // If ErrorVerifier._isInInstanceVariableInitializer is not properly
+    // restored on exit from visitVariableDeclaration, the error at (1)
+    // won't be detected.
+    Source source = addSource(r'''
+class Foo {
+  var bar;
+  Map foo = {
+    'bar': () {
+        var _bar;
+    },
+    'bop': _foo // (1)
+  };
+  _foo() {
+  }
+}''');
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
+    verify([source]);
+  }
+
   void test_labelInOuterScope() {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index fdbf762..7fa5e6e 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -1999,45 +1999,7 @@
 
 
 class DartEntryTest extends EngineTestCase {
-  void set state2(DataDescriptor descriptor) {
-    DartEntry entry = new DartEntry();
-    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
-    entry.setState(descriptor, CacheState.FLUSHED);
-    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
-  }
-
-  void set state3(DataDescriptor descriptor) {
-    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
-    expect(entry.getStateInLibrary(descriptor, source), isNot(same(CacheState.FLUSHED)));
-    entry.setStateInLibrary(descriptor, source, CacheState.FLUSHED);
-    expect(entry.getStateInLibrary(descriptor, source), same(CacheState.FLUSHED));
-  }
-
-  void test_creation() {
-    Source librarySource = new TestSource();
-    DartEntry entry = new DartEntry();
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
-  }
-
-  void test_getAllErrors() {
+  void test_allErrors() {
     Source source = new TestSource();
     DartEntry entry = new DartEntry();
     expect(entry.allErrors, hasLength(0));
@@ -2069,12 +2031,44 @@
                 StaticWarningCode.CASE_BLOCK_NOT_TERMINATED,
                 [])]);
     entry.setValueInLibrary(
+        DartEntry.ANGULAR_ERRORS,
+        source,
+        <AnalysisError>[new AnalysisError.con1(source, AngularCode.MISSING_NAME, [])]);
+    entry.setValueInLibrary(
         DartEntry.HINTS,
         source,
         <AnalysisError>[new AnalysisError.con1(source, HintCode.DEAD_CODE, [])]);
     expect(entry.allErrors, hasLength(5));
   }
 
+  void test_creation() {
+    Source librarySource = new TestSource();
+    DartEntry entry = new DartEntry();
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
+  }
+
   void test_getResolvableCompilationUnit_none() {
     DartEntry entry = new DartEntry();
     expect(entry.resolvableCompilationUnit, isNull);
@@ -2305,50 +2299,90 @@
   }
 
   void test_invalidateAllInformation() {
-    DartEntry entry = _entryWithValidState();
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
     entry.invalidateAllInformation();
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
   }
 
   void test_invalidateAllResolutionInformation() {
-    DartEntry entry = _entryWithValidState();
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
     entry.invalidateAllResolutionInformation(false);
-    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
     expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
-    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
-  }
-
-  void test_invalidateAllResolutionInformation_includingUris() {
-    DartEntry entry = _entryWithValidState();
-    entry.invalidateAllResolutionInformation(true);
-    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
+  }
+
+  void test_invalidateAllResolutionInformation_includingUris() {
+    Source librarySource = new TestSource();
+    DartEntry entry = _entryWithValidState(librarySource);
+    entry.invalidateAllResolutionInformation(true);
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
   }
 
   void test_isClient() {
@@ -2382,243 +2416,335 @@
   }
 
   void test_recordBuildElementError() {
-    // TODO(brianwilkerson) This test should set the state for two libraries,
-    // record an error in one library, then verify that the data for the other
-    // library is still valid.
-    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
     entry.recordBuildElementErrorInLibrary(
-        source,
+        firstLibrary,
         new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, source), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.VALID));
   }
 
   void test_recordContentError() {
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
     entry.recordContentError(
         new CaughtException(new AnalysisException(), null));
     expect(entry.getState(SourceEntry.CONTENT), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
   }
 
   void test_recordHintErrorInLibrary() {
-    // TODO(brianwilkerson) This test should set the state for two libraries,
-    // record an error in one library, then verify that the data for the other
-    // library is still valid.
-    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
     entry.recordHintErrorInLibrary(
-        source,
+        firstLibrary,
         new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.VALID));
   }
 
   void test_recordParseError() {
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
     entry.recordParseError(new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
   }
 
   void test_recordResolutionError() {
-    //    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
     entry.recordResolutionError(
         new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-//    assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
   }
 
   void test_recordResolutionErrorInLibrary() {
-    // TODO(brianwilkerson) This test should set the state for two libraries,
-    // record an error in one library, then verify that the data for the other
-    // library is still valid.
-    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
     entry.recordResolutionErrorInLibrary(
-        source,
+        firstLibrary,
         new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.VALID));
   }
 
   void test_recordScanError() {
-//    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+//    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary);
     entry.recordScanError(new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
     expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, source));
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-//    JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+//    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.ERROR));
+//    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.ERROR));
   }
 
   void test_recordVerificationErrorInLibrary() {
-    // TODO(brianwilkerson) This test should set the state for two libraries,
-    // record an error in one library, then verify that the data for the other
-    // library is still valid.
-    Source source = new TestSource();
-    DartEntry entry = new DartEntry();
+    Source firstLibrary = new TestSource('first.dart');
+    Source secondLibrary = new TestSource('second.dart');
+    DartEntry entry = _entryWithValidState(firstLibrary, secondLibrary);
     entry.recordVerificationErrorInLibrary(
-        source,
+        firstLibrary,
         new CaughtException(new AnalysisException(), null));
-    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
-    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
-    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.INVALID));
-    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.ERROR));
+
+    expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.VALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.VALID));
   }
 
   void test_removeResolution_multiple_first() {
-    Source source1 = new TestSource();
-    Source source2 = new TestSource();
-    Source source3 = new TestSource();
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
     DartEntry entry = new DartEntry();
     entry.setValueInLibrary(
         DartEntry.RESOLVED_UNIT,
@@ -2636,9 +2762,9 @@
   }
 
   void test_removeResolution_multiple_last() {
-    Source source1 = new TestSource();
-    Source source2 = new TestSource();
-    Source source3 = new TestSource();
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
     DartEntry entry = new DartEntry();
     entry.setValueInLibrary(
         DartEntry.RESOLVED_UNIT,
@@ -2656,9 +2782,9 @@
   }
 
   void test_removeResolution_multiple_middle() {
-    Source source1 = new TestSource();
-    Source source2 = new TestSource();
-    Source source3 = new TestSource();
+    Source source1 = new TestSource('first.dart');
+    Source source2 = new TestSource('second.dart');
+    Source source3 = new TestSource('third.dart');
     DartEntry entry = new DartEntry();
     entry.setValueInLibrary(
         DartEntry.RESOLVED_UNIT,
@@ -2685,24 +2811,67 @@
     entry.removeResolution(source1);
   }
 
+  void test_resolvableCompilationUnit_builtUnit() {
+    Source librarySource = new TestSource('/lib.dart');
+    CompilationUnit unit = AstFactory.compilationUnit();
+    CompilationUnitElement element = ElementFactory.compilationUnit('test.dart');
+    unit.element = element;
+    DartEntry entry = new DartEntry();
+    entry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+    entry.setValueInLibrary(DartEntry.BUILT_UNIT, librarySource, unit);
+    entry.invalidateAllResolutionInformation(false);
+    CompilationUnit resolvableUnit = entry.resolvableCompilationUnit;
+    expect(resolvableUnit, isNotNull);
+    expect(resolvableUnit.element, isNull);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_none() {
+    DartEntry entry = new DartEntry();
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_parsed() {
+    CompilationUnit unit = AstFactory.compilationUnit();
+    DartEntry entry = new DartEntry();
+    entry.setValue(DartEntry.PARSED_UNIT, unit);
+    expect(entry.resolvableCompilationUnit, unit);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
+  void test_resolvableCompilationUnit_resolved() {
+    Source librarySource = new TestSource('/lib.dart');
+    CompilationUnit unit = AstFactory.compilationUnit();
+    CompilationUnitElement element = ElementFactory.compilationUnit('test.dart');
+    unit.element = element;
+    DartEntry entry = new DartEntry();
+    entry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
+    entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
+    entry.invalidateAllResolutionInformation(false);
+    CompilationUnit resolvableUnit = entry.resolvableCompilationUnit;
+    expect(resolvableUnit, isNotNull);
+    expect(resolvableUnit.element, isNull);
+    expect(entry.resolvableCompilationUnit, isNull);
+  }
+
   void test_setState_element() {
-    state2 = DartEntry.ELEMENT;
+    _setState(DartEntry.ELEMENT);
   }
 
   void test_setState_exportedLibraries() {
-    state2 = DartEntry.EXPORTED_LIBRARIES;
+    _setState(DartEntry.EXPORTED_LIBRARIES);
   }
 
   void test_setState_hints() {
-    state3 = DartEntry.HINTS;
+    _setStateInLibrary(DartEntry.HINTS);
   }
 
   void test_setState_importedLibraries() {
-    state2 = DartEntry.IMPORTED_LIBRARIES;
+    _setState(DartEntry.IMPORTED_LIBRARIES);
   }
 
   void test_setState_includedParts() {
-    state2 = DartEntry.INCLUDED_PARTS;
+    _setState(DartEntry.INCLUDED_PARTS);
   }
 
   void test_setState_invalid_element() {
@@ -2745,108 +2914,108 @@
    }
 
   void test_setState_isClient() {
-    state2 = DartEntry.IS_CLIENT;
+    _setState(DartEntry.IS_CLIENT);
   }
 
   void test_setState_isLaunchable() {
-    state2 = DartEntry.IS_LAUNCHABLE;
+    _setState(DartEntry.IS_LAUNCHABLE);
   }
 
   void test_setState_lineInfo() {
-    state2 = SourceEntry.LINE_INFO;
+    _setState(SourceEntry.LINE_INFO);
   }
 
   void test_setState_parseErrors() {
-    state2 = DartEntry.PARSE_ERRORS;
+    _setState(DartEntry.PARSE_ERRORS);
   }
 
   void test_setState_parsedUnit() {
-    state2 = DartEntry.PARSED_UNIT;
+    _setState(DartEntry.PARSED_UNIT);
   }
 
   void test_setState_publicNamespace() {
-    state2 = DartEntry.PUBLIC_NAMESPACE;
+    _setState(DartEntry.PUBLIC_NAMESPACE);
   }
 
   void test_setState_resolutionErrors() {
-    state3 = DartEntry.RESOLUTION_ERRORS;
+    _setStateInLibrary(DartEntry.RESOLUTION_ERRORS);
   }
 
   void test_setState_resolvedUnit() {
-    state3 = DartEntry.RESOLVED_UNIT;
+    _setStateInLibrary(DartEntry.RESOLVED_UNIT);
   }
 
   void test_setState_scanErrors() {
-    state2 = DartEntry.SCAN_ERRORS;
+    _setState(DartEntry.SCAN_ERRORS);
   }
 
   void test_setState_sourceKind() {
-    state2 = DartEntry.SOURCE_KIND;
+    _setState(DartEntry.SOURCE_KIND);
   }
 
   void test_setState_tokenStream() {
-    state2 = DartEntry.TOKEN_STREAM;
+    _setState(DartEntry.TOKEN_STREAM);
   }
 
   void test_setState_verificationErrors() {
-    state3 = DartEntry.VERIFICATION_ERRORS;
+    _setStateInLibrary(DartEntry.VERIFICATION_ERRORS);
   }
 
   void test_setValue_element() {
-    _setValue2(
+    _setValue(
         DartEntry.ELEMENT,
         new LibraryElementImpl.forNode(null, AstFactory.libraryIdentifier2(["lib"])));
   }
 
   void test_setValue_exportedLibraries() {
-    _setValue2(DartEntry.EXPORTED_LIBRARIES, <Source>[new TestSource()]);
+    _setValue(DartEntry.EXPORTED_LIBRARIES, <Source>[new TestSource()]);
   }
 
   void test_setValue_hints() {
-    _setValue3(
+    _setValueInLibrary(
         DartEntry.HINTS,
         <AnalysisError>[new AnalysisError.con1(null, HintCode.DEAD_CODE, [])]);
   }
 
   void test_setValue_importedLibraries() {
-    _setValue2(DartEntry.IMPORTED_LIBRARIES, <Source>[new TestSource()]);
+    _setValue(DartEntry.IMPORTED_LIBRARIES, <Source>[new TestSource()]);
   }
 
   void test_setValue_includedParts() {
-    _setValue2(DartEntry.INCLUDED_PARTS, <Source>[new TestSource()]);
+    _setValue(DartEntry.INCLUDED_PARTS, <Source>[new TestSource()]);
   }
 
   void test_setValue_isClient() {
-    _setValue2(DartEntry.IS_CLIENT, true);
+    _setValue(DartEntry.IS_CLIENT, true);
   }
 
   void test_setValue_isLaunchable() {
-    _setValue2(DartEntry.IS_LAUNCHABLE, true);
+    _setValue(DartEntry.IS_LAUNCHABLE, true);
   }
 
   void test_setValue_lineInfo() {
-    _setValue2(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
+    _setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0]));
   }
 
   void test_setValue_parseErrors() {
-    _setValue2(
+    _setValue(
         DartEntry.PARSE_ERRORS,
         <AnalysisError>[
             new AnalysisError.con1(null, ParserErrorCode.ABSTRACT_CLASS_MEMBER, [])]);
   }
 
   void test_setValue_parsedUnit() {
-    _setValue2(DartEntry.PARSED_UNIT, AstFactory.compilationUnit());
+    _setValue(DartEntry.PARSED_UNIT, AstFactory.compilationUnit());
   }
 
   void test_setValue_publicNamespace() {
-    _setValue2(
+    _setValue(
         DartEntry.PUBLIC_NAMESPACE,
         new Namespace(new HashMap<String, Element>()));
   }
 
   void test_setValue_resolutionErrors() {
-    _setValue3(
+    _setValueInLibrary(
         DartEntry.RESOLUTION_ERRORS,
         <AnalysisError>[
             new AnalysisError.con1(
@@ -2856,11 +3025,11 @@
   }
 
   void test_setValue_resolvedUnit() {
-    _setValue3(DartEntry.RESOLVED_UNIT, AstFactory.compilationUnit());
+    _setValueInLibrary(DartEntry.RESOLVED_UNIT, AstFactory.compilationUnit());
   }
 
   void test_setValue_scanErrors() {
-    _setValue2(
+    _setValue(
         DartEntry.SCAN_ERRORS,
         <AnalysisError>[
             new AnalysisError.con1(
@@ -2870,46 +3039,110 @@
   }
 
   void test_setValue_sourceKind() {
-    _setValue2(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+    _setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
   }
 
   void test_setValue_tokenStream() {
-    _setValue2(DartEntry.TOKEN_STREAM, new Token(TokenType.LT, 5));
+    _setValue(DartEntry.TOKEN_STREAM, new Token(TokenType.LT, 5));
   }
 
   void test_setValue_verificationErrors() {
-    _setValue3(
+    _setValueInLibrary(
         DartEntry.VERIFICATION_ERRORS,
         <AnalysisError>[
             new AnalysisError.con1(null, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, [])]);
   }
 
-  DartEntry _entryWithValidState() {
+  DartEntry _entryWithValidState([Source firstLibrary, Source secondLibrary]) {
     DartEntry entry = new DartEntry();
+    entry.setValue(SourceEntry.CONTENT, null);
+    entry.setValue(SourceEntry.LINE_INFO, null);
+    entry.setValue(DartEntry.CONTAINING_LIBRARIES, null);
     entry.setValue(DartEntry.ELEMENT, null);
     entry.setValue(DartEntry.EXPORTED_LIBRARIES, null);
     entry.setValue(DartEntry.IMPORTED_LIBRARIES, null);
     entry.setValue(DartEntry.INCLUDED_PARTS, null);
-    entry.setValue(DartEntry.IS_CLIENT, true);
-    entry.setValue(DartEntry.IS_LAUNCHABLE, true);
-    entry.setValue(SourceEntry.LINE_INFO, null);
+    entry.setValue(DartEntry.IS_CLIENT, null);
+    entry.setValue(DartEntry.IS_LAUNCHABLE, null);
     entry.setValue(DartEntry.PARSE_ERRORS, null);
     entry.setValue(DartEntry.PARSED_UNIT, null);
     entry.setValue(DartEntry.PUBLIC_NAMESPACE, null);
+    entry.setValue(DartEntry.SCAN_ERRORS, null);
+    entry.setValue(DartEntry.SOURCE_KIND, null);
+    entry.setValue(DartEntry.TOKEN_STREAM, null);
+    if (firstLibrary != null) {
+      entry.setValueInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_UNIT, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.HINTS, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary, null);
+      entry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary, null);
+    }
+    if (secondLibrary != null) {
+      entry.setValueInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.BUILT_UNIT, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.HINTS, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary, null);
+      entry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary, null);
+    }
+    //
+    // Validate that the state was set correctly.
+    //
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.CONTAINING_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
     expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
-    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
     expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.VALID));
+    if (firstLibrary != null) {
+      expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.HINTS, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, firstLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, firstLibrary), same(CacheState.VALID));
+    }
+    if (secondLibrary != null) {
+      expect(entry.getStateInLibrary(DartEntry.ANGULAR_ERRORS, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.HINTS, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, secondLibrary), same(CacheState.VALID));
+      expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, secondLibrary), same(CacheState.VALID));
+    }
     return entry;
   }
 
-  void _setValue2(DataDescriptor descriptor, Object newValue) {
+  void _setState(DataDescriptor descriptor) {
+    DartEntry entry = new DartEntry();
+    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
+    entry.setState(descriptor, CacheState.FLUSHED);
+    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
+  }
+
+  void _setStateInLibrary(DataDescriptor descriptor) {
+    Source source = new TestSource();
+    DartEntry entry = new DartEntry();
+    expect(entry.getStateInLibrary(descriptor, source), isNot(same(CacheState.FLUSHED)));
+    entry.setStateInLibrary(descriptor, source, CacheState.FLUSHED);
+    expect(entry.getStateInLibrary(descriptor, source), same(CacheState.FLUSHED));
+  }
+
+  void _setValue(DataDescriptor descriptor, Object newValue) {
     DartEntry entry = new DartEntry();
     Object value = entry.getValue(descriptor);
     expect(newValue, isNot(same(value)));
@@ -2918,7 +3151,7 @@
     expect(entry.getValue(descriptor), same(newValue));
   }
 
-  void _setValue3(DataDescriptor descriptor, Object newValue) {
+  void _setValueInLibrary(DataDescriptor descriptor, Object newValue) {
     Source source = new TestSource();
     DartEntry entry = new DartEntry();
     Object value = entry.getValueInLibrary(descriptor, source);
@@ -5600,6 +5833,12 @@
   void setContents(Source source, String contents) {
     fail("Unexpected invocation of setContents");
   }
+  @override
+  void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
+                                     DataDescriptor rowDesc,
+                                     CacheState state)) {
+    fail("Unexpected invocation of visitCacheItems");
+  }
 }
 
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 501b539..fc1eeb8 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -5898,7 +5898,7 @@
     expect(statement.loopVariable, isNull);
     expect(statement.identifier, isNotNull);
     expect(statement.inKeyword, isNotNull);
-    expect(statement.iterator, isNotNull);
+    expect(statement.iterable, isNotNull);
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.body, isNotNull);
   }
@@ -5911,7 +5911,7 @@
     expect(statement.loopVariable, isNull);
     expect(statement.identifier, isNotNull);
     expect(statement.inKeyword, isNotNull);
-    expect(statement.iterator, isNotNull);
+    expect(statement.iterable, isNotNull);
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.body, isNotNull);
   }
@@ -5925,7 +5925,7 @@
     expect(statement.loopVariable.metadata, hasLength(1));
     expect(statement.identifier, isNull);
     expect(statement.inKeyword, isNotNull);
-    expect(statement.iterator, isNotNull);
+    expect(statement.iterable, isNotNull);
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.body, isNotNull);
   }
@@ -5938,7 +5938,7 @@
     expect(statement.loopVariable, isNotNull);
     expect(statement.identifier, isNull);
     expect(statement.inKeyword, isNotNull);
-    expect(statement.iterator, isNotNull);
+    expect(statement.iterable, isNotNull);
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.body, isNotNull);
   }
@@ -5951,7 +5951,7 @@
     expect(statement.loopVariable, isNotNull);
     expect(statement.identifier, isNull);
     expect(statement.inKeyword, isNotNull);
-    expect(statement.iterator, isNotNull);
+    expect(statement.iterable, isNotNull);
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.body, isNotNull);
   }
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index f8089e9..e05c4d0 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -14,7 +14,9 @@
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/static_type_analyzer.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -25,6 +27,7 @@
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/java_io.dart';
 import '../reflective_tests.dart';
+import 'parser_test.dart';
 
 
 /**
@@ -977,7 +980,7 @@
 const int ZERO = 0;
 class C {
   int m(int p) {
-    return (p * p) + (p * p) + ZERO;
+    return p + p;
   }
 }''');
   }
@@ -1063,9 +1066,7 @@
     Source source = addSource(oldContent);
     LibraryElement library = resolve(source);
     CompilationUnit oldUnit = resolveCompilationUnit(source, library);
-    AnalysisContext context = analysisContext;
-    context.setContents(source, newContent);
-    CompilationUnit newUnit = context.parseCompilationUnit(source);
+    CompilationUnit newUnit = ParserTestCase.parseCompilationUnit(newContent, []);
     DeclarationMatcher matcher = new DeclarationMatcher();
     expect(matcher.matches(newUnit, oldUnit.element), expectMatch);
   }
@@ -8415,6 +8416,16 @@
     _listener.assertNoErrors();
   }
 
+  void test_visitSimpleIdentifier_dynamic() {
+    // "dynamic"
+    SimpleIdentifier identifier = AstFactory.identifier3('dynamic');
+    DynamicElementImpl element = DynamicElementImpl.instance;
+    identifier.staticElement = element;
+    identifier.staticType = _typeProvider.typeType;
+    expect(_analyze(identifier), same(_typeProvider.typeType));
+    _listener.assertNoErrors();
+  }
+
   void test_visitSimpleStringLiteral() {
     // "a"
     Expression node = _resolvedString("a");
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 67ec5de..02c588b 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -220,6 +220,17 @@
     verify([source]);
   }
 
+  void test_invalidAssignment_dynamic() {
+    Source source = addSource(r'''
+main() {
+  dynamic = 1;
+}
+''');
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+    verify([source]);
+  }
+
   void test_invalidAssignment_instanceVariable() {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index f8b0893..2c779c5 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:unittest/unittest.dart';
 import 'resolver_test.dart';
-import 'test_support.dart';
 import '../reflective_tests.dart';
 
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 60c3ce6..20f04a8 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -557,22 +557,22 @@
   int infoCount = 0;
 
   @override
-  void logError(String message) {
+  void logError(String message, [CaughtException exception]) {
     errorCount++;
   }
 
   @override
-  void logError2(String message, Exception exception) {
+  void logError2(String message, Object exception) {
     errorCount++;
   }
 
   @override
-  void logInformation(String message) {
+  void logInformation(String message, [CaughtException exception]) {
     infoCount++;
   }
 
   @override
-  void logInformation2(String message, Exception exception) {
+  void logInformation2(String message, Object exception) {
     infoCount++;
   }
 }
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 5aea6b7..27ebefd 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -10,7 +10,6 @@
 import 'dart:collection';
 
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -2795,13 +2794,13 @@
 class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3 implements
     NodeReplacerTest_Getter {
   @override
-  Expression get(ForEachStatement node) => node.iterator;
+  Expression get(ForEachStatement node) => node.iterable;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable implements
     NodeReplacerTest_Getter {
   @override
-  Expression get(ForEachStatement node) => node.iterator;
+  Expression get(ForEachStatement node) => node.iterable;
 }
 
 class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2
@@ -5238,55 +5237,6 @@
   }
 }
 
-/**
- * Instances of the class `TestLogger` implement a logger that can be used by tests.
- */
-class TestLogger implements Logger {
-  /**
-   * The number of error messages that were logged.
-   */
-  int _errorCount = 0;
-
-  /**
-   * The number of informational messages that were logged.
-   */
-  int _infoCount = 0;
-
-  /**
-   * Return the number of error messages that were logged.
-   *
-   * @return the number of error messages that were logged
-   */
-  int get errorCount => _errorCount;
-
-  /**
-   * Return the number of informational messages that were logged.
-   *
-   * @return the number of informational messages that were logged
-   */
-  int get infoCount => _infoCount;
-
-  @override
-  void logError(String message) {
-    _errorCount++;
-  }
-
-  @override
-  void logError2(String message, Exception exception) {
-    _errorCount++;
-  }
-
-  @override
-  void logInformation(String message) {
-    _infoCount++;
-  }
-
-  @override
-  void logInformation2(String message, Exception exception) {
-    _infoCount++;
-  }
-}
-
 
 class TokenMapTest {
   void test_creation() {
diff --git a/pkg/analyzer/test/task/task_dart_test.dart b/pkg/analyzer/test/task/task_dart_test.dart
index 9a44b7d..1d0da10 100644
--- a/pkg/analyzer/test/task/task_dart_test.dart
+++ b/pkg/analyzer/test/task/task_dart_test.dart
@@ -15,7 +15,6 @@
 import '../generated/engine_test.dart';
 import '../generated/resolver_test.dart';
 import '../generated/test_support.dart';
-import '../reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index a8c7698..ffeea64 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -31,6 +31,8 @@
 
   Source get currentSource => element.source;
 
+  analyzer.LibraryElement get currentLibrary => element.library;
+
   ir.Node visit(AstNode node) => node.accept(this);
 
   @override
@@ -304,6 +306,25 @@
   }
 
   @override
+  ir.Node visitListLiteral(ListLiteral node) {
+    dart2js.InterfaceType type = converter.convertType(node.staticType);
+    // TODO(johnniwinther): Use `build` instead of `(e) => build(e)` when issue
+    // 18630 has been resolved.
+    Iterable<ir.Primitive> values = node.elements.map((e) => build(e));
+    return irBuilder.buildListLiteral(type, values);
+  }
+
+  @override
+  ir.Node visitMapLiteral(MapLiteral node) {
+    dart2js.InterfaceType type = converter.convertType(node.staticType);
+    return irBuilder.buildMapLiteral(
+        type,
+        node.entries.map((e) => e.key),
+        node.entries.map((e) => e.value),
+        build);
+  }
+
+  @override
   visitForStatement(ForStatement node) {
     // TODO(johnniwinther): Support `for` as a jump target.
     SubbuildFunction buildInitializer;
@@ -317,4 +338,68 @@
                        buildBody: subbuild(node.body),
                        buildUpdate: subbuildSequence(node.updaters));
   }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    // TODO(johnniwinther): Support `while` as a jump target.
+    irBuilder.buildWhile(buildCondition: subbuild(node.condition),
+                         buildBody: subbuild(node.body));
+  }
+
+  @override
+  visitDeclaredIdentifier(DeclaredIdentifier node) {
+    giveUp(node, "Unexpected node: DeclaredIdentifier");
+  }
+
+  @override
+  visitForEachStatement(ForEachStatement node) {
+    SubbuildFunction buildVariableDeclaration;
+    dart2js.Element variableElement;
+    Selector variableSelector;
+    if (node.identifier != null) {
+       AccessSemantics accessSemantics =
+           node.identifier.accept(ACCESS_SEMANTICS_VISITOR);
+       if (accessSemantics.kind == AccessKind.DYNAMIC) {
+         variableSelector = new Selector.setter(
+             node.identifier.name, converter.convertElement(currentLibrary));
+       } else if (accessSemantics.element != null) {
+         variableElement = converter.convertElement(accessSemantics.element);
+         variableSelector = new Selector.setter(
+             variableElement.name,
+             converter.convertElement(accessSemantics.element.library));
+       } else {
+         giveUp(node, 'For-in of unresolved variable: $accessSemantics');
+       }
+    } else {
+      assert(invariant(
+          node, node.loopVariable != null, "Loop variable expected"));
+      variableElement = converter.convertElement(node.loopVariable.element);
+      buildVariableDeclaration = (IrBuilder builder) {
+        builder.declareLocalVariable(variableElement);
+      };
+    }
+    // TODO(johnniwinther): Support `for-in` as a jump target.
+    irBuilder.buildForIn(
+        buildExpression: subbuild(node.iterable),
+        buildVariableDeclaration: buildVariableDeclaration,
+        variableElement: variableElement,
+        variableSelector: variableSelector,
+        buildBody: subbuild(node.body));
+  }
+  @override
+  ir.Primitive visitIsExpression(IsExpression node) {
+    return irBuilder.buildTypeOperator(
+        visit(node.expression),
+        converter.convertType(node.type.type),
+        isTypeTest: true,
+        isNotCheck: node.notOperator != null);
+  }
+
+  @override
+  ir.Primitive visitAsExpression(AsExpression node) {
+    return irBuilder.buildTypeOperator(
+        visit(node.expression),
+        converter.convertType(node.type.type),
+        isTypeTest: false);
+  }
 }
diff --git a/pkg/analyzer2dart/lib/src/modely.dart b/pkg/analyzer2dart/lib/src/modely.dart
index 390ea7c..4f89848 100644
--- a/pkg/analyzer2dart/lib/src/modely.dart
+++ b/pkg/analyzer2dart/lib/src/modely.dart
@@ -361,6 +361,9 @@
 
   @override
   bool get hasFunctionSignature => unsupported('hasFunctionSignature');
+
+  @override
+  get asyncMarker => unsupported('asyncMarker');
 }
 
 class TopLevelFunctionElementY extends ElementY
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
index 47a653f..bc69438 100644
--- a/pkg/analyzer2dart/lib/src/tree_shaker.dart
+++ b/pkg/analyzer2dart/lib/src/tree_shaker.dart
@@ -44,6 +44,9 @@
   /**
    * The classes that are instantiated by the method.
    */
+  // TODO(johnniwinther,paulberry): Register instantiated types.
+  // TODO(johnniwinther,paulberry): Register checked types from is/as checks,
+  // catch clauses and (checked) type annotations.
   final List<ClassElement> instantiates = <ClassElement>[];
 
   MethodAnalysis(this.declaration);
diff --git a/pkg/analyzer2dart/test/end2end_data.dart b/pkg/analyzer2dart/test/end2end_data.dart
index 455f790..6237402 100644
--- a/pkg/analyzer2dart/test/end2end_data.dart
+++ b/pkg/analyzer2dart/test/end2end_data.dart
@@ -501,6 +501,38 @@
 '''),
   ]),
 
+  const Group('List literal', const <TestSpec>[
+    const TestSpec('''
+main() {
+  return [];
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return <int>[];
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return <int>[0];
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return <int>[0, 1, a];
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return [0, [1], [a, <int>[3]]];
+}
+'''),
+  ]),
+
   const Group('Constructor invocation', const <TestSpec>[
     const TestSpec('''
 main(a) {
@@ -515,6 +547,37 @@
 '''),
   ]),
 
+  const Group('Map literal', const <TestSpec>[
+    const TestSpec('''
+main() {
+  return {};
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return <int, String>{};
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return <String, int>{"a": 0};
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return <String, int>{"a": 0, "b": 1, "c": a};
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return {0: "a", 1: {2: "b"}, a: {3: "c"}};
+}
+'''),
+  ]),
   const Group('For loop', const <TestSpec>[
     const TestSpec('''
 main() {
@@ -528,7 +591,7 @@
 
 const TestSpec('''
 main() {
-  for (int i = 0; i < 10; i = i + 1) {
+  for (var i = 0; i < 10; i = i + 1) {
     print(i);
   }
 }
@@ -558,4 +621,119 @@
 }
 '''),
   ]),
+
+  const Group('While loop', const <TestSpec>[
+    const TestSpec('''
+main() {
+  while (true) {}
+}
+'''),
+
+const TestSpec('''
+main() {
+  var i = 0;
+  while (i < 10) {
+    print(i);
+    i = i + 1;
+  }
+}''', '''
+main() {
+  var i = 0;
+  while (i < 10) {
+    print(i);
+    ++i;
+  }
+}'''),
+  ]),
+
+  const Group('Type operators', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a is String;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a is List<String>;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a is Comparator<String>;
+}
+'''),
+
+  const TestSpec('''
+main(a) {
+  return a is! String;
+}
+''', '''
+main(a) {
+  return !(a is String);
+}
+'''),
+
+const TestSpec('''
+main(a) {
+  return a as String;
+}
+'''),
+  ]),
+
+  const Group('For in loop', const <TestSpec>[
+// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
+// fields.
+    const TestSpec('''
+main(a) {
+  for (var i in a) {
+    print(i);
+  }
+}
+''', '''
+main(a) {
+  var v0 = a.iterator;
+  while (v0.moveNext()) {
+    print(v0.current);
+  }
+}'''),
+
+    const TestSpec('''
+main(a) {
+  for (var i in a) {
+    print(i);
+    i = 0;
+    print(i);
+  }
+}
+''', '''
+main(a) {
+  var v0 = a.iterator, i;
+  while (v0.moveNext()) {
+    i = v0.current;
+    print(i);
+    i = 0;
+    print(i);
+  }
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  var i;
+  for (i in a) {
+    print(i);
+  }
+}
+''', '''
+main(a) {
+  var i, v0 = a.iterator;
+  while (v0.moveNext()) {
+    i = v0.current;
+    print(i);
+  }
+}
+'''),
+  ]),
 ];
diff --git a/pkg/analyzer2dart/test/end2end_test.dart b/pkg/analyzer2dart/test/end2end_test.dart
index 3cfde57..6cc500c0 100644
--- a/pkg/analyzer2dart/test/end2end_test.dart
+++ b/pkg/analyzer2dart/test/end2end_test.dart
@@ -27,7 +27,7 @@
 
 checkResult(TestSpec result) {
   String input = result.input;
-  String expectedOutput = result.output;
+  String expectedOutput = result.output.trim();
 
   CollectingOutputProvider outputProvider = new CollectingOutputProvider();
   MemoryResourceProvider provider = new MemoryResourceProvider();
@@ -40,6 +40,6 @@
   ClosedWorld world = driver.computeWorld(entryPoint);
   ConvertedWorld convertedWorld = convertWorld(world);
   compileToDart(driver, convertedWorld);
-  String output = outputProvider.output.text;
+  String output = outputProvider.output.text.trim();
   expect(output, equals(expectedOutput));
 }
diff --git a/pkg/analyzer2dart/test/identifier_semantics_test.dart b/pkg/analyzer2dart/test/identifier_semantics_test.dart
index 3ccc46f..b9a3044 100644
--- a/pkg/analyzer2dart/test/identifier_semantics_test.dart
+++ b/pkg/analyzer2dart/test/identifier_semantics_test.dart
@@ -1103,6 +1103,17 @@
     helper.checkStaticField('x', null, 'x', isWrite: true);
   });
 
+  test('Set variable defined at top level in foreach loop', () {
+    Helper helper = new Helper('''
+var x;
+
+f() {
+  for (x in []) {}
+}
+''');
+    helper.checkStaticField('x', null, 'x', isWrite: true);
+  });
+
   test('Set variable defined at top level via prefix', () {
     Helper helper = new Helper('''
 import 'lib.dart' as l;
@@ -1132,6 +1143,20 @@
     helper.checkStaticField('x', 'A', 'x', isWrite: true);
   });
 
+  test('Set field defined statically in class from inside class in foreach' +
+      ' loop', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+
+  f() {
+    for (x in []) {}
+  }
+}
+''');
+    helper.checkStaticField('x', 'A', 'x', isWrite: true);
+  });
+
   test('Set field defined statically in class from outside class', () {
     Helper helper = new Helper('''
 class A {
@@ -1178,6 +1203,20 @@
     helper.checkDynamic('x', null, 'x', isWrite: true);
   });
 
+  test('Set field defined dynamically in class from inside class in foreach' +
+      ' loop', () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+
+  f() {
+    for (x in []) {}
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
   test(
       'Set field defined dynamically in class from outside class via typed var',
       () {
@@ -1220,6 +1259,16 @@
     helper.checkLocalVariable('x', 'x', isWrite: true);
   });
 
+  test('Set variable defined locally in foreach loop', () {
+    Helper helper = new Helper('''
+f() {
+  var x;
+  for (x in []) {}
+}
+''');
+    helper.checkLocalVariable('x', 'x', isWrite: true);
+  });
+
   test('Set variable defined in parameter', () {
     Helper helper = new Helper('''
 f(x) {
@@ -1229,6 +1278,15 @@
     helper.checkParameter('x', 'x', isWrite: true);
   });
 
+  test('Set variable defined in parameter in foreach loop', () {
+    Helper helper = new Helper('''
+f(x) {
+  for (x in []) {}
+}
+''');
+    helper.checkParameter('x', 'x', isWrite: true);
+  });
+
   test('Set accessor defined at top level', () {
     Helper helper = new Helper('''
 set x(value) {};
@@ -1240,6 +1298,17 @@
     helper.checkStaticProperty('x', null, 'x', true, isWrite: true);
   });
 
+  test('Set accessor defined at top level in foreach loop', () {
+    Helper helper = new Helper('''
+set x(value) {};
+
+f() {
+  for (x in []) {}
+}
+''');
+    helper.checkStaticProperty('x', null, 'x', true, isWrite: true);
+  });
+
   test('Set accessor defined at top level via prefix', () {
     Helper helper = new Helper('''
 import 'lib.dart' as l;
@@ -1269,6 +1338,20 @@
     helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
   });
 
+  test('Set accessor defined statically in class from inside class in' +
+      ' foreach loop', () {
+    Helper helper = new Helper('''
+class A {
+  static set x(value) {}
+
+  f() {
+    for (x in []) {}
+  }
+}
+''');
+    helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
+  });
+
   test('Set accessor defined statically in class from outside class', () {
     Helper helper = new Helper('''
 class A {
@@ -1315,6 +1398,20 @@
     helper.checkDynamic('x', null, 'x', isWrite: true);
   });
 
+  test('Set accessor defined dynamically in class from inside class in' +
+      ' foreach loop', () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+
+  f() {
+    for (x in []) {}
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
   test(
       'Set accessor defined dynamically in class from outside class via typed var',
       () {
@@ -1380,6 +1477,15 @@
     helper.checkDynamic('x', null, 'x', isWrite: true);
   });
 
+  test('Set accessor undefined at top level in foreach loop', () {
+    Helper helper = new Helper('''
+f() {
+  for (x in []) {}
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
   test('Set accessor undefined at top level via prefix', () {
     Helper helper = new Helper('''
 import 'lib.dart' as l;
@@ -1434,6 +1540,18 @@
     helper.checkDynamic('x', null, 'x', isWrite: true);
   });
 
+  test('Set accessor undefined dynamically in class from inside class in' +
+      ' foreach loop', () {
+    Helper helper = new Helper('''
+class A {
+  f() {
+    for (x in []) {}
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
   test(
       'Set accessor undefined dynamically in class from outside class via typed var',
       () {
diff --git a/pkg/analyzer2dart/test/sexpr_data.dart b/pkg/analyzer2dart/test/sexpr_data.dart
index bf1f08a..049760f 100644
--- a/pkg/analyzer2dart/test/sexpr_data.dart
+++ b/pkg/analyzer2dart/test/sexpr_data.dart
@@ -816,6 +816,115 @@
 '''),
   ]),
 
+  const Group('List literal', const <TestSpec>[
+    const TestSpec('''
+main() {
+  return [];
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (LiteralList ()))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return [0];
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (LiteralList (v0)))
+  (InvokeContinuation return v1))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return [0, 1, a];
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant IntConstant(1)))
+  (LetPrim v2 (LiteralList (v0 v1 a)))
+  (InvokeContinuation return v2))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return [0, [1], [a, [3]]];
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant IntConstant(1)))
+  (LetPrim v2 (LiteralList (v1)))
+  (LetPrim v3 (Constant IntConstant(3)))
+  (LetPrim v4 (LiteralList (v3)))
+  (LetPrim v5 (LiteralList (a v4)))
+  (LetPrim v6 (LiteralList (v0 v2 v5)))
+  (InvokeContinuation return v6))
+'''),
+  ]),
+
+  const Group('Map literal', const <TestSpec>[
+    const TestSpec('''
+main() {
+  return {};
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (LiteralMap () ()))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return {"a": 0};
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("a")))
+  (LetPrim v1 (Constant IntConstant(0)))
+  (LetPrim v2 (LiteralMap (v0) (v1)))
+  (InvokeContinuation return v2))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return {"a": 0, "b": 1, "c": a};
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant StringConstant("a")))
+  (LetPrim v1 (Constant IntConstant(0)))
+  (LetPrim v2 (Constant StringConstant("b")))
+  (LetPrim v3 (Constant IntConstant(1)))
+  (LetPrim v4 (Constant StringConstant("c")))
+  (LetPrim v5 (LiteralMap (v0 v2 v4) (v1 v3 a)))
+  (InvokeContinuation return v5))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return {0: "a", 1: {2: "b"}, a: {3: "c"}};
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("a")))
+  (LetPrim v2 (Constant IntConstant(1)))
+  (LetPrim v3 (Constant IntConstant(2)))
+  (LetPrim v4 (Constant StringConstant("b")))
+  (LetPrim v5 (LiteralMap (v3) (v4)))
+  (LetPrim v6 (Constant IntConstant(3)))
+  (LetPrim v7 (Constant StringConstant("c")))
+  (LetPrim v8 (LiteralMap (v6) (v7)))
+  (LetPrim v9 (LiteralMap (v0 v2 a) (v1 v5 v8)))
+  (InvokeContinuation return v9))
+'''),
+  ]),
+
   const Group('For loop', const <TestSpec>[
     const TestSpec('''
 main() {
@@ -836,7 +945,7 @@
 
 const TestSpec('''
 main() {
-  for (int i = 0; i < 10; i = i + 1) {
+  for (var i = 0; i < 10; i = i + 1) {
     print(i);
   }
 }
@@ -888,4 +997,208 @@
   (InvokeContinuation k0 v0))
 '''),
   ]),
+
+  const Group('While loop', const <TestSpec>[
+    const TestSpec('''
+main() {
+  while (true) {}
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetCont* (k0)
+    (LetPrim v0 (Constant BoolConstant(true)))
+    (LetCont (k1)
+      (LetPrim v1 (Constant NullConstant))
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (InvokeContinuation* k0 ))
+    (Branch (IsTrue v0) k2 k1))
+  (InvokeContinuation k0 ))
+'''),
+
+const TestSpec('''
+main() {
+  var i = 0;
+  while (i < 10) {
+    print(i);
+    i = i + 1;
+  }
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont* (k0 v1)
+    (LetPrim v2 (Constant IntConstant(10)))
+    (LetCont (k1 v3)
+      (LetCont (k2)
+        (LetPrim v4 (Constant NullConstant))
+        (InvokeContinuation return v4))
+      (LetCont (k3)
+        (LetCont (k4 v5)
+          (LetPrim v6 (Constant IntConstant(1)))
+          (LetCont (k5 v7)
+            (InvokeContinuation* k0 v7))
+          (InvokeMethod v1 + v6 k5))
+        (InvokeStatic print v1 k4))
+      (Branch (IsTrue v3) k3 k2))
+    (InvokeMethod v1 < v2 k1))
+  (InvokeContinuation k0 v0))
+'''),
+  ]),
+
+  const Group('Type operators', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a is String;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (TypeOperator is a String k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a is List<String>;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (TypeOperator is a List<String> k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a is Comparator<String>;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (TypeOperator is a Comparator<String> k0))
+'''),
+
+  const TestSpec('''
+main(a) {
+  return a is! String;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetCont (k1 v1)
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (LetPrim v2 (Constant BoolConstant(false)))
+      (InvokeContinuation k1 v2))
+    (LetCont (k3)
+      (LetPrim v3 (Constant BoolConstant(true)))
+      (InvokeContinuation k1 v3))
+    (Branch (IsTrue v0) k2 k3))
+  (TypeOperator is a String k0))
+'''),
+
+const TestSpec('''
+main(a) {
+  return a as String;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (TypeOperator as a String k0))
+'''),
+  ]),
+
+  const Group('For in loop', const <TestSpec>[
+// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
+// fields.
+    const TestSpec('''
+main(a) {
+  for (var i in a) {
+    print(i);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetCont* (k1 v1)
+      (LetCont (k2 v2)
+        (LetCont (k3)
+          (LetPrim v3 (Constant NullConstant))
+          (InvokeContinuation return v3))
+        (LetCont (k4)
+          (LetPrim v4 (Constant NullConstant))
+          (LetCont (k5 v5)
+            (LetCont (k6 v6)
+              (InvokeContinuation* k1 v1))
+            (InvokeStatic print v5 k6))
+          (InvokeMethod v0 current  k5))
+        (Branch (IsTrue v2) k4 k3))
+      (InvokeMethod v0 moveNext  k2))
+    (InvokeContinuation k1 a))
+  (InvokeMethod a iterator  k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  for (var i in a) {
+    print(i);
+    i = 0;
+    print(i);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetCont* (k1 v1)
+      (LetCont (k2 v2)
+        (LetCont (k3)
+          (LetPrim v3 (Constant NullConstant))
+          (InvokeContinuation return v3))
+        (LetCont (k4)
+          (LetPrim v4 (Constant NullConstant))
+          (LetCont (k5 v5)
+            (LetCont (k6 v6)
+              (LetPrim v7 (Constant IntConstant(0)))
+              (LetCont (k7 v8)
+                (InvokeContinuation* k1 v1))
+              (InvokeStatic print v7 k7))
+            (InvokeStatic print v5 k6))
+          (InvokeMethod v0 current  k5))
+        (Branch (IsTrue v2) k4 k3))
+      (InvokeMethod v0 moveNext  k2))
+    (InvokeContinuation k1 a))
+  (InvokeMethod a iterator  k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  var i;
+  for (i in a) {
+    print(i);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant NullConstant))
+  (LetCont (k0 v1)
+    (LetCont* (k1 v2 v3)
+      (LetCont (k2 v4)
+        (LetCont (k3)
+          (LetPrim v5 (Constant NullConstant))
+          (InvokeContinuation return v5))
+        (LetCont (k4)
+          (LetCont (k5 v6)
+            (LetCont (k6 v7)
+              (InvokeContinuation* k1 v2 v6))
+            (InvokeStatic print v6 k6))
+          (InvokeMethod v1 current  k5))
+        (Branch (IsTrue v4) k4 k3))
+      (InvokeMethod v1 moveNext  k2))
+    (InvokeContinuation k1 a v0))
+  (InvokeMethod a iterator  k0))
+'''),
+  ]),
 ];
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index a19084c..4dd081d 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.12.1-dev
+version: 0.12.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/collection/CHANGELOG.md b/pkg/collection/CHANGELOG.md
index 1ed9863..6742b4c 100644
--- a/pkg/collection/CHANGELOG.md
+++ b/pkg/collection/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.0
+
+* Add a `QueueList` class that implements both `Queue` and `List`.
+
 ## 0.9.4
 
 * Add a `CanonicalizedMap` class that canonicalizes its keys to provide a custom
diff --git a/pkg/collection/lib/collection.dart b/pkg/collection/lib/collection.dart
index d24dd39..45d3867 100644
--- a/pkg/collection/lib/collection.dart
+++ b/pkg/collection/lib/collection.dart
@@ -22,4 +22,5 @@
 export "iterable_zip.dart";
 export "priority_queue.dart";
 export "src/canonicalized_map.dart";
+export "src/queue_list.dart";
 export "wrappers.dart";
diff --git a/pkg/collection/lib/src/queue_list.dart b/pkg/collection/lib/src/queue_list.dart
new file mode 100644
index 0000000..0ef888f
--- /dev/null
+++ b/pkg/collection/lib/src/queue_list.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2014, 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.
+
+import 'dart:collection';
+
+/**
+ * A class that efficiently implements both [Queue] and [List].
+ */
+// TODO(nweiz): Currently this code is copied almost verbatim from
+// dart:collection. The only changes are to implement List and to remove methods
+// that are redundant with ListMixin. Remove or simplify it when issue 21330 is
+// fixed.
+class QueueList<E> extends Object with ListMixin<E> implements Queue<E> {
+  static const int _INITIAL_CAPACITY = 8;
+  List<E> _table;
+  int _head;
+  int _tail;
+
+  /**
+   * Create an empty queue.
+   *
+   * If [initialCapacity] is given, prepare the queue for at least that many
+   * elements.
+   */
+  QueueList([int initialCapacity]) : _head = 0, _tail = 0 {
+    if (initialCapacity == null || initialCapacity < _INITIAL_CAPACITY) {
+      initialCapacity = _INITIAL_CAPACITY;
+    } else if (!_isPowerOf2(initialCapacity)) {
+      initialCapacity = _nextPowerOf2(initialCapacity);
+    }
+    assert(_isPowerOf2(initialCapacity));
+    _table = new List<E>(initialCapacity);
+  }
+
+  /**
+   * Create a queue initially containing the elements of [source].
+   */
+  factory QueueList.from(Iterable<E> source) {
+    if (source is List) {
+      int length = source.length;
+      QueueList<E> queue = new QueueList(length + 1);
+      assert(queue._table.length > length);
+      List sourceList = source;
+      queue._table.setRange(0, length, sourceList, 0);
+      queue._tail = length;
+      return queue;
+    } else {
+      return new QueueList<E>()..addAll(source);
+    }
+  }
+
+  // Collection interface.
+
+  void add(E element) {
+    _add(element);
+  }
+
+  void addAll(Iterable<E> elements) {
+    if (elements is List) {
+      List list = elements;
+      int addCount = list.length;
+      int length = this.length;
+      if (length + addCount >= _table.length) {
+        _preGrow(length + addCount);
+        // After preGrow, all elements are at the start of the list.
+        _table.setRange(length, length + addCount, list, 0);
+        _tail += addCount;
+      } else {
+        // Adding addCount elements won't reach _head.
+        int endSpace = _table.length - _tail;
+        if (addCount < endSpace) {
+          _table.setRange(_tail, _tail + addCount, list, 0);
+          _tail += addCount;
+        } else {
+          int preSpace = addCount - endSpace;
+          _table.setRange(_tail, _tail + endSpace, list, 0);
+          _table.setRange(0, preSpace, list, endSpace);
+          _tail = preSpace;
+        }
+      }
+    } else {
+      for (E element in elements) _add(element);
+    }
+  }
+
+  String toString() => IterableBase.iterableToFullString(this, "{", "}");
+
+  // Queue interface.
+
+  void addLast(E element) { _add(element); }
+
+  void addFirst(E element) {
+    _head = (_head - 1) & (_table.length - 1);
+    _table[_head] = element;
+    if (_head == _tail) _grow();
+  }
+
+  E removeFirst() {
+    if (_head == _tail) throw new StateError("No element");
+    E result = _table[_head];
+    _table[_head] = null;
+    _head = (_head + 1) & (_table.length - 1);
+    return result;
+  }
+
+  E removeLast() {
+    if (_head == _tail) throw new StateError("No element");
+    _tail = (_tail - 1) & (_table.length - 1);
+    E result = _table[_tail];
+    _table[_tail] = null;
+    return result;
+  }
+
+  // List interface.
+
+  int get length => (_tail - _head) & (_table.length - 1);
+
+  void set length(int value) {
+    if (value < 0) throw new RangeError("Length $value may not be negative.");
+
+    int delta = value - length;
+    if (delta >= 0) {
+      if (_table.length <= value) {
+        _preGrow(value);
+      }
+      _tail = (_tail + delta) & (_table.length - 1);
+      return;
+    }
+
+    int newTail = _tail + delta; // [delta] is negative.
+    if (newTail >= 0) {
+      _table.fillRange(newTail, _tail, null);
+    } else { 
+      newTail += _table.length;
+      _table.fillRange(0, _tail, null);
+      _table.fillRange(newTail, _table.length, null);
+    }
+    _tail = newTail;
+  }
+
+  E operator [](int index) {
+    if (index < 0 || index >= length) {
+      throw new RangeError("Index $index must be in the range [0..$length).");
+    }
+
+    return _table[(_head + index) & (_table.length - 1)];
+  }
+
+  void operator[]=(int index, E value) {
+    if (index < 0 || index >= length) {
+      throw new RangeError("Index $index must be in the range [0..$length).");
+    }
+
+    _table[(_head + index) & (_table.length - 1)] = value;
+  }
+
+  // Internal helper functions.
+
+  /**
+   * Whether [number] is a power of two.
+   *
+   * Only works for positive numbers.
+   */
+  static bool _isPowerOf2(int number) => (number & (number - 1)) == 0;
+
+  /**
+   * Rounds [number] up to the nearest power of 2.
+   *
+   * If [number] is a power of 2 already, it is returned.
+   *
+   * Only works for positive numbers.
+   */
+  static int _nextPowerOf2(int number) {
+    assert(number > 0);
+    number = (number << 1) - 1;
+    for(;;) {
+      int nextNumber = number & (number - 1);
+      if (nextNumber == 0) return number;
+      number = nextNumber;
+    }
+  }
+
+  /** Adds element at end of queue. Used by both [add] and [addAll]. */
+  void _add(E element) {
+    _table[_tail] = element;
+    _tail = (_tail + 1) & (_table.length - 1);
+    if (_head == _tail) _grow();
+  }
+
+  /**
+   * Grow the table when full.
+   */
+  void _grow() {
+    List<E> newTable = new List<E>(_table.length * 2);
+    int split = _table.length - _head;
+    newTable.setRange(0, split, _table, _head);
+    newTable.setRange(split, split + _head, _table, 0);
+    _head = 0;
+    _tail = _table.length;
+    _table = newTable;
+  }
+
+  int _writeToList(List<E> target) {
+    assert(target.length >= length);
+    if (_head <= _tail) {
+      int length = _tail - _head;
+      target.setRange(0, length, _table, _head);
+      return length;
+    } else {
+      int firstPartSize = _table.length - _head;
+      target.setRange(0, firstPartSize, _table, _head);
+      target.setRange(firstPartSize, firstPartSize + _tail, _table, 0);
+      return _tail + firstPartSize;
+    }
+  }
+
+  /** Grows the table even if it is not full. */
+  void _preGrow(int newElementCount) {
+    assert(newElementCount >= length);
+
+    // Add 1.5x extra room to ensure that there's room for more elements after
+    // expansion.
+    newElementCount += newElementCount >> 1;
+    int newCapacity = _nextPowerOf2(newElementCount);
+    List<E> newTable = new List<E>(newCapacity);
+    _tail = _writeToList(newTable);
+    _table = newTable;
+    _head = 0;
+  }
+}
diff --git a/pkg/collection/pubspec.yaml b/pkg/collection/pubspec.yaml
index 9ec80f4..b4396b9 100644
--- a/pkg/collection/pubspec.yaml
+++ b/pkg/collection/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 1.0.0
+version: 1.1.0
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: http://www.dartlang.org
diff --git a/pkg/collection/test/queue_list_test.dart b/pkg/collection/test/queue_list_test.dart
new file mode 100644
index 0000000..6b213c8
--- /dev/null
+++ b/pkg/collection/test/queue_list_test.dart
@@ -0,0 +1,276 @@
+// Copyright (c) 2014, 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.
+
+import "package:collection/collection.dart";
+import "package:unittest/unittest.dart";
+
+void main() {
+  group("new QueueList()", () {
+    test("creates an empty QueueList", () {
+      expect(new QueueList(), isEmpty);
+    });
+
+    test("takes an initial capacity", () {
+      expect(new QueueList(100), isEmpty);
+    });
+  });
+
+  test("new QueueList.from() copies the contents of an iterable", () {
+    expect(new QueueList.from([1, 2, 3].skip(1)), equals([2, 3]));
+  });
+
+  group("add()", () {
+    test("adds an element to the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.add(4);
+      expect(queue, equals([1, 2, 3, 4]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.add(8);
+      expect(queue, equals([1, 2, 3, 4, 5, 6, 7, 8]));
+    });
+  });
+
+  group("addAll()", () {
+    test("adds elements to the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.addAll([4, 5, 6]);
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.addAll([8, 9]);
+      expect(queue, equals([1, 2, 3, 4, 5, 6, 7, 8, 9]));
+    });
+  });
+
+  group("addFirst()", () {
+    test("adds an element to the beginning of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.addFirst(0);
+      expect(queue, equals([0, 1, 2, 3]));
+    });
+
+    test("expands a full queue", () {
+      var queue = atCapacity();
+      queue.addFirst(0);
+      expect(queue, equals([0, 1, 2, 3, 4, 5, 6, 7]));
+    });
+  });
+
+  group("removeFirst()", () {
+    test("removes an element from the beginning of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3]));
+    });
+
+    test("removes an element from the beginning of a queue with an internal "
+        "gap", () {
+      var queue = withInternalGap();
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3, 4, 5, 6, 7]));
+    });
+
+    test("removes an element from the beginning of a queue at capacity", () {
+      var queue = atCapacity();
+      expect(queue.removeFirst(), equals(1));
+      expect(queue, equals([2, 3, 4, 5, 6, 7]));
+    });
+
+    test("throws a StateError for an empty queue", () {
+      expect(new QueueList().removeFirst, throwsStateError);
+    });
+  });
+
+  group("removeLast()", () {
+    test("removes an element from the end of the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue.removeLast(), equals(3));
+      expect(queue, equals([1, 2]));
+    });
+
+    test("removes an element from the end of a queue with an internal gap", () {
+      var queue = withInternalGap();
+      expect(queue.removeLast(), equals(7));
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("removes an element from the end of a queue at capacity", () {
+      var queue = atCapacity();
+      expect(queue.removeLast(), equals(7));
+      expect(queue, equals([1, 2, 3, 4, 5, 6]));
+    });
+
+    test("throws a StateError for an empty queue", () {
+      expect(new QueueList().removeLast, throwsStateError);
+    });
+  });
+
+  group("length", () {
+    test("returns the length of a queue", () {
+      expect(new QueueList.from([1, 2, 3]).length, equals(3));
+    });
+
+    test("returns the length of a queue with an internal gap", () {
+      expect(withInternalGap().length, equals(7));
+    });
+
+    test("returns the length of a queue at capacity", () {
+      expect(atCapacity().length, equals(7));
+    });
+  });
+
+  group("length=", () {
+    test("shrinks a larger queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.length = 1;
+      expect(queue, equals([1]));
+    });
+
+    test("grows a smaller queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue.length = 5;
+      expect(queue, equals([1, 2, 3, null, null]));
+    });
+
+    test("throws a RangeError if length is less than 0", () {
+      expect(() => new QueueList().length = -1, throwsRangeError);
+    });
+  });
+
+  group("[]", () {
+    test("returns individual entries in the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(queue[0], equals(1));
+      expect(queue[1], equals(2));
+      expect(queue[2], equals(3));
+    });
+
+    test("returns individual entries in a queue with an internal gap", () {
+      var queue = withInternalGap();
+      expect(queue[0], equals(1));
+      expect(queue[1], equals(2));
+      expect(queue[2], equals(3));
+      expect(queue[3], equals(4));
+      expect(queue[4], equals(5));
+      expect(queue[5], equals(6));
+      expect(queue[6], equals(7));
+    });
+
+    test("throws a RangeError if the index is less than 0", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() => queue[-1], throwsRangeError);
+    });
+
+    test("throws a RangeError if the index is greater than or equal to the "
+        "length", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() => queue[3], throwsRangeError);
+    });
+  });
+
+  group("[]=", () {
+    test("sets individual entries in the queue", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      queue[0] = "a";
+      queue[1] = "b";
+      queue[2] = "c";
+      expect(queue, equals(["a", "b", "c"]));
+    });
+
+    test("sets individual entries in a queue with an internal gap", () {
+      var queue = withInternalGap();
+      queue[0] = "a";
+      queue[1] = "b";
+      queue[2] = "c";
+      queue[3] = "d";
+      queue[4] = "e";
+      queue[5] = "f";
+      queue[6] = "g";
+      expect(queue, equals(["a", "b", "c", "d", "e", "f", "g"]));
+    });
+
+    test("throws a RangeError if the index is less than 0", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() {
+        queue[-1] = 0;
+      }, throwsRangeError);
+    });
+
+    test("throws a RangeError if the index is greater than or equal to the "
+        "length", () {
+      var queue = new QueueList.from([1, 2, 3]);
+      expect(() {
+        queue[3] = 4;
+      }, throwsRangeError);
+    });
+  });
+
+  group("throws a modification error for", () {
+    var queue;
+    setUp(() {
+      queue = new QueueList.from([1, 2, 3]);
+    });
+
+    test("add", () {
+      expect(() => queue.forEach((_) => queue.add(4)),
+          throwsConcurrentModificationError);
+    });
+
+    test("addAll", () {
+      expect(() => queue.forEach((_) => queue.addAll([4, 5, 6])),
+          throwsConcurrentModificationError);
+    });
+
+    test("addFirst", () {
+      expect(() => queue.forEach((_) => queue.addFirst(0)),
+          throwsConcurrentModificationError);
+    });
+
+    test("removeFirst", () {
+      expect(() => queue.forEach((_) => queue.removeFirst()),
+          throwsConcurrentModificationError);
+    });
+
+    test("removeLast", () {
+      expect(() => queue.forEach((_) => queue.removeLast()),
+          throwsConcurrentModificationError);
+    });
+
+    test("length=", () {
+      expect(() => queue.forEach((_) => queue.length = 1),
+          throwsConcurrentModificationError);
+    });
+  });
+}
+
+/// Returns a queue whose internal ring buffer is full enough that adding a new
+/// element will expand it.
+QueueList atCapacity() {
+  // Use addAll because [new QueueList.from(List)] won't use the default initial
+  // capacity of 8.
+  return new QueueList()..addAll([1, 2, 3, 4, 5, 6, 7]);
+}
+
+/// Returns a queue whose internal tail has a lower index than its head.
+QueueList withInternalGap() {
+  var queue = new QueueList.from([null, null, null, null, 1, 2, 3, 4]);
+  for (var i = 0; i < 4; i++) {
+    queue.removeFirst();
+  }
+  for (var i = 5; i < 8; i++) {
+    queue.addLast(i);
+  }
+  return queue;
+}
+
+/// Returns a matcher that expects that a closure throws a
+/// [ConcurrentModificationError].
+final throwsConcurrentModificationError = throwsA(
+    new isInstanceOf<ConcurrentModificationError>(
+        "ConcurrentModificationError"));
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart
index 8fbf06e..282fe59 100644
--- a/pkg/csslib/lib/parser.dart
+++ b/pkg/csslib/lib/parser.dart
@@ -2093,7 +2093,7 @@
     return expressions;
   }
 
-  static final int MAX_UNICODE = int.parse('0x10FFFF');
+  static const int MAX_UNICODE = 0x10FFFF;
 
   //  Term grammar:
   //
diff --git a/pkg/custom_element/AUTHORS b/pkg/custom_element/AUTHORS
deleted file mode 100644
index 0617765..0000000
--- a/pkg/custom_element/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-# Names should be added to this file with this pattern:
-#
-# For individuals:
-#   Name <email address>
-#
-# For organizations:
-#   Organization <fnmatch pattern>
-#
-Google Inc. <*@google.com>
diff --git a/pkg/custom_element/LICENSE b/pkg/custom_element/LICENSE
deleted file mode 100644
index 92d60b0..0000000
--- a/pkg/custom_element/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 The Polymer Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/custom_element/PATENTS b/pkg/custom_element/PATENTS
deleted file mode 100644
index e120963..0000000
--- a/pkg/custom_element/PATENTS
+++ /dev/null
@@ -1,23 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Polymer project.
-
-Google hereby grants to You a perpetual, worldwide, non-exclusive,
-no-charge, royalty-free, irrevocable (except as stated in this section)
-patent license to make, have made, use, offer to sell, sell, import,
-transfer and otherwise run, modify and propagate the contents of this
-implementation of Polymer, where such license applies only to those
-patent claims, both currently owned or controlled by Google and acquired
-in the future, licensable by Google that are necessarily infringed by
-this implementation of Polymer.  This grant does not include claims
-that would be infringed only as a consequence of further modification of
-this implementation.  If you or your agent or exclusive licensee
-institute or order or agree to the institution of patent litigation
-against any entity (including a cross-claim or counterclaim in a
-lawsuit) alleging that this implementation of Polymer or any code
-incorporated within this implementation of Polymer constitutes
-direct or contributory patent infringement, or inducement of patent
-infringement, then any patent rights granted to you under this License
-for this implementation of Polymer shall terminate as of the date
-such litigation is filed.
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
deleted file mode 100644
index 4fc679f..0000000
--- a/pkg/custom_element/lib/custom_element.dart
+++ /dev/null
@@ -1,500 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/**
- * Custom DOM elements.
- *
- * This library provides access to the Polymer project's
- * [Custom Elements]
- * (http://www.polymer-project.org/platform/custom-elements.html)
- * API, which lets you define your own elements. With custom elements, you
- * associate code with custom tag names, and then use those custom tag names
- * as you would any standard tag. For more information, see the
- * [Polymer.dart homepage](https://www.dartlang.org/polymer-dart/) and its
- * [custom element example]
- * (https://www.dartlang.org/polymer-dart/#custom-elements).
- */
-library custom_element;
-
-import 'dart:html';
-import 'dart:async';
-
-/**
- * *Deprecated* -- do not use. Extend [HtmlElement] and use
- * [document.register] instead. If running on a browser without native
- * document.register, you can add the polyfill script to your page:
- *
- *     <script src="packages/custom_element/custom-elements.debug.js"></script>
- *
- * You can also use "custom-elements.min.js" for the minified version.
- */
-// This is only used by Dart Web UI.
-class CustomElement implements Element {
-  /** The web component element wrapped by this class. */
-  Element _host;
-  List _shadowRoots;
-
-  /**
-   * Shadow roots generated by dwc for each custom element, indexed by the
-   * custom element tag name.
-   */
-  Map<String, dynamic> _generatedRoots = {};
-
-  /**
-   * Temporary property until components extend [Element]. An element can
-   * only be associated with one host, and it is an error to use a web component
-   * without an associated host element.
-   */
-  Element get host {
-    if (_host == null) throw new StateError('host element has not been set.');
-    return _host;
-  }
-
-  set host(Element value) {
-    if (value == null) {
-      throw new ArgumentError('host must not be null.');
-    }
-    // TODO(jmesserly): xtag used to return "null" if unset, now it checks for
-    // "this". Temporarily allow both.
-    var xtag = value.xtag;
-    if (xtag != null && xtag != value) {
-      throw new ArgumentError('host must not have its xtag property set.');
-    }
-    if (_host != null) {
-      throw new StateError('host can only be set once.');
-    }
-
-    value.xtag = this;
-    _host = value;
-  }
-
-  /**
-   * **Note**: This is an implementation helper and should not need to be called
-   * from your code.
-   *
-   * Creates the [ShadowRoot] backing this component.
-   */
-  createShadowRoot([String componentName]) {
-    var root = host.createShadowRoot();
-    if (componentName != null) {
-      _generatedRoots[componentName] = root;
-    }
-    return root;
-  }
-
-  getShadowRoot(String componentName) => _generatedRoots[componentName];
-
-  /**
-   * Invoked when this component gets created.
-   * Note that [root] will be a [ShadowRoot] if the browser supports Shadow DOM.
-   */
-  void created() {}
-  // Added for analyzer warnings
-  @deprecated
-  void createdCallback() {}
-
-  /** Invoked when this component gets inserted in the DOM tree. */
-  void inserted() {}
-  @deprecated
-  void enteredView() {}
-  @deprecated
-  void attached() {}
-
-  /** Invoked when this component is removed from the DOM tree. */
-  void removed() {}
-  @deprecated
-  void leftView() {}
-  @deprecated
-  void detached() {}
-
-  /** Invoked when any attribute of the component is modified. */
-  void attributeChanged(String name, String oldValue, String newValue) =>
-      host.attributeChanged(name, oldValue, newValue);
-
-  // TODO(efortuna): Update these when we decide what to do with these
-  // properties.
-  @deprecated
-  String getAttribute(String name) =>
-      host.getAttribute(name);
-
-  @deprecated
-  String getAttributeNS(String namespaceUri, String localName) =>
-      host.getAttributeNS(namespaceUri, localName);
-
-  @deprecated
-  void setAttributeNS(
-      String namespaceUri, String localName, String value) {
-    host.setAttributeNS(namespaceUri, localName, value);
-  }
-
-  @deprecated
-  void setAttribute(String name, String value) =>
-      host.setAttribute(name, value);
-
-  @deprecated
-  List<Node> get childNodes => host.childNodes;
-
-  // TODO(jmesserly): this forwarding is temporary until Dart supports
-  // subclassing Elements.
-  // TODO(jmesserly): we were missing the setter for title, are other things
-  // missing setters?
-
-  List<Node> get nodes => host.nodes;
-
-  set nodes(Iterable<Node> value) { host.nodes = value; }
-
-  /**
-   * Replaces this node with another node.
-   */
-  Node replaceWith(Node otherNode) => host.replaceWith(otherNode);
-
-  /**
-   * Removes this node from the DOM.
-   */
-  void remove() => host.remove();
-
-  Node get nextNode => host.nextNode;
-
-  String get nodeName => host.nodeName;
-
-  Document get ownerDocument => host.ownerDocument;
-
-  Node get previousNode => host.previousNode;
-
-  String get text => host.text;
-
-  set text(String v) { host.text = v; }
-
-  bool contains(Node other) => host.contains(other);
-
-  bool hasChildNodes() => host.hasChildNodes();
-
-  Node insertBefore(Node newChild, Node refChild) =>
-    host.insertBefore(newChild, refChild);
-
-  Node insertAllBefore(Iterable<Node> newChild, Node refChild) =>
-    host.insertAllBefore(newChild, refChild);
-
-  Map<String, String> get attributes => host.attributes;
-  set attributes(Map<String, String> value) {
-    host.attributes = value;
-  }
-
-  List<Element> get elements => host.children;
-
-  set elements(List<Element> value) {
-    host.children = value;
-  }
-
-  String get baseUri => host.baseUri;
-
-  List<Element> get children => host.children;
-
-  set children(List<Element> value) {
-    host.children = value;
-  }
-
-  Set<String> get classes => host.classes;
-
-  set classes(Iterable<String> value) {
-    host.classes = value;
-  }
-
-  CssRect get contentEdge => host.contentEdge;
-  CssRect get paddingEdge => host.paddingEdge;
-  CssRect get borderEdge => host.borderEdge;
-  CssRect get marginEdge => host.marginEdge;
-  Point get documentOffset => host.documentOffset;
-  Point offsetTo(Element parent) => host.offsetTo(parent);
-
-  Map<String, String> getNamespacedAttributes(String namespace) =>
-      host.getNamespacedAttributes(namespace);
-
-  CssStyleDeclaration getComputedStyle([String pseudoElement])
-    => host.getComputedStyle(pseudoElement);
-
-  Element clone(bool deep) => host.clone(deep);
-
-  Element get parent => host.parent;
-
-  Node get parentNode => host.parentNode;
-
-  String get nodeValue => host.nodeValue;
-
-  Events get on => host.on;
-
-  String get contentEditable => host.contentEditable;
-  set contentEditable(String v) { host.contentEditable = v; }
-
-  String get dir => host.dir;
-  set dir(String v) { host.dir = v; }
-
-  bool get draggable => host.draggable;
-  set draggable(bool v) { host.draggable = v; }
-
-  bool get hidden => host.hidden;
-  set hidden(bool v) { host.hidden = v; }
-
-  String get id => host.id;
-  set id(String v) { host.id = v; }
-
-  String get innerHtml => host.innerHtml;
-  void set innerHtml(String v) {
-    host.innerHtml = v;
-  }
-
-  void setInnerHtml(String html,
-    {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) {
-    host.setInnerHtml(html, validator: validator, treeSanitizer: treeSanitizer);
-  }
-
-  DocumentFragment createFragment(String html,
-      {NodeValidator validator, NodeTreeSanitizer treeSanitizer}) =>
-    host.createFragment(html,
-        validator: validator, treeSanitizer: treeSanitizer);
-
-  bool get isContentEditable => host.isContentEditable;
-
-  String get lang => host.lang;
-  set lang(String v) { host.lang = v; }
-
-  String get outerHtml => host.outerHtml;
-
-  bool get spellcheck => host.spellcheck;
-  set spellcheck(bool v) { host.spellcheck = v; }
-
-  int get tabIndex => host.tabIndex;
-  set tabIndex(int i) { host.tabIndex = i; }
-
-  String get title => host.title;
-
-  set title(String value) { host.title = value; }
-
-  bool get translate => host.translate;
-  set translate(bool v) { host.translate = v; }
-
-  String get dropzone => host.dropzone;
-  set dropzone(String v) { host.dropzone = v; }
-
-  void click() { host.click(); }
-
-  List<Node> getDestinationInsertionPoints() =>
-    host.getDestinationInsertionPoints();
-
-  Element insertAdjacentElement(String where, Element element) =>
-    host.insertAdjacentElement(where, element);
-
-  void insertAdjacentHtml(String where, String html) {
-    host.insertAdjacentHtml(where, html);
-  }
-
-  void insertAdjacentText(String where, String text) {
-    host.insertAdjacentText(where, text);
-  }
-
-  Map<String, String> get dataset => host.dataset;
-
-  set dataset(Map<String, String> value) {
-    host.dataset = value;
-  }
-
-  Element get nextElementSibling => host.nextElementSibling;
-
-  Element get offsetParent => host.offsetParent;
-
-  Element get previousElementSibling => host.previousElementSibling;
-
-  CssStyleDeclaration get style => host.style;
-
-  String get tagName => host.tagName;
-
-  // Note: we are not polyfilling the shadow root here. This will be fixed when
-  // we migrate to the JS Shadow DOM polyfills. You can still use getShadowRoot
-  // to retrieve a node that behaves as the shadow root when Shadow DOM is not
-  // enabled.
-  ShadowRoot get shadowRoot => host.shadowRoot;
-
-  void blur() { host.blur(); }
-
-  void focus() { host.focus(); }
-
-  void scrollByLines(int lines) {
-    host.scrollByLines(lines);
-  }
-
-  void scrollByPages(int pages) {
-    host.scrollByPages(pages);
-  }
-
-  void scrollIntoView([ScrollAlignment alignment]) {
-    host.scrollIntoView(alignment);
-  }
-
-  bool matches(String selectors) => host.matches(selectors);
-
-  bool matchesWithAncestors(String selectors) =>
-      host.matchesWithAncestors(selectors);
-
-  @deprecated
-  void requestFullScreen(int flags) { requestFullscreen(); }
-
-  void requestFullscreen() { host.requestFullscreen(); }
-
-  void requestPointerLock() { host.requestPointerLock(); }
-
-  Element querySelector(String selectors) => host.querySelector(selectors);
-
-  ElementList querySelectorAll(String selectors) =>
-      host.querySelectorAll(selectors);
-
-  @deprecated
-  Element query(String selectors) => host.querySelector(selectors);
-
-  @deprecated
-  ElementList queryAll(String selectors) => host.querySelectorAll(selectors);
-
-  String get className => host.className;
-  set className(String value) { host.className = value; }
-
-  @deprecated
-  int get clientHeight => client.height;
-
-  @deprecated
-  int get clientLeft => client.left;
-
-  @deprecated
-  int get clientTop => client.top;
-
-  @deprecated
-  int get clientWidth => client.width;
-
-  Rectangle get client => host.client;
-
-  @deprecated
-  int get offsetHeight => offset.height;
-
-  @deprecated
-  int get offsetLeft => offset.left;
-
-  @deprecated
-  int get offsetTop => offset.top;
-
-  @deprecated
-  int get offsetWidth => offset.width;
-
-  Rectangle get offset => host.offset;
-
-  int get scrollHeight => host.scrollHeight;
-
-  int get scrollLeft => host.scrollLeft;
-
-  int get scrollTop => host.scrollTop;
-
-  set scrollLeft(int value) { host.scrollLeft = value; }
-
-  set scrollTop(int value) { host.scrollTop = value; }
-
-  int get scrollWidth => host.scrollWidth;
-
-  Rectangle getBoundingClientRect() => host.getBoundingClientRect();
-
-  List<Rectangle> getClientRects() => host.getClientRects();
-
-  List<Node> getElementsByClassName(String name) =>
-      host.getElementsByClassName(name);
-
-  Node get firstChild => host.firstChild;
-
-  Node get lastChild => host.lastChild;
-
-  String get localName => host.localName;
-
-  String get namespaceUri => host.namespaceUri;
-
-  int get nodeType => host.nodeType;
-
-  void addEventListener(String type, EventListener listener,
-      [bool useCapture]) {
-    host.addEventListener(type, listener, useCapture);
-  }
-
-  bool dispatchEvent(Event event) => host.dispatchEvent(event);
-
-  void removeEventListener(String type, EventListener listener,
-      [bool useCapture]) {
-    host.removeEventListener(type, listener, useCapture);
-  }
-
-  get xtag => host.xtag;
-
-  set xtag(value) { host.xtag = value; }
-
-  Node append(Node e) => host.append(e);
-
-  void appendText(String text) => host.appendText(text);
-
-  void appendHtml(String html) => host.appendHtml(html);
-
-  Animation animate(List<Map> keyframes, [num duration]) =>
-      host.animate(keyframes, duration);
-
-  // TODO(jmesserly): rename "created" to "onCreated".
-  void onCreated() => created();
-
-  Stream<Event> get onAbort => host.onAbort;
-  Stream<Event> get onBeforeCopy => host.onBeforeCopy;
-  Stream<Event> get onBeforeCut => host.onBeforeCut;
-  Stream<Event> get onBeforePaste => host.onBeforePaste;
-  Stream<Event> get onBlur => host.onBlur;
-  Stream<Event> get onChange => host.onChange;
-  Stream<MouseEvent> get onClick => host.onClick;
-  Stream<MouseEvent> get onContextMenu => host.onContextMenu;
-  Stream<Event> get onCopy => host.onCopy;
-  Stream<Event> get onCut => host.onCut;
-  Stream<Event> get onDoubleClick => host.onDoubleClick;
-  Stream<MouseEvent> get onDrag => host.onDrag;
-  Stream<MouseEvent> get onDragEnd => host.onDragEnd;
-  Stream<MouseEvent> get onDragEnter => host.onDragEnter;
-  Stream<MouseEvent> get onDragLeave => host.onDragLeave;
-  Stream<MouseEvent> get onDragOver => host.onDragOver;
-  Stream<MouseEvent> get onDragStart => host.onDragStart;
-  Stream<MouseEvent> get onDrop => host.onDrop;
-  Stream<Event> get onError => host.onError;
-  Stream<Event> get onFocus => host.onFocus;
-  Stream<Event> get onInput => host.onInput;
-  Stream<Event> get onInvalid => host.onInvalid;
-  Stream<KeyboardEvent> get onKeyDown => host.onKeyDown;
-  Stream<KeyboardEvent> get onKeyPress => host.onKeyPress;
-  Stream<KeyboardEvent> get onKeyUp => host.onKeyUp;
-  Stream<Event> get onLoad => host.onLoad;
-  Stream<MouseEvent> get onMouseDown => host.onMouseDown;
-  Stream<MouseEvent> get onMouseEnter => host.onMouseEnter;
-  Stream<MouseEvent> get onMouseLeave => host.onMouseLeave;
-  Stream<MouseEvent> get onMouseMove => host.onMouseMove;
-  Stream<Event> get onFullscreenChange => host.onFullscreenChange;
-  Stream<Event> get onFullscreenError => host.onFullscreenError;
-  Stream<Event> get onPaste => host.onPaste;
-  Stream<Event> get onReset => host.onReset;
-  Stream<Event> get onResize => host.onResize;
-  Stream<Event> get onScroll => host.onScroll;
-  Stream<Event> get onSearch => host.onSearch;
-  Stream<Event> get onSelect => host.onSelect;
-  Stream<Event> get onSelectStart => host.onSelectStart;
-  Stream<Event> get onSubmit => host.onSubmit;
-  Stream<MouseEvent> get onMouseOut => host.onMouseOut;
-  Stream<MouseEvent> get onMouseOver => host.onMouseOver;
-  Stream<MouseEvent> get onMouseUp => host.onMouseUp;
-  Stream<TouchEvent> get onTouchCancel => host.onTouchCancel;
-  Stream<TouchEvent> get onTouchEnd => host.onTouchEnd;
-  Stream<TouchEvent> get onTouchEnter => host.onTouchEnter;
-  Stream<TouchEvent> get onTouchLeave => host.onTouchLeave;
-  Stream<TouchEvent> get onTouchMove => host.onTouchMove;
-  Stream<TouchEvent> get onTouchStart => host.onTouchStart;
-  Stream<TransitionEvent> get onTransitionEnd => host.onTransitionEnd;
-
-  // TODO(sigmund): do the normal forwarding when dartbug.com/7919 is fixed.
-  Stream<WheelEvent> get onMouseWheel {
-    throw new UnsupportedError('onMouseWheel is not supported');
-  }
-}
diff --git a/pkg/custom_element/lib/src/custom_tag_name.dart b/pkg/custom_element/lib/src/custom_tag_name.dart
deleted file mode 100644
index 72d9150..0000000
--- a/pkg/custom_element/lib/src/custom_tag_name.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2013, 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.
-
-library custom_element.src.custom_tag_name;
-
-/**
- * Returns true if this is a valid custom element name. See:
- * <https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-name>
- */
-bool isCustomTag(String name) {
-  if (!name.contains('-')) return false;
-
-  // These names have meaning in SVG or MathML, so they aren't allowed as custom
-  // tags.
-  var invalidNames = const {
-    'annotation-xml': '',
-    'color-profile': '',
-    'font-face': '',
-    'font-face-src': '',
-    'font-face-uri': '',
-    'font-face-format': '',
-    'font-face-name': '',
-    'missing-glyph': '',
-  };
-  return !invalidNames.containsKey(name);
-}
diff --git a/pkg/custom_element/pubspec.yaml b/pkg/custom_element/pubspec.yaml
deleted file mode 100644
index b6baadf..0000000
--- a/pkg/custom_element/pubspec.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: custom_element
-version: 0.10.1
-author: "Polymer.dart Team <web-ui-dev@dartlang.org>"
-homepage: http://www.dartlang.org/
-description: >
-  *Deprecated* newer version is in web_components package. This is for backwards
-  compatibility with polymer.dart 0.4.x (web_ui package).
-dev_dependencies:
-  unittest: ">=0.10.0 <0.11.0"
-environment:
-  sdk: ">=1.3.0-dev.7.5 <2.0.0"
diff --git a/pkg/custom_element/test/analyzer_test.dart b/pkg/custom_element/test/analyzer_test.dart
deleted file mode 100644
index 0cbe620..0000000
--- a/pkg/custom_element/test/analyzer_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2013, 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.
-
-library custom_element.test.analyzer_test;
-
-import 'package:custom_element/custom_element.dart';
-
-// This test ensures CustomElement compiles without errors.
-void main() {
-}
diff --git a/pkg/dart2js_incremental/lib/library_updater.dart b/pkg/dart2js_incremental/lib/library_updater.dart
index 04d1ba3..b2a8595 100644
--- a/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/pkg/dart2js_incremental/lib/library_updater.dart
@@ -305,20 +305,26 @@
     }
     String name = info.name;
     jsAst.Node function = info.code;
-    jsAst.Node elementAccess = namer.elementAccess(element);
-    jsAst.Expression globalFunctionsAccess =
-        emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
     List<jsAst.Statement> statements = <jsAst.Statement>[];
-    statements.add(
-        js.statement(
-            '#.# = # = f',
-            [globalFunctionsAccess, name, elementAccess]));
-    if (info.canTearOff) {
-      String globalName = namer.globalObjectFor(element);
+    if (element.isInstanceMember) {
+      jsAst.Node elementAccess = namer.elementAccess(element.enclosingClass);
+      statements.add(
+          js.statement('#.prototype.# = f', [elementAccess, name]));
+    } else {
+      jsAst.Node elementAccess = namer.elementAccess(element);
+      jsAst.Expression globalFunctionsAccess =
+          emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
       statements.add(
           js.statement(
-              '#.#().# = f',
-              [globalName, info.tearOffName, callNameFor(element)]));
+              '#.# = # = f',
+              [globalFunctionsAccess, name, elementAccess]));
+      if (info.canTearOff) {
+        String globalName = namer.globalObjectFor(element);
+        statements.add(
+            js.statement(
+                '#.#().# = f',
+                [globalName, info.tearOffName, callNameFor(element)]));
+      }
     }
     // Create a scope by creating a new function. The updated function literal
     // is passed as an argument to this function which ensures that temporary
diff --git a/pkg/docgen/test/async_await_test.dart b/pkg/docgen/test/async_await_test.dart
new file mode 100644
index 0000000..e129455
--- /dev/null
+++ b/pkg/docgen/test/async_await_test.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2014, 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.
+
+library async_await_test;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
+import '../lib/docgen.dart';
+
+const String DART_LIBRARY = '''
+  library test;
+  /**
+   * Doc comment for class [A].
+   *
+   * Multiline Test
+   */
+  /*
+   * Normal comment for class A.
+   */
+  class A {
+    m1() sync* {
+      yield 0;
+    }
+
+    m2() async {
+      await 0;
+      await for (var e in m1()) {}
+    }
+
+    m3() async* {
+      yield* m1();
+    }
+  }
+
+  m1() sync* {
+    yield 0;
+  }
+
+  m2() async {
+    await 0;
+    await for (var e in m1()) {}
+  }
+
+  m3() async* {
+    yield* m1();
+  }
+
+  main() {
+    m1();
+    m2();
+    m3();
+    A a = new A();
+    a.m1();
+    a.m2();
+    a.m3();
+  }
+''';
+
+main() {
+  group('Generate docs for', () {
+    test('file with async/await.', () {
+      var temporaryDir = Directory.systemTemp.createTempSync('single_library_');
+      var fileName = path.join(temporaryDir.path, 'temp.dart');
+      var file = new File(fileName);
+      file.writeAsStringSync(DART_LIBRARY);
+
+      return getMirrorSystem([new Uri.file(fileName)], false)
+        .then((mirrorSystem) {
+          var testLibraryUri = new Uri.file(path.absolute(fileName),
+                                            windows: Platform.isWindows);
+          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
+          expect(library is Library, isTrue);
+
+          var classTypes = library.classes;
+          var classes = [];
+          classes.addAll(classTypes.values);
+          classes.addAll(library.errors.values);
+          expect(classes.every((e) => e is Class), isTrue);
+
+          expect(library.typedefs.values.every((e) => e is Typedef), isTrue);
+
+          var classMethodTypes = [];
+          classes.forEach((e) {
+            classMethodTypes.add(e.methods);
+            classMethodTypes.add(e.inheritedMethods);
+          });
+          expect(classMethodTypes.every((e) => e is Map<String, Method>),
+                 isTrue);
+
+          var classMethods = [];
+          classMethodTypes.forEach((e) {
+            classMethods.addAll(e.values);
+          });
+          expect(classMethods.every((e) => e is Method), isTrue);
+
+          var methodParameters = [];
+          classMethods.forEach((e) {
+            methodParameters.addAll(e.parameters.values);
+          });
+          expect(methodParameters.every((e) => e is Parameter), isTrue);
+
+          var functionTypes = library.functions;
+          expect(functionTypes is Map<String, Method>, isTrue);
+
+          var functions = [];
+          functions.addAll(functionTypes.values);
+          expect(functions.every((e) => e is Method), isTrue);
+
+          var functionParameters = [];
+          functions.forEach((e) {
+            functionParameters.addAll(e.parameters.values);
+          });
+          expect(functionParameters.every((e) => e is Parameter), isTrue);
+
+          var variables = library.variables.values;
+          expect(variables.every((e) => e is Variable), isTrue);
+
+          /// Testing fixReference
+          // Testing Doc comment for class [A].
+          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
+          var classMirror =
+              dart2js_util.classesOf(libraryMirror.declarations).first;
+          var classDocComment = library.fixReference('A').children.first.text;
+          expect(classDocComment, 'test.A');
+
+          // Test for linking to parameter [A]
+          var method = getDocgenObject(
+              classMirror.declarations[dart2js_util.symbolOf('m1')]);
+
+          // Testing trying to refer to m1 method
+          var methodDocComment = method.fixReference(
+              'm1').children.first.text;
+          expect(methodDocComment, 'test.A.m1');
+
+          // Testing something with no reference
+          var libraryDocComment = method.fixReference('foobar').text;
+          expect(libraryDocComment, 'foobar');
+
+          // Testing trying to refer to m1 function
+          libraryDocComment = library.fixReference('m1').children.first.text;
+          expect(libraryDocComment, 'test.m1');
+        }).whenComplete(() => temporaryDir.deleteSync(recursive: true));
+    });
+  });
+}
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 20d216f..562af8d 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -346,19 +346,23 @@
   static void throws(void f(),
                      [_CheckExceptionFn check = null,
                       String reason = null]) {
+    String msg = reason == null ? "" : "($reason)";
+    if (f is! _Nullary) {
+      // Only throws from executing the funtion body should count as throwing.
+      // The failure to even call `f` should throw outside the try/catch.
+      _fail("Expect.throws$msg: Funciton f not callable with zero arguments");
+    }
     try {
       f();
     } catch (e, s) {
       if (check != null) {
         if (!check(e)) {
-          String msg = reason == null ? "" : reason;
-          _fail("Expect.throws($msg): Unexpected '$e'\n$s");
+          _fail("Expect.throws$msg: Unexpected '$e'\n$s");
         }
       }
       return;
     }
-    String msg = reason == null ? "" : reason;
-    _fail('Expect.throws($msg) fails');
+    _fail('Expect.throws$msg fails: Did not throw');
   }
 
   static String _getMessage(String reason)
@@ -372,6 +376,7 @@
 bool _identical(a, b) => identical(a, b);
 
 typedef bool _CheckExceptionFn(exception);
+typedef _Nullary();  // Expect.throws argument must be this type.
 
 class ExpectException implements Exception {
   ExpectException(this.message);
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index c08f649..b1ba358 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.11.10
+  * Fix some style glitches with naming. The only publicly visible one
+    is DateFormat.parseUtc, but the parseUTC variant is still retained
+    for backward-compatibility.
+
 ## 0.11.9
   * Fix bug with per-mille parsing (only divided by 100, not 1000)
   
diff --git a/pkg/intl/bin/generate_from_arb.dart b/pkg/intl/bin/generate_from_arb.dart
index 1d576bcf..7156e23 100644
--- a/pkg/intl/bin/generate_from_arb.dart
+++ b/pkg/intl/bin/generate_from_arb.dart
@@ -137,5 +137,5 @@
   List<MainMessage> _findOriginals() => originalMessages = messages[id];
 }
 
-final pluralAndGenderParser = new ICUParser().message;
-final plainParser = new ICUParser().nonIcuMessage;
+final pluralAndGenderParser = new IcuParser().message;
+final plainParser = new IcuParser().nonIcuMessage;
diff --git a/pkg/intl/lib/date_symbol_data_http_request.dart b/pkg/intl/lib/date_symbol_data_http_request.dart
index 4c54147..4f724f8 100644
--- a/pkg/intl/lib/date_symbol_data_http_request.dart
+++ b/pkg/intl/lib/date_symbol_data_http_request.dart
@@ -26,10 +26,10 @@
  *   "http://localhost:8000/dates/"
  */
 Future initializeDateFormatting(String locale, String url) {
-  var reader = new HTTPRequestDataReader('${url}symbols/');
+  var reader = new HttpRequestDataReader('${url}symbols/');
   initializeDateSymbols(() => new LazyLocaleData(
       reader, _createDateSymbol, availableLocalesForDateFormatting));
-  var reader2 = new HTTPRequestDataReader('${url}patterns/');
+  var reader2 = new HttpRequestDataReader('${url}patterns/');
   initializeDatePatterns(() => new LazyLocaleData(
       reader2, (x) => x, availableLocalesForDateFormatting));
   var actualLocale = Intl.verifiedLocale(locale,
diff --git a/pkg/intl/lib/src/http_request_data_reader.dart b/pkg/intl/lib/src/http_request_data_reader.dart
index a79d16f..ce63870 100644
--- a/pkg/intl/lib/src/http_request_data_reader.dart
+++ b/pkg/intl/lib/src/http_request_data_reader.dart
@@ -13,11 +13,11 @@
 import 'dart:html';
 import 'intl_helpers.dart';
 
-class HTTPRequestDataReader implements LocaleDataReader {
+class HttpRequestDataReader implements LocaleDataReader {
 
   /** The base url from which we read the data. */
   String url;
-  HTTPRequestDataReader(this.url);
+  HttpRequestDataReader(this.url);
 
   Future read(String locale) {
     // TODO(alanknight): Remove this once it's not necessary for Chrome.
diff --git a/pkg/intl/lib/src/icu_parser.dart b/pkg/intl/lib/src/icu_parser.dart
index d83c089..0565ce0 100644
--- a/pkg/intl/lib/src/icu_parser.dart
+++ b/pkg/intl/lib/src/icu_parser.dart
@@ -13,11 +13,11 @@
 
 /**
  * This defines a grammar for ICU MessageFormat syntax. Usage is
- *       new ICUParser.message.parse(<string>).value;
+ *       new IcuParser.message.parse(<string>).value;
  * The "parse" method will return a Success or Failure object which responds
  * to "value".
  */
-class ICUParser {
+class IcuParser {
   get openCurly => char("{");
 
   get closeCurly => char("}");
@@ -69,7 +69,7 @@
       gender.map((values) => new Gender.from(values.first, values[3], null));
   get selectClause => (id & openCurly & interiorText & closeCurly).map(
       (x) => [x.first, x[2]]);
-  get generalSelect => preface & selectLiteral & comma & 
+  get generalSelect => preface & selectLiteral & comma &
       selectClause.plus() & closeCurly;
   get intlSelect => generalSelect.map(
       (values) => new Select.from(values.first, values[3], null));
@@ -79,7 +79,7 @@
   get contents => pluralOrGenderOrSelect | parameter | messageText;
   get simpleText => (nonIcuMessageText | parameter | openCurly).plus();
   get empty => epsilon().map((_) => '');
-  
+
   get parameter => (openCurly & id & closeCurly).map(
       (param) => new VariableSubstitution.named(param[1], null));
 
@@ -91,17 +91,16 @@
       Message.from(chunk, null));
 
   /**
-   * Represents an ordinary message, i.e. not a plural/gender/select, although 
+   * Represents an ordinary message, i.e. not a plural/gender/select, although
    * it may have parameters.
    */
   get nonIcuMessage => (simpleText | empty).map((chunk) =>
-      Message.from(chunk, null));  
-  
+      Message.from(chunk, null));
+
   get stuff => (pluralOrGenderOrSelect | empty).map(
       (chunk) => Message.from(chunk, null));
-  
 
-  ICUParser() {
+  IcuParser() {
     // There is a cycle here, so we need the explicit set to avoid
     // infinite recursion.
     interiorText.set(contents.plus() | empty);
diff --git a/pkg/intl/lib/src/intl/date_format.dart b/pkg/intl/lib/src/intl/date_format.dart
index 54fb3f0..3aede36 100644
--- a/pkg/intl/lib/src/intl/date_format.dart
+++ b/pkg/intl/lib/src/intl/date_format.dart
@@ -291,10 +291,24 @@
   /**
    * Given user input, attempt to parse the [inputString] into the anticipated
    * format, treating it as being in UTC.
+   *
+   * The canonical Dart style name
+   * is [parseUtc], but [parseUTC] is retained
+   * for backward-compatibility.
    */
   DateTime parseUTC(String inputString) => parse(inputString, true);
 
   /**
+   * Given user input, attempt to parse the [inputString] into the anticipated
+   * format, treating it as being in UTC.
+   *
+   * The canonical Dart style name
+   * is [parseUtc], but [parseUTC] is retained
+   * for backward-compatibility.
+   */
+  DateTime parseUtc(String inputString) => parse(inputString, true);
+
+  /**
    * Return the locale code in which we operate, e.g. 'en_US' or 'pt'.
    */
   String get locale => _locale;
diff --git a/pkg/mutation_observer/LICENSE b/pkg/mutation_observer/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/pkg/mutation_observer/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2014, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of Google Inc. nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/mutation_observer/README.md b/pkg/mutation_observer/README.md
deleted file mode 100644
index ea4f66a..0000000
--- a/pkg/mutation_observer/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Mutation Observers polyfill
-
-Mutation Observers provide a way to react to changes in the DOM. This is needed
-on IE versions 9 and 10, see <http://caniuse.com/mutationobserver>.
-
-## More information
-
-* [API documentation](http://api.dartlang.org/docs/bleeding_edge/dart_html/MutationObserver.html)
-* [Mozilla Developer Network page](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)
-* [Specification](https://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#mutation-observers)
-
-## Getting started
-
-Include the polyfill in your HTML `<head>`:
-
-```html
-    <script src="packages/mutation_observer/mutation_observer.js"></script>
-```
-
-You can also use a minified version for deployment:
-
-```html
-    <script src="packages/mutation_observer/mutation_observer.min.js"></script>
-```
-
-## Getting the source code
-
-The source for this package is at:
-<https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/pkg/mutation_observer/>
-
-The original source of the JavaScript code is at:
-<https://github.com/Polymer/MutationObservers/tree/master>
-
-## Building
-
-The minified version is produced with:
-
-```bash
-    uglifyjs mutation_observer.js -o mutation_observer.min.js
-```
-
-See <https://github.com/mishoo/UglifyJS2> for usage of UglifyJS.
diff --git a/pkg/mutation_observer/lib/mutation_observer.js b/pkg/mutation_observer/lib/mutation_observer.js
deleted file mode 100644
index cae8709..0000000
--- a/pkg/mutation_observer/lib/mutation_observer.js
+++ /dev/null
@@ -1,588 +0,0 @@
-/*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is goverened by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-// TODO(jmesserly): polyfill does not have feature testing or the definition of
-// SideTable. The extra code is from:
-// https://github.com/Polymer/CustomElements/blob/master/src/MutationObserver.js
-// https://github.com/Polymer/CustomElements/blob/master/src/sidetable.js
-// I also renamed JsMutationObserver -> MutationObserver to correctly interact
-// with dart2js interceptors.
-
-if (!window.MutationObserver && !window.WebKitMutationObserver) {
-
-(function(global) {
-  // SideTable is a weak map where possible. If WeakMap is not available the
-  // association is stored as an expando property.
-  var SideTable;
-  // TODO(arv): WeakMap does not allow for Node etc to be keys in Firefox
-  if (typeof WeakMap !== 'undefined' && navigator.userAgent.indexOf('Firefox/') < 0) {
-    SideTable = WeakMap;
-  } else {
-    (function() {
-      var defineProperty = Object.defineProperty;
-      var hasOwnProperty = Object.hasOwnProperty;
-      var counter = new Date().getTime() % 1e9;
-
-      SideTable = function() {
-        this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
-      };
-
-      SideTable.prototype = {
-        set: function(key, value) {
-          defineProperty(key, this.name, {value: value, writable: true});
-        },
-        get: function(key) {
-          return hasOwnProperty.call(key, this.name) ? key[this.name] : undefined;
-        },
-        delete: function(key) {
-          this.set(key, undefined);
-        }
-      }
-    })();
-  }
-
-  var registrationsTable = new SideTable();
-
-  // We use setImmediate or postMessage for our future callback.
-  var setImmediate = window.msSetImmediate;
-
-  // Use post message to emulate setImmediate.
-  if (!setImmediate) {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener('message', function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, '*');
-    };
-  }
-
-  // This is used to ensure that we never schedule 2 callas to setImmediate
-  var isScheduled = false;
-
-  // Keep track of observers that needs to be notified next time.
-  var scheduledObservers = [];
-
-  /**
-   * Schedules |dispatchCallback| to be called in the future.
-   * @param {MutationObserver} observer
-   */
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill &&
-        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||
-        node;
-  }
-
-  function dispatchCallbacks() {
-    // http://dom.spec.whatwg.org/#mutation-observers
-
-    isScheduled = false; // Used to allow a new setImmediate call above.
-
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    // Sort observers based on their creation UID (incremental).
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-
-      // 2.1, 2.2
-      var queue = observer.takeRecords();
-      // 2.3. Remove all transient registered observers whose observer is mo.
-      removeTransientObserversFor(observer);
-
-      // 2.4
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-
-    // 3.
-    if (anyNonEmpty)
-      dispatchCallbacks();
-  }
-
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer)
-          registration.removeTransientObservers();
-      });
-    });
-  }
-
-  /**
-   * This function is used for the "For each registered observer observer (with
-   * observer's options as options) in target's list of registered observers,
-   * run these substeps:" and the "For each ancestor ancestor of target, and for
-   * each registered observer observer (with options options) in ancestor's list
-   * of registered observers, run these substeps:" part of the algorithms. The
-   * |options.subtree| is checked to ensure that the callback is called
-   * correctly.
-   *
-   * @param {Node} target
-   * @param {function(MutationObserverInit):MutationRecord} callback
-   */
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-
-          // Only target ignores subtree.
-          if (node !== target && !options.subtree)
-            continue;
-
-          var record = callback(options);
-          if (record)
-            registration.enqueue(record);
-        }
-      }
-    }
-  }
-
-  var uidCounter = 0;
-
-  /**
-   * The class that maps to the DOM MutationObserver interface.
-   * @param {Function} callback.
-   * @constructor
-   */
-  function MutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-
-  MutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-
-      // 1.1
-      if (!options.childList && !options.attributes && !options.characterData ||
-
-          // 1.2
-          options.attributeOldValue && !options.attributes ||
-
-          // 1.3
-          options.attributeFilter && options.attributeFilter.length &&
-              !options.attributes ||
-
-          // 1.4
-          options.characterDataOldValue && !options.characterData) {
-
-        throw new SyntaxError();
-      }
-
-      var registrations = registrationsTable.get(target);
-      if (!registrations)
-        registrationsTable.set(target, registrations = []);
-
-      // 2
-      // If target's list of registered observers already includes a registered
-      // observer associated with the context object, replace that registered
-      // observer's options with options.
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-
-      // 3.
-      // Otherwise, add a new registered observer to target's list of registered
-      // observers with the context object as the observer and options as the
-      // options, and add target to context object's list of nodes on which it
-      // is registered.
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-
-      registration.addListeners();
-    },
-
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-
-  /**
-   * @param {string} type
-   * @param {Node} target
-   * @constructor
-   */
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-
-  // TODO(jmesserly): this fixes the interceptor dispatch on IE.
-  // Not sure why this is necessary.
-  MutationObserver.prototype.constructor = MutationObserver;
-  MutationObserver.name = 'MutationObserver';
-  MutationRecord.prototype.constructor = MutationRecord;
-  MutationRecord.name = 'MutationRecord';
-
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  };
-
-  // We keep track of the two (possibly one) records used in a single mutation.
-  var currentRecord, recordWithOldValue;
-
-  /**
-   * Creates a record without |oldValue| and caches it as |currentRecord| for
-   * later use.
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-
-  /**
-   * Gets or creates a record with |oldValue| based in the |currentRecord|
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue)
-      return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-
-  /**
-   * @param {MutationRecord} record
-   * @return {boolean} Whether the record represents a record from the current
-   * mutation event.
-   */
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-
-  /**
-   * Selects which record, if any, to replace the last record in the queue.
-   * This returns |null| if no record should be replaced.
-   *
-   * @param {MutationRecord} lastRecord
-   * @param {MutationRecord} newRecord
-   * @param {MutationRecord}
-   */
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord)
-      return lastRecord;
-
-    // Check if the the record we are adding represents the same record. If
-    // so, we keep the one with the oldValue in it.
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))
-      return recordWithOldValue;
-
-    return null;
-  }
-
-  /**
-   * Class used to represent a registered observer.
-   * @param {MutationObserver} observer
-   * @param {Node} target
-   * @param {MutationObserverInit} options
-   * @constructor
-   */
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-
-      // There are cases where we replace the last record with the new record.
-      // For example if the record represents the same mutation we need to use
-      // the one with the oldValue. If we get same record (this can happen as we
-      // walk up the tree) we ignore the new record.
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-
-      records[length] = record;
-    },
-
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.addEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.addEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.addEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.addEventListener('DOMNodeRemoved', this, true);
-    },
-
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.removeEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.removeEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.removeEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.removeEventListener('DOMNodeRemoved', this, true);
-    },
-
-    /**
-     * Adds a transient observer on node. The transient observer gets removed
-     * next time we deliver the change records.
-     * @param {Node} node
-     */
-    addTransientObserver: function(node) {
-      // Don't add transient observers on the target itself. We already have all
-      // the required listeners set up on the target.
-      if (node === this.target)
-        return;
-
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        registrationsTable.set(node, registrations = []);
-
-      // We know that registrations does not contain this because we already
-      // checked if node === this.target.
-      registrations.push(this);
-    },
-
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-
-      transientObservedNodes.forEach(function(node) {
-        // Transient observers are never added to the target.
-        this.removeListeners_(node);
-
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-    },
-
-    handleEvent: function(e) {
-      // Stop propagation since we are managing the propagation manually.
-      // This means that other mutation events on the page will not work
-      // correctly but that is by design.
-      e.stopImmediatePropagation();
-
-      switch (e.type) {
-        case 'DOMAttrModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes
-
-          var name = e.attrName;
-          var namespace = e.relatedNode.namespaceURI;
-          var target = e.target;
-
-          // 1.
-          var record = new getRecord('attributes', target);
-          record.attributeName = name;
-          record.attributeNamespace = namespace;
-
-          // 2.
-          var oldValue =
-              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.attributes)
-              return;
-
-            // 3.2, 4.3
-            if (options.attributeFilter && options.attributeFilter.length &&
-                options.attributeFilter.indexOf(name) === -1 &&
-                options.attributeFilter.indexOf(namespace) === -1) {
-              return;
-            }
-            // 3.3, 4.4
-            if (options.attributeOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.4, 4.5
-            return record;
-          });
-
-          break;
-
-        case 'DOMCharacterDataModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata
-          var target = e.target;
-
-          // 1.
-          var record = getRecord('characterData', target);
-
-          // 2.
-          var oldValue = e.prevValue;
-
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.characterData)
-              return;
-
-            // 3.2, 4.3
-            if (options.characterDataOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.3, 4.4
-            return record;
-          });
-
-          break;
-
-        case 'DOMNodeRemoved':
-          this.addTransientObserver(e.target);
-          // Fall through.
-        case 'DOMNodeInserted':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist
-          var target = e.relatedNode;
-          var changedNode = e.target;
-          var addedNodes, removedNodes;
-          if (e.type === 'DOMNodeInserted') {
-            addedNodes = [changedNode];
-            removedNodes = [];
-          } else {
-
-            addedNodes = [];
-            removedNodes = [changedNode];
-          }
-          var previousSibling = changedNode.previousSibling;
-          var nextSibling = changedNode.nextSibling;
-
-          // 1.
-          var record = getRecord('childList', target);
-          record.addedNodes = addedNodes;
-          record.removedNodes = removedNodes;
-          record.previousSibling = previousSibling;
-          record.nextSibling = nextSibling;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 2.1, 3.2
-            if (!options.childList)
-              return;
-
-            // 2.2, 3.3
-            return record;
-          });
-
-      }
-
-      clearRecords();
-    }
-  };
-
-  global.MutationObserver = MutationObserver;
-})(window);
-
-}
diff --git a/pkg/mutation_observer/lib/mutation_observer.min.js b/pkg/mutation_observer/lib/mutation_observer.min.js
deleted file mode 100644
index 1c25e0b..0000000
--- a/pkg/mutation_observer/lib/mutation_observer.min.js
+++ /dev/null
@@ -1 +0,0 @@
-if(!window.MutationObserver&&!window.WebKitMutationObserver){!function(global){var SideTable;if(typeof WeakMap!=="undefined"&&navigator.userAgent.indexOf("Firefox/")<0){SideTable=WeakMap}else{!function(){var defineProperty=Object.defineProperty;var hasOwnProperty=Object.hasOwnProperty;var counter=(new Date).getTime()%1e9;SideTable=function(){this.name="__st"+(Math.random()*1e9>>>0)+(counter++ +"__")};SideTable.prototype={set:function(key,value){defineProperty(key,this.name,{value:value,writable:true})},get:function(key){return hasOwnProperty.call(key,this.name)?key[this.name]:undefined},"delete":function(key){this.set(key,undefined)}}}()}var registrationsTable=new SideTable;var setImmediate=window.msSetImmediate;if(!setImmediate){var setImmediateQueue=[];var sentinel=String(Math.random());window.addEventListener("message",function(e){if(e.data===sentinel){var queue=setImmediateQueue;setImmediateQueue=[];queue.forEach(function(func){func()})}});setImmediate=function(func){setImmediateQueue.push(func);window.postMessage(sentinel,"*")}}var isScheduled=false;var scheduledObservers=[];function scheduleCallback(observer){scheduledObservers.push(observer);if(!isScheduled){isScheduled=true;setImmediate(dispatchCallbacks)}}function wrapIfNeeded(node){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(node)||node}function dispatchCallbacks(){isScheduled=false;var observers=scheduledObservers;scheduledObservers=[];observers.sort(function(o1,o2){return o1.uid_-o2.uid_});var anyNonEmpty=false;observers.forEach(function(observer){var queue=observer.takeRecords();removeTransientObserversFor(observer);if(queue.length){observer.callback_(queue,observer);anyNonEmpty=true}});if(anyNonEmpty)dispatchCallbacks()}function removeTransientObserversFor(observer){observer.nodes_.forEach(function(node){var registrations=registrationsTable.get(node);if(!registrations)return;registrations.forEach(function(registration){if(registration.observer===observer)registration.removeTransientObservers()})})}function forEachAncestorAndObserverEnqueueRecord(target,callback){for(var node=target;node;node=node.parentNode){var registrations=registrationsTable.get(node);if(registrations){for(var j=0;j<registrations.length;j++){var registration=registrations[j];var options=registration.options;if(node!==target&&!options.subtree)continue;var record=callback(options);if(record)registration.enqueue(record)}}}}var uidCounter=0;function MutationObserver(callback){this.callback_=callback;this.nodes_=[];this.records_=[];this.uid_=++uidCounter}MutationObserver.prototype={observe:function(target,options){target=wrapIfNeeded(target);if(!options.childList&&!options.attributes&&!options.characterData||options.attributeOldValue&&!options.attributes||options.attributeFilter&&options.attributeFilter.length&&!options.attributes||options.characterDataOldValue&&!options.characterData){throw new SyntaxError}var registrations=registrationsTable.get(target);if(!registrations)registrationsTable.set(target,registrations=[]);var registration;for(var i=0;i<registrations.length;i++){if(registrations[i].observer===this){registration=registrations[i];registration.removeListeners();registration.options=options;break}}if(!registration){registration=new Registration(this,target,options);registrations.push(registration);this.nodes_.push(target)}registration.addListeners()},disconnect:function(){this.nodes_.forEach(function(node){var registrations=registrationsTable.get(node);for(var i=0;i<registrations.length;i++){var registration=registrations[i];if(registration.observer===this){registration.removeListeners();registrations.splice(i,1);break}}},this);this.records_=[]},takeRecords:function(){var copyOfRecords=this.records_;this.records_=[];return copyOfRecords}};function MutationRecord(type,target){this.type=type;this.target=target;this.addedNodes=[];this.removedNodes=[];this.previousSibling=null;this.nextSibling=null;this.attributeName=null;this.attributeNamespace=null;this.oldValue=null}MutationObserver.prototype.constructor=MutationObserver;MutationObserver.name="MutationObserver";MutationRecord.prototype.constructor=MutationRecord;MutationRecord.name="MutationRecord";function copyMutationRecord(original){var record=new MutationRecord(original.type,original.target);record.addedNodes=original.addedNodes.slice();record.removedNodes=original.removedNodes.slice();record.previousSibling=original.previousSibling;record.nextSibling=original.nextSibling;record.attributeName=original.attributeName;record.attributeNamespace=original.attributeNamespace;record.oldValue=original.oldValue;return record}var currentRecord,recordWithOldValue;function getRecord(type,target){return currentRecord=new MutationRecord(type,target)}function getRecordWithOldValue(oldValue){if(recordWithOldValue)return recordWithOldValue;recordWithOldValue=copyMutationRecord(currentRecord);recordWithOldValue.oldValue=oldValue;return recordWithOldValue}function clearRecords(){currentRecord=recordWithOldValue=undefined}function recordRepresentsCurrentMutation(record){return record===recordWithOldValue||record===currentRecord}function selectRecord(lastRecord,newRecord){if(lastRecord===newRecord)return lastRecord;if(recordWithOldValue&&recordRepresentsCurrentMutation(lastRecord))return recordWithOldValue;return null}function Registration(observer,target,options){this.observer=observer;this.target=target;this.options=options;this.transientObservedNodes=[]}Registration.prototype={enqueue:function(record){var records=this.observer.records_;var length=records.length;if(records.length>0){var lastRecord=records[length-1];var recordToReplaceLast=selectRecord(lastRecord,record);if(recordToReplaceLast){records[length-1]=recordToReplaceLast;return}}else{scheduleCallback(this.observer)}records[length]=record},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(node){var options=this.options;if(options.attributes)node.addEventListener("DOMAttrModified",this,true);if(options.characterData)node.addEventListener("DOMCharacterDataModified",this,true);if(options.childList)node.addEventListener("DOMNodeInserted",this,true);if(options.childList||options.subtree)node.addEventListener("DOMNodeRemoved",this,true)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(node){var options=this.options;if(options.attributes)node.removeEventListener("DOMAttrModified",this,true);if(options.characterData)node.removeEventListener("DOMCharacterDataModified",this,true);if(options.childList)node.removeEventListener("DOMNodeInserted",this,true);if(options.childList||options.subtree)node.removeEventListener("DOMNodeRemoved",this,true)},addTransientObserver:function(node){if(node===this.target)return;this.addListeners_(node);this.transientObservedNodes.push(node);var registrations=registrationsTable.get(node);if(!registrations)registrationsTable.set(node,registrations=[]);registrations.push(this)},removeTransientObservers:function(){var transientObservedNodes=this.transientObservedNodes;this.transientObservedNodes=[];transientObservedNodes.forEach(function(node){this.removeListeners_(node);var registrations=registrationsTable.get(node);for(var i=0;i<registrations.length;i++){if(registrations[i]===this){registrations.splice(i,1);break}}},this)},handleEvent:function(e){e.stopImmediatePropagation();switch(e.type){case"DOMAttrModified":var name=e.attrName;var namespace=e.relatedNode.namespaceURI;var target=e.target;var record=new getRecord("attributes",target);record.attributeName=name;record.attributeNamespace=namespace;var oldValue=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;forEachAncestorAndObserverEnqueueRecord(target,function(options){if(!options.attributes)return;if(options.attributeFilter&&options.attributeFilter.length&&options.attributeFilter.indexOf(name)===-1&&options.attributeFilter.indexOf(namespace)===-1){return}if(options.attributeOldValue)return getRecordWithOldValue(oldValue);return record});break;case"DOMCharacterDataModified":var target=e.target;var record=getRecord("characterData",target);var oldValue=e.prevValue;forEachAncestorAndObserverEnqueueRecord(target,function(options){if(!options.characterData)return;if(options.characterDataOldValue)return getRecordWithOldValue(oldValue);return record});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var target=e.relatedNode;var changedNode=e.target;var addedNodes,removedNodes;if(e.type==="DOMNodeInserted"){addedNodes=[changedNode];removedNodes=[]}else{addedNodes=[];removedNodes=[changedNode]}var previousSibling=changedNode.previousSibling;var nextSibling=changedNode.nextSibling;var record=getRecord("childList",target);record.addedNodes=addedNodes;record.removedNodes=removedNodes;record.previousSibling=previousSibling;record.nextSibling=nextSibling;forEachAncestorAndObserverEnqueueRecord(target,function(options){if(!options.childList)return;return record})}clearRecords()}};global.MutationObserver=MutationObserver}(window)}
\ No newline at end of file
diff --git a/pkg/mutation_observer/pubspec.yaml b/pkg/mutation_observer/pubspec.yaml
deleted file mode 100644
index c7b1079..0000000
--- a/pkg/mutation_observer/pubspec.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: mutation_observer
-version: 0.9.0+2
-author: "Polymer.dart Team <web-ui-dev@dartlang.org>"
-homepage: https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/pkg/mutation_observer/
-description: >
-  *Deprecated* newer version is in web_components package.
-dev_dependencies:
-  unittest: ">=0.9.0 <0.11.0"
-environment:
-  sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/mutation_observer/test/mutation_observer_test.dart b/pkg/mutation_observer/test/mutation_observer_test.dart
deleted file mode 100644
index 6f257e4f..0000000
--- a/pkg/mutation_observer/test/mutation_observer_test.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2013, 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.
-
-library mutation_observer_test;
-
-import 'dart:html';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-
-main() {
-  useHtmlConfiguration();
-
-  // Load the MutationObserver polyfill.
-  HttpRequest.getString('/root_dart/pkg/mutation_observer/lib/'
-      'mutation_observer.min.js').then((code) {
-
-    // Force MutationObserver polyfill to be used so we can test it, even in
-    // browsers with native support.
-    document.head.children.add(new ScriptElement()
-        ..text = 'window.MutationObserver = void 0;'
-                 'window.WebKitMutationObserver = void 0;'
-                 '$code');
-
-    testMutationObserver();
-  });
-}
-
-/**
- * Test suite for Mutation Observers. This is just a small set of sanity
- * checks, not a complete test suite.
- */
-testMutationObserver() {
-  group('supported', () {
-    test('supported', () {
-      expect(MutationObserver.supported, true, reason: 'polyfill loaded.');
-    });
-  });
-
-  group('childList', () {
-    mutationCallback(count, expectation) {
-      var done = false;
-      var nodes = [];
-
-      callback(mutations, observer) {
-        for (MutationRecord mutation in mutations) {
-          for (Node node in mutation.addedNodes) {
-            nodes.add(node);
-          }
-        }
-        if (nodes.length >= count) {
-          done = true;
-          expect(nodes.length, count);
-          expect(nodes, expectation);
-        }
-      }
-
-      return expectAsyncUntil(callback, () => done);
-    }
-
-    test('empty options is syntax error', () {
-      var mutationObserver = new MutationObserver(
-          (mutations, observer) { expect(false, isTrue,
-              reason: 'Should not be reached'); });
-      expect(() { mutationObserver.observe(document); },
-             throws);
-    });
-
-    test('direct-parallel options-named', () {
-      var container = new DivElement();
-      var div1 = new DivElement();
-      var div2 = new DivElement();
-      var mutationObserver = new MutationObserver(
-          mutationCallback(2, orderedEquals([div1, div2])));
-      mutationObserver.observe(container, childList: true);
-
-      container.append(div1);
-      container.append(div2);
-    });
-
-    test('direct-nested options-named', () {
-      var container = new DivElement();
-      var div1 = new DivElement();
-      var div2 = new DivElement();
-      var mutationObserver =
-          new MutationObserver(mutationCallback(1, orderedEquals([div1])));
-      mutationObserver.observe(container, childList: true);
-
-      container.append(div1);
-      div1.append(div2);
-    });
-
-    test('subtree options-named', () {
-      var container = new DivElement();
-      var div1 = new DivElement();
-      var div2 = new DivElement();
-      var mutationObserver = new MutationObserver(
-          mutationCallback(2, orderedEquals([div1, div2])));
-      mutationObserver.observe(container, childList: true, subtree: true);
-
-      container.append(div1);
-      div1.append(div2);
-    });
-  });
-}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index b7f4dbe..7ecf212 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -73,6 +73,7 @@
 analysis_server/test/analysis_server_test: Skip  # Times out
 analysis_server/test/domain_context_test: Skip  # Times out
 analysis_server/test/domain_server_test: Skip  # Times out
+analysis_server/test/integration/analysis/reanalyze_concurrent_test: Skip # Times out
 analysis_server/test/integration/analysis/update_content_test: Skip # Times out
 analysis_server/tool/spec/check_all_test: Skip # Times out
 analyzer/test/generated/element_test: Skip  # Times out
@@ -252,7 +253,6 @@
 polymer/e2e_test/*: Pass, RuntimeError # Issue 19265
 polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
 polymer_expressions/*: Pass, RuntimeError # Issue 19265
-template_binding/test/custom_element_bindings_test: Pass, RuntimeError # Issue 20714
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
 typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
 
@@ -298,7 +298,6 @@
 # This test uses third_party/pkg/perf_api/lib/perf_api.dart, which
 # contains illegal constant constructors.
 third_party/angular_tests/browser_test: CompileTimeError
-custom_element/test/analyzer_test: StaticWarning # Issue 20939
 
 [ $compiler == dart2js && $runtime == none]
 polymer/e2e_test/canonicalization: Skip
@@ -446,7 +445,6 @@
 
 [ $runtime == vm ]
 # Skip tests on the VM if the package depends on dart:html
-custom_element: Skip
 template_binding: Skip
 mutation_observer: Skip
 polymer_expressions/test/syntax_test: Skip
@@ -495,10 +493,3 @@
 
 [ $system == windows ]
 analysis_server/test/integration/search/get_type_hierarchy_test: Pass, Fail # Issue 20436
-
-[ $runtime == safari && $builder_tag == mac10_8 ]
-polymer/e2e_test/good_import/test/import_test: RuntimeError # Issue 21424
-polymer/test/custom_event_test: RuntimeError # Issue 21425
-polymer/test/instance_attrs_test: RuntimeError # Issue 21425
-polymer/test/property_observe_test: RuntimeError # Issue 21425
-intl/test/date_time_format_http_request_test: RuntimeError # Issue 21428
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 20d8052..16bd7c7 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -249,13 +249,19 @@
     // Process all classes and top-level functions to include initializers,
     // register custom elements, and include special fields and methods in
     // custom element classes.
+    var functionsSeen = new Set<FunctionElement>();
+    var classesSeen = new Set<ClassElement>();
     for (var id in entryLibraries) {
       var lib = resolver.getLibrary(id);
       for (var fun in _visibleTopLevelMethodsOf(lib)) {
+        if (functionsSeen.contains(fun)) continue;
+        functionsSeen.add(fun);
         _processFunction(fun, id);
       }
 
       for (var cls in _visibleClassesOf(lib)) {
+        if (classesSeen.contains(cls)) continue;
+        classesSeen.add(cls);
         _processClass(cls, id, recorder);
       }
     }
@@ -824,8 +830,7 @@
   var result = [];
   result.addAll(lib.units.expand((u) => u.functions));
   for (var e in lib.exports) {
-    var exported = e.exportedLibrary.units
-        .expand((u) => u.functions).toList();
+    var exported = e.exportedLibrary.units.expand((u) => u.functions).toList();
     _filter(exported, e.combinators);
     result.addAll(exported);
   }
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index f94eb8a..ad7a7b7 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.15.1+3
+version: 0.15.1+4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 3e844d5..2f14cd4 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -245,7 +245,8 @@
           '<!DOCTYPE html><html><head>'
           '</head><body><div></div>',
       'a|web/test.html._data':
-          expectedData(['web/a.dart', 'web/b.dart', 'web/c.dart', 'web/d.dart']),
+          expectedData(['web/a.dart', 'web/b.dart', 'web/c.dart',
+              'web/i.dart', 'web/j.dart', 'web/d.dart']),
       'a|web/d.dart':
           'library d;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -253,6 +254,7 @@
 
       'a|web/a.dart':
           'import "package:polymer/polymer.dart";\n'
+          'export "i.dart" hide mI2;\n'
           '@initMethod mA(){}\n',
 
       'a|web/b.dart':
@@ -296,6 +298,15 @@
           '@initMethod mH1(){}\n'
           '@CustomTag("x-h2") class XH2 extends PolymerElement {}\n'
           '@initMethod mH2(){}\n',
+
+      'a|web/i.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-i") class XI extends PolymerElement {}\n'
+          '@initMethod mI1(){}\n'
+          '@initMethod mI2(){}\n',
+
+      'a|web/j.dart':
+          'export "a.dart";\n',
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body><div></div>'
@@ -308,36 +319,43 @@
           import 'a.dart' as i0;
           import 'b.dart' as i1;
           import 'c.dart' as i2;
-          import 'd.dart' as i3;
+          import 'i.dart' as i3;
+          import 'j.dart' as i4;
+          import 'd.dart' as i5;
           ${DEFAULT_IMPORTS.join('\n')}
-          import 'e.dart' as smoke_0;
+          import 'i.dart' as smoke_0;
           import 'package:polymer/polymer.dart' as smoke_1;
-          import 'f.dart' as smoke_2;
-          import 'g.dart' as smoke_3;
-          import 'h.dart' as smoke_4;
-          import 'c.dart' as smoke_5;
+          import 'e.dart' as smoke_2;
+          import 'f.dart' as smoke_3;
+          import 'g.dart' as smoke_4;
+          import 'h.dart' as smoke_5;
+          import 'c.dart' as smoke_6;
 
           void main() {
             useGeneratedCode(new StaticConfiguration(
                 checkedMode: false,
                 parents: {
-                  smoke_5.XC1: smoke_1.PolymerElement,
-                  smoke_5.XC2: smoke_1.PolymerElement,
-                  smoke_0.XE: smoke_1.PolymerElement,
-                  smoke_2.XF1: smoke_1.PolymerElement,
-                  smoke_3.XG2: smoke_1.PolymerElement,
-                  smoke_4.XH1: smoke_1.PolymerElement,
+                  smoke_6.XC1: smoke_1.PolymerElement,
+                  smoke_6.XC2: smoke_1.PolymerElement,
+                  smoke_2.XE: smoke_1.PolymerElement,
+                  smoke_3.XF1: smoke_1.PolymerElement,
+                  smoke_4.XG2: smoke_1.PolymerElement,
+                  smoke_5.XH1: smoke_1.PolymerElement,
+                  smoke_0.XI: smoke_1.PolymerElement,
                 },
                 declarations: {
-                  smoke_5.XC1: {},
-                  smoke_5.XC2: {},
-                  smoke_0.XE: {},
-                  smoke_2.XF1: {},
-                  smoke_3.XG2: {},
-                  smoke_4.XH1: {},
+                  smoke_6.XC1: {},
+                  smoke_6.XC2: {},
+                  smoke_2.XE: {},
+                  smoke_3.XF1: {},
+                  smoke_4.XG2: {},
+                  smoke_5.XH1: {},
+                  smoke_0.XI: {},
                 }));
             configureForDeployment([
                 i0.mA,
+                i0.mI1,
+                () => Polymer.register('x-i', i0.XI),
                 i1.mB,
                 i1.mE,
                 i1.mF1,
@@ -348,9 +366,10 @@
                 () => Polymer.register('x-h1', i1.XH1),
                 () => Polymer.register('x-c1', i2.XC1),
                 () => Polymer.register('x-c2', i2.XC2),
-                i3.mD,
+                i3.mI2,
+                i5.mD,
               ]);
-            i3.main();
+            i5.main();
           }
           '''.replaceAll('\n          ', '\n'),
     }, null);
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index fde463b..cc68bf3 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -26,15 +26,9 @@
 main() => dirtyCheckZone().run(() {
   useHtmlConfiguration();
 
-  // Load MutationObserver polyfill in case IE needs it.
-  var script = new ScriptElement()
-      ..src = '/root_dart/pkg/mutation_observer/lib/mutation_observer.min.js';
-  var polyfillLoaded = script.onLoad.first;
-  document.head.append(script);
-
-  setUp(() => polyfillLoaded.then((_) {
+  setUp(() {
     document.body.append(testDiv = new DivElement());
-  }));
+  });
 
   tearDown(() {
     testDiv.remove();
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 9e374ae..22b08aa 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -451,6 +451,8 @@
       return encoding.decode(output);
     }
 
+    _processes.remove(_serviceId);
+
     return new _ProcessResult(
         result[0],
         result[1],
diff --git a/runtime/bin/stdio_patch.dart b/runtime/bin/stdio_patch.dart
index 9a0e5af..d400306 100644
--- a/runtime/bin/stdio_patch.dart
+++ b/runtime/bin/stdio_patch.dart
@@ -30,7 +30,7 @@
       case _STDIO_HANDLE_TYPE_PIPE:
       case _STDIO_HANDLE_TYPE_SOCKET:
       case _STDIO_HANDLE_TYPE_FILE:
-        return wrap(new IOSink(new _StdConsumer(fd)));
+        return wrap(new IOSink(new _FileStreamConsumer.fromStdio(fd)));
       default:
         throw new FileSystemException("Unsupported stdin type");
     }
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index eea0fa5..d8ca287 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -21,6 +21,36 @@
   return listener.result;
 }
 
+patch class Utf8Decoder {
+  /* patch */
+  Converter<List<int>, dynamic> fuse(Converter<String, dynamic> next) {
+    if (next is JsonDecoder) {
+      return new _JsonUtf8Decoder(next._reviver, this._allowMalformed);
+    }
+    // TODO(lrn): Recognize a fused decoder where the next step is JsonDecoder.
+    return super.fuse(next);
+  }
+}
+
+class _JsonUtf8Decoder extends Converter<List<int>, Object> {
+  final _Reviver _reviver;
+  final bool _allowMalformed;
+
+  _JsonUtf8Decoder(this._reviver, this._allowMalformed);
+
+  dynamic convert(List<int> input) {
+    var parser = _JsonUtf8DecoderSink._createParser(_reviver, _allowMalformed);
+    parser.chunk = input;
+    parser.chunkEnd = input.length;
+    parser.parse(0);
+    return parser.result;
+  }
+
+  ByteConversionSink startChunkedConversion(Sink<Object> sink) {
+    return new _JsonUtf8DecoderSink(_reviver, sink, _allowMalformed);
+  }
+}
+
 //// Implementation ///////////////////////////////////////////////////////////
 
 // Simple API for JSON parsing.
@@ -760,6 +790,9 @@
     int state = this.state;
     while (position < length) {
       int char = getChar(position);
+      if (char == null) {
+        print("[[[$chunk]]] - $position - ${chunk.runtimeType}");
+      }
       switch (char) {
         case SPACE:
         case CARRIAGE_RETURN:
@@ -847,6 +880,7 @@
         default:
           if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
           state |= VALUE_READ_BITS;
+          if (char == null) print("$chunk - $position");
           position = parseNumber(char, position);
           break;
       }
@@ -1240,7 +1274,7 @@
       listener.handleNumber(sign * intValue);
       return position;
     }
-    // Double values at or above this value (2**53) may have lost precission.
+    // Double values at or above this value (2 ** 53) may have lost precission.
     // Only trust results that are below this value.
     const double maxExactDouble = 9007199254740992.0;
     if (doubleValue < maxExactDouble) {
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 24c2ef6..ad999b5 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1360,7 +1360,7 @@
   ASSERT(!closure.IsNull());
 
   Function& function = Function::Handle();
-  bool callable = closure.IsCallable(&function, NULL);
+  bool callable = closure.IsCallable(&function);
   if (callable) {
     return CreateMethodMirror(function, Instance::null_instance());
   }
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index f2799ee..acdfaff 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -773,7 +773,7 @@
   Map<Symbol, Mirror> get _members {
     if (_cachedMembers == null) {
       var whoseMembers = _isMixinAlias ? _trueSuperclass : this;
-      _cachedMembers = _makeMemberMap(mixin._computeMembers(whoseMembers._reflectee));
+      _cachedMembers = _makeMemberMap(mixin._computeMembers(whoseMembers.mixin._reflectee));
     }
     return _cachedMembers;
   }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 03a0715..7e7ab4f 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -22,6 +22,14 @@
 [ $mode == debug ]
 # This is a benchmark that is not informative in debug mode.
 cc/CorelibIsolateStartup: Skip
+# Negative tests of VerifiedMemory should crash iff in DEBUG mode.
+# TODO(koda): Improve support for negative tests.
+cc/VerifyImplicit_Crash: Crash
+cc/VerifyExplicit_Crash: Crash
+
+[ $mode == debug && $system == windows ]
+cc/VerifiedMemoryBasic: Crash # Issue 21469
+cc/VerifiedMemoryAccept: Crash # Issue 21469
 
 # The following section refers to the dart vm tests which live under
 # runtime/tests/vm/dart.
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 45f44b0..9868440 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -2135,7 +2135,10 @@
       }
       continue;  // Skip the implicit constructor.
     }
-    if (!func.is_static()) {
+    if (!func.is_static() &&
+        !func.IsMethodExtractor() &&
+        !func.IsNoSuchMethodDispatcher() &&
+        !func.IsInvokeFieldDispatcher()) {
       func = func.Clone(cls);
       cloned_funcs.Add(func);
     }
@@ -2153,6 +2156,8 @@
   const intptr_t num_fields = fields.Length();
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= fields.At(i);
+    // Static fields are shared between the mixin class and the mixin
+    // application class.
     if (!field.is_static()) {
       field = field.Clone(cls);
       cloned_fields.Add(field);
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 7de90df..5e68bea 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -21,22 +21,8 @@
 
 
 CODEGEN_TEST_GENERATE(StackmapCodegen, test) {
-  Assembler assembler;
-  const String& function_name = String::ZoneHandle(Symbols::New("test"));
-  Class& cls = Class::ZoneHandle();
-  const Script& script = Script::Handle();
-  cls = Class::New(function_name, script, Scanner::kNoSourcePos);
-  const Function& function = Function::ZoneHandle(
-      Function::New(function_name, RawFunction::kRegularFunction,
-                    true, false, false, false, false, cls, 0));
-  function.set_result_type(Type::Handle(Type::DynamicType()));
-  const Array& functions = Array::Handle(Array::New(1));
-  functions.SetAt(0, function);
-  cls.SetFunctions(functions);
-  Library& lib = Library::Handle(Library::CoreLibrary());
-  lib.AddClass(cls);
   ParsedFunction* parsed_function =
-      new ParsedFunction(Isolate::Current(), function);
+      new ParsedFunction(Isolate::Current(), test->function());
   LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)));
   test->node_sequence()->Add(new ReturnNode(kPos, l));
   l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
@@ -46,6 +32,11 @@
   parsed_function->SetNodeSequence(test->node_sequence());
   parsed_function->set_instantiator(NULL);
   parsed_function->set_default_parameter_values(Object::null_array());
+  parsed_function->EnsureExpressionTemp();
+  test->node_sequence()->scope()->AddVariable(
+      parsed_function->expression_temp_var());
+  test->node_sequence()->scope()->AddVariable(
+      parsed_function->current_context_var());
   parsed_function->AllocateVariables();
   bool retval;
   Isolate* isolate = Isolate::Current();
@@ -133,7 +124,7 @@
     const Error& error =
         Error::Handle(Compiler::CompileParsedFunction(parsed_function));
     EXPECT(error.IsNull());
-    const Code& code = Code::Handle(function.CurrentCode());
+    const Code& code = Code::Handle(test->function().CurrentCode());
 
     const Array& stack_maps =
         Array::Handle(stackmap_table_builder->FinalizeStackmaps(code));
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 22273f1..0c47e54 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -761,9 +761,7 @@
     RawLocalVarDescriptors::VarInfo var_info;
     var_descriptors.GetInfo(i, &var_info);
     const int8_t kind = var_info.kind();
-    if (kind == RawLocalVarDescriptors::kSavedEntryContext) {
-      OS::Print("  saved caller's CTX reg offset %d\n", var_info.index());
-    } else if (kind == RawLocalVarDescriptors::kSavedCurrentContext) {
+    if (kind == RawLocalVarDescriptors::kSavedCurrentContext) {
       OS::Print("  saved current CTX reg offset %d\n", var_info.index());
     } else {
       if (kind == RawLocalVarDescriptors::kContextLevel) {
@@ -1049,8 +1047,9 @@
     ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
     parsed_function->SetNodeSequence(fragment);
     parsed_function->set_default_parameter_values(Object::null_array());
-    parsed_function->EnsureExpressionTemp();
-    fragment->scope()->AddVariable(parsed_function->expression_temp_var());
+    fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
+    fragment->scope()->AddVariable(
+        parsed_function->current_context_var());
     parsed_function->AllocateVariables();
 
     // Non-optimized code generator.
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index b8827c5b..8ab020a 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3987,7 +3987,7 @@
   DARTSCOPE(isolate);
   CHECK_CALLBACK_STATE(isolate);
   const Instance& closure_obj = Api::UnwrapInstanceHandle(isolate, closure);
-  if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL, NULL)) {
+  if (closure_obj.IsNull() || !closure_obj.IsCallable(NULL)) {
     RETURN_TYPE_ERROR(isolate, closure, Instance);
   }
   if (number_of_arguments < 0) {
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 80d54a4..52f0024 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -28,15 +28,6 @@
 }
 
 
-RawObject* DartEntry::InvokeFunction(const Function& function,
-                                     const Array& arguments,
-                                     const Array& arguments_descriptor) {
-  const Context& context =
-      Context::Handle(Isolate::Current()->object_store()->empty_context());
-  return InvokeFunction(function, arguments, arguments_descriptor, context);
-}
-
-
 class ScopedIsolateStackLimits : public ValueObject {
  public:
   explicit ScopedIsolateStackLimits(Isolate* isolate)
@@ -65,8 +56,7 @@
 
 RawObject* DartEntry::InvokeFunction(const Function& function,
                                      const Array& arguments,
-                                     const Array& arguments_descriptor,
-                                     const Context& context) {
+                                     const Array& arguments_descriptor) {
   // Get the entrypoint corresponding to the function specified, this
   // will result in a compilation of the function if it is not already
   // compiled.
@@ -93,20 +83,19 @@
         static_cast<int64_t>(code.EntryPoint()),
         reinterpret_cast<int64_t>(&arguments_descriptor),
         reinterpret_cast<int64_t>(&arguments),
-        reinterpret_cast<int64_t>(&context)));
+        0));
 #else
     return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
         reinterpret_cast<int32_t>(entrypoint),
         static_cast<int32_t>(code.EntryPoint()),
         reinterpret_cast<int32_t>(&arguments_descriptor),
         reinterpret_cast<int32_t>(&arguments),
-        reinterpret_cast<int32_t>(&context)));
+        0));
 #endif
 #else
     return entrypoint(code.EntryPoint(),
                       arguments_descriptor,
-                      arguments,
-                      context);
+                      arguments);
 #endif
 }
 
@@ -126,8 +115,7 @@
   // method of the instance. This will result in a compilation of the function
   // if it is not already compiled.
   Function& function = Function::Handle();
-  Context& context = Context::Handle();
-  if (instance.IsCallable(&function, &context)) {
+  if (instance.IsCallable(&function)) {
     // Only invoke the function if its arguments are compatible.
     const ArgumentsDescriptor args_desc(arguments_descriptor);
     if (function.AreValidArgumentCounts(args_desc.Count(),
@@ -135,7 +123,7 @@
                                         NULL)) {
       // The closure or non-closure object (receiver) is passed as implicit
       // first argument. It is already included in the arguments array.
-      return InvokeFunction(function, arguments, arguments_descriptor, context);
+      return InvokeFunction(function, arguments, arguments_descriptor);
     }
   }
   // There is no compatible 'call' method, so invoke noSuchMethod.
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 9b9b5c4..d8e86af 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -13,7 +13,6 @@
 // Forward declarations.
 class Array;
 class Closure;
-class Context;
 class Function;
 class Instance;
 class Integer;
@@ -103,8 +102,7 @@
   // On success, returns a RawInstance.  On failure, a RawError.
   typedef RawObject* (*invokestub)(uword entry_point,
                                    const Array& arguments_descriptor,
-                                   const Array& arguments,
-                                   const Context& context);
+                                   const Array& arguments);
 
   // Invokes the specified instance function or static function.
   // The first argument of an instance function is the receiver.
@@ -113,18 +111,11 @@
   static RawObject* InvokeFunction(const Function& function,
                                    const Array& arguments);
 
-  // Invokes the specified instance or static function.
-  // On success, returns a RawInstance.  On failure, a RawError.
-  static RawObject* InvokeFunction(const Function& function,
-                                   const Array& arguments,
-                                   const Array& arguments_descriptor);
-
   // Invokes the specified instance, static, or closure function.
   // On success, returns a RawInstance.  On failure, a RawError.
   static RawObject* InvokeFunction(const Function& function,
                                    const Array& arguments,
-                                   const Array& arguments_descriptor,
-                                   const Context& context);
+                                   const Array& arguments_descriptor);
 
   // Invokes the closure object given as the first argument.
   // On success, returns a RawInstance.  On failure, a RawError.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 584cad1..5eface55 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -458,29 +458,7 @@
 }
 
 
-RawContext* ActivationFrame::GetSavedEntryContext() {
-  // Attempt to find a saved context.
-  GetVarDescriptors();
-  intptr_t var_desc_len = var_descriptors_.Length();
-  for (intptr_t i = 0; i < var_desc_len; i++) {
-    RawLocalVarDescriptors::VarInfo var_info;
-    var_descriptors_.GetInfo(i, &var_info);
-    const int8_t kind = var_info.kind();
-    if (kind == RawLocalVarDescriptors::kSavedEntryContext) {
-      if (FLAG_trace_debugger_stacktrace) {
-        OS::PrintErr("\tFound saved entry ctx at index %d\n", var_info.index());
-      }
-      return GetLocalContextVar(var_info.index());
-    }
-  }
-
-  // No saved context.  Return the current context.
-  return ctx_.raw();
-}
-
-
-// Get the saved context if the callee of this activation frame is a
-// closure function.
+// Get the saved current context of this activation.
 RawContext* ActivationFrame::GetSavedCurrentContext() {
   GetVarDescriptors();
   intptr_t var_desc_len = var_descriptors_.Length();
@@ -493,7 +471,8 @@
         OS::PrintErr("\tFound saved current ctx at index %d\n",
             var_info.index());
       }
-      return GetLocalContextVar(var_info.index());
+      ASSERT(Object::Handle(GetLocalVar(var_info.index())).IsContext());
+      return Context::RawCast(GetLocalVar(var_info.index()));
     }
   }
   UNREACHABLE();
@@ -678,21 +657,6 @@
 }
 
 
-RawContext* ActivationFrame::GetLocalContextVar(intptr_t slot_index) {
-  Object& context = Object::Handle(GetLocalVar(slot_index));
-  if (context.IsContext()) {
-    // We found a saved context.
-    return Context::Cast(context).raw();
-  } else if (context.raw() == Symbols::OptimizedOut().raw()) {
-    // The optimizing compiler has eliminated the saved context.
-    return Context::null();
-  } else {
-    UNREACHABLE();
-    return Context::null();
-  }
-}
-
-
 void ActivationFrame::PrintContextMismatchError(
     const String& var_name,
     intptr_t ctx_slot,
@@ -761,13 +725,7 @@
     *value = GetLocalInstanceVar(var_info.index());
   } else {
     ASSERT(kind == RawLocalVarDescriptors::kContextVar);
-    if (ctx_.IsNull()) {
-      // The context has been removed by the optimizing compiler.
-      //
-      // TODO(turnidge): This may be erroneous.  Revisit.
-      *value = Symbols::OptimizedOut().raw();
-      return;
-    }
+    ASSERT(!ctx_.IsNull());
 
     // The context level at the PC/token index of this activation frame.
     intptr_t frame_ctx_level = ContextLevel();
@@ -1234,66 +1192,19 @@
                                             StackFrame* frame,
                                             const Code& code,
                                             const Array& deopt_frame,
-                                            intptr_t deopt_frame_offset,
-                                            ActivationFrame* callee_activation,
-                                            const Context& entry_ctx) {
+                                            intptr_t deopt_frame_offset) {
   ASSERT(code.ContainsInstructionAt(pc));
-  // We provide either a callee activation or an entry context.  Not both.
-  ASSERT(((callee_activation != NULL) && entry_ctx.IsNull()) ||
-         ((callee_activation == NULL) && !entry_ctx.IsNull()));
   ActivationFrame* activation =
       new ActivationFrame(pc, frame->fp(), frame->sp(), code,
                           deopt_frame, deopt_frame_offset);
 
-  // Is there a closure call at the current PC?
-  //
-  // We can't just check the callee_activation to see if it is a
-  // closure function, because it may not be on the stack yet.
-  bool is_closure_call = false;
-  const PcDescriptors& pc_desc =
-      PcDescriptors::Handle(isolate, code.pc_descriptors());
-  PcDescriptors::Iterator iter(pc_desc, RawPcDescriptors::kClosureCall);
-  while (iter.MoveNext()) {
-    if (iter.Pc() == pc) {
-      is_closure_call = true;
-      break;
-    }
-  }
-
   // Recover the context for this frame.
-  if (is_closure_call) {
-    // If the callee is a closure, we should have stored the context
-    // in the current frame before making the call.
-    const Context& closure_call_ctx =
-        Context::Handle(isolate, activation->GetSavedCurrentContext());
-    ASSERT(!closure_call_ctx.IsNull());
-    activation->SetContext(closure_call_ctx);
-    if (FLAG_trace_debugger_stacktrace) {
-      OS::PrintErr("\tUsing closure call ctx: %s\n",
-                   closure_call_ctx.ToCString());
-    }
-  } else if (callee_activation == NULL) {
-    // No callee available.  Use incoming entry context.  Could be from
-    // isolate's top context or from an entry frame.
-    ASSERT(!entry_ctx.IsNull());
-    activation->SetContext(entry_ctx);
-    if (FLAG_trace_debugger_stacktrace) {
-      OS::PrintErr("\tUsing entry ctx: %s\n", entry_ctx.ToCString());
-    }
-  } else {
-    // Use the context provided by our callee.  This is either the
-    // callee's context or a context that was saved in the callee's
-    // frame.
-    //
-    // The callee's saved context may be NULL if it was eliminated by
-    // the optimizing compiler.
-    const Context& callee_ctx =
-        Context::Handle(isolate, callee_activation->GetSavedEntryContext());
-    activation->SetContext(callee_ctx);
-    if (FLAG_trace_debugger_stacktrace) {
-      OS::PrintErr("\tUsing callee call ctx: %s\n",
-                   callee_ctx.ToCString());
-    }
+  const Context& ctx =
+      Context::Handle(isolate, activation->GetSavedCurrentContext());
+  ASSERT(!ctx.IsNull());
+  activation->SetContext(ctx);
+  if (FLAG_trace_debugger_stacktrace) {
+    OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
   }
   if (FLAG_trace_debugger_stacktrace) {
     OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber());
@@ -1330,8 +1241,6 @@
   Isolate* isolate = Isolate::Current();
   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
   StackFrameIterator iterator(false);
-  ActivationFrame* current_activation = NULL;
-  Context& entry_ctx = Context::Handle(isolate, isolate->top_context());
   Code& code = Code::Handle(isolate);
   Code& inlined_code = Code::Handle(isolate);
   Array& deopt_frame = Array::Handle(isolate);
@@ -1344,15 +1253,7 @@
       OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n",
                    frame->ToCString());
     }
-    if (frame->IsEntryFrame()) {
-      current_activation = NULL;
-      entry_ctx = reinterpret_cast<EntryFrame*>(frame)->SavedContext();
-      if (FLAG_trace_debugger_stacktrace) {
-        OS::PrintErr("\tFound saved ctx in  entry frame:\n\t%s\n",
-                     entry_ctx.ToCString());
-      }
-
-    } else if (frame->IsDartFrame()) {
+    if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
       if (code.is_optimized()) {
         deopt_frame = DeoptimizeToArray(isolate, frame, code);
@@ -1368,28 +1269,20 @@
                          function.ToFullyQualifiedCString());
           }
           intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
-          current_activation = CollectDartFrame(isolate,
-                                                it.pc(),
-                                                frame,
-                                                inlined_code,
-                                                deopt_frame,
-                                                deopt_frame_offset,
-                                                current_activation,
-                                                entry_ctx);
-          stack_trace->AddActivation(current_activation);
-          entry_ctx = Context::null();  // Only use entry context once.
+          stack_trace->AddActivation(CollectDartFrame(isolate,
+                                                      it.pc(),
+                                                      frame,
+                                                      inlined_code,
+                                                      deopt_frame,
+                                                      deopt_frame_offset));
         }
       } else {
-        current_activation = CollectDartFrame(isolate,
-                                              frame->pc(),
-                                              frame,
-                                              code,
-                                              Object::null_array(),
-                                              0,
-                                              current_activation,
-                                              entry_ctx);
-        stack_trace->AddActivation(current_activation);
-        entry_ctx = Context::null();  // Only use entry context once.
+        stack_trace->AddActivation(CollectDartFrame(isolate,
+                                                    frame->pc(),
+                                                    frame,
+                                                    code,
+                                                    Object::null_array(),
+                                                    0));
       }
     }
   }
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 7cb2f3a..cca84d4 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -179,7 +179,6 @@
   RawArray* GetLocalVariables();
   RawObject* GetReceiver();
 
-  RawContext* GetSavedEntryContext();
   RawContext* GetSavedCurrentContext();
 
   RawObject* Evaluate(const String& expr);
@@ -199,11 +198,6 @@
 
   RawObject* GetLocalVar(intptr_t slot_index);
   RawInstance* GetLocalInstanceVar(intptr_t slot_index);
-  RawContext* GetLocalContextVar(intptr_t slot_index);
-
-  RawInstance* GetLocalVarValue(intptr_t slot_index);
-  RawInstance* GetInstanceCallReceiver(intptr_t num_actual_args);
-  RawObject* GetClosureObject(intptr_t num_acatual_args);
 
   uword pc_;
   uword fp_;
@@ -481,9 +475,7 @@
                                            StackFrame* frame,
                                            const Code& code,
                                            const Array& deopt_frame,
-                                           intptr_t deopt_frame_offset,
-                                           ActivationFrame* callee_activation,
-                                           const Context& entry_ctx);
+                                           intptr_t deopt_frame_offset);
   static RawArray* DeoptimizeToArray(Isolate* isolate,
                                      StackFrame* frame,
                                      const Code& code);
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index 43d3031..fc924ca 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -13,26 +13,6 @@
 
 namespace dart {
 
-RawInstance* ActivationFrame::GetInstanceCallReceiver(
-                 intptr_t num_actual_args) {
-  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawInstance*>(
-             *reinterpret_cast<uword*>(receiver_addr));
-}
-
-
-RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  // At a minimum we have the closure object on the stack.
-  ASSERT(num_actual_args > 0);
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawObject*>(
-             *reinterpret_cast<uword*>(closure_addr));
-}
-
-
 uword CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 2a74ad6..abef24d 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -13,26 +13,6 @@
 
 namespace dart {
 
-RawInstance* ActivationFrame::GetInstanceCallReceiver(
-                 intptr_t num_actual_args) {
-  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
-  // Stack pointer points to last argument that was pushed on the stack.
-  const uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  const uword receiver = *reinterpret_cast<uword*>(receiver_addr);
-  return reinterpret_cast<RawInstance*>(receiver);
-}
-
-
-RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  // At a minimum we have the closure object on the stack.
-  ASSERT(num_actual_args > 0);
-  // Stack pointer points to last argument that was pushed on the stack.
-  const uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  const uword closure = *reinterpret_cast<uword*>(closure_addr);
-  return reinterpret_cast<RawObject*>(closure);
-}
-
-
 uword CodeBreakpoint::OrigStubAddress() const {
   const Code& code = Code::Handle(code_);
   const Array& object_pool = Array::Handle(code.ObjectPool());
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index ed6c944..b05ae16 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -17,26 +17,6 @@
 
 namespace dart {
 
-RawInstance* ActivationFrame::GetInstanceCallReceiver(
-                 intptr_t num_actual_args) {
-  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawInstance*>(
-             *reinterpret_cast<uword*>(receiver_addr));
-}
-
-
-RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  // At a minimum we have the closure object on the stack.
-  ASSERT(num_actual_args > 0);
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawObject*>(
-      *reinterpret_cast<uword*>(closure_addr));
-}
-
-
 uword CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index eb11fbc..e3918e67 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -13,26 +13,6 @@
 
 namespace dart {
 
-RawInstance* ActivationFrame::GetInstanceCallReceiver(
-                 intptr_t num_actual_args) {
-  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawInstance*>(
-             *reinterpret_cast<uword*>(receiver_addr));
-}
-
-
-RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  // At a minimum we have the closure object on the stack.
-  ASSERT(num_actual_args > 0);
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawObject*>(
-             *reinterpret_cast<uword*>(closure_addr));
-}
-
-
 uword CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index b76469e..f32b6a7 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -15,26 +15,6 @@
 
 namespace dart {
 
-RawInstance* ActivationFrame::GetInstanceCallReceiver(
-                 intptr_t num_actual_args) {
-  ASSERT(num_actual_args > 0);  // At minimum we have a receiver on the stack.
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawInstance*>(
-             *reinterpret_cast<uword*>(receiver_addr));
-}
-
-
-RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
-  // At a minimum we have the closure object on the stack.
-  ASSERT(num_actual_args > 0);
-  // Stack pointer points to last argument that was pushed on the stack.
-  uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
-  return reinterpret_cast<RawObject*>(
-             *reinterpret_cast<uword*>(closure_addr));
-}
-
-
 uword CodeBreakpoint::OrigStubAddress() const {
   const Code& code = Code::Handle(code_);
   const Array& object_pool = Array::Handle(code.ObjectPool());
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 9f53b58..88b7375 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -280,13 +280,6 @@
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
 
-  // The following operation is part of the 'epilogue' of the CallToRuntime,
-  // CallBootstrapCFunction, and CallNativeCFunction stubs. In the case of an
-  // exception, we skip the epilogues and must set the correct state here.
-  // The other operations performed as part of the 'epilogue' are handled
-  // by the simulator's Longjmp or the JumpToExceptionHandler stub.
-  isolate->set_top_context(Context::null());
-
 #if defined(USING_SIMULATOR)
   // Unwinding of the C++ frames and destroying of their stack resources is done
   // by the simulator, because the target stack_pointer is a simulated stack
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 7caa3f9..78405d3 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -8,10 +8,12 @@
 #include "vm/flow_graph_builder.h"
 #include "vm/intermediate_language.h"
 #include "vm/growable_array.h"
+#include "vm/object_store.h"
 #include "vm/report.h"
 
 namespace dart {
 
+DEFINE_FLAG(bool, prune_dead_locals, true, "optimize dead locals away");
 DECLARE_FLAG(bool, reorder_basic_blocks);
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, verify_compiler);
@@ -36,6 +38,7 @@
     optimized_block_order_(),
     constant_null_(NULL),
     constant_dead_(NULL),
+    constant_empty_context_(NULL),
     block_effects_(NULL),
     licm_allowed_(true),
     loop_headers_(NULL),
@@ -465,10 +468,13 @@
   // Returns true if the value set by the given store reaches any load from the
   // same local variable.
   bool IsStoreAlive(BlockEntryInstr* block, StoreLocalInstr* store) {
+    if (store->local().Equals(*flow_graph_->CurrentContextVar())) {
+      return true;
+    }
+
     if (store->is_dead()) {
       return false;
     }
-
     if (store->is_last()) {
       const intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
       return GetLiveOutSet(block)->Contains(index);
@@ -480,6 +486,9 @@
   // Returns true if the given load is the last for the local and the value
   // of the local will not flow into another one.
   bool IsLastLoad(BlockEntryInstr* block, LoadLocalInstr* load) {
+    if (load->local().Equals(*flow_graph_->CurrentContextVar())) {
+      return false;
+    }
     const intptr_t index = load->local().BitIndexIn(num_non_copied_params_);
     return load->is_last() && !GetLiveOutSet(block)->Contains(index);
   }
@@ -565,11 +574,13 @@
   VariableLivenessAnalysis variable_liveness(this);
   variable_liveness.Analyze();
 
+  GrowableArray<PhiInstr*> live_phis;
+
   InsertPhis(preorder_,
              variable_liveness.ComputeAssignedVars(),
-             dominance_frontier);
+             dominance_frontier,
+             &live_phis);
 
-  GrowableArray<PhiInstr*> live_phis;
 
   // Rename uses to reference inserted phis where appropriate.
   // Collect phis that reach a non-environment use.
@@ -702,7 +713,8 @@
 void FlowGraph::InsertPhis(
     const GrowableArray<BlockEntryInstr*>& preorder,
     const GrowableArray<BitVector*>& assigned_vars,
-    const GrowableArray<BitVector*>& dom_frontier) {
+    const GrowableArray<BitVector*>& dom_frontier,
+    GrowableArray<PhiInstr*>* live_phis) {
   const intptr_t block_count = preorder.length();
   // Map preorder block number to the highest variable index that has a phi
   // in that block.  Use it to avoid inserting multiple phis for the same
@@ -722,6 +734,8 @@
   // Insert phis for each variable in turn.
   GrowableArray<BlockEntryInstr*> worklist;
   for (intptr_t var_index = 0; var_index < variable_count(); ++var_index) {
+    const bool always_live = !FLAG_prune_dead_locals ||
+        (var_index == CurrentContextEnvIndex());
     // Add to the worklist each block containing an assignment.
     for (intptr_t block_index = 0; block_index < block_count; ++block_index) {
       if (assigned_vars[block_index]->Contains(var_index)) {
@@ -740,7 +754,12 @@
         if (has_already[index] < var_index) {
           BlockEntryInstr* block = preorder[index];
           ASSERT(block->IsJoinEntry());
-          block->AsJoinEntry()->InsertPhi(var_index, variable_count());
+          PhiInstr* phi = block->AsJoinEntry()->InsertPhi(var_index,
+                                                          variable_count());
+          if (always_live) {
+            phi->mark_alive();
+            live_phis->Add(phi);
+          }
           has_already[index] = var_index;
           if (work[index] < var_index) {
             work[index] = var_index;
@@ -764,6 +783,8 @@
   // Add global constants to the initial definitions.
   constant_null_ = GetConstant(Object::ZoneHandle());
   constant_dead_ = GetConstant(Symbols::OptimizedOut());
+  constant_empty_context_ = GetConstant(Context::Handle(
+      isolate()->object_store()->empty_context()));
 
   // Add parameters to the initial definitions and renaming environment.
   if (inlining_parameters != NULL) {
@@ -787,11 +808,22 @@
     }
   }
 
-  // Initialize all locals with #null in the renaming environment.  For OSR,
-  // the locals have already been handled as parameters.
+  // Initialize all locals in the renaming environment  For OSR, the locals have
+  // already been handled as parameters.
   if (!IsCompiledForOsr()) {
     for (intptr_t i = parameter_count(); i < variable_count(); ++i) {
-      env.Add(constant_null());
+      if (i == CurrentContextEnvIndex()) {
+        if (parsed_function().function().IsClosureFunction()) {
+          CurrentContextInstr* context = new CurrentContextInstr();
+          context->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
+          AddToInitialDefinitions(context);
+          env.Add(context);
+        } else {
+          env.Add(constant_empty_context());
+        }
+      } else {
+        env.Add(constant_null());
+      }
     }
   }
 
@@ -812,12 +844,6 @@
                         *env,
                         num_non_copied_params_,
                         &parsed_function_);
-  // TODO(fschneider): Add predicates CanEagerlyDeoptimize and
-  // CanLazilyDeoptimize to instructions to generally deal with instructions
-  // that have pushed arguments and input operands.
-  // Right now, closure calls are the only instructions that have both. They
-  // also don't have an eager deoptimziation point, so the environment attached
-  // here is only used for after the call.
   if (instr->IsClosureCall()) {
     deopt_env = deopt_env->DeepCopy(isolate(),
                                     deopt_env->Length() - instr->InputCount());
@@ -846,7 +872,7 @@
         if (phi != NULL) {
           (*env)[i] = phi;
           phi->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
-          if (block_entry->InsideTryBlock()) {
+          if (block_entry->InsideTryBlock() && !phi->is_alive()) {
             // This is a safe approximation.  Inside try{} all locals are
             // used at every call implicitly, so we mark all phis as live
             // from the start.
@@ -872,7 +898,11 @@
   // slots with null.
   BitVector* live_in = variable_liveness->GetLiveInSet(block_entry);
   for (intptr_t i = 0; i < variable_count(); i++) {
-    if (!live_in->Contains(i)) {
+    // TODO(fschneider): Make sure that live_in always contains the
+    // CurrentContext variable to avoid the special case here.
+    if (FLAG_prune_dead_locals &&
+        !live_in->Contains(i) &&
+        (i != CurrentContextEnvIndex())) {
       (*env)[i] = constant_dead();
     }
   }
@@ -940,7 +970,8 @@
           intptr_t index = store->local().BitIndexIn(num_non_copied_params_);
           result = store->value()->definition();
 
-          if (variable_liveness->IsStoreAlive(block_entry, store)) {
+          if (!FLAG_prune_dead_locals ||
+              variable_liveness->IsStoreAlive(block_entry, store)) {
             (*env)[index] = result;
           } else {
             (*env)[index] = constant_dead();
@@ -958,7 +989,8 @@
             live_phis->Add(phi);
           }
 
-          if (variable_liveness->IsLastLoad(block_entry, load)) {
+          if (FLAG_prune_dead_locals &&
+              variable_liveness->IsLastLoad(block_entry, load)) {
             (*env)[index] = constant_dead();
           }
 
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 8d85b4e..c319412 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -111,6 +111,15 @@
     return num_non_copied_params_;
   }
 
+  LocalVariable* CurrentContextVar() const {
+    return parsed_function().current_context_var();
+  }
+
+  intptr_t CurrentContextEnvIndex() const {
+    return parsed_function().current_context_var()->BitIndexIn(
+        num_non_copied_params_);
+  }
+
   // Flow graph orders.
   const GrowableArray<BlockEntryInstr*>& preorder() const {
     return preorder_;
@@ -159,6 +168,10 @@
     return constant_dead_;
   }
 
+  ConstantInstr* constant_empty_context() const {
+    return constant_empty_context_;
+  }
+
   intptr_t alloc_ssa_temp_index() { return current_ssa_temp_index_++; }
 
   void AllocateSSAIndexes(Definition* def) {
@@ -296,7 +309,8 @@
   void InsertPhis(
       const GrowableArray<BlockEntryInstr*>& preorder,
       const GrowableArray<BitVector*>& assigned_vars,
-      const GrowableArray<BitVector*>& dom_frontier);
+      const GrowableArray<BitVector*>& dom_frontier,
+      GrowableArray<PhiInstr*>* live_phis);
 
   void RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis);
 
@@ -333,6 +347,7 @@
   GrowableArray<BlockEntryInstr*> optimized_block_order_;
   ConstantInstr* constant_null_;
   ConstantInstr* constant_dead_;
+  ConstantInstr* constant_empty_context_;
 
   BlockEffects* block_effects_;
   bool licm_allowed_;
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 1967960..8a4bc56 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -106,7 +106,6 @@
   for (intptr_t i = kLastFreeCpuRegister + 1; i < kNumberOfCpuRegisters; i++) {
     blocked_cpu_registers_[i] = true;
   }
-  blocked_cpu_registers_[CTX] = true;
   if (TMP != kNoRegister) {
     blocked_cpu_registers_[TMP] = true;
   }
@@ -661,6 +660,16 @@
                                                      param->base_reg()));
     range->set_spill_slot(Location::StackSlot(slot_index,
                                               param->base_reg()));
+  } else if (defn->IsCurrentContext()) {
+    AssignSafepoints(defn, range);
+    range->finger()->Initialize(range);
+    range->set_assigned_location(Location::RegisterLocation(CTX));
+    if (range->End() > kNormalEntryPos) {
+      LiveRange* tail = range->SplitAt(kNormalEntryPos);
+      CompleteRange(tail, Location::kRegister);
+    }
+    ConvertAllUses(range);
+    return;
   } else {
     ConstantInstr* constant = defn->AsConstant();
     ASSERT(constant != NULL);
@@ -2434,6 +2443,14 @@
                                             Location from) {
   ASSERT(!IsBlockEntry(pos));
 
+  if (pos < kNormalEntryPos) {
+    ASSERT(pos > 0);
+    // Parallel moves added to the GraphEntry (B0) will be added at the start
+    // of the normal entry (B1)
+    BlockEntryInstr* entry = InstructionAt(kNormalEntryPos)->AsBlockEntry();
+    return entry->GetParallelMove()->AddMove(to, from);
+  }
+
   Instruction* instr = InstructionAt(pos);
 
   ParallelMoveInstr* parallel_move = NULL;
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index 8b106bd..fe2c710 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -129,6 +129,9 @@
   void ProcessOneInstruction(BlockEntryInstr* block,
                              Instruction* instr,
                              BitVector* interference_set);
+
+  static const intptr_t kNormalEntryPos = 2;
+
   void ProcessInitialDefinition(Definition* defn,
                                 LiveRange* range,
                                 BlockEntryInstr* block);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 5ae8d6d..3924811 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -759,7 +759,7 @@
     intptr_t delta =
         owner()->context_level() - local.owner()->context_level();
     ASSERT(delta >= 0);
-    Value* context = Bind(new(I) CurrentContextInstr());
+    Value* context = Bind(BuildCurrentContext());
     while (delta-- > 0) {
       context = Bind(new(I) LoadFieldInstr(
           context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -787,7 +787,7 @@
     intptr_t delta =
         owner()->context_level() - local.owner()->context_level();
     ASSERT(delta >= 0);
-    Value* context = Bind(new(I) CurrentContextInstr());
+    Value* context = Bind(BuildCurrentContext());
     while (delta-- > 0) {
       context = Bind(new(I) LoadFieldInstr(
           context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -805,7 +805,7 @@
 
 // Stores current context into the 'variable'
 void EffectGraphVisitor::BuildSaveContext(const LocalVariable& variable) {
-  Value* context = Bind(new(I) CurrentContextInstr());
+  Value* context = Bind(BuildCurrentContext());
   Do(BuildStoreLocal(variable, context));
 }
 
@@ -813,7 +813,19 @@
 // Loads context saved in 'context_variable' into the current context.
 void EffectGraphVisitor::BuildRestoreContext(const LocalVariable& variable) {
   Value* load_saved_context = Bind(BuildLoadLocal(variable));
-  AddInstruction(new(I) StoreContextInstr(load_saved_context));
+  Do(BuildStoreContext(load_saved_context));
+}
+
+
+Definition* EffectGraphVisitor::BuildStoreContext(Value* value) {
+  return new(I) StoreLocalInstr(
+      *owner()->parsed_function()->current_context_var(), value);
+}
+
+
+Definition* EffectGraphVisitor::BuildCurrentContext() {
+  return new(I) LoadLocalInstr(
+      *owner()->parsed_function()->current_context_var());
 }
 
 
@@ -1086,10 +1098,7 @@
 
   intptr_t current_context_level = owner()->context_level();
   ASSERT(current_context_level >= 0);
-  if (owner()->parsed_function()->saved_entry_context_var() != NULL) {
-    // CTX on entry was saved, but not linked as context parent.
-    BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var());
-  } else {
+  if (HasContextScope()) {
     UnchainContexts(current_context_level);
   }
 
@@ -1268,12 +1277,12 @@
   const String& name = String::ZoneHandle(I, Symbols::New(node->TokenName()));
   const intptr_t kNumArgsChecked = 2;
   InstanceCallInstr* call = new(I) InstanceCallInstr(node->token_pos(),
-                                                  name,
-                                                  node->kind(),
-                                                  arguments,
-                                                  Object::null_array(),
-                                                  kNumArgsChecked,
-                                                  owner()->ic_data_array());
+                                                     name,
+                                                     node->kind(),
+                                                     arguments,
+                                                     Object::null_array(),
+                                                     kNumArgsChecked,
+                                                     owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1366,12 +1375,12 @@
   arguments->Add(push_mask);
   const intptr_t kNumArgsChecked = 2;
   InstanceCallInstr* call = new(I) InstanceCallInstr(node->token_pos(),
-                                                  BinaryOpAndMaskName(node),
-                                                  Token::kILLEGAL,
-                                                  arguments,
-                                                  Object::null_array(),
-                                                  kNumArgsChecked,
-                                                  owner()->ic_data_array());
+                                                     BinaryOpAndMaskName(node),
+                                                     Token::kILLEGAL,
+                                                     arguments,
+                                                     Object::null_array(),
+                                                     kNumArgsChecked,
+                                                     owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -1496,7 +1505,7 @@
   intptr_t delta = old_ctx_level -
                    continuation_result->owner()->context_level();
   ASSERT(delta >= 0);
-  Value* context = Bind(new(I) CurrentContextInstr());
+  Value* context = Bind(BuildCurrentContext());
   while (delta-- > 0) {
     context = Bind(new(I) LoadFieldInstr(
         context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -1744,14 +1753,14 @@
     PushArgumentInstr* push_right = PushArgument(for_right_value.value());
     arguments->Add(push_right);
 
-    Definition* result =
-        new(I) InstanceCallInstr(node->token_pos(),
-                                 Symbols::EqualOperator(),
-                              Token::kEQ,  // Result is negated later for kNE.
-                              arguments,
-                              Object::null_array(),
-                              2,
-                              owner()->ic_data_array());
+    Definition* result = new(I) InstanceCallInstr(
+        node->token_pos(),
+        Symbols::EqualOperator(),
+        Token::kEQ,  // Result is negated later for kNE.
+        arguments,
+        Object::null_array(),
+        2,
+        owner()->ic_data_array());
     if (node->kind() == Token::kNE) {
       if (FLAG_enable_type_checks) {
         Value* value = Bind(result);
@@ -1780,15 +1789,14 @@
   arguments->Add(push_right);
 
   ASSERT(Token::IsRelationalOperator(node->kind()));
-  InstanceCallInstr* comp =
-      new(I) InstanceCallInstr(node->token_pos(),
-                            String::ZoneHandle(
-                                I, Symbols::New(node->TokenName())),
-                            node->kind(),
-                            arguments,
-                            Object::null_array(),
-                            2,
-                            owner()->ic_data_array());
+  InstanceCallInstr* comp = new(I) InstanceCallInstr(
+      node->token_pos(),
+      String::ZoneHandle(I, Symbols::New(node->TokenName())),
+      node->kind(),
+      arguments,
+      Object::null_array(),
+      2,
+      owner()->ic_data_array());
   ReturnDefinition(comp);
 }
 
@@ -1816,15 +1824,14 @@
   ZoneGrowableArray<PushArgumentInstr*>* arguments =
       new(I) ZoneGrowableArray<PushArgumentInstr*>(1);
   arguments->Add(push_value);
-  InstanceCallInstr* call =
-      new(I) InstanceCallInstr(node->token_pos(),
-                            String::ZoneHandle(
-                                I, Symbols::New(node->TokenName())),
-                            node->kind(),
-                            arguments,
-                            Object::null_array(),
-                            1,
-                            owner()->ic_data_array());
+  InstanceCallInstr* call = new(I) InstanceCallInstr(
+      node->token_pos(),
+      String::ZoneHandle(I, Symbols::New(node->TokenName())),
+      node->kind(),
+      arguments,
+      Object::null_array(),
+      1,
+      owner()->ic_data_array());
   ReturnDefinition(call);
 }
 
@@ -2444,7 +2451,7 @@
     // same closure, do not add a second one. We compare the origin
     // class, token position, and parent function to detect duplicates.
     // Note that we can have two different closure object for the same
-    // source text represntation of the closure: one with a non-closurized
+    // source text representation of the closure: one with a non-closurized
     // parent, and one with a closurized parent function.
 
     const Function& found_func = Function::Handle(
@@ -2525,7 +2532,7 @@
     } else {
       // Store current context in closure.
       closure_tmp_val = Bind(new(I) LoadLocalInstr(*closure_tmp_var));
-      Value* context = Bind(new(I) CurrentContextInstr());
+      Value* context = Bind(BuildCurrentContext());
       Do(new(I) StoreInstanceFieldInstr(Closure::context_offset(),
                                         closure_tmp_val,
                                         context,
@@ -2611,10 +2618,10 @@
   BuildPushArguments(*node->arguments(), arguments);
   StaticCallInstr* call =
       new(I) StaticCallInstr(node->token_pos(),
-                          node->function(),
-                          node->arguments()->names(),
-                          arguments,
-                          owner()->ic_data_array());
+                             node->function(),
+                             node->arguments()->names(),
+                             arguments,
+                             owner()->ic_data_array());
   if (node->function().is_native()) {
     const intptr_t result_cid = GetResultCidOfNativeFactory(node->function());
     if (result_cid != kDynamicCid) {
@@ -2641,18 +2648,6 @@
   arguments->Add(push_closure);
   BuildPushArguments(*node->arguments(), arguments);
 
-  // Save context around the call.
-  ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
-  BuildSaveContext(*owner()->parsed_function()->saved_current_context_var());
-  closure_val = Bind(new(I) LoadLocalInstr(*tmp_var));
-  LoadFieldInstr* context_load = new(I) LoadFieldInstr(
-      closure_val,
-      Closure::context_offset(),
-      AbstractType::ZoneHandle(I, AbstractType::null()),
-      node->token_pos());
-  context_load->set_is_immutable(true);
-  Value* context_val = Bind(context_load);
-  AddInstruction(new(I) StoreContextInstr(context_val));
   closure_val = Bind(new(I) LoadLocalInstr(*tmp_var));
   LoadFieldInstr* function_load = new(I) LoadFieldInstr(
       closure_val,
@@ -2661,22 +2656,16 @@
       node->token_pos());
   function_load->set_is_immutable(true);
   Value* function_val = Bind(function_load);
+
   Definition* closure_call =
       new(I) ClosureCallInstr(function_val, node, arguments);
   if (result_needed) {
     Value* result = Bind(closure_call);
     Do(new(I) StoreLocalInstr(*tmp_var, result));
-    // Restore context from temp.
-    BuildRestoreContext(
-        *owner()->parsed_function()->saved_current_context_var());
-    ReturnDefinition(ExitTempLocalScope(tmp_var));
   } else {
     Do(closure_call);
-    // Restore context from saved location.
-    BuildRestoreContext(
-        *owner()->parsed_function()->saved_current_context_var());
-    Do(ExitTempLocalScope(tmp_var));
   }
+  ReturnDefinition(ExitTempLocalScope(tmp_var));
 }
 
 
@@ -2697,9 +2686,9 @@
 
 
 void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
-  Value* context = Bind(new(I) CurrentContextInstr());
+  Value* context = Bind(BuildCurrentContext());
   Value* clone = Bind(new(I) CloneContextInstr(node->token_pos(), context));
-  AddInstruction(new(I) StoreContextInstr(clone));
+  Do(BuildStoreContext(clone));
 }
 
 
@@ -2739,10 +2728,10 @@
 
   BuildPushArguments(*node->arguments(), arguments);
   Do(new(I) StaticCallInstr(node->token_pos(),
-                         node->constructor(),
-                         node->arguments()->names(),
-                         arguments,
-                         owner()->ic_data_array()));
+                            node->constructor(),
+                            node->arguments()->names(),
+                            arguments,
+                            owner()->ic_data_array()));
 }
 
 
@@ -2782,10 +2771,10 @@
     BuildPushArguments(*node->arguments(), arguments);
     StaticCallInstr* call =
         new(I) StaticCallInstr(node->token_pos(),
-                            node->constructor(),
-                            node->arguments()->names(),
-                            arguments,
-                            owner()->ic_data_array());
+                               node->constructor(),
+                               node->arguments()->names(),
+                               arguments,
+                               owner()->ic_data_array());
     const intptr_t result_cid = GetResultCidOfListFactory(node);
     if (result_cid != kDynamicCid) {
       call->set_result_cid(result_cid);
@@ -3536,21 +3525,22 @@
   if (super_function != NULL) {
     // Generate static call to super operator.
     StaticCallInstr* load = new(I) StaticCallInstr(node->token_pos(),
-                                                *super_function,
-                                                Object::null_array(),
-                                                arguments,
-                                                owner()->ic_data_array());
+                                                   *super_function,
+                                                   Object::null_array(),
+                                                   arguments,
+                                                   owner()->ic_data_array());
     ReturnDefinition(load);
   } else {
     // Generate dynamic call to index operator.
     const intptr_t checked_argument_count = 1;
-    InstanceCallInstr* load = new(I) InstanceCallInstr(node->token_pos(),
-                                                    Symbols::IndexToken(),
-                                                    Token::kINDEX,
-                                                    arguments,
-                                                    Object::null_array(),
-                                                    checked_argument_count,
-                                                    owner()->ic_data_array());
+    InstanceCallInstr* load = new(I) InstanceCallInstr(
+        node->token_pos(),
+        Symbols::IndexToken(),
+        Token::kINDEX,
+        arguments,
+        Object::null_array(),
+        checked_argument_count,
+        owner()->ic_data_array());
     ReturnDefinition(load);
   }
 }
@@ -3617,10 +3607,10 @@
 
     StaticCallInstr* store =
         new(I) StaticCallInstr(node->token_pos(),
-                            *super_function,
-                            Object::null_array(),
-                            arguments,
-                            owner()->ic_data_array());
+                               *super_function,
+                               Object::null_array(),
+                               arguments,
+                               owner()->ic_data_array());
     if (result_is_needed) {
       Do(store);
       return BuildLoadExprTemp();
@@ -3634,12 +3624,12 @@
         String::ZoneHandle(I, Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
     InstanceCallInstr* store =
         new(I) InstanceCallInstr(node->token_pos(),
-                              name,
-                              Token::kASSIGN_INDEX,
-                              arguments,
-                              Object::null_array(),
-                              checked_argument_count,
-                              owner()->ic_data_array());
+                                 name,
+                                 Token::kASSIGN_INDEX,
+                                 arguments,
+                                 Object::null_array(),
+                                 checked_argument_count,
+                                 owner()->ic_data_array());
     if (result_is_needed) {
       Do(store);
       return BuildLoadExprTemp();
@@ -3660,15 +3650,16 @@
 }
 
 
-bool EffectGraphVisitor::MustSaveRestoreContext(SequenceNode* node) const {
-  return (node == owner()->parsed_function()->node_sequence()) &&
-         (owner()->parsed_function()->saved_entry_context_var() != NULL);
+bool EffectGraphVisitor::HasContextScope() const {
+  const ContextScope& context_scope = ContextScope::Handle(
+      owner()->parsed_function()->function().context_scope());
+  return !context_scope.IsNull() && (context_scope.num_variables() > 0);
 }
 
 
 void EffectGraphVisitor::UnchainContexts(intptr_t n) {
   if (n > 0) {
-    Value* context = Bind(new(I) CurrentContextInstr());
+    Value* context = Bind(BuildCurrentContext());
     while (n-- > 0) {
       context = Bind(
           new(I) LoadFieldInstr(context,
@@ -3677,7 +3668,7 @@
                                 Type::ZoneHandle(I, Type::null()),
                                 Scanner::kNoSourcePos));
     }
-    AddInstruction(new(I) StoreContextInstr(context));
+    Do(BuildStoreContext(context));
   }
 }
 
@@ -3689,47 +3680,35 @@
   LocalScope* scope = node->scope();
   const intptr_t num_context_variables =
       (scope != NULL) ? scope->num_context_variables() : 0;
+  const bool is_top_level_sequence =
+      node == owner()->parsed_function()->node_sequence();
   // The outermost function sequence cannot contain a label.
-  ASSERT((node->label() == NULL) ||
-         (node != owner()->parsed_function()->node_sequence()));
+  ASSERT((node->label() == NULL) || !is_top_level_sequence);
   NestedBlock nested_block(owner(), node);
 
   if (num_context_variables > 0) {
-    // The loop local scope declares variables that are captured.
-    // Allocate and chain a new context.
-    // Allocate context computation (uses current CTX)
+    // The local scope declares variables that are captured.
+    // Allocate and chain a new context (Except don't chain when at the function
+    // entry if the function does not capture any variables from outer scopes).
     Value* allocated_context =
         Bind(new(I) AllocateContextInstr(node->token_pos(),
                                          num_context_variables));
     { LocalVariable* tmp_var = EnterTempLocalScope(allocated_context);
-      // If this node_sequence is the body of the function being compiled, and
-      // if this function allocates context variables, but none of its enclosing
-      // functions do, the context on entry is not linked as parent of the
-      // allocated context but saved on entry and restored on exit as to prevent
-      // memory leaks.
-      // In this case, the parser pre-allocates a variable to save the context.
-      Value* tmp_val = Bind(new(I) LoadLocalInstr(*tmp_var));
-      Value* parent_context = NULL;
-      if (MustSaveRestoreContext(node)) {
-        BuildSaveContext(
-            *owner()->parsed_function()->saved_entry_context_var());
-        parent_context = Bind(
-            new(I) ConstantInstr(Object::ZoneHandle(I, Object::null())));
-      } else {
-        parent_context = Bind(new(I) CurrentContextInstr());
+      if (HasContextScope() || !is_top_level_sequence) {
+        Value* tmp_val = Bind(new(I) LoadLocalInstr(*tmp_var));
+        Value* parent_context = Bind(BuildCurrentContext());
+        Do(new(I) StoreInstanceFieldInstr(Context::parent_offset(),
+                                          tmp_val,
+                                          parent_context,
+                                          kEmitStoreBarrier,
+                                          Scanner::kNoSourcePos));
       }
-      Do(new(I) StoreInstanceFieldInstr(Context::parent_offset(),
-                                        tmp_val,
-                                        parent_context,
-                                        kEmitStoreBarrier,
-                                        Scanner::kNoSourcePos));
-      AddInstruction(
-          new(I) StoreContextInstr(Bind(ExitTempLocalScope(tmp_var))));
+      Do(BuildStoreContext(Bind(ExitTempLocalScope(tmp_var))));
     }
 
     // If this node_sequence is the body of the function being compiled, copy
     // the captured parameters from the frame into the context.
-    if (node == owner()->parsed_function()->node_sequence()) {
+    if (is_top_level_sequence) {
       ASSERT(scope->context_level() == 1);
       const Function& function = owner()->parsed_function()->function();
       const int num_params = function.NumParameters();
@@ -3765,23 +3744,12 @@
         }
       }
     }
-  } else if (MustSaveRestoreContext(node)) {
-    // Even when the current scope has no context variables, we may
-    // still need to save the current context if, for example, there
-    // are loop scopes below this which will allocate a context
-    // object.
-    BuildSaveContext(
-        *owner()->parsed_function()->saved_entry_context_var());
-    AddInstruction(
-        new(I) StoreContextInstr(Bind(new(I) ConstantInstr(Object::ZoneHandle(
-            I, I->object_store()->empty_context())))));
   }
 
   // This check may be deleted if the generated code is leaf.
   // Native functions don't need a stack check at entry.
   const Function& function = owner()->parsed_function()->function();
-  if ((node == owner()->parsed_function()->node_sequence()) &&
-      !function.is_native()) {
+  if (is_top_level_sequence && !function.is_native()) {
     // Always allocate CheckOverflowInstr so that deopt-ids match regardless
     // if we inline or not.
     if (!function.IsImplicitGetterFunction() &&
@@ -3796,8 +3764,7 @@
     }
   }
 
-  if (FLAG_enable_type_checks &&
-      (node == owner()->parsed_function()->node_sequence())) {
+  if (FLAG_enable_type_checks && is_top_level_sequence) {
     const Function& function = owner()->parsed_function()->function();
     const int num_params = function.NumParameters();
     int pos = 0;
@@ -3836,7 +3803,7 @@
   // If this node sequence is the body of an async closure leave room for a
   // preamble. The preamble is generated after visiting the body.
   GotoInstr* preamble_start = NULL;
-  if ((node == owner()->parsed_function()->node_sequence()) &&
+  if (is_top_level_sequence &&
       (owner()->parsed_function()->function().is_async_closure())) {
     JoinEntryInstr* preamble_end = new(I) JoinEntryInstr(
         owner()->AllocateBlockId(), owner()->try_index());
@@ -3862,7 +3829,7 @@
   // Continuation part:
   // After generating the CFG for the body we can create the preamble because we
   // know exactly how many continuation states we need.
-  if ((node == owner()->parsed_function()->node_sequence()) &&
+  if (is_top_level_sequence &&
       (owner()->parsed_function()->function().is_async_closure())) {
     ASSERT(preamble_start != NULL);
     // We are at the top level. Fetch the corresponding scope.
@@ -3923,13 +3890,10 @@
     exit_ = saved_exit;
   }
 
-  if (is_open()) {
-    if (MustSaveRestoreContext(node)) {
-      BuildRestoreContext(
-          *owner()->parsed_function()->saved_entry_context_var());
-    } else if (num_context_variables > 0) {
-      UnchainContexts(1);
-    }
+  if (is_open() &&
+      (num_context_variables > 0) &&
+      (HasContextScope() || !is_top_level_sequence)) {
+    UnchainContexts(1);
   }
 
   // If this node sequence is labeled, a break out of the sequence will have
@@ -3943,7 +3907,7 @@
 
 void EffectGraphVisitor::VisitCatchClauseNode(CatchClauseNode* node) {
   InlineBailout("EffectGraphVisitor::VisitCatchClauseNode (exception)");
-  // Restores CTX from local variable ':saved_context'.
+  // Restores current context from local variable ':saved_context'.
   BuildRestoreContext(node->context_var());
 
   EffectGraphVisitor for_catch(owner());
@@ -3959,7 +3923,7 @@
   ASSERT(try_handler_index != original_handler_index);
   owner()->set_try_index(try_handler_index);
 
-  // Preserve CTX into local variable '%saved_context'.
+  // Preserve current context into local variable '%saved_context'.
   BuildSaveContext(node->context_var());
 
   EffectGraphVisitor for_try(owner());
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 66b4697..a86a2cc 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -407,7 +407,7 @@
   virtual void BuildTypeTest(ComparisonNode* node);
   virtual void BuildTypeCast(ComparisonNode* node);
 
-  bool MustSaveRestoreContext(SequenceNode* node) const;
+  bool HasContextScope() const;
 
   // Moves the nth parent context into the context register.
   void UnchainContexts(intptr_t n);
@@ -425,6 +425,9 @@
   void BuildSaveContext(const LocalVariable& variable);
   void BuildRestoreContext(const LocalVariable& variable);
 
+  Definition* BuildStoreContext(Value* value);
+  Definition* BuildCurrentContext();
+
   void BuildThrowNode(ThrowNode* node);
 
   StaticCallInstr* BuildStaticNoSuchMethodCall(
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index d3258f9..5bb8e09 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -225,7 +225,8 @@
 
 
 static bool IsEmptyBlock(BlockEntryInstr* block) {
-  return !block->HasNonRedundantParallelMove() &&
+  return !block->IsCatchBlockEntry() &&
+         !block->HasNonRedundantParallelMove() &&
          block->next()->IsGoto() &&
          !block->next()->AsGoto()->HasNonRedundantParallelMove();
 }
@@ -287,7 +288,7 @@
       // own so that it can control the placement.
       AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                            instr->deopt_id(),
-                           Scanner::kNoSourcePos);
+                           instr->token_pos());
     }
     AllocateRegistersLocally(instr);
   } else if (instr->MayThrow()  &&
@@ -1108,7 +1109,6 @@
   }
 
   // Do not allocate known registers.
-  blocked_registers[CTX] = true;
   blocked_registers[SPREG] = true;
   blocked_registers[FPREG] = true;
   if (TMP != kNoRegister) {
@@ -1385,7 +1385,6 @@
       reg_(kNoRegister),
       spilled_(false) {
   uword blocked_mask = MaskBit(blocked)
-                     | MaskBit(CTX)
                      | MaskBit(SPREG)
                      | MaskBit(FPREG)
                      | MaskBit(TMP)
@@ -1497,4 +1496,24 @@
   return threshold;
 }
 
+
+const Class& FlowGraphCompiler::BoxClassFor(Representation rep) {
+  switch (rep) {
+    case kUnboxedDouble:
+      return double_class();
+    case kUnboxedFloat32x4:
+      return float32x4_class();
+    case kUnboxedFloat64x2:
+      return float64x2_class();
+    case kUnboxedInt32x4:
+      return int32x4_class();
+    case kUnboxedMint:
+      return mint_class();
+    default:
+      UNREACHABLE();
+      return Class::ZoneHandle();
+  }
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 79cb82c..0cb7dc4 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -473,6 +473,8 @@
   const Class& float64x2_class() const { return float64x2_class_; }
   const Class& int32x4_class() const { return int32x4_class_; }
 
+  const Class& BoxClassFor(Representation rep);
+
   void SaveLiveRegisters(LocationSummary* locs);
   void RestoreLiveRegisters(LocationSummary* locs);
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 9b9030c..c6993f1 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1074,15 +1074,40 @@
     CopyParameters();
   }
 
+  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
+    // Load context from the closure object (first argument).
+    LocalScope* scope = parsed_function().node_sequence()->scope();
+    LocalVariable* closure_parameter = scope->VariableAt(0);
+    __ ldr(CTX, Address(FP, closure_parameter->index() * kWordSize));
+    __ ldr(CTX, FieldAddress(CTX, Closure::context_offset()));
+  }
+
   // In unoptimized code, initialize (non-argument) stack allocated slots to
   // null.
-  if (!is_optimizing() && (num_locals > 0)) {
+  if (!is_optimizing()) {
+    ASSERT(num_locals > 0);  // There is always at least context_var.
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+    const intptr_t context_index =
+        parsed_function().current_context_var()->index();
+    if (num_locals > 1) {
+      __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than FP).
-      __ StoreToOffset(kWord, R0, FP, (slot_base - i) * kWordSize);
+      if (((slot_base - i) == context_index)) {
+        if (function.IsClosureFunction()) {
+          __ StoreToOffset(kWord, CTX, FP, (slot_base - i) * kWordSize);
+        } else {
+          const Context& empty_context = Context::ZoneHandle(
+              isolate(), isolate()->object_store()->empty_context());
+          __ LoadObject(R1, empty_context);
+          __ StoreToOffset(kWord, R1, FP, (slot_base - i) * kWordSize);
+        }
+      } else {
+        ASSERT(num_locals > 1);
+        __ StoreToOffset(kWord, R0, FP, (slot_base - i) * kWordSize);
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 1b1195f..8513588 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1079,15 +1079,40 @@
     CopyParameters();
   }
 
+  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
+    // Load context from the closure object (first argument).
+    LocalScope* scope = parsed_function().node_sequence()->scope();
+    LocalVariable* closure_parameter = scope->VariableAt(0);
+    __ ldr(CTX, Address(FP, closure_parameter->index() * kWordSize));
+    __ ldr(CTX, FieldAddress(CTX, Closure::context_offset()));
+  }
+
   // In unoptimized code, initialize (non-argument) stack allocated slots to
   // null.
-  if (!is_optimizing() && (num_locals > 0)) {
+  if (!is_optimizing()) {
+    ASSERT(num_locals > 0);  // There is always at least context_var.
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    __ LoadObject(R0, Object::null_object(), PP);
+    const intptr_t context_index =
+        parsed_function().current_context_var()->index();
+    if (num_locals > 1) {
+      __ LoadObject(R0, Object::null_object(), PP);
+    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than FP).
-      __ StoreToOffset(R0, FP, (slot_base - i) * kWordSize, PP);
+      if (((slot_base - i) == context_index)) {
+        if (function.IsClosureFunction()) {
+          __ StoreToOffset(CTX, FP, (slot_base - i) * kWordSize, PP);
+        } else {
+          const Context& empty_context = Context::ZoneHandle(
+              isolate(), isolate()->object_store()->empty_context());
+          __ LoadObject(R1, empty_context, PP);
+          __ StoreToOffset(R1, FP, (slot_base - i) * kWordSize, PP);
+        }
+      } else {
+        ASSERT(num_locals > 1);
+        __ StoreToOffset(R0, FP, (slot_base - i) * kWordSize, PP);
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 6236d5c8..5879192 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1074,17 +1074,52 @@
     CopyParameters();
   }
 
+  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
+    // Load context from the closure object (first argument).
+    LocalScope* scope = parsed_function().node_sequence()->scope();
+    LocalVariable* closure_parameter = scope->VariableAt(0);
+    // TODO(fschneider): Don't load context for optimized functions that
+    // don't use it.
+    __ movl(CTX, Address(EBP, closure_parameter->index() * kWordSize));
+    __ movl(CTX, FieldAddress(CTX, Closure::context_offset()));
+#ifdef dEBUG
+    Label ok;
+    __ LoadClassId(EBX, CTX);
+    __ cmpl(EBX, Immediate(kContextCid));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Incorrect context at entry");
+    __ Bind(&ok);
+#endif
+  }
+
   // In unoptimized code, initialize (non-argument) stack allocated slots to
   // null.
-  if (!is_optimizing() && (num_locals > 0)) {
+  if (!is_optimizing()) {
+    ASSERT(num_locals > 0);  // There is always at least context_var.
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ movl(EAX, raw_null);
+    const intptr_t context_index =
+        parsed_function().current_context_var()->index();
+    if (num_locals > 1) {
+      const Immediate& raw_null =
+          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      __ movl(EAX, raw_null);
+    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than EBP).
-      __ movl(Address(EBP, (slot_base - i) * kWordSize), EAX);
+      if (((slot_base - i) == context_index)) {
+        if (function.IsClosureFunction()) {
+          __ movl(Address(EBP, (slot_base - i) * kWordSize), CTX);
+        } else {
+          const Immediate& raw_empty_context =
+              Immediate(reinterpret_cast<intptr_t>(
+                  isolate()->object_store()->empty_context()));
+          __ movl(Address(EBP, (slot_base - i) * kWordSize), raw_empty_context);
+        }
+      } else {
+        ASSERT(num_locals > 1);
+        __ movl(Address(EBP, (slot_base - i) * kWordSize), EAX);
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 583de9b..c0ac35d 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1102,16 +1102,41 @@
     CopyParameters();
   }
 
+  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
+    // Load context from the closure object (first argument).
+    LocalScope* scope = parsed_function().node_sequence()->scope();
+    LocalVariable* closure_parameter = scope->VariableAt(0);
+    __ lw(CTX, Address(FP, closure_parameter->index() * kWordSize));
+    __ lw(CTX, FieldAddress(CTX, Closure::context_offset()));
+  }
+
   // In unoptimized code, initialize (non-argument) stack allocated slots to
   // null.
-  if (!is_optimizing() && (num_locals > 0)) {
+  if (!is_optimizing()) {
+    ASSERT(num_locals > 0);  // There is always at least context_var.
     __ TraceSimMsg("Initialize spill slots");
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
+    const intptr_t context_index =
+        parsed_function().current_context_var()->index();
+    if (num_locals > 1) {
+      __ LoadImmediate(V0, reinterpret_cast<int32_t>(Object::null()));
+    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than FP).
-      __ LoadImmediate(TMP, reinterpret_cast<int32_t>(Object::null()));
-      __ sw(TMP, Address(FP, (slot_base - i) * kWordSize));
+      if (((slot_base - i) == context_index)) {
+        if (function.IsClosureFunction()) {
+          __ sw(CTX, Address(FP, (slot_base - i) * kWordSize));
+        } else {
+          const Context& empty_context = Context::ZoneHandle(
+              isolate(), isolate()->object_store()->empty_context());
+          __ LoadObject(V1, empty_context);
+          __ sw(V1, Address(FP, (slot_base - i) * kWordSize));
+        }
+      } else {
+        ASSERT(num_locals > 1);
+        __ sw(V0, Address(FP, (slot_base - i) * kWordSize));
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 790fea4..1c4b7d7 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1113,15 +1113,48 @@
     CopyParameters();
   }
 
+  if (function.IsClosureFunction() && !flow_graph().IsCompiledForOsr()) {
+    // Load context from the closure object (first argument).
+    LocalScope* scope = parsed_function().node_sequence()->scope();
+    LocalVariable* closure_parameter = scope->VariableAt(0);
+    __ movq(CTX, Address(RBP, closure_parameter->index() * kWordSize));
+    __ movq(CTX, FieldAddress(CTX, Closure::context_offset()));
+#ifdef dEBUG
+    Label ok;
+    __ LoadClassId(RAX, CTX);
+    __ cmpq(RAX, Immediate(kContextCid));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Incorrect context at entry");
+    __ Bind(&ok);
+#endif
+  }
+
   // In unoptimized code, initialize (non-argument) stack allocated slots to
   // null.
-  if (!is_optimizing() && (num_locals > 0)) {
+  if (!is_optimizing()) {
+    ASSERT(num_locals > 0);  // There is always at least context_var.
     __ Comment("Initialize spill slots");
     const intptr_t slot_base = parsed_function().first_stack_local_index();
-    __ LoadObject(RAX, Object::null_object(), PP);
+    const intptr_t context_index =
+        parsed_function().current_context_var()->index();
+    if (num_locals > 1) {
+      __ LoadObject(RAX, Object::null_object(), PP);
+    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       // Subtract index i (locals lie at lower addresses than RBP).
-      __ movq(Address(RBP, (slot_base - i) * kWordSize), RAX);
+      if (((slot_base - i) == context_index)) {
+        if (function.IsClosureFunction()) {
+          __ movq(Address(RBP, (slot_base - i) * kWordSize), CTX);
+        } else {
+          const Context& empty_context = Context::ZoneHandle(
+              isolate(), isolate()->object_store()->empty_context());
+          __ StoreObject(
+              Address(RBP, (slot_base - i) * kWordSize), empty_context, PP);
+        }
+      } else {
+        ASSERT(num_locals > 1);
+        __ movq(Address(RBP, (slot_base - i) * kWordSize), RAX);
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 848cbfd..1a2cea8 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -926,6 +926,20 @@
         constant->ReplaceUsesWith(
             caller_graph_->GetConstant(constant->value()));
       }
+      CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
+      if ((context != NULL) && context->HasUses()) {
+        ASSERT(call->IsClosureCall());
+        LoadFieldInstr* context_load = new(isolate()) LoadFieldInstr(
+            new Value((*arguments)[0]->definition()),
+            Closure::context_offset(),
+            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            call_data->call->token_pos());
+        context_load->set_is_immutable(true);
+        context_load->set_ssa_temp_index(
+            caller_graph_->alloc_ssa_temp_index());
+        context_load->InsertBefore(callee_entry->next());
+        context->ReplaceUsesWith(context_load);
+      }
     }
 
     // Check that inlining maintains use lists.
@@ -1335,6 +1349,20 @@
       constant->ReplaceUsesWith(
           owner_->caller_graph()->GetConstant(constant->value()));
     }
+    CurrentContextInstr* context = (*defns)[i]->AsCurrentContext();
+    if ((context != NULL) && context->HasUses()) {
+      ASSERT(call_data.call->IsClosureCall());
+      LoadFieldInstr* context_load = new(isolate()) LoadFieldInstr(
+          new Value(redefinition),
+          Closure::context_offset(),
+          AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+          call_data.call->token_pos());
+      context_load->set_is_immutable(true);
+      context_load->set_ssa_temp_index(
+          owner_->caller_graph()->alloc_ssa_temp_index());
+      context_load->InsertAfter(redefinition);
+      context->ReplaceUsesWith(context_load);
+    }
   }
   return true;
 }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 7a70da4..709d42b 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -628,138 +628,41 @@
   }
 
   Definition* converted = NULL;
-  if ((from == kTagged) && (to == kUnboxedMint)) {
-    ASSERT((deopt_target != NULL) ||
-           (use->Type()->ToCid() == kUnboxedMint));
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
-  } else if ((from == kUnboxedMint) && (to == kTagged)) {
-    converted = new(I) BoxIntegerInstr(use->CopyWithType());
-  } else if ((from == kUnboxedUint32) && (to == kTagged)) {
-    converted = new(I) BoxUint32Instr(use->CopyWithType());
-  } else if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
+  if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
     const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+      deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
     converted = new(I) UnboxedIntConverterInstr(from,
                                                 to,
                                                 use->CopyWithType(),
                                                 deopt_id);
   } else if ((from == kUnboxedInt32) && (to == kUnboxedDouble)) {
     converted = new Int32ToDoubleInstr(use->CopyWithType());
-  } else if ((from == kTagged) && (to == kUnboxedInt32)) {
+  } else if ((from == kUnboxedMint) &&
+             (to == kUnboxedDouble) &&
+             CanConvertUnboxedMintToDouble()) {
     const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxInt32Instr(use->CopyWithType(), deopt_id);
-  } else if ((from == kUnboxedInt32) && (to == kTagged)) {
-    converted = new BoxInt32Instr(use->CopyWithType());
-  } else if ((from == kTagged) && (to == kUnboxedUint32)) {
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxUint32Instr(use->CopyWithType(), deopt_id);
-  } else if (from == kUnboxedMint && to == kUnboxedDouble) {
+      deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
     ASSERT(CanUnboxDouble());
+    converted = new MintToDoubleInstr(use->CopyWithType(), deopt_id);
+  } else if ((from == kTagged) && Boxing::Supports(to)) {
     const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    if (CanConvertUnboxedMintToDouble()) {
-      // Fast path.
-      converted = new MintToDoubleInstr(use->CopyWithType(), deopt_id);
-    } else {
-      // Slow path.
-      BoxIntegerInstr* boxed = new(I) BoxIntegerInstr(use->CopyWithType());
-      use->BindTo(boxed);
-      InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-      converted = new(I) UnboxDoubleInstr(new(I) Value(boxed), deopt_id);
-    }
-  } else if ((from == kUnboxedDouble) && (to == kTagged)) {
-    ASSERT(CanUnboxDouble());
-    converted = new(I) BoxDoubleInstr(use->CopyWithType());
-  } else if ((from == kTagged) && (to == kUnboxedDouble)) {
-    ASSERT(CanUnboxDouble());
-    ASSERT((deopt_target != NULL) ||
-           (use->Type()->ToCid() == kDoubleCid));
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    ConstantInstr* constant = use->definition()->AsConstant();
-    if ((constant != NULL) && constant->value().IsSmi()) {
-      const double dbl_val = Smi::Cast(constant->value()).AsDoubleValue();
-      const Double& dbl_obj =
-          Double::ZoneHandle(I, Double::NewCanonical(dbl_val));
-      ConstantInstr* double_const = flow_graph()->GetConstant(dbl_obj);
-      converted = new(I) UnboxDoubleInstr(new(I) Value(double_const), deopt_id);
-    } else {
-      converted = new(I) UnboxDoubleInstr(use->CopyWithType(), deopt_id);
-    }
-  } else if ((from == kTagged) && (to == kUnboxedFloat32x4)) {
-    ASSERT((deopt_target != NULL) ||
-           (use->Type()->ToCid() == kFloat32x4Cid));
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxFloat32x4Instr(
-        use->CopyWithType(), deopt_id);
-  } else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
-    converted = new(I) BoxFloat32x4Instr(use->CopyWithType());
-  } else if ((from == kTagged) && (to == kUnboxedInt32x4)) {
-    ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kInt32x4Cid));
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
-  } else if ((from == kUnboxedInt32x4) && (to == kTagged)) {
-    converted = new(I) BoxInt32x4Instr(use->CopyWithType());
-  } else if ((from == kTagged) && (to == kUnboxedFloat64x2)) {
-    ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kFloat64x2Cid));
-    const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxFloat64x2Instr(use->CopyWithType(), deopt_id);
-  } else if ((from == kUnboxedFloat64x2) && (to == kTagged)) {
-    converted = new(I) BoxFloat64x2Instr(use->CopyWithType());
+      deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    converted = UnboxInstr::Create(to, use->CopyWithType(), deopt_id);
+  } else if ((to == kTagged) && Boxing::Supports(from)) {
+    converted = BoxInstr::Create(from, use->CopyWithType());
   } else {
     // We have failed to find a suitable conversion instruction.
     // Insert two "dummy" conversion instructions with the correct
     // "from" and "to" representation. The inserted instructions will
     // trigger a deoptimization if executed. See #12417 for a discussion.
     const intptr_t deopt_id = (deopt_target != NULL) ?
-        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    ASSERT(from != kTagged);
-    ASSERT(to != kTagged);
-    Definition* boxed = NULL;
-    if (from == kUnboxedDouble) {
-      boxed = new(I) BoxDoubleInstr(use->CopyWithType());
-    } else if (from == kUnboxedInt32x4) {
-      boxed = new(I) BoxInt32x4Instr(use->CopyWithType());
-    } else if (from == kUnboxedFloat32x4) {
-      boxed = new(I) BoxFloat32x4Instr(use->CopyWithType());
-    } else if (from == kUnboxedMint) {
-      boxed = new(I) BoxIntegerInstr(use->CopyWithType());
-    } else if (from == kUnboxedFloat64x2) {
-      boxed = new(I) BoxFloat64x2Instr(use->CopyWithType());
-    } else if (from == kUnboxedInt32) {
-      boxed = new(I) BoxInt32Instr(use->CopyWithType());
-    } else if (from == kUnboxedUint32) {
-      boxed = new(I) BoxUint32Instr(use->CopyWithType());
-    } else {
-      UNIMPLEMENTED();
-    }
+      deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    ASSERT(Boxing::Supports(from));
+    ASSERT(Boxing::Supports(to));
+    Definition* boxed = BoxInstr::Create(from, use->CopyWithType());
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-    Value* to_value = new(I) Value(boxed);
-    if (to == kUnboxedDouble) {
-      converted = new(I) UnboxDoubleInstr(to_value, deopt_id);
-    } else if (to == kUnboxedInt32x4) {
-      converted = new(I) UnboxInt32x4Instr(to_value, deopt_id);
-    } else if (to == kUnboxedFloat32x4) {
-      converted = new(I) UnboxFloat32x4Instr(to_value, deopt_id);
-    } else if (to == kUnboxedMint) {
-      converted = new(I) UnboxIntegerInstr(to_value, deopt_id);
-    } else if (to == kUnboxedFloat64x2) {
-      converted = new(I) UnboxFloat64x2Instr(to_value, deopt_id);
-    } else if (to == kUnboxedInt32) {
-      boxed = new(I) UnboxInt32Instr(use->CopyWithType(), deopt_id);
-    } else if (to == kUnboxedUint32) {
-      boxed = new(I) UnboxUint32Instr(use->CopyWithType(), deopt_id);
-    } else {
-      UNIMPLEMENTED();
-    }
+    converted = UnboxInstr::Create(to, new(I) Value(boxed), deopt_id);
   }
   ASSERT(converted != NULL);
   InsertBefore(insert_before, converted, use->instruction()->env(),
@@ -1394,9 +1297,9 @@
                                     FlowGraph::kValue);
   } else if (array_cid == kTypedDataInt32ArrayCid) {
     stored_value = new(I) UnboxInt32Instr(
+        UnboxInt32Instr::kTruncate,
         new(I) Value(stored_value),
         call->deopt_id());
-    stored_value->AsUnboxIntN()->mark_truncating();
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
@@ -1405,7 +1308,7 @@
     stored_value = new(I) UnboxUint32Instr(
         new(I) Value(stored_value),
         call->deopt_id());
-    ASSERT(stored_value->AsUnboxIntN()->is_truncating());
+    ASSERT(stored_value->AsUnboxInteger()->is_truncating());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
@@ -3882,9 +3785,9 @@
                                     FlowGraph::kValue);
   } else if (view_cid == kTypedDataInt32ArrayCid) {
     stored_value = new(I) UnboxInt32Instr(
+        UnboxInt32Instr::kTruncate,
         new(I) Value(stored_value),
         call->deopt_id());
-    stored_value->AsUnboxIntN()->mark_truncating();
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
@@ -3893,7 +3796,7 @@
     stored_value = new(I) UnboxUint32Instr(
         new(I) Value(stored_value),
         call->deopt_id());
-    ASSERT(stored_value->AsUnboxIntN()->is_truncating());
+    ASSERT(stored_value->AsUnboxInteger()->is_truncating());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     call->env(),
@@ -5140,8 +5043,7 @@
 static bool IsLoadEliminationCandidate(Instruction* instr) {
   return instr->IsLoadField()
       || instr->IsLoadIndexed()
-      || instr->IsLoadStaticField()
-      || instr->IsCurrentContext();
+      || instr->IsLoadStaticField();
 }
 
 
@@ -5284,9 +5186,6 @@
 
     // Indexed location with a constant index.
     kConstantIndexed,
-
-    // Current context.
-    kContext
   };
 
   Place(const Place& other)
@@ -5373,21 +5272,6 @@
         break;
       }
 
-      case Instruction::kCurrentContext:
-        kind_ = kContext;
-        ASSERT(instr->AsCurrentContext()->representation() == kTagged);
-        representation_ = kTagged;
-        *is_load = true;
-        break;
-
-      case Instruction::kStoreContext:
-        kind_ = kContext;
-        ASSERT(instr->AsStoreContext()->RequiredInputRepresentation(
-            StoreContextInstr::kValuePos) == kTagged);
-        representation_ = kTagged;
-        *is_store = true;
-        break;
-
       default:
         break;
     }
@@ -5427,7 +5311,6 @@
       case kConstantIndexed:
         return true;
 
-      case kContext:
       case kNone:
         return false;
     }
@@ -5527,9 +5410,6 @@
             "<%s[%" Pd "]>",
             DefinitionName(instance()),
             index_constant());
-
-      case kContext:
-        return "<context>";
     }
     UNREACHABLE();
     return "<?>";
@@ -5956,9 +5836,7 @@
           // X.f or X.@offs alias with *.f and *.@offs respectively.
           CrossAlias(alias, alias->CopyWithoutInstance());
         }
-
-      case Place::kContext:
-        return;
+        break;
 
       case Place::kNone:
         UNREACHABLE();
@@ -6158,10 +6036,6 @@
     return store_static_field->value()->definition();
   }
 
-  if (instr->IsStoreContext()) {
-    return instr->InputAt(0)->definition();
-  }
-
   UNREACHABLE();  // Should only be called for supported store instructions.
   return NULL;
 }
@@ -7225,7 +7099,6 @@
           // Can't eliminate stores that initialized unboxed fields.
           return false;
         }
-      case Instruction::kStoreContext:
       case Instruction::kStoreIndexed:
       case Instruction::kStoreStaticField:
         return true;
@@ -7765,9 +7638,6 @@
 // --------------------------------------------------------------------------
 // Analysis of non-definition instructions.  They do not have values so they
 // cannot have constant values.
-void ConstantPropagator::VisitStoreContext(StoreContextInstr* instr) { }
-
-
 void ConstantPropagator::VisitCheckStackOverflow(
     CheckStackOverflowInstr* instr) { }
 
@@ -8400,13 +8270,13 @@
 }
 
 
-void ConstantPropagator::VisitBoxInteger(BoxIntegerInstr* instr) {
+void ConstantPropagator::VisitBoxInt64(BoxInt64Instr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
 }
 
 
-void ConstantPropagator::VisitUnboxInteger(UnboxIntegerInstr* instr) {
+void ConstantPropagator::VisitUnboxInt64(UnboxInt64Instr* instr) {
   // TODO(kmillikin): Handle unbox operation.
   SetValue(instr, non_constant_);
 }
@@ -8789,7 +8659,7 @@
 }
 
 
-void ConstantPropagator::VisitUnboxDouble(UnboxDoubleInstr* instr) {
+void ConstantPropagator::VisitUnbox(UnboxInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
@@ -8800,73 +8670,7 @@
 }
 
 
-void ConstantPropagator::VisitBoxDouble(BoxDoubleInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitUnboxFloat32x4(UnboxFloat32x4Instr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitBoxFloat32x4(BoxFloat32x4Instr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitUnboxFloat64x2(UnboxFloat64x2Instr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitBoxFloat64x2(BoxFloat64x2Instr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitUnboxInt32x4(UnboxInt32x4Instr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
-}
-
-
-void ConstantPropagator::VisitBoxInt32x4(BoxInt32x4Instr* instr) {
+void ConstantPropagator::VisitBox(BoxInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
@@ -9893,9 +9697,7 @@
     MaterializeObjectInstr* mat = materializations_[i];
     for (intptr_t j = 0; j < mat->InputCount(); j++) {
       Definition* defn = mat->InputAt(j)->definition();
-      if (defn->IsBoxDouble() ||
-          defn->IsBoxFloat32x4() ||
-          defn->IsBoxInt32x4()) {
+      if (defn->IsBox()) {
         mat->InputAt(j)->BindTo(defn->InputAt(0)->definition());
       }
     }
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index 8b597d7..18487cc 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -506,7 +506,7 @@
     // range possible for this value.
     // We don't need to handle kMintCid here because all external mints
     // (e.g. results of loads or function call) can be used only after they
-    // pass through UnboxIntegerInstr which is considered as mint-definition
+    // pass through UnboxInt64Instr which is considered as mint-definition
     // and will have a range assigned to it.
     // Note: that we can't return NULL here because it is used as lattice's
     // bottom element to indicate that the range was not computed *yet*.
@@ -1647,8 +1647,8 @@
   // TODO(johnmccutchan): Consider Smi operations, to avoid unnecessary tagging
   // & untagged of intermediate results.
   // TODO(johnmccutchan): Consider phis.
-  return def->IsBoxInteger()   ||   // BoxMint.
-         def->IsUnboxInteger() ||   // UnboxMint.
+  return def->IsBoxInt64() ||
+         def->IsUnboxInt64() ||
          def->IsBinaryMintOp() ||
          def->IsShiftMintOp()  ||
          def->IsUnaryMintOp();
@@ -1740,10 +1740,9 @@
 
 bool IntegerInstructionSelector::CanBecomeUint32(Definition* def) {
   ASSERT(IsPotentialUint32Definition(def));
-  if (def->IsBoxInteger()) {
-    // If a BoxInteger's input is a candidate, the box is a candidate.
-    BoxIntegerInstr* box = def->AsBoxInteger();
-    Definition* box_input = box->value()->definition();
+  if (def->IsBoxInt64()) {
+    // If a BoxInt64's input is a candidate, the box is a candidate.
+    Definition* box_input = def->AsBoxInt64()->value()->definition();
     return selected_uint32_defs_->Contains(box_input->ssa_temp_index());
   }
   // A right shift with an input outside of Uint32 range cannot be converted
@@ -1818,14 +1817,13 @@
     Value* right = op->right()->CopyWithType();
     intptr_t deopt_id = op->DeoptimizationTarget();
     return new(I) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
-  } else if (def->IsBoxInteger()) {
-    BoxIntegerInstr* box = def->AsBoxInteger();
-    Value* value = box->value()->CopyWithType();
+  } else if (def->IsBoxInt64()) {
+    Value* value = def->AsBoxInt64()->value()->CopyWithType();
     return new(I) BoxUint32Instr(value);
-  } else if (def->IsUnboxInteger()) {
-    UnboxIntegerInstr* unbox = def->AsUnboxInteger();
+  } else if (def->IsUnboxInt64()) {
+    UnboxInstr* unbox = def->AsUnboxInt64();
     Value* value = unbox->value()->CopyWithType();
-    intptr_t deopt_id = unbox->deopt_id();
+    intptr_t deopt_id = unbox->DeoptimizationTarget();
     return new(I) UnboxUint32Instr(value, deopt_id);
   } else if (def->IsUnaryMintOp()) {
     UnaryMintOpInstr* op = def->AsUnaryMintOp();
@@ -2908,7 +2906,7 @@
 }
 
 
-void BoxInt32Instr::InferRange(RangeAnalysis* analysis, Range* range) {
+void BoxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   const Range* value_range = value()->definition()->range();
   if (!Range::IsUnknown(value_range)) {
     *range = *value_range;
@@ -2936,6 +2934,17 @@
 }
 
 
+void UnboxInt64Instr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = value()->definition()->range();
+  if (value_range != NULL) {
+    *range = *value_range;
+  } else if (!value()->definition()->IsMintDefinition() &&
+             (value()->definition()->Type()->ToCid() != kSmiCid)) {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+  }
+}
+
+
 void UnboxedIntConverterInstr::InferRange(RangeAnalysis* analysis,
                                           Range* range) {
   ASSERT((from() == kUnboxedInt32) ||
@@ -2963,28 +2972,6 @@
 }
 
 
-void BoxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  const Range* input_range = value()->definition()->range();
-  if (input_range != NULL) {
-    bool is_smi = input_range->Fits(RangeBoundary::kRangeBoundarySmi);
-    set_is_smi(is_smi);
-    // The output range is the same as the input range.
-    *range = *input_range;
-  }
-}
-
-
-void UnboxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  const Range* value_range = value()->definition()->range();
-  if (value_range != NULL) {
-    *range = *value_range;
-  } else if (!value()->definition()->IsMintDefinition() &&
-             (value()->definition()->Type()->ToCid() != kSmiCid)) {
-    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
-  }
-}
-
-
 bool CheckArrayBoundInstr::IsRedundant(const RangeBoundary& length) {
   Range* index_range = index()->definition()->range();
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 0501f6a..fc33aaf 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -548,12 +548,14 @@
   if (type_ == NULL) {
     ASSERT(cid_ != kIllegalCid);
 
-    // VM internal Function objects don't have a compile-type. Return
-    // dynamic-type in this case.
-    if (cid_ == kFunctionCid) {
+    // VM internal Function and Context objects don't have a compile-type.
+    // Return dynamic-type in this case.
+    if (cid_ == kFunctionCid || cid_ == kContextCid) {
       type_ = &Type::ZoneHandle(Type::DynamicType());
       return type_;
     }
+    // Except the special cases above, only instances are expected.
+    ASSERT(cid_ >= kInstanceCid);
 
     const Class& type_class =
         Class::Handle(Isolate::Current()->class_table()->At(cid_));
@@ -1042,7 +1044,7 @@
 }
 
 // Note that MintOp may produce Smi-s as result of an
-// appended BoxIntegerInstr node.
+// appended BoxInt64Instr node.
 CompileType BinaryMintOpInstr::ComputeType() const {
   return CompileType::Int();
 }
@@ -1059,29 +1061,11 @@
 
 
 CompileType BoxIntegerInstr::ComputeType() const {
-  if (is_smi()) {
-    return CompileType::FromCid(kSmiCid);
-  }
-  return CompileType::Int();
-}
-
-
-bool BoxIntegerInstr::RecomputeType() {
-  return UpdateType(ComputeType());
-}
-
-
-CompileType BoxIntNInstr::ComputeType() const {
   return ValueFitsSmi() ? CompileType::FromCid(kSmiCid) : CompileType::Int();
 }
 
 
-CompileType UnboxIntNInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
-bool BoxIntNInstr::RecomputeType() {
+bool BoxIntegerInstr::RecomputeType() {
   return UpdateType(ComputeType());
 }
 
@@ -1288,43 +1272,48 @@
 }
 
 
-CompileType UnboxDoubleInstr::ComputeType() const {
-  return CompileType::FromCid(kDoubleCid);
+CompileType UnboxInstr::ComputeType() const {
+  switch (representation()) {
+    case kUnboxedDouble:
+      return CompileType::FromCid(kDoubleCid);
+
+    case kUnboxedFloat32x4:
+      return CompileType::FromCid(kFloat32x4Cid);
+
+    case kUnboxedFloat64x2:
+      return CompileType::FromCid(kFloat64x2Cid);
+
+    case kUnboxedInt32x4:
+      return CompileType::FromCid(kInt32x4Cid);
+
+    case kUnboxedMint:
+      return CompileType::Int();
+
+    default:
+      UNREACHABLE();
+      return CompileType::Dynamic();
+  }
 }
 
 
-CompileType BoxDoubleInstr::ComputeType() const {
-  return CompileType::FromCid(kDoubleCid);
-}
+CompileType BoxInstr::ComputeType() const {
+  switch (from_representation()) {
+    case kUnboxedDouble:
+      return CompileType::FromCid(kDoubleCid);
 
+    case kUnboxedFloat32x4:
+      return CompileType::FromCid(kFloat32x4Cid);
 
-CompileType UnboxFloat32x4Instr::ComputeType() const {
-  return CompileType::FromCid(kFloat32x4Cid);
-}
+    case kUnboxedFloat64x2:
+      return CompileType::FromCid(kFloat64x2Cid);
 
+    case kUnboxedInt32x4:
+      return CompileType::FromCid(kInt32x4Cid);
 
-CompileType BoxFloat32x4Instr::ComputeType() const {
-  return CompileType::FromCid(kFloat32x4Cid);
-}
-
-
-CompileType UnboxFloat64x2Instr::ComputeType() const {
-  return CompileType::FromCid(kFloat64x2Cid);
-}
-
-
-CompileType BoxFloat64x2Instr::ComputeType() const {
-  return CompileType::FromCid(kFloat64x2Cid);
-}
-
-
-CompileType UnboxInt32x4Instr::ComputeType() const {
-  return CompileType::FromCid(kInt32x4Cid);
-}
-
-
-CompileType BoxInt32x4Instr::ComputeType() const {
-  return CompileType::FromCid(kInt32x4Cid);
+    default:
+      UNREACHABLE();
+      return CompileType::Dynamic();
+  }
 }
 
 
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 5a34fcc..df8c95c 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -356,7 +356,7 @@
 
 
 void ClosureCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("function=");
+  f->Print(" function=");
   InputAt(0)->PrintTo(f);
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
     f->Print(", ");
@@ -366,7 +366,7 @@
 
 
 void InstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", function_name().ToCString());
+  f->Print(" %s", function_name().ToCString());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
     f->Print(", ");
     PushArgumentAt(i)->value()->PrintTo(f);
@@ -378,7 +378,7 @@
 
 
 void PolymorphicInstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s", instance_call()->function_name().ToCString());
+  f->Print(" %s", instance_call()->function_name().ToCString());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
     f->Print(", ");
     PushArgumentAt(i)->value()->PrintTo(f);
@@ -417,7 +417,7 @@
 
 
 void StaticCallInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s ", String::Handle(function().name()).ToCString());
+  f->Print(" %s ", String::Handle(function().name()).ToCString());
   for (intptr_t i = 0; i < ArgumentCount(); ++i) {
     if (i > 0) f->Print(", ");
     PushArgumentAt(i)->value()->PrintTo(f);
@@ -986,7 +986,7 @@
 }
 
 
-void UnboxIntNInstr::PrintOperandsTo(BufferFormatter* f) const {
+void UnboxIntegerInstr::PrintOperandsTo(BufferFormatter* f) const {
   if (is_truncating()) {
     f->Print("[tr], ");
   }
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 7a80023..c0a4f03 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -390,12 +390,12 @@
 
 
 bool Value::BindsTo32BitMaskConstant() const {
-  if (!definition()->IsUnboxInteger() || !definition()->IsUnboxUint32()) {
+  if (!definition()->IsUnboxInt64() || !definition()->IsUnboxUint32()) {
     return false;
   }
-  // Two cases to consider: UnboxInteger and UnboxUint32.
-  if (definition()->IsUnboxInteger()) {
-    UnboxIntegerInstr* instr = definition()->AsUnboxInteger();
+  // Two cases to consider: UnboxInt64 and UnboxUint32.
+  if (definition()->IsUnboxInt64()) {
+    UnboxInt64Instr* instr = definition()->AsUnboxInt64();
     if (!instr->value()->BindsToConstant()) {
       return false;
     }
@@ -1055,7 +1055,7 @@
 }
 
 
-void JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) {
+PhiInstr* JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) {
   // Lazily initialize the array of phis.
   // Currently, phis are stored in a sparse array that holds the phi
   // for variable with index i at position i.
@@ -1067,7 +1067,7 @@
     }
   }
   ASSERT((*phis_)[var_index] == NULL);
-  (*phis_)[var_index] = new PhiInstr(this, PredecessorCount());
+  return (*phis_)[var_index] = new PhiInstr(this, PredecessorCount());
 }
 
 
@@ -1262,9 +1262,9 @@
 
 static bool ToIntegerConstant(Value* value, int64_t* result) {
   if (!value->BindsToConstant()) {
-    if (value->definition()->IsUnboxDouble()) {
-      return ToIntegerConstant(value->definition()->AsUnboxDouble()->value(),
-                               result);
+    UnboxInstr* unbox = value->definition()->AsUnbox();
+    if ((unbox != NULL) && (unbox->representation() == kUnboxedDouble)) {
+      return ToIntegerConstant(unbox->value(), result);
     }
     return false;
   }
@@ -1904,164 +1904,47 @@
 }
 
 
-Definition* BoxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
+Definition* BoxInstr::Canonicalize(FlowGraph* flow_graph) {
   if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
 
-  // Fold away BoxDouble(UnboxDouble(v)) if value is known to be double.
-  UnboxDoubleInstr* defn = value()->definition()->AsUnboxDouble();
-  if ((defn != NULL) && (defn->value()->Type()->ToCid() == kDoubleCid)) {
-    return defn->value()->definition();
+  // Fold away Box<rep>(Unbox<rep>(v)) if value is known to be of the
+  // right class.
+  UnboxInstr* unbox_defn = value()->definition()->AsUnbox();
+  if ((unbox_defn != NULL) &&
+      (unbox_defn->representation() == from_representation()) &&
+      (unbox_defn->value()->Type()->ToCid() == Type()->ToCid())) {
+    return unbox_defn->value()->definition();
   }
 
   return this;
 }
 
 
-bool BoxIntNInstr::ValueFitsSmi() const {
+bool BoxIntegerInstr::ValueFitsSmi() const {
   Range* range = value()->definition()->range();
   return RangeUtils::Fits(range, RangeBoundary::kRangeBoundarySmi);
 }
 
 
-Definition* BoxIntNInstr::Canonicalize(FlowGraph* flow_graph) {
-  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
-    // Environments can accomodate any representation. No need to box.
-    return value()->definition();
-  }
-
-  return this;
-}
-
-
-Definition* UnboxIntNInstr::Canonicalize(FlowGraph* flow_graph) {
-  if (!HasUses()) return NULL;
-
-  // Fold away UnboxInt<N>Instr(BoxInt<N>Instr(v)).
-  BoxIntNInstr* box_defn = value()->definition()->AsBoxIntN();
-  if (box_defn != NULL) {
-    if (box_defn->value()->definition()->representation() == representation()) {
-      return box_defn->value()->definition();
-    } else {
-      UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
-          box_defn->value()->definition()->representation(),
-          representation(),
-          box_defn->value()->CopyWithType(),
-          (representation() == kUnboxedInt32) ?
-              GetDeoptId() : Isolate::kNoDeoptId);
-      if ((representation() == kUnboxedInt32) && is_truncating()) {
-        converter->mark_truncating();
-      }
-      flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
-      return converter;
-    }
-  }
-
-  return this;
-}
-
-
-Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) {
-  if (!HasUses()) return NULL;
-
-  UnboxedIntConverterInstr* box_defn =
-      value()->definition()->AsUnboxedIntConverter();
-  if ((box_defn != NULL) && (box_defn->representation() == from())) {
-    if (box_defn->from() == to()) {
-      return box_defn->value()->definition();
-    }
-
-    UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
-        box_defn->from(),
-        representation(),
-        box_defn->value()->CopyWithType(),
-        (to() == kUnboxedInt32) ? GetDeoptId() : Isolate::kNoDeoptId);
-    if ((representation() == kUnboxedInt32) && is_truncating()) {
-      converter->mark_truncating();
-    }
-    flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
-    return converter;
-  }
-
-  UnboxIntegerInstr* unbox_defn = value()->definition()->AsUnboxInteger();
-  if (unbox_defn != NULL &&
-      (from() == kUnboxedMint) &&
-      (to() == kUnboxedInt32) &&
-      unbox_defn->HasOnlyInputUse(value())) {
-    // TODO(vegorov): there is a duplication of code between UnboxedIntCoverter
-    // and code path that unboxes Mint into Int32. We should just schedule
-    // these instructions close to each other instead of fusing them.
-    Definition* replacement =
-        new UnboxInt32Instr(unbox_defn->value()->CopyWithType(), GetDeoptId());
-    if (is_truncating()) {
-      replacement->AsUnboxInt32()->mark_truncating();
-    }
-    flow_graph->InsertBefore(this,
-                             replacement,
-                             env(),
-                             FlowGraph::kValue);
-    return replacement;
-  }
-
-  return this;
-}
-
-
-Definition* UnboxInt32Instr::Canonicalize(FlowGraph* flow_graph) {
-  Definition* replacement = UnboxIntNInstr::Canonicalize(flow_graph);
-  if (replacement != this) {
-    return replacement;
-  }
-
-  ConstantInstr* c = value()->definition()->AsConstant();
-  if ((c != NULL) && c->value().IsSmi()) {
-    if (!is_truncating() && (kSmiBits > 32)) {
-      // Check that constant fits into 32-bit integer.
-      const int64_t value =
-          static_cast<int64_t>(Smi::Cast(c->value()).Value());
-      if (!Utils::IsInt(32, value)) {
-        return this;
-      }
-    }
-
-    UnboxedConstantInstr* uc =
-        new UnboxedConstantInstr(c->value(), kUnboxedInt32);
-    flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
-    return uc;
-  }
-
-  return this;
-}
-
-
-Definition* UnboxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
-  if (!HasUses()) return NULL;
-  // Fold away UnboxDouble(BoxDouble(v)).
-  BoxDoubleInstr* box_defn = value()->definition()->AsBoxDouble();
-  if (box_defn != NULL) {
-    return box_defn->value()->definition();
-  }
-
-  ConstantInstr* c = value()->definition()->AsConstant();
-  if ((c != NULL) && c->value().IsDouble()) {
-    UnboxedConstantInstr* uc =
-        new UnboxedConstantInstr(c->value(), kUnboxedDouble);
-    flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
-    return uc;
-  }
-
-  return this;
-}
-
-
 Definition* BoxIntegerInstr::Canonicalize(FlowGraph* flow_graph) {
   if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
 
+  return this;
+}
+
+
+Definition* BoxInt64Instr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* replacement = BoxIntegerInstr::Canonicalize(flow_graph);
+  if (replacement != this) {
+    return replacement;
+  }
+
   UnboxedIntConverterInstr* conv =
       value()->definition()->AsUnboxedIntConverter();
   if (conv != NULL) {
@@ -2093,82 +1976,138 @@
 }
 
 
+Definition* UnboxInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
+
+  // Fold away Unbox<rep>(Box<rep>(v)).
+  BoxInstr* box_defn = value()->definition()->AsBox();
+  if ((box_defn != NULL) &&
+      (box_defn->from_representation() == representation())) {
+    return box_defn->value()->definition();
+  }
+
+  if ((representation() == kUnboxedDouble) && value()->BindsToConstant()) {
+    UnboxedConstantInstr* uc = NULL;
+
+    const Object& val = value()->BoundConstant();
+    if (val.IsSmi()) {
+      const Double& double_val = Double::ZoneHandle(flow_graph->isolate(),
+          Double::NewCanonical(Smi::Cast(val).AsDoubleValue()));
+      uc = new UnboxedConstantInstr(double_val, kUnboxedDouble);
+    } else if (val.IsDouble()) {
+      uc = new UnboxedConstantInstr(val, kUnboxedDouble);
+    }
+
+    if (uc != NULL) {
+      flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
+      return uc;
+    }
+  }
+
+  return this;
+}
+
+
 Definition* UnboxIntegerInstr::Canonicalize(FlowGraph* flow_graph) {
   if (!HasUses()) return NULL;
-  return this;
-}
 
-
-Definition* BoxFloat32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
-    // Environments can accomodate any representation. No need to box.
-    return value()->definition();
-  }
-
-  // Fold away BoxFloat32x4(UnboxFloat32x4(v)).
-  UnboxFloat32x4Instr* defn = value()->definition()->AsUnboxFloat32x4();
-  if ((defn != NULL) && (defn->value()->Type()->ToCid() == kFloat32x4Cid)) {
-    return defn->value()->definition();
+  // Fold away UnboxInteger<rep_to>(BoxInteger<rep_from>(v)).
+  BoxIntegerInstr* box_defn = value()->definition()->AsBoxInteger();
+  if (box_defn != NULL) {
+    if (box_defn->value()->definition()->representation() == representation()) {
+      return box_defn->value()->definition();
+    } else {
+      UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
+          box_defn->value()->definition()->representation(),
+          representation(),
+          box_defn->value()->CopyWithType(),
+          (representation() == kUnboxedInt32) ?
+              GetDeoptId() : Isolate::kNoDeoptId);
+      if ((representation() == kUnboxedInt32) && is_truncating()) {
+        converter->mark_truncating();
+      }
+      flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
+      return converter;
+    }
   }
 
   return this;
 }
 
 
-Definition* UnboxFloat32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  // Fold away UnboxFloat32x4(BoxFloat32x4(v)).
-  BoxFloat32x4Instr* defn = value()->definition()->AsBoxFloat32x4();
-  return (defn != NULL) ? defn->value()->definition() : this;
-}
-
-
-Definition* BoxFloat64x2Instr::Canonicalize(FlowGraph* flow_graph) {
-  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
-    // Environments can accomodate any representation. No need to box.
-    return value()->definition();
+Definition* UnboxInt32Instr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* replacement = UnboxIntegerInstr::Canonicalize(flow_graph);
+  if (replacement != this) {
+    return replacement;
   }
 
-  // Fold away BoxFloat64x2(UnboxFloat64x2(v)).
-  UnboxFloat64x2Instr* defn = value()->definition()->AsUnboxFloat64x2();
-  if ((defn != NULL) && (defn->value()->Type()->ToCid() == kFloat64x2Cid)) {
-    return defn->value()->definition();
+  ConstantInstr* c = value()->definition()->AsConstant();
+  if ((c != NULL) && c->value().IsSmi()) {
+    if (!is_truncating() && (kSmiBits > 32)) {
+      // Check that constant fits into 32-bit integer.
+      const int64_t value =
+          static_cast<int64_t>(Smi::Cast(c->value()).Value());
+      if (!Utils::IsInt(32, value)) {
+        return this;
+      }
+    }
+
+    UnboxedConstantInstr* uc =
+        new UnboxedConstantInstr(c->value(), kUnboxedInt32);
+    flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
+    return uc;
   }
 
   return this;
 }
 
 
-Definition* UnboxFloat64x2Instr::Canonicalize(FlowGraph* flow_graph) {
-  // Fold away UnboxFloat64x2(BoxFloat64x2(v)).
-  BoxFloat64x2Instr* defn = value()->definition()->AsBoxFloat64x2();
-  return (defn != NULL) ? defn->value()->definition() : this;
-}
+Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
 
+  UnboxedIntConverterInstr* box_defn =
+      value()->definition()->AsUnboxedIntConverter();
+  if ((box_defn != NULL) && (box_defn->representation() == from())) {
+    if (box_defn->from() == to()) {
+      return box_defn->value()->definition();
+    }
 
-
-Definition* BoxInt32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
-    // Environments can accomodate any representation. No need to box.
-    return value()->definition();
+    UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
+        box_defn->from(),
+        representation(),
+        box_defn->value()->CopyWithType(),
+        (to() == kUnboxedInt32) ? GetDeoptId() : Isolate::kNoDeoptId);
+    if ((representation() == kUnboxedInt32) && is_truncating()) {
+      converter->mark_truncating();
+    }
+    flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
+    return converter;
   }
 
-  // Fold away BoxInt32x4(UnboxInt32x4(v)).
-  UnboxInt32x4Instr* defn = value()->definition()->AsUnboxInt32x4();
-  if ((defn != NULL) && (defn->value()->Type()->ToCid() == kInt32x4Cid)) {
-    return defn->value()->definition();
+  UnboxInt64Instr* unbox_defn = value()->definition()->AsUnboxInt64();
+  if (unbox_defn != NULL &&
+      (from() == kUnboxedMint) &&
+      (to() == kUnboxedInt32) &&
+      unbox_defn->HasOnlyInputUse(value())) {
+    // TODO(vegorov): there is a duplication of code between UnboxedIntCoverter
+    // and code path that unboxes Mint into Int32. We should just schedule
+    // these instructions close to each other instead of fusing them.
+    Definition* replacement =
+        new UnboxInt32Instr(is_truncating() ? UnboxInt32Instr::kTruncate
+                                            : UnboxInt32Instr::kNoTruncation,
+                            unbox_defn->value()->CopyWithType(),
+                            GetDeoptId());
+    flow_graph->InsertBefore(this,
+                             replacement,
+                             env(),
+                             FlowGraph::kValue);
+    return replacement;
   }
 
   return this;
 }
 
 
-Definition* UnboxInt32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  // Fold away UnboxInt32x4(BoxInt32x4(v)).
-  BoxInt32x4Instr* defn = value()->definition()->AsBoxInt32x4();
-  return (defn != NULL) ? defn->value()->definition() : this;
-}
-
-
 Definition* BooleanNegateInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* defn = value()->definition();
   if (defn->IsComparison() && defn->HasOnlyUse(value())) {
@@ -2460,6 +2399,75 @@
 }
 
 
+BoxInstr* BoxInstr::Create(Representation from, Value* value) {
+  switch (from) {
+    case kUnboxedInt32:
+      return new BoxInt32Instr(value);
+
+    case kUnboxedUint32:
+      return new BoxUint32Instr(value);
+
+    case kUnboxedMint:
+      return new BoxInt64Instr(value);
+
+    case kUnboxedDouble:
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      return new BoxInstr(from, value);
+
+    default:
+      UNREACHABLE();
+      return NULL;
+  }
+}
+
+
+UnboxInstr* UnboxInstr::Create(Representation to,
+                               Value* value,
+                               intptr_t deopt_id) {
+  switch (to) {
+    case kUnboxedInt32:
+      return new UnboxInt32Instr(
+          UnboxInt32Instr::kNoTruncation, value, deopt_id);
+
+    case kUnboxedUint32:
+      return new UnboxUint32Instr(value, deopt_id);
+
+    case kUnboxedMint:
+      return new UnboxInt64Instr(value, deopt_id);
+
+    case kUnboxedDouble:
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      return new UnboxInstr(to, value, deopt_id);
+
+    default:
+      UNREACHABLE();
+      return NULL;
+  }
+}
+
+
+bool UnboxInstr::CanConvertSmi() const {
+  switch (representation()) {
+    case kUnboxedDouble:
+    case kUnboxedMint:
+      return true;
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      return false;
+
+    default:
+      UNREACHABLE();
+      return false;
+  }
+}
+
+
 // Shared code generation methods (EmitNativeCode and
 // MakeLocationSummary). Only assembly code that can be shared across all
 // architectures can be used. Machine specific register allocation and code
@@ -2645,33 +2653,15 @@
 
 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return LocationSummary::Make(isolate,
-                               0,
-                               Location::RegisterLocation(CTX),
-                               LocationSummary::kNoCall);
+  // Only appears in initial definitions, never in normal code.
+  UNREACHABLE();
+  return NULL;
 }
 
 
 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // No code to emit. Just assert the correct result register.
-  ASSERT(locs()->out(0).reg() == CTX);
-}
-
-
-LocationSummary* StoreContextInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool optimizing) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RegisterLocation(CTX));
-  return summary;
-}
-
-
-void StoreContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // Nothing to do.  Context register was loaded by the register allocator.
-  ASSERT(locs()->in(0).reg() == CTX);
+  // Only appears in initial definitions, never in normal code.
+  UNREACHABLE();
 }
 
 
@@ -2729,7 +2719,7 @@
 
 LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool optimizing) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -2847,7 +2837,7 @@
 
 LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool optimizing) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 26733a5..83106c7 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -20,7 +20,7 @@
 
 class BitVector;
 class BlockEntryInstr;
-class BoxIntNInstr;
+class BoxIntegerInstr;
 class BufferFormatter;
 class CatchBlockEntryInstr;
 class ComparisonInstr;
@@ -36,7 +36,7 @@
 class Range;
 class RangeAnalysis;
 class RangeBoundary;
-class UnboxIntNInstr;
+class UnboxIntegerInstr;
 
 // CompileType describes type of the value produced by the definition.
 //
@@ -437,7 +437,6 @@
   M(AssertAssignable)                                                          \
   M(AssertBoolean)                                                             \
   M(CurrentContext)                                                            \
-  M(StoreContext)                                                              \
   M(ClosureCall)                                                               \
   M(InstanceCall)                                                              \
   M(PolymorphicInstanceCall)                                                   \
@@ -491,14 +490,10 @@
   M(BinaryDoubleOp)                                                            \
   M(MathUnary)                                                                 \
   M(MathMinMax)                                                                \
-  M(UnboxDouble)                                                               \
-  M(BoxDouble)                                                                 \
-  M(BoxFloat32x4)                                                              \
-  M(UnboxFloat32x4)                                                            \
-  M(BoxInt32x4)                                                                \
-  M(UnboxInt32x4)                                                              \
-  M(UnboxInteger)                                                              \
-  M(BoxInteger)                                                                \
+  M(Box)                                                                       \
+  M(Unbox)                                                                     \
+  M(BoxInt64)                                                                  \
+  M(UnboxInt64)                                                                \
   M(BinaryMintOp)                                                              \
   M(ShiftMintOp)                                                               \
   M(UnaryMintOp)                                                               \
@@ -537,8 +532,6 @@
   M(BinaryInt32x4Op)                                                           \
   M(TestSmi)                                                                   \
   M(TestCids)                                                                  \
-  M(BoxFloat64x2)                                                              \
-  M(UnboxFloat64x2)                                                            \
   M(BinaryFloat64x2Op)                                                         \
   M(Float64x2Zero)                                                             \
   M(Float64x2Constructor)                                                      \
@@ -561,8 +554,8 @@
 
 #define FOR_EACH_ABSTRACT_INSTRUCTION(M)                                       \
   M(BlockEntry)                                                                \
-  M(BoxIntN)                                                                   \
-  M(UnboxIntN)                                                                 \
+  M(BoxInteger)                                                                \
+  M(UnboxInteger)                                                              \
   M(Comparison)                                                                \
   M(UnaryIntegerOp)                                                            \
   M(BinaryIntegerOp)                                                           \
@@ -726,7 +719,7 @@
     locs_ = MakeLocationSummary(isolate, optimizing);
   }
 
-  static LocationSummary* MakeCallSummary();
+  static LocationSummary* MakeCallSummary(Isolate* isolate);
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
     UNIMPLEMENTED();
@@ -1358,7 +1351,7 @@
 
   ZoneGrowableArray<PhiInstr*>* phis() const { return phis_; }
 
-  void InsertPhi(intptr_t var_index, intptr_t var_count);
+  PhiInstr* InsertPhi(intptr_t var_index, intptr_t var_count);
   void RemoveDeadPhis(Definition* replacement);
 
   void InsertPhi(PhiInstr* phi);
@@ -1621,14 +1614,7 @@
   }
 
   // Does this define a mint?
-  bool IsMintDefinition() {
-    return (Type()->ToCid() == kMintCid) ||
-            IsBinaryMintOp() ||
-            IsUnaryMintOp() ||
-            IsShiftMintOp() ||
-            IsBoxInteger() ||
-            IsUnboxInteger();
-  }
+  inline bool IsMintDefinition();
 
   bool IsInt32Definition() {
     return IsBinaryInt32Op() ||
@@ -2330,31 +2316,6 @@
 };
 
 
-class StoreContextInstr : public TemplateInstruction<1, NoThrow> {
- public:
-  explicit StoreContextInstr(Value* value) {
-    SetInputAt(kValuePos, value);
-  }
-
-  enum {
-    kValuePos = 0
-  };
-
-  DECLARE_INSTRUCTION(StoreContext)
-
-  virtual intptr_t ArgumentCount() const { return 0; }
-
-  Value* value() const { return inputs_[kValuePos]; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StoreContextInstr);
-};
-
-
 class DeoptimizeInstr : public TemplateInstruction<0, NoThrow, Pure> {
  public:
   DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id)
@@ -4419,321 +4380,358 @@
 };
 
 
-class BoxDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
+class Boxing : public AllStatic {
  public:
-  explicit BoxDoubleInstr(Value* value) {
-    SetInputAt(0, value);
+  static bool Supports(Representation rep) {
+    switch (rep) {
+      case kUnboxedDouble:
+      case kUnboxedFloat32x4:
+      case kUnboxedFloat64x2:
+      case kUnboxedInt32x4:
+      case kUnboxedMint:
+      case kUnboxedInt32:
+      case kUnboxedUint32:
+        return true;
+      default:
+        return false;
+    }
   }
 
-  Value* value() const { return inputs_[0]; }
+  static intptr_t ValueOffset(Representation rep) {
+    switch (rep) {
+      case kUnboxedDouble:
+        return Double::value_offset();
 
-  DECLARE_INSTRUCTION(BoxDouble)
-  virtual CompileType ComputeType() const;
+      case kUnboxedFloat32x4:
+        return Float32x4::value_offset();
 
-  virtual bool CanDeoptimize() const { return false; }
+      case kUnboxedFloat64x2:
+        return Float64x2::value_offset();
 
-  virtual intptr_t DeoptimizationTarget() const {
-    return Isolate::kNoDeoptId;
+      case kUnboxedInt32x4:
+        return Int32x4::value_offset();
+
+      case kUnboxedMint:
+        return Mint::value_offset();
+
+      default:
+        UNREACHABLE();
+        return 0;
+    }
   }
 
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return kUnboxedDouble;
+  static intptr_t BoxCid(Representation rep) {
+    switch (rep) {
+      case kUnboxedMint:
+        return kMintCid;
+      case kUnboxedDouble:
+        return kDoubleCid;
+      case kUnboxedFloat32x4:
+        return kFloat32x4Cid;
+      case kUnboxedFloat64x2:
+        return kFloat64x2Cid;
+      case kUnboxedInt32x4:
+        return kInt32x4Cid;
+      default:
+        UNREACHABLE();
+        return kIllegalCid;
+    }
   }
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BoxDoubleInstr);
 };
 
 
-class BoxFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  explicit BoxFloat32x4Instr(Value* value) {
-    SetInputAt(0, value);
-  }
+  static BoxInstr* Create(Representation from, Value* value);
 
   Value* value() const { return inputs_[0]; }
+  Representation from_representation() const { return from_representation_; }
+
+  DECLARE_INSTRUCTION(Box)
+  virtual CompileType ComputeType() const;
 
   virtual bool CanDeoptimize() const { return false; }
-
   virtual intptr_t DeoptimizationTarget() const {
     return Isolate::kNoDeoptId;
   }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
-    return kUnboxedFloat32x4;
+    return from_representation();
   }
 
-  DECLARE_INSTRUCTION(BoxFloat32x4)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return other->AsBox()->from_representation() == from_representation();
+  }
 
   Definition* Canonicalize(FlowGraph* flow_graph);
 
- private:
-  DISALLOW_COPY_AND_ASSIGN(BoxFloat32x4Instr);
-};
-
-
-class BoxFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
- public:
-  explicit BoxFloat64x2Instr(Value* value) {
+ protected:
+  BoxInstr(Representation from_representation, Value* value)
+      : from_representation_(from_representation) {
     SetInputAt(0, value);
   }
 
-  Value* value() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return Isolate::kNoDeoptId;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return kUnboxedFloat64x2;
-  }
-
-  DECLARE_INSTRUCTION(BoxFloat64x2)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
-
  private:
-  DISALLOW_COPY_AND_ASSIGN(BoxFloat64x2Instr);
+  intptr_t ValueOffset() const {
+    return Boxing::ValueOffset(from_representation());
+  }
+
+  const Representation from_representation_;
+
+  DISALLOW_COPY_AND_ASSIGN(BoxInstr);
 };
 
 
-
-class BoxInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxIntegerInstr : public BoxInstr {
  public:
-  explicit BoxInt32x4Instr(Value* value) {
-    SetInputAt(0, value);
-  }
+  BoxIntegerInstr(Representation representation, Value* value)
+      : BoxInstr(representation, value) { }
 
-  Value* value() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return Isolate::kNoDeoptId;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return kUnboxedInt32x4;
-  }
-
-  DECLARE_INSTRUCTION(BoxInt32x4)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BoxInt32x4Instr);
-};
-
-
-class BoxIntegerInstr : public TemplateDefinition<1, NoThrow, Pure> {
- public:
-  explicit BoxIntegerInstr(Value* value) : is_smi_(false) {
-    SetInputAt(0, value);
-  }
-
-  Value* value() const { return inputs_[0]; }
-
-  bool is_smi() const { return is_smi_; }
-  void set_is_smi(bool is_smi) { is_smi_ = is_smi; }
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return Isolate::kNoDeoptId;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return kUnboxedMint;
-  }
-
-  DECLARE_INSTRUCTION(BoxInteger)
-  virtual CompileType ComputeType() const;
-  virtual bool RecomputeType();
+  virtual bool ValueFitsSmi() const;
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
+  virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
- private:
-  bool is_smi_;
+  DEFINE_INSTRUCTION_TYPE_CHECK(BoxInteger)
 
+ private:
   DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
 };
 
 
-class UnboxDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxInteger32Instr : public BoxIntegerInstr {
  public:
-  UnboxDoubleInstr(Value* value, intptr_t deopt_id)
-      : TemplateDefinition(deopt_id) {
-    SetInputAt(0, value);
-  }
+  BoxInteger32Instr(Representation representation, Value* value)
+      : BoxIntegerInstr(representation, value) { }
 
-  Value* value() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kDoubleCid)
-        && (value()->Type()->ToCid() != kSmiCid);
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedDouble;
-  }
-
-  DECLARE_INSTRUCTION(UnboxDouble)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
+  DECLARE_INSTRUCTION_BACKEND()
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxDoubleInstr);
+  DISALLOW_COPY_AND_ASSIGN(BoxInteger32Instr);
 };
 
 
-class UnboxFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxInt32Instr : public BoxInteger32Instr {
  public:
-  UnboxFloat32x4Instr(Value* value, intptr_t deopt_id)
-      : TemplateDefinition(deopt_id) {
-    SetInputAt(0, value);
-  }
+  explicit BoxInt32Instr(Value* value)
+      : BoxInteger32Instr(kUnboxedInt32, value) { }
 
-  Value* value() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kFloat32x4Cid);
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedFloat32x4;
-  }
-
-  DECLARE_INSTRUCTION(UnboxFloat32x4)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
+  DECLARE_INSTRUCTION_NO_BACKEND(BoxInt32)
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxFloat32x4Instr);
+  DISALLOW_COPY_AND_ASSIGN(BoxInt32Instr);
 };
 
 
-class UnboxFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxUint32Instr : public BoxInteger32Instr {
  public:
-  UnboxFloat64x2Instr(Value* value, intptr_t deopt_id)
-      : TemplateDefinition(deopt_id) {
-    SetInputAt(0, value);
-  }
+  explicit BoxUint32Instr(Value* value)
+      : BoxInteger32Instr(kUnboxedUint32, value) { }
 
-  Value* value() const { return inputs_[0]; }
-
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kFloat64x2Cid);
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedFloat64x2;
-  }
-
-  DECLARE_INSTRUCTION(UnboxFloat64x2)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
+  DECLARE_INSTRUCTION_NO_BACKEND(BoxUint32)
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxFloat64x2Instr);
+  DISALLOW_COPY_AND_ASSIGN(BoxUint32Instr);
 };
 
 
-class UnboxInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
+class BoxInt64Instr : public BoxIntegerInstr {
  public:
-  UnboxInt32x4Instr(Value* value, intptr_t deopt_id)
-      : TemplateDefinition(deopt_id) {
-    SetInputAt(0, value);
-  }
+  explicit BoxInt64Instr(Value* value)
+      : BoxIntegerInstr(kUnboxedMint, value) { }
 
-  Value* value() const { return inputs_[0]; }
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kInt32x4Cid);
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedInt32x4;
-  }
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
-  DECLARE_INSTRUCTION(UnboxInt32x4)
-  virtual CompileType ComputeType() const;
-
-  Definition* Canonicalize(FlowGraph* flow_graph);
+  DECLARE_INSTRUCTION(BoxInt64)
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxInt32x4Instr);
+  DISALLOW_COPY_AND_ASSIGN(BoxInt64Instr);
 };
 
 
-class UnboxIntegerInstr : public TemplateDefinition<1, NoThrow, Pure> {
+class UnboxInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxIntegerInstr(Value* value, intptr_t deopt_id)
-      : TemplateDefinition(deopt_id) {
-    SetInputAt(0, value);
-  }
+  static UnboxInstr* Create(Representation to, Value* value, intptr_t deopt_id);
 
   Value* value() const { return inputs_[0]; }
 
   virtual bool CanDeoptimize() const {
+    const intptr_t value_cid = value()->Type()->ToCid();
+
+    if (CanConvertSmi() &&
+        (value()->Type()->ToCid() == kSmiCid)) {
+      return false;
+    }
+
+    return (value_cid != BoxCid());
+  }
+
+  virtual Representation representation() const {
+    return representation_;
+  }
+
+  DECLARE_INSTRUCTION(Unbox)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    return representation() == other->AsUnbox()->representation();
+  }
+
+  Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual intptr_t DeoptimizationTarget() const {
+    return GetDeoptId();
+  }
+
+ protected:
+  UnboxInstr(Representation representation,
+             Value* value,
+             intptr_t deopt_id)
+      : TemplateDefinition(deopt_id),
+        representation_(representation) {
+    SetInputAt(0, value);
+  }
+
+ private:
+  bool CanConvertSmi() const;
+  void EmitLoadFromBox(FlowGraphCompiler* compiler);
+  void EmitSmiConversion(FlowGraphCompiler* compiler);
+
+  intptr_t BoxCid() const {
+    return Boxing::BoxCid(representation_);
+  }
+
+  intptr_t ValueOffset() const {
+    return Boxing::ValueOffset(representation_);
+  }
+
+  const Representation representation_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxInstr);
+};
+
+
+class UnboxIntegerInstr : public UnboxInstr {
+ public:
+  enum TruncationMode { kTruncate, kNoTruncation };
+
+  UnboxIntegerInstr(Representation representation,
+                    TruncationMode truncation_mode,
+                    Value* value,
+                    intptr_t deopt_id)
+      : UnboxInstr(representation, value, deopt_id),
+        is_truncating_(truncation_mode == kTruncate) {
+  }
+
+  bool is_truncating() const { return is_truncating_; }
+
+  virtual CompileType ComputeType() const;
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    UnboxIntegerInstr* other_unbox = other->AsUnboxInteger();
+    return UnboxInstr::AttributesEqual(other) &&
+        (other_unbox->is_truncating_ == is_truncating_);
+  }
+
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  DEFINE_INSTRUCTION_TYPE_CHECK(UnboxInteger)
+
+ private:
+  bool is_truncating_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxIntegerInstr);
+};
+
+
+class UnboxInteger32Instr : public UnboxIntegerInstr {
+ public:
+  UnboxInteger32Instr(Representation representation,
+                      TruncationMode truncation_mode,
+                      Value* value,
+                      intptr_t deopt_id)
+      : UnboxIntegerInstr(representation, truncation_mode, value, deopt_id) { }
+
+  DECLARE_INSTRUCTION_BACKEND()
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxInteger32Instr);
+};
+
+
+class UnboxUint32Instr : public UnboxInteger32Instr {
+ public:
+  UnboxUint32Instr(Value* value, intptr_t deopt_id)
+      : UnboxInteger32Instr(kUnboxedUint32, kTruncate, value, deopt_id) {
+    ASSERT(is_truncating());
+  }
+
+  virtual bool CanDeoptimize() const {
+    ASSERT(is_truncating());
     return (value()->Type()->ToCid() != kSmiCid)
         && (value()->Type()->ToCid() != kMintCid);
   }
 
-  virtual Representation representation() const {
-    return kUnboxedMint;
+  DECLARE_INSTRUCTION_NO_BACKEND(UnboxUint32)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
+};
+
+
+class UnboxInt32Instr : public UnboxInteger32Instr {
+ public:
+  UnboxInt32Instr(TruncationMode truncation_mode,
+                  Value* value,
+                  intptr_t deopt_id)
+      : UnboxInteger32Instr(kUnboxedInt32, truncation_mode, value, deopt_id) {
   }
 
-  intptr_t deopt_id() const { return GetDeoptId(); }
+  virtual bool CanDeoptimize() const;
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  DECLARE_INSTRUCTION(UnboxInteger)
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
+  DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt32)
+
  private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxIntegerInstr);
+  DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr);
 };
 
 
+class UnboxInt64Instr : public UnboxIntegerInstr {
+ public:
+  UnboxInt64Instr(Value* value, intptr_t deopt_id)
+      : UnboxIntegerInstr(kUnboxedMint, kNoTruncation, value, deopt_id) {
+  }
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt64)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxInt64Instr);
+};
+
+
+bool Definition::IsMintDefinition() {
+  return (Type()->ToCid() == kMintCid) ||
+          IsBinaryMintOp() ||
+          IsUnaryMintOp() ||
+          IsShiftMintOp() ||
+          IsBoxInt64() ||
+          IsUnboxInt64();
+}
+
+
 class MathUnaryInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   enum MathUnaryKind {
@@ -7470,155 +7468,6 @@
 };
 
 
-class BoxIntNInstr : public TemplateDefinition<1, NoThrow, Pure> {
- public:
-  BoxIntNInstr(Representation representation, Value* value)
-      : from_representation_(representation) {
-    SetInputAt(0, value);
-  }
-
-  Representation from_representation() const { return from_representation_; }
-
-  Value* value() const { return inputs_[0]; }
-  virtual bool ValueFitsSmi() const;
-
-  virtual CompileType ComputeType() const;
-  virtual bool RecomputeType();
-
-  virtual bool CanDeoptimize() const { return false; }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return Isolate::kNoDeoptId;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return from_representation_;
-  }
-
-  virtual bool AttributesEqual(Instruction* other) const {
-    return other->AsBoxIntN()->from_representation_ == from_representation_;
-  }
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  DEFINE_INSTRUCTION_TYPE_CHECK(BoxIntN)
-  DECLARE_INSTRUCTION_BACKEND()
-
- private:
-  const Representation from_representation_;
-
-  DISALLOW_COPY_AND_ASSIGN(BoxIntNInstr);
-};
-
-
-class BoxUint32Instr : public BoxIntNInstr {
- public:
-  explicit BoxUint32Instr(Value* value)
-      : BoxIntNInstr(kUnboxedUint32, value) { }
-
-  DECLARE_INSTRUCTION_NO_BACKEND(BoxUint32)
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BoxUint32Instr);
-};
-
-
-class BoxInt32Instr : public BoxIntNInstr {
- public:
-  explicit BoxInt32Instr(Value* value)
-      : BoxIntNInstr(kUnboxedInt32, value) { }
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  DECLARE_INSTRUCTION_NO_BACKEND(BoxInt32)
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BoxInt32Instr);
-};
-
-
-class UnboxIntNInstr : public TemplateDefinition<1, NoThrow, Pure> {
- public:
-  UnboxIntNInstr(Representation representation,
-                 Value* value,
-                 intptr_t deopt_id)
-      : TemplateDefinition(deopt_id),
-        representation_(representation),
-        is_truncating_(representation == kUnboxedUint32) {
-    SetInputAt(0, value);
-  }
-
-  Value* value() const { return inputs_[0]; }
-
-  bool is_truncating() const { return is_truncating_; }
-  void mark_truncating() { is_truncating_ = true; }
-
-  virtual Representation representation() const {
-    return representation_;
-  }
-
-  virtual CompileType ComputeType() const;
-
-  virtual bool AttributesEqual(Instruction* other) const {
-    UnboxIntNInstr* other_unbox = other->AsUnboxIntN();
-    return (other_unbox->representation_ == representation_) &&
-        (other_unbox->is_truncating_ == is_truncating_);
-  }
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  DEFINE_INSTRUCTION_TYPE_CHECK(UnboxIntN)
-  DECLARE_INSTRUCTION_BACKEND()
-
- private:
-  const Representation representation_;
-  bool is_truncating_;
-
-  DISALLOW_COPY_AND_ASSIGN(UnboxIntNInstr);
-};
-
-
-class UnboxUint32Instr : public UnboxIntNInstr {
- public:
-  UnboxUint32Instr(Value* value, intptr_t deopt_id)
-      : UnboxIntNInstr(kUnboxedUint32, value, deopt_id) {
-    ASSERT(is_truncating());
-  }
-
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kSmiCid)
-        && (value()->Type()->ToCid() != kMintCid);
-  }
-
-  DECLARE_INSTRUCTION_NO_BACKEND(UnboxUint32)
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
-};
-
-
-class UnboxInt32Instr : public UnboxIntNInstr {
- public:
-  UnboxInt32Instr(Value* value, intptr_t deopt_id)
-      : UnboxIntNInstr(kUnboxedInt32, value, deopt_id) {
-  }
-
-  virtual bool CanDeoptimize() const;
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  DECLARE_INSTRUCTION_NO_BACKEND(UnboxInt32)
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr);
-};
-
-
 class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> {
  public:
   UnboxedIntConverterInstr(Representation from,
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 5de809b..05ebe6c 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -31,8 +31,7 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary() {
-  Isolate* isolate = Isolate::Current();
+LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
@@ -919,22 +918,11 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(R1));
-  locs->set_temp(1, Location::RegisterLocation(R2));
-  locs->set_temp(2, Location::RegisterLocation(R5));
-  locs->set_out(0, Location::RegisterLocation(R0));
-  return locs;
+  return MakeCallSummary(isolate);
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(locs()->temp(0).reg() == R1);
-  ASSERT(locs()->temp(1).reg() == R2);
-  ASSERT(locs()->temp(2).reg() == R5);
   const Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
@@ -3563,7 +3551,7 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
@@ -3578,280 +3566,344 @@
 }
 
 
-void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register out_reg = locs()->out(0).reg();
   const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
 
   BoxAllocationSlowPath::Allocate(
       compiler,
       this,
-      compiler->double_class(),
+      compiler->BoxClassFor(from_representation()),
       out_reg,
       locs()->temp(0).reg());
-  __ StoreDToOffset(value, out_reg, Double::value_offset() - kHeapObjectTag);
+
+  switch (from_representation()) {
+    case kUnboxedDouble:
+      __ StoreDToOffset(
+          value, out_reg, ValueOffset() - kHeapObjectTag);
+      break;
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      __ StoreMultipleDToOffset(
+          value, 2, out_reg, ValueOffset() - kHeapObjectTag);
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
+  const bool needs_temp = CanDeoptimize();
   const intptr_t kNumInputs = 1;
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (needs_temp) summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  if (needs_temp) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  if (representation() == kUnboxedMint) {
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
 
-void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  CompileType* value_type = value()->Type();
-  const intptr_t value_cid = value_type->ToCid();
-  const Register value = locs()->in(0).reg();
-  const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
 
-  if (value_cid == kDoubleCid) {
-    __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(IP, value);
-    __ vmovdr(DTMP, 0, IP);
-    __ vcvtdi(result, STMP);
-  } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id(),
-                                          ICData::kDeoptBinaryDoubleOp);
-    const Register temp = locs()->temp(0).reg();
-    if (value_type->is_nullable() &&
-        (value_type->ToNullableCid() == kDoubleCid)) {
-      __ CompareImmediate(value, reinterpret_cast<intptr_t>(Object::null()));
-      __ b(deopt, EQ);
-      // It must be double now.
-      __ LoadDFromOffset(result, value,
-          Double::value_offset() - kHeapObjectTag);
-    } else {
-      Label is_smi, done;
-      __ tst(value, Operand(kSmiTagMask));
-      __ b(&is_smi, EQ);
-      __ CompareClassId(value, kDoubleCid, temp);
-      __ b(deopt, NE);
-      __ LoadDFromOffset(result, value,
-          Double::value_offset() - kHeapObjectTag);
-      __ b(&done);
-      __ Bind(&is_smi);
-      __ SmiUntag(IP, value);
+  switch (representation()) {
+    case kUnboxedMint: {
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      __ LoadFromOffset(kWord,
+                        result->At(0).reg(),
+                        box,
+                        ValueOffset() - kHeapObjectTag);
+      __ LoadFromOffset(kWord,
+                        result->At(1).reg(),
+                        box,
+                        ValueOffset() - kHeapObjectTag + kWordSize);
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+      __ LoadDFromOffset(
+          result, box, ValueOffset() - kHeapObjectTag);
+      break;
+    }
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4: {
+      const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+      __ LoadMultipleDFromOffset(
+          result, 2, box, ValueOffset() - kHeapObjectTag);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitSmiConversion(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kUnboxedMint: {
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      __ SmiUntag(result->At(0).reg(), box);
+      __ SignFill(result->At(1).reg(), result->At(0).reg());
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+      __ SmiUntag(IP, box);
       __ vmovdr(DTMP, 0, IP);
       __ vcvtdi(result, STMP);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t box_cid = BoxCid();
+
+  if (value_cid == box_cid) {
+    EmitLoadFromBox(compiler);
+  } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
+    EmitSmiConversion(compiler);
+  } else {
+    const Register box = locs()->in(0).reg();
+    const Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
+                                          ICData::kDeoptCheckClass);
+    Label is_smi;
+
+    if ((value()->Type()->ToNullableCid() == box_cid) &&
+        value()->Type()->is_nullable()) {
+      __ CompareImmediate(box, reinterpret_cast<intptr_t>(Object::null()));
+      __ b(deopt, EQ);
+    } else {
+      __ tst(box, Operand(kSmiTagMask));
+      __ b(CanConvertSmi() ? &is_smi : deopt, EQ);
+      __ CompareClassId(box, box_cid, temp);
+      __ b(deopt, NE);
+    }
+
+    EmitLoadFromBox(compiler);
+
+    if (is_smi.IsLinked()) {
+      Label done;
+      __ b(&done);
+      __ Bind(&is_smi);
+      EmitSmiConversion(compiler);
       __ Bind(&done);
     }
   }
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  if (!ValueFitsSmi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const QRegister value = locs()->in(0).fpu_reg();
-  const DRegister dvalue0 = EvenDRegisterOf(value);
+void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
 
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->float32x4_class(),
-      out_reg,
-      locs()->temp(0).reg());
-  __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
-      Float32x4::value_offset() - kHeapObjectTag);
-}
-
-
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kFloat32x4Cid ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
-    summary->set_temp(0, Location::RequiresRegister());
+  __ SmiTag(out, value);
+  if (!ValueFitsSmi()) {
+    Register temp = locs()->temp(0).reg();
+    Label done;
+    if (from_representation() == kUnboxedInt32) {
+      __ cmp(value, Operand(out, ASR, 1));
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      // Note: better to test upper bits instead of comparing with
+      // kSmiMax as kSmiMax does not fit into immediate operand.
+      __ TestImmediate(value, 0xC0000000);
+    }
+    __ b(&done, EQ);
+    BoxAllocationSlowPath::Allocate(
+        compiler,
+        this,
+        compiler->mint_class(),
+        out,
+        temp);
+    if (from_representation() == kUnboxedInt32) {
+      __ Asr(temp, value, Operand(kBitsPerWord - 1));
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      __ eor(temp, temp, Operand(temp));
+    }
+    __ StoreToOffset(kWord,
+                     value,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(kWord,
+                     temp,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ Bind(&done);
   }
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
 }
 
 
-void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const QRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat32x4Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
-    __ tst(value, Operand(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kFloat32x4Cid, temp);
-    __ b(deopt, NE);
-  }
-
-  const DRegister dresult0 = EvenDRegisterOf(result);
-  __ LoadMultipleDFromOffset(dresult0, 2, value,
-      Float32x4::value_offset() - kHeapObjectTag);
-}
-
-
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const QRegister value = locs()->in(0).fpu_reg();
-  const DRegister dvalue0 = EvenDRegisterOf(value);
-
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->float64x2_class(),
-      out_reg,
-      locs()->temp(0).reg());
-  __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
-      Float64x2::value_offset() - kHeapObjectTag);
-}
-
-
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const QRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat64x2Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
-    __ tst(value, Operand(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kFloat64x2Cid, temp);
-    __ b(deopt, NE);
-  }
-
-  const DRegister dresult0 = EvenDRegisterOf(result);
-  __ LoadMultipleDFromOffset(dresult0, 2, value,
-      Float64x2::value_offset() - kHeapObjectTag);
-}
-
-
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  if (!ValueFitsSmi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const QRegister value = locs()->in(0).fpu_reg();
-  const DRegister dvalue0 = EvenDRegisterOf(value);
+void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (ValueFitsSmi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ SmiTag(out_reg, value_lo);
+    return;
+  }
+
+  PairLocation* value_pair = locs()->in(0).AsPairLocation();
+  Register value_lo = value_pair->At(0).reg();
+  Register value_hi = value_pair->At(1).reg();
+  Register tmp = locs()->temp(0).reg();
+  Register out_reg = locs()->out(0).reg();
+
+  Label done;
+  __ SmiTag(out_reg, value_lo);
+  __ cmp(value_lo, Operand(out_reg, ASR, kSmiTagSize));
+  __ cmp(value_hi, Operand(out_reg, ASR, 31), EQ);
+  __ b(&done, EQ);
 
   BoxAllocationSlowPath::Allocate(
       compiler,
       this,
-      compiler->int32x4_class(),
+      compiler->mint_class(),
       out_reg,
-      locs()->temp(0).reg());
-  __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
-      Int32x4::value_offset() - kHeapObjectTag);
+      tmp);
+  __ StoreToOffset(kWord,
+                   value_lo,
+                   out_reg,
+                   Mint::value_offset() - kHeapObjectTag);
+  __ StoreToOffset(kWord,
+                   value_hi,
+                   out_reg,
+                   Mint::value_offset() - kHeapObjectTag + kWordSize);
+  __ Bind(&done);
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register mint,
+                              Register result,
+                              Register temp,
+                              Label* deopt) {
+  __ LoadFromOffset(kWord,
+                    result,
+                    mint,
+                    Mint::value_offset() - kHeapObjectTag);
+  if (deopt != NULL) {
+    __ LoadFromOffset(kWord,
+                      temp,
+                      mint,
+                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ cmp(temp, Operand(result, ASR, kBitsPerWord - 1));
+    __ b(deopt, NE);
+  }
+}
+
+
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  ASSERT((representation() == kUnboxedInt32) ||
+         (representation() == kUnboxedUint32));
+  ASSERT((representation() != kUnboxedUint32) || is_truncating());
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1;
+  const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
     summary->set_temp(0, Location::RequiresRegister());
   }
-  summary->set_out(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
-  const QRegister result = locs()->out(0).fpu_reg();
+  const Register out = locs()->out(0).reg();
+  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+  Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
+  ASSERT(value != out);
 
-  if (value_cid != kInt32x4Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptCheckClass);
-    __ tst(value, Operand(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kInt32x4Cid, temp);
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
+  } else {
+    Label done;
+    __ SmiUntag(out, value, &done);
+    __ CompareClassId(value, kMintCid, temp);
     __ b(deopt, NE);
+    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
+    __ Bind(&done);
   }
-
-  const DRegister dresult0 = EvenDRegisterOf(result);
-  __ LoadMultipleDFromOffset(dresult0, 2, value,
-      Int32x4::value_offset() - kHeapObjectTag);
 }
 
 
@@ -5746,7 +5798,7 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -5994,168 +6046,6 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0,  Location::Pair(Location::RequiresRegister(),
-                                      Location::RequiresRegister()));
-  return summary;
-}
-
-
-void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  PairLocation* result_pair = locs()->out(0).AsPairLocation();
-  Register result_lo = result_pair->At(0).reg();
-  Register result_hi = result_pair->At(1).reg();
-  ASSERT(value != result_lo);
-  ASSERT(value != result_hi);
-
-  __ Comment("UnboxIntegerInstr");
-  if (value_cid == kMintCid) {
-    // Load low word.
-    __ LoadFromOffset(kWord,
-                      result_lo,
-                      value,
-                      Mint::value_offset() - kHeapObjectTag);
-    // Load high word.
-    __ LoadFromOffset(kWord,
-                      result_hi,
-                      value,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
-  } else if (value_cid == kSmiCid) {
-    // Load Smi into result_lo.
-    __ mov(result_lo, Operand(value));
-    // Untag.
-    __ SmiUntag(result_lo);
-    __ SignFill(result_hi, result_lo);
-  } else {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptUnboxInteger);
-    Label is_smi, done;
-    __ tst(value, Operand(kSmiTagMask));
-    __ b(&is_smi, EQ);
-    __ CompareClassId(value, kMintCid, temp);
-    __ b(deopt, NE);
-
-    // It's a Mint.
-    // Load low word.
-    __ LoadFromOffset(kWord,
-                      result_lo,
-                      value,
-                      Mint::value_offset() - kHeapObjectTag);
-    // Load high word.
-    __ LoadFromOffset(kWord,
-                      result_hi,
-                      value,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
-    __ b(&done);
-
-    // It's a Smi.
-    __ Bind(&is_smi);
-    // Load Smi into result_lo.
-    __ mov(result_lo, Operand(value));
-    // Untag.
-    __ SmiUntag(result_lo);
-    // Sign extend result_lo into result_hi.
-    __ SignFill(result_hi, result_lo);
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = is_smi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          is_smi()
-                              ? LocationSummary::kNoCall
-                              : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                    Location::RequiresRegister()));
-  if (!is_smi()) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (is_smi()) {
-    PairLocation* value_pair = locs()->in(0).AsPairLocation();
-    Register value_lo = value_pair->At(0).reg();
-    Register out_reg = locs()->out(0).reg();
-    __ mov(out_reg, Operand(value_lo));
-    __ SmiTag(out_reg);
-    return;
-  }
-
-  PairLocation* value_pair = locs()->in(0).AsPairLocation();
-  Register value_lo = value_pair->At(0).reg();
-  Register value_hi = value_pair->At(1).reg();
-  Register tmp = locs()->temp(0).reg();
-  Register out_reg = locs()->out(0).reg();
-
-  // Unboxed operations produce smis or mint-sized values.
-  // Check if value fits into a smi.
-  __ Comment("BoxIntegerInstr");
-  Label not_smi, done, maybe_pos_smi, maybe_neg_smi, is_smi;
-  // Check high word.
-  __ CompareImmediate(value_hi, 0);
-  __ b(&maybe_pos_smi, EQ);
-
-  __ CompareImmediate(value_hi, -1);
-  __ b(&maybe_neg_smi, EQ);
-  __ b(&not_smi);
-
-  __ Bind(&maybe_pos_smi);
-  __ CompareImmediate(value_lo, kSmiMax);
-  __ b(&is_smi, LS);  // unsigned lower or same.
-  __ b(&not_smi);
-
-  __ Bind(&maybe_neg_smi);
-  __ CompareImmediate(value_lo, 0);
-  __ b(&not_smi, GE);
-  __ CompareImmediate(value_lo, kSmiMin);
-  __ b(&not_smi, LT);
-
-  // lo is a Smi. Tag it and return.
-  __ Bind(&is_smi);
-  __ mov(out_reg, Operand(value_lo));
-  __ SmiTag(out_reg);
-  __ b(&done);
-
-  // Not a smi. Box it.
-  __ Bind(&not_smi);
-  BoxAllocationSlowPath::Allocate(
-      compiler,
-      this,
-      compiler->mint_class(),
-      out_reg,
-      tmp);
-  __ StoreToOffset(kWord,
-                   value_lo,
-                   out_reg,
-                   Mint::value_offset() - kHeapObjectTag);
-  __ StoreToOffset(kWord,
-                   value_hi,
-                   out_reg,
-                   Mint::value_offset() - kHeapObjectTag + kWordSize);
-  __ Bind(&done);
-}
-
-
 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6577,133 +6467,6 @@
 }
 
 
-LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                   bool opt) const {
-  ASSERT((from_representation() == kUnboxedInt32) ||
-         (from_representation() == kUnboxedUint32));
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
-      kNumInputs,
-      kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresRegister());
-  if (!ValueFitsSmi()) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(value != out);
-
-  __ SmiTag(out, value);
-  if (!ValueFitsSmi()) {
-    Register temp = locs()->temp(0).reg();
-    Label done;
-    if (from_representation() == kUnboxedInt32) {
-      __ cmp(value, Operand(out, ASR, 1));
-    } else {
-      ASSERT(from_representation() == kUnboxedUint32);
-      // Note: better to test upper bits instead of comparing with
-      // kSmiMax as kSmiMax does not fit into immediate operand.
-      __ TestImmediate(value, 0xC0000000);
-    }
-    __ b(&done, EQ);
-    BoxAllocationSlowPath::Allocate(
-        compiler,
-        this,
-        compiler->mint_class(),
-        out,
-        temp);
-    if (from_representation() == kUnboxedInt32) {
-      __ Asr(temp, value, Operand(kBitsPerWord - 1));
-    } else {
-      ASSERT(from_representation() == kUnboxedUint32);
-      __ eor(temp, temp, Operand(temp));
-    }
-    __ StoreToOffset(kWord,
-                     value,
-                     out,
-                     Mint::value_offset() - kHeapObjectTag);
-    __ StoreToOffset(kWord,
-                     temp,
-                     out,
-                     Mint::value_offset() - kHeapObjectTag + kWordSize);
-    __ Bind(&done);
-  }
-}
-
-
-static void LoadInt32FromMint(FlowGraphCompiler* compiler,
-                              Register mint,
-                              Register result,
-                              Register temp,
-                              Label* deopt) {
-  __ LoadFromOffset(kWord,
-                    result,
-                    mint,
-                    Mint::value_offset() - kHeapObjectTag);
-  if (deopt != NULL) {
-    __ LoadFromOffset(kWord,
-                      temp,
-                      mint,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
-    __ cmp(temp, Operand(result, ASR, kBitsPerWord - 1));
-    __ b(deopt, NE);
-  }
-}
-
-
-LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  ASSERT((representation() == kUnboxedInt32) ||
-         (representation() == kUnboxedUint32));
-  ASSERT((representation() != kUnboxedUint32) || is_truncating());
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
-  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
-  Label* out_of_range = !is_truncating() ? deopt : NULL;
-  ASSERT(value != out);
-
-  if (value_cid == kSmiCid) {
-    __ SmiUntag(out, value);
-  } else if (value_cid == kMintCid) {
-    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
-  } else {
-    Label done;
-    __ SmiUntag(out, value, &done);
-    __ CompareClassId(value, kMintCid, temp);
-    __ b(deopt, NE);
-    LoadInt32FromMint(compiler, value, out, temp, out_of_range);
-    __ Bind(&done);
-  }
-}
-
-
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -6961,7 +6724,7 @@
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index d550611..ecea14d 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -29,8 +29,7 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
-LocationSummary* Instruction::MakeCallSummary() {
-  Isolate* isolate = Isolate::Current();
+LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
@@ -766,22 +765,11 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(R1));
-  locs->set_temp(1, Location::RegisterLocation(R2));
-  locs->set_temp(2, Location::RegisterLocation(R5));
-  locs->set_out(0, Location::RegisterLocation(R0));
-  return locs;
+  return MakeCallSummary(isolate);
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(locs()->temp(0).reg() == R1);
-  ASSERT(locs()->temp(1).reg() == R2);
-  ASSERT(locs()->temp(2).reg() == R5);
   const Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
@@ -3054,8 +3042,8 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
+LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
+                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
   LocationSummary* summary = new(isolate) LocationSummary(
@@ -3067,19 +3055,36 @@
 }
 
 
-void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register out_reg = locs()->out(0).reg();
   const Register temp_reg = locs()->temp(0).reg();
   const VRegister value = locs()->in(0).fpu_reg();
 
   BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->double_class(), out_reg, temp_reg);
-  __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP);
+      compiler,
+      this,
+      compiler->BoxClassFor(from_representation()),
+      out_reg,
+      temp_reg);
+
+  switch (from_representation()) {
+    case kUnboxedDouble:
+      __ StoreDFieldToOffset(value, out_reg, ValueOffset(), PP);
+      break;
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      __ StoreQFieldToOffset(value, out_reg, ValueOffset(), PP);
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
@@ -3090,201 +3095,175 @@
 }
 
 
-void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  CompileType* value_type = value()->Type();
-  const intptr_t value_cid = value_type->ToCid();
-  const Register value = locs()->in(0).reg();
-  const VRegister result = locs()->out(0).fpu_reg();
+void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
 
-  if (value_cid == kDoubleCid) {
-    __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(TMP, value);  // Untag input before conversion.
-    __ scvtfdx(result, TMP);
+  switch (representation()) {
+    case kUnboxedMint: {
+      UNIMPLEMENTED();
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const VRegister result = locs()->out(0).fpu_reg();
+      __ LoadDFieldFromOffset(result, box, ValueOffset(), PP);
+      break;
+    }
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4: {
+      const VRegister result = locs()->out(0).fpu_reg();
+      __ LoadQFieldFromOffset(result, box, ValueOffset(), PP);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitSmiConversion(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kUnboxedMint: {
+      UNIMPLEMENTED();
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const VRegister result = locs()->out(0).fpu_reg();
+      __ SmiUntag(TMP, box);
+      __ scvtfdx(result, TMP);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t box_cid = BoxCid();
+
+  if (value_cid == box_cid) {
+    EmitLoadFromBox(compiler);
+  } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
+    EmitSmiConversion(compiler);
   } else {
+    const Register box = locs()->in(0).reg();
     Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptBinaryDoubleOp);
-    if (value_type->is_nullable() &&
-        (value_type->ToNullableCid() == kDoubleCid)) {
-      __ CompareObject(value, Object::null_object(), PP);
+                                          ICData::kDeoptCheckClass);
+    Label is_smi;
+
+    if ((value()->Type()->ToNullableCid() == box_cid) &&
+        value()->Type()->is_nullable()) {
+      __ CompareObject(box, Object::null_object(), PP);
       __ b(deopt, EQ);
-      // It must be double now.
-      __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
     } else {
-      Label is_smi, done;
-      __ tsti(value, Immediate(kSmiTagMask));
-      __ b(&is_smi, EQ);
-      __ CompareClassId(value, kDoubleCid, PP);
+      __ tsti(box, Immediate(kSmiTagMask));
+      __ b(CanConvertSmi() ? &is_smi : deopt, EQ);
+      __ CompareClassId(box, box_cid, PP);
       __ b(deopt, NE);
-      __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
+    }
+
+    EmitLoadFromBox(compiler);
+
+    if (is_smi.IsLinked()) {
+      Label done;
       __ b(&done);
       __ Bind(&is_smi);
-      __ SmiUntag(TMP, value);  // Copy and untag.
-      __ scvtfdx(result, TMP);
+      EmitSmiConversion(compiler);
       __ Bind(&done);
     }
   }
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const Register temp_reg = locs()->temp(0).reg();
-  const VRegister value = locs()->in(0).fpu_reg();
+void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
 
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float32x4_class(), out_reg, temp_reg);
-  __ StoreQFieldToOffset(value, out_reg, Float32x4::value_offset(), PP);
+  ASSERT(kSmiTagSize == 1);
+  // TODO(vegorov) implement and use UBFM/SBFM for this.
+  __ LslImmediate(out, value, 32);
+  if (from_representation() == kUnboxedInt32) {
+    __ AsrImmediate(out, out, 32 - kSmiTagSize);
+  } else {
+    ASSERT(from_representation() == kUnboxedUint32);
+    __ LsrImmediate(out, out, 32 - kSmiTagSize);
+  }
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr)
+
+
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const VRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat32x4Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ tsti(value, Immediate(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kFloat32x4Cid, PP);
-    __ b(deopt, NE);
-  }
-
-  __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP);
-}
-
-
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const Register temp_reg = locs()->temp(0).reg();
-  const VRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float64x2_class(), out_reg, temp_reg);
-  __ StoreQFieldToOffset(value, out_reg, Float64x2::value_offset(), PP);
-}
-
-
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
+  const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
-  const VRegister result = locs()->out(0).fpu_reg();
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
 
-  if (value_cid != kFloat64x2Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ tsti(value, Immediate(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kFloat64x2Cid, PP);
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
+  } else {
+    Label done;
+    __ SmiUntag(out, value);
+    __ TestImmediate(value, kSmiTagMask, PP);
+    __ b(&done, EQ);
+    __ CompareClassId(value, kMintCid, PP);
     __ b(deopt, NE);
+    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
+    __ Bind(&done);
   }
 
-  __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP);
-}
-
-
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out_reg = locs()->out(0).reg();
-  const Register temp_reg = locs()->temp(0).reg();
-  const VRegister value = locs()->in(0).fpu_reg();
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->int32x4_class(), out_reg, temp_reg);
-  __ StoreQFieldToOffset(value, out_reg, Int32x4::value_offset(), PP);
-}
-
-
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const VRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kInt32x4Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ tsti(value, Immediate(kSmiTagMask));
-    __ b(deopt, EQ);
-    __ CompareClassId(value, kInt32x4Cid, PP);
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    __ cmp(out, Operand(out, SXTW, 0));
     __ b(deopt, NE);
   }
-
-  __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP);
 }
 
 
@@ -4948,7 +4927,7 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -5182,30 +5161,6 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   UNIMPLEMENTED();
@@ -5269,84 +5224,6 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register out = locs()->out(0).reg();
-  const Register value = locs()->in(0).reg();
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
-
-  if (value_cid == kSmiCid) {
-    __ SmiUntag(out, value);
-  } else if (value_cid == kMintCid) {
-    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
-  } else {
-    Label done;
-    __ SmiUntag(out, value);
-    __ TestImmediate(value, kSmiTagMask, PP);
-    __ b(&done, EQ);
-    __ CompareClassId(value, kMintCid, PP);
-    __ b(deopt, NE);
-    __ LoadFieldFromOffset(out, value, Mint::value_offset(), PP);
-    __ Bind(&done);
-  }
-
-  // TODO(vegorov): as it is implemented right now truncating unboxing would
-  // leave "garbage" in the higher word.
-  if (!is_truncating() && (deopt != NULL)) {
-    ASSERT(representation() == kUnboxedInt32);
-    __ cmp(out, Operand(out, SXTW, 0));
-    __ b(deopt, NE);
-  }
-}
-
-
-LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                   bool opt) const {
-  ASSERT((from_representation() == kUnboxedInt32) ||
-         (from_representation() == kUnboxedUint32));
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
-      kNumInputs,
-      kNumTemps,
-      LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(value != out);
-
-  ASSERT(kSmiTagSize == 1);
-  // TODO(vegorov) implement and use UBFM/SBFM for this.
-  __ LslImmediate(out, value, 32);
-  if (from_representation() == kUnboxedInt32) {
-    __ AsrImmediate(out, out, 32 - kSmiTagSize);
-  } else {
-    ASSERT(from_representation() == kUnboxedUint32);
-    __ LsrImmediate(out, out, 32 - kSmiTagSize);
-  }
-}
-
-
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5579,7 +5456,7 @@
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 2c16100..7eb2995 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -30,10 +30,11 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
-LocationSummary* Instruction::MakeCallSummary() {
-  Isolate* isolate = Isolate::Current();
+LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps= 0;
   LocationSummary* result = new(isolate) LocationSummary(
-      isolate, 0, 0, LocationSummary::kCall);
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
 }
@@ -803,22 +804,11 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(EAX));
-  locs->set_temp(1, Location::RegisterLocation(ECX));
-  locs->set_temp(2, Location::RegisterLocation(EDX));
-  locs->set_out(0, Location::RegisterLocation(EAX));
-  return locs;
+  return MakeCallSummary(isolate);
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(locs()->temp(0).reg() == EAX);
-  ASSERT(locs()->temp(1).reg() == ECX);
-  ASSERT(locs()->temp(2).reg() == EDX);
   Register result = locs()->out(0).reg();
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
@@ -3329,10 +3319,7 @@
 }
 
 
-
-
-
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -3344,252 +3331,370 @@
 }
 
 
-void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register out_reg = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
+
   BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->double_class(), out_reg, kNoRegister);
-  __ movsd(FieldAddress(out_reg, Double::value_offset()), value);
+      compiler,
+      this,
+      compiler->BoxClassFor(from_representation()),
+      out_reg,
+      kNoRegister);
+
+  switch (from_representation()) {
+    case kUnboxedDouble:
+      __ movsd(FieldAddress(out_reg, ValueOffset()), value);
+      break;
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      __ movups(FieldAddress(out_reg, ValueOffset()), value);
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
+  const bool needs_temp = CanDeoptimize() ||
+      (CanConvertSmi() && (value()->Type()->ToCid() == kSmiCid));
+
   const intptr_t kNumInputs = 1;
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
-  const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, needs_writable_input
-                     ? Location::WritableRegister()
-                     : Location::RequiresRegister());
-  if (needs_temp) summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  summary->set_in(0, Location::RequiresRegister());
+  if (needs_temp) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  if (representation() == kUnboxedMint) {
+    summary->set_out(0, Location::Pair(Location::RegisterLocation(EAX),
+                                       Location::RegisterLocation(EDX)));
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
 
-void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  CompileType* value_type = value()->Type();
-  const intptr_t value_cid = value_type->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
+void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
 
-  if (value_cid == kDoubleCid) {
-    __ movsd(result, FieldAddress(value, Double::value_offset()));
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(value);  // Untag input before conversion.
-    __ cvtsi2sd(result, value);
-  } else {
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptBinaryDoubleOp);
-    Register temp = locs()->temp(0).reg();
-    if (value_type->is_nullable() &&
-        (value_type->ToNullableCid() == kDoubleCid)) {
-      const Immediate& raw_null =
-          Immediate(reinterpret_cast<intptr_t>(Object::null()));
-      __ cmpl(value, raw_null);
-      __ j(EQUAL, deopt);
-      // It must be double now.
-      __ movsd(result, FieldAddress(value, Double::value_offset()));
-    } else {
-      Label is_smi, done;
-      __ testl(value, Immediate(kSmiTagMask));
-      __ j(ZERO, &is_smi);
-      __ CompareClassId(value, kDoubleCid, temp);
-      __ j(NOT_EQUAL, deopt);
-      __ movsd(result, FieldAddress(value, Double::value_offset()));
-      __ jmp(&done);
-      __ Bind(&is_smi);
-      __ movl(temp, value);
+  switch (representation()) {
+    case kUnboxedMint: {
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      __ movl(result->At(0).reg(), FieldAddress(box, ValueOffset()));
+      __ movl(result->At(1).reg(),
+              FieldAddress(box, ValueOffset() + kWordSize));
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ movsd(result, FieldAddress(box, ValueOffset()));
+      break;
+    }
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4: {
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ movups(result, FieldAddress(box, ValueOffset()));
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitSmiConversion(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kUnboxedMint: {
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      ASSERT(result->At(0).reg() == EAX);
+      ASSERT(result->At(1).reg() == EDX);
+      __ movl(EAX, box);
+      __ SmiUntag(EAX);
+      __ cdq();
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const Register temp = locs()->temp(0).reg();
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ movl(temp, box);
       __ SmiUntag(temp);
       __ cvtsi2sd(result, temp);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t box_cid = BoxCid();
+
+  if (value_cid == box_cid) {
+    EmitLoadFromBox(compiler);
+  } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
+    EmitSmiConversion(compiler);
+  } else {
+    const Register box = locs()->in(0).reg();
+    const Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
+                                          ICData::kDeoptCheckClass);
+    Label is_smi;
+
+    if ((value()->Type()->ToNullableCid() == box_cid) &&
+        value()->Type()->is_nullable()) {
+      const Immediate& raw_null =
+          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      __ cmpl(box, raw_null);
+      __ j(EQUAL, deopt);
+    } else {
+      __ testl(box, Immediate(kSmiTagMask));
+      __ j(ZERO, CanConvertSmi() ? &is_smi : deopt);
+      __ CompareClassId(box, box_cid, temp);
+      __ j(NOT_EQUAL, deopt);
+    }
+
+    EmitLoadFromBox(compiler);
+
+    if (is_smi.IsLinked()) {
+      Label done;
+      __ jmp(&done);
+      __ Bind(&is_smi);
+      EmitSmiConversion(compiler);
       __ Bind(&done);
     }
   }
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  const bool needs_writable_input = ValueFitsSmi() ||
+      (from_representation() == kUnboxedUint32);
+  summary->set_in(0, needs_writable_input ? Location::RequiresRegister()
+                                          : Location::WritableRegister());
+  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
+                                     : Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+
+  __ MoveRegister(out, value);
+  __ shll(out, Immediate(kSmiTagSize));
+  if (!ValueFitsSmi()) {
+    Label done;
+    ASSERT(value != out);
+    if (from_representation() == kUnboxedInt32) {
+      __ j(NO_OVERFLOW, &done);
+    } else {
+      __ testl(value, Immediate(0xC0000000));
+      __ j(ZERO, &done);
+    }
+
+    // Allocate a mint.
+    // Value input is writable register and has to be manually preserved
+    // on the slow path.
+    locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32);
+    BoxAllocationSlowPath::Allocate(
+        compiler, this, compiler->mint_class(), out, kNoRegister);
+    __ movl(FieldAddress(out, Mint::value_offset()), value);
+    if (from_representation() == kUnboxedInt32) {
+      __ sarl(value, Immediate(31));  // Sign extend.
+      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
+    } else {
+      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize),
+              Immediate(0));
+    }
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs,
                           kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
+                          ValueFitsSmi()
+                              ? LocationSummary::kNoCall
+                              : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  if (!ValueFitsSmi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (ValueFitsSmi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ movl(out_reg, value_lo);
+    __ SmiTag(out_reg);
+    return;
+  }
+
+  PairLocation* value_pair = locs()->in(0).AsPairLocation();
+  Register value_lo = value_pair->At(0).reg();
+  Register value_hi = value_pair->At(1).reg();
   Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
+
+  // Copy value_hi into out_reg as a temporary.
+  // We modify value_lo but restore it before using it.
+  __ movl(out_reg, value_hi);
+
+  // Unboxed operations produce smis or mint-sized values.
+  // Check if value fits into a smi.
+  Label not_smi, done;
+
+  // 1. Compute (x + -kMinSmi) which has to be in the range
+  //    0 .. -kMinSmi+kMaxSmi for x to fit into a smi.
+  __ addl(value_lo, Immediate(0x40000000));
+  __ adcl(out_reg, Immediate(0));
+  // 2. Unsigned compare to -kMinSmi+kMaxSmi.
+  __ cmpl(value_lo, Immediate(0x80000000));
+  __ sbbl(out_reg, Immediate(0));
+  __ j(ABOVE_EQUAL, &not_smi);
+  // 3. Restore lower half if result is a smi.
+  __ subl(value_lo, Immediate(0x40000000));
+  __ movl(out_reg, value_lo);
+  __ SmiTag(out_reg);
+  __ jmp(&done);
+  __ Bind(&not_smi);
+  // 3. Restore lower half of input before using it.
+  __ subl(value_lo, Immediate(0x40000000));
 
   BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float32x4_class(), out_reg, kNoRegister);
-  __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value);
+      compiler, this, compiler->mint_class(), out_reg, kNoRegister);
+  __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo);
+  __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi);
+  __ Bind(&done);
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t value_cid = value()->Type()->ToCid();
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kFloat32x4Cid ? 0 : 1;
+  intptr_t kNumTemps = 0;
+
+  if (CanDeoptimize()) {
+    if ((value_cid != kSmiCid) &&
+        (value_cid != kMintCid) &&
+        !is_truncating()) {
+      kNumTemps = 2;
+    } else {
+      kNumTemps = 1;
+    }
+  }
+
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
-    summary->set_temp(0, Location::RequiresRegister());
+  for (int i = 0; i < kNumTemps; i++) {
+    summary->set_temp(i, Location::RequiresRegister());
   }
-  summary->set_out(0, Location::RequiresFpuRegister());
+  summary->set_out(0, ((value_cid == kSmiCid) || (value_cid != kMintCid)) ?
+      Location::SameAsFirstInput() : Location::RequiresRegister());
   return summary;
 }
 
 
-void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat32x4Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kFloat32x4Cid, temp);
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register result,
+                              const Address& lo,
+                              const Address& hi,
+                              Register temp,
+                              Label* deopt) {
+  __ movl(result, lo);
+  if (deopt != NULL) {
+    ASSERT(temp != result);
+    __ movl(temp, result);
+    __ sarl(temp, Immediate(31));
+    __ cmpl(temp, hi);
     __ j(NOT_EQUAL, deopt);
   }
-  __ movups(result, FieldAddress(value, Float32x4::value_offset()));
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float64x2_class(), out_reg, kNoRegister);
-  __ movups(FieldAddress(out_reg, Float64x2::value_offset()), value);
-}
-
-
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
+void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
+  Register value = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
 
+  const intptr_t lo_offset = Mint::value_offset();
+  const intptr_t hi_offset = Mint::value_offset() + kWordSize;
 
-void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat64x2Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kFloat64x2Cid, temp);
+  if (value_cid == kSmiCid) {
+    ASSERT(value == result);
+    __ SmiUntag(value);
+  } else if (value_cid == kMintCid) {
+    ASSERT((value != result) || (out_of_range == NULL));
+    LoadInt32FromMint(compiler,
+                      result,
+                      FieldAddress(value, lo_offset),
+                      FieldAddress(value, hi_offset),
+                      temp,
+                      out_of_range);
+  } else {
+    ASSERT(value == result);
+    Label done;
+    __ SmiUntagOrCheckClass(value, kMintCid, temp, &done);
     __ j(NOT_EQUAL, deopt);
+    if (out_of_range != NULL) {
+      Register value_temp = locs()->temp(1).reg();
+      __ movl(value_temp, value);
+      value = value_temp;
+    }
+    LoadInt32FromMint(compiler,
+                      result,
+                      Address(value, TIMES_2, lo_offset),
+                      Address(value, TIMES_2, hi_offset),
+                      temp,
+                      out_of_range);
+    __ Bind(&done);
   }
-  __ movups(result, FieldAddress(value, Float64x2::value_offset()));
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->int32x4_class(), out_reg, kNoRegister);
-  __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value);
-}
-
-
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  if (kNumTemps > 0) {
-    ASSERT(kNumTemps == 1);
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kInt32x4Cid) {
-    const Register temp = locs()->temp(0).reg();
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kInt32x4Cid, temp);
-    __ j(NOT_EQUAL, deopt);
-  }
-  __ movups(result, FieldAddress(value, Int32x4::value_offset()));
-}
-
-
-
 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -5395,7 +5500,7 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -5643,128 +5748,6 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::Pair(Location::RegisterLocation(EAX),
-                                     Location::RegisterLocation(EDX)));
-  return summary;
-}
-
-
-void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  PairLocation* result_pair = locs()->out(0).AsPairLocation();
-  Register result_lo = result_pair->At(0).reg();
-  Register result_hi = result_pair->At(1).reg();
-
-  ASSERT(value != result_lo);
-  ASSERT(value != result_hi);
-  ASSERT(result_lo == EAX);
-  ASSERT(result_hi == EDX);
-
-  if (value_cid == kMintCid) {
-    __ movl(result_lo, FieldAddress(value, Mint::value_offset()));
-    __ movl(result_hi, FieldAddress(value, Mint::value_offset() + kWordSize));
-  } else if (value_cid == kSmiCid) {
-    __ movl(result_lo, value);
-    __ SmiUntag(result_lo);
-    // Sign extend into result_hi.
-    __ cdq();
-  } else {
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptUnboxInteger);
-    Label is_smi, done;
-    __ testl(value, Immediate(kSmiTagMask));
-    __ j(ZERO, &is_smi);
-    __ CompareClassId(value, kMintCid, result_lo);
-    __ j(NOT_EQUAL, deopt);
-    __ movl(result_lo, FieldAddress(value, Mint::value_offset()));
-    __ movl(result_hi, FieldAddress(value, Mint::value_offset() + kWordSize));
-    __ jmp(&done);
-    __ Bind(&is_smi);
-    __ movl(result_lo, value);
-    __ SmiUntag(result_lo);
-    // Sign extend into result_hi.
-    __ cdq();
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = is_smi() ? 0 : 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          is_smi()
-                              ? LocationSummary::kNoCall
-                              : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                    Location::RequiresRegister()));
-  if (!is_smi()) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (is_smi()) {
-    PairLocation* value_pair = locs()->in(0).AsPairLocation();
-    Register value_lo = value_pair->At(0).reg();
-    Register out_reg = locs()->out(0).reg();
-    __ movl(out_reg, value_lo);
-    __ SmiTag(out_reg);
-    return;
-  }
-
-  PairLocation* value_pair = locs()->in(0).AsPairLocation();
-  Register value_lo = value_pair->At(0).reg();
-  Register value_hi = value_pair->At(1).reg();
-  Register out_reg = locs()->out(0).reg();
-
-  // Copy value_hi into out_reg as a temporary.
-  // We modify value_lo but restore it before using it.
-  __ movl(out_reg, value_hi);
-
-  // Unboxed operations produce smis or mint-sized values.
-  // Check if value fits into a smi.
-  Label not_smi, done;
-
-  // 1. Compute (x + -kMinSmi) which has to be in the range
-  //    0 .. -kMinSmi+kMaxSmi for x to fit into a smi.
-  __ addl(value_lo, Immediate(0x40000000));
-  __ adcl(out_reg, Immediate(0));
-  // 2. Unsigned compare to -kMinSmi+kMaxSmi.
-  __ cmpl(value_lo, Immediate(0x80000000));
-  __ sbbl(out_reg, Immediate(0));
-  __ j(ABOVE_EQUAL, &not_smi);
-  // 3. Restore lower half if result is a smi.
-  __ subl(value_lo, Immediate(0x40000000));
-  __ movl(out_reg, value_lo);
-  __ SmiTag(out_reg);
-  __ jmp(&done);
-  __ Bind(&not_smi);
-  // 3. Restore lower half of input before using it.
-  __ subl(value_lo, Immediate(0x40000000));
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->mint_class(), out_reg, kNoRegister);
-  __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo);
-  __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi);
-  __ Bind(&done);
-}
-
-
 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6221,148 +6204,6 @@
 }
 
 
-LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                    bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps,
-      ValueFitsSmi() ? LocationSummary::kNoCall
-                     : LocationSummary::kCallOnSlowPath);
-  const bool needs_writable_input = ValueFitsSmi() ||
-      (from_representation() == kUnboxedUint32);
-  summary->set_in(0, needs_writable_input ? Location::RequiresRegister()
-                                          : Location::WritableRegister());
-  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
-                                     : Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
-
-  __ MoveRegister(out, value);
-  __ shll(out, Immediate(kSmiTagSize));
-  if (!ValueFitsSmi()) {
-    Label done;
-    ASSERT(value != out);
-    if (from_representation() == kUnboxedInt32) {
-      __ j(NO_OVERFLOW, &done);
-    } else {
-      __ testl(value, Immediate(0xC0000000));
-      __ j(ZERO, &done);
-    }
-
-    // Allocate a mint.
-    // Value input is writable register and has to be manually preserved
-    // on the slow path.
-    locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32);
-    BoxAllocationSlowPath::Allocate(
-        compiler, this, compiler->mint_class(), out, kNoRegister);
-    __ movl(FieldAddress(out, Mint::value_offset()), value);
-    if (from_representation() == kUnboxedInt32) {
-      __ sarl(value, Immediate(31));  // Sign extend.
-      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
-    } else {
-      __ movl(FieldAddress(out, Mint::value_offset() + kWordSize),
-              Immediate(0));
-    }
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  intptr_t kNumTemps = 0;
-
-  if (CanDeoptimize()) {
-    if ((value_cid != kSmiCid) &&
-        (value_cid != kMintCid) &&
-        !is_truncating()) {
-      kNumTemps = 2;
-    } else {
-      kNumTemps = 1;
-    }
-  }
-
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  for (int i = 0; i < kNumTemps; i++) {
-    summary->set_temp(i, Location::RequiresRegister());
-  }
-  summary->set_out(0, ((value_cid == kSmiCid) || (value_cid != kMintCid)) ?
-      Location::SameAsFirstInput() : Location::RequiresRegister());
-  return summary;
-}
-
-
-static void LoadInt32FromMint(FlowGraphCompiler* compiler,
-                              Register result,
-                              const Address& lo,
-                              const Address& hi,
-                              Register temp,
-                              Label* deopt) {
-  __ movl(result, lo);
-  if (deopt != NULL) {
-    ASSERT(temp != result);
-    __ movl(temp, result);
-    __ sarl(temp, Immediate(31));
-    __ cmpl(temp, hi);
-    __ j(NOT_EQUAL, deopt);
-  }
-}
-
-
-void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  Register value = locs()->in(0).reg();
-  const Register result = locs()->out(0).reg();
-  const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
-  Label* out_of_range = !is_truncating() ? deopt : NULL;
-
-  const intptr_t lo_offset = Mint::value_offset();
-  const intptr_t hi_offset = Mint::value_offset() + kWordSize;
-
-  if (value_cid == kSmiCid) {
-    ASSERT(value == result);
-    __ SmiUntag(value);
-  } else if (value_cid == kMintCid) {
-    ASSERT((value != result) || (out_of_range == NULL));
-    LoadInt32FromMint(compiler,
-                      result,
-                      FieldAddress(value, lo_offset),
-                      FieldAddress(value, hi_offset),
-                      temp,
-                      out_of_range);
-  } else {
-    ASSERT(value == result);
-    Label done;
-    __ SmiUntagOrCheckClass(value, kMintCid, temp, &done);
-    __ j(NOT_EQUAL, deopt);
-    if (out_of_range != NULL) {
-      Register value_temp = locs()->temp(1).reg();
-      __ movl(value_temp, value);
-      value = value_temp;
-    }
-    LoadInt32FromMint(compiler,
-                      result,
-                      Address(value, TIMES_2, lo_offset),
-                      Address(value, TIMES_2, hi_offset),
-                      temp,
-                      out_of_range);
-    __ Bind(&done);
-  }
-}
-
-
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -6407,7 +6248,7 @@
     }
   } else if (from() == kUnboxedMint) {
     // TODO(vegorov) kUnboxedMint -> kInt32 conversion is currently usually
-    // dominated by a CheckSmi(BoxInteger(val)) which is an artifact of ordering
+    // dominated by a CheckSmi(BoxInt64(val)) which is an artifact of ordering
     // of optimization passes and the way we check smi-ness of values.
     // Optimize it away.
     ASSERT(to() == kUnboxedInt32 || to() == kUnboxedUint32);
@@ -6740,7 +6581,7 @@
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -6766,7 +6607,6 @@
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ movl(EDX, Immediate(kInvalidObjectPointer));
-  __ movl(EDX, Immediate(kInvalidObjectPointer));
 #endif
 }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index f23a56e..46b2555 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -30,8 +30,7 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register V0.
-LocationSummary* Instruction::MakeCallSummary() {
-  Isolate* isolate = Isolate::Current();
+LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(V0));
@@ -876,23 +875,12 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(A1));
-  locs->set_temp(1, Location::RegisterLocation(A2));
-  locs->set_temp(2, Location::RegisterLocation(T5));
-  locs->set_out(0, Location::RegisterLocation(V0));
-  return locs;
+  return MakeCallSummary(isolate);
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("NativeCallInstr");
-  ASSERT(locs()->temp(0).reg() == A1);
-  ASSERT(locs()->temp(1).reg() == A2);
-  ASSERT(locs()->temp(2).reg() == T5);
   Register result = locs()->out(0).reg();
 
   // Push the result place holder initialized to NULL.
@@ -3077,14 +3065,12 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -3092,7 +3078,9 @@
 }
 
 
-void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(from_representation() == kUnboxedDouble);
+
   Register out_reg = locs()->out(0).reg();
   DRegister value = locs()->in(0).fpu_reg();
 
@@ -3102,7 +3090,7 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
@@ -3114,116 +3102,209 @@
 }
 
 
-void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  CompileType* value_type = value()->Type();
-  const intptr_t value_cid = value_type->ToCid();
-  const Register value = locs()->in(0).reg();
-  const DRegister result = locs()->out(0).fpu_reg();
+void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
 
-  if (value_cid == kDoubleCid) {
-    __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(TMP, value);
-    __ mtc1(TMP, STMP1);
-    __ cvtdw(result, STMP1);
-  } else {
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptBinaryDoubleOp);
-    if (value_type->is_nullable() &&
-        (value_type->ToNullableCid() == kDoubleCid)) {
-      __ BranchEqual(value, Object::null_object(), deopt);
-      // It must be double now.
-      __ LoadDFromOffset(result, value,
-          Double::value_offset() - kHeapObjectTag);
-    } else {
-      Label is_smi, done;
+  switch (representation()) {
+    case kUnboxedMint: {
+      UNIMPLEMENTED();
+      break;
+    }
 
-      __ andi(CMPRES1, value, Immediate(kSmiTagMask));
-      __ beq(CMPRES1, ZR, &is_smi);
-      __ LoadClassId(CMPRES1, value);
-      __ BranchNotEqual(CMPRES1, Immediate(kDoubleCid), deopt);
-      __ LoadDFromOffset(result, value,
-          Double::value_offset() - kHeapObjectTag);
-      __ b(&done);
-      __ Bind(&is_smi);
-      __ SmiUntag(TMP, value);
+    case kUnboxedDouble: {
+      const DRegister result = locs()->out(0).fpu_reg();
+      __ LoadDFromOffset(result, box, Double::value_offset() - kHeapObjectTag);
+      break;
+    }
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4: {
+      UNIMPLEMENTED();
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitSmiConversion(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kUnboxedMint: {
+      UNIMPLEMENTED();
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const DRegister result = locs()->out(0).fpu_reg();
+      __ SmiUntag(TMP, box);
       __ mtc1(TMP, STMP1);
       __ cvtdw(result, STMP1);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t box_cid = BoxCid();
+
+  if (value_cid == box_cid) {
+    EmitLoadFromBox(compiler);
+  } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
+    EmitSmiConversion(compiler);
+  } else {
+    const Register box = locs()->in(0).reg();
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
+                                          ICData::kDeoptCheckClass);
+    Label is_smi;
+
+    if ((value()->Type()->ToNullableCid() == box_cid) &&
+        value()->Type()->is_nullable()) {
+      __ BranchEqual(box, Object::null_object(), deopt);
+    } else {
+      __ andi(CMPRES1, box, Immediate(kSmiTagMask));
+      __ beq(CMPRES1, ZR, CanConvertSmi() ? &is_smi : deopt);
+      __ LoadClassId(CMPRES1, box);
+      __ BranchNotEqual(CMPRES1, Immediate(box_cid), deopt);
+    }
+
+    EmitLoadFromBox(compiler);
+
+    if (is_smi.IsLinked()) {
+      Label done;
+      __ b(&done);
+      __ Bind(&is_smi);
+      EmitSmiConversion(compiler);
       __ Bind(&done);
     }
   }
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
-void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  Label done;
+  __ SmiTag(out, value);
+  if (!ValueFitsSmi()) {
+    Register temp = locs()->temp(0).reg();
+    if (from_representation() == kUnboxedInt32) {
+      __ SmiUntag(CMPRES1, out);
+      __ BranchEqual(CMPRES1, value, &done);
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      __ AndImmediate(CMPRES1, value, 0xC0000000);
+      __ BranchEqual(CMPRES1, ZR, &done);
+    }
+    BoxAllocationSlowPath::Allocate(
+        compiler,
+        this,
+        compiler->mint_class(),
+        out,
+        temp);
+    Register hi;
+    if (from_representation() == kUnboxedInt32) {
+      hi = temp;
+      __ sra(hi, value, kBitsPerWord - 1);
+    } else {
+      ASSERT(from_representation() == kUnboxedUint32);
+      hi = ZR;
+    }
+    __ StoreToOffset(value,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(hi,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ Bind(&done);
+  }
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr);
+
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT((representation() == kUnboxedInt32) ||
+         (representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
-void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register mint,
+                              Register result,
+                              Label* deopt) {
+  __ LoadFromOffset(result,
+                    mint,
+                    Mint::value_offset() - kHeapObjectTag);
+  if (deopt != NULL) {
+    __ LoadFromOffset(CMPRES1,
+                      mint,
+                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ sra(CMPRES2, result, kBitsPerWord - 1);
+    __ BranchNotEqual(CMPRES1, CMPRES2, deopt);
+  }
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
+void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
+  Label* out_of_range = !is_truncating() ? deopt : NULL;
+  ASSERT(value != out);
 
-
-void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(out, value);
+  } else if (value_cid == kMintCid) {
+    LoadInt32FromMint(compiler, value, out, out_of_range);
+  } else {
+    Label done;
+    __ SmiUntag(out, value);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, &done);
+    __ LoadClassId(CMPRES1, value);
+    __ BranchNotEqual(CMPRES1, Immediate(kMintCid), deopt);
+    LoadInt32FromMint(compiler, value, out, out_of_range);
+    __ Bind(&done);
+  }
 }
 
 
@@ -4265,7 +4346,7 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -4490,72 +4571,15 @@
   }
 }
 
-
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryMintOpInstr);
 
 bool ShiftMintOpInstr::has_shift_count_check() const {
   UNREACHABLE();
   return false;
 }
 
-
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
+DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftMintOpInstr);
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryMintOpInstr);
 
 CompileType BinaryUint32OpInstr::ComputeType() const {
   return CompileType::Int();
@@ -4578,120 +4602,6 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                   bool opt) const {
-  ASSERT((from_representation() == kUnboxedInt32) ||
-         (from_representation() == kUnboxedUint32));
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_temp(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register value = locs()->in(0).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(value != out);
-
-  Label done;
-  __ SmiTag(out, value);
-  if (!ValueFitsSmi()) {
-    Register temp = locs()->temp(0).reg();
-    if (from_representation() == kUnboxedInt32) {
-      __ SmiUntag(CMPRES1, out);
-      __ BranchEqual(CMPRES1, value, &done);
-    } else {
-      ASSERT(from_representation() == kUnboxedUint32);
-      __ AndImmediate(CMPRES1, value, 0xC0000000);
-      __ BranchEqual(CMPRES1, ZR, &done);
-    }
-    BoxAllocationSlowPath::Allocate(
-        compiler,
-        this,
-        compiler->mint_class(),
-        out,
-        temp);
-    Register hi;
-    if (from_representation() == kUnboxedInt32) {
-      hi = temp;
-      __ sra(hi, value, kBitsPerWord - 1);
-    } else {
-      ASSERT(from_representation() == kUnboxedUint32);
-      hi = ZR;
-    }
-    __ StoreToOffset(value,
-                     out,
-                     Mint::value_offset() - kHeapObjectTag);
-    __ StoreToOffset(hi,
-                     out,
-                     Mint::value_offset() - kHeapObjectTag + kWordSize);
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  ASSERT((representation() == kUnboxedInt32) ||
-         (representation() == kUnboxedUint32));
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-static void LoadInt32FromMint(FlowGraphCompiler* compiler,
-                              Register mint,
-                              Register result,
-                              Label* deopt) {
-  __ LoadFromOffset(result,
-                    mint,
-                    Mint::value_offset() - kHeapObjectTag);
-  if (deopt != NULL) {
-    __ LoadFromOffset(CMPRES1,
-                      mint,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
-    __ sra(CMPRES2, result, kBitsPerWord - 1);
-    __ BranchNotEqual(CMPRES1, CMPRES2, deopt);
-  }
-}
-
-
-void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
-  Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
-  Label* out_of_range = !is_truncating() ? deopt : NULL;
-  ASSERT(value != out);
-
-  if (value_cid == kSmiCid) {
-    __ SmiUntag(out, value);
-  } else if (value_cid == kMintCid) {
-    LoadInt32FromMint(compiler, value, out, out_of_range);
-  } else {
-    Label done;
-    __ SmiUntag(out, value);
-    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
-    __ beq(CMPRES1, ZR, &done);
-    __ LoadClassId(CMPRES1, value);
-    __ BranchNotEqual(CMPRES1, Immediate(kMintCid), deopt);
-    LoadInt32FromMint(compiler, value, out, out_of_range);
-    __ Bind(&done);
-  }
-}
-
-
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -4916,7 +4826,7 @@
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 1167b3a..0616adb 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -30,8 +30,8 @@
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register RAX.
-LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(
+LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
+  LocationSummary* result = new(isolate) LocationSummary(
       Isolate::Current(), 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(RAX));
   return result;
@@ -752,22 +752,11 @@
 
 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
-  const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 3;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(RAX));
-  locs->set_temp(1, Location::RegisterLocation(RBX));
-  locs->set_temp(2, Location::RegisterLocation(R10));
-  locs->set_out(0, Location::RegisterLocation(RAX));
-  return locs;
+  return MakeCallSummary(isolate);
 }
 
 
 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ASSERT(locs()->temp(0).reg() == RAX);
-  ASSERT(locs()->temp(1).reg() == RBX);
-  ASSERT(locs()->temp(2).reg() == R10);
   Register result = locs()->out(0).reg();
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
   const bool is_leaf_call =
@@ -3194,239 +3183,267 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate,
                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register out_reg = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
 
   BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->double_class(), out_reg);
+      compiler, this, compiler->BoxClassFor(from_representation()), out_reg);
   __ movsd(FieldAddress(out_reg, Double::value_offset()), value);
+  switch (from_representation()) {
+    case kUnboxedDouble:
+      __ movsd(FieldAddress(out_reg, ValueOffset()), value);
+      break;
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4:
+      __ movups(FieldAddress(out_reg, ValueOffset()), value);
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
+LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
+  const bool needs_writable_input =
+      (representation() != kUnboxedMint) &&
+      (value()->Type()->ToNullableCid() != BoxCid());
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  const bool needs_writable_input = (value()->Type()->ToCid() != kDoubleCid);
-  summary->set_in(0, needs_writable_input
-                     ? Location::WritableRegister()
-                     : Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  summary->set_in(0, needs_writable_input ? Location::WritableRegister()
+                                          : Location::RequiresRegister());
+  if (representation() == kUnboxedMint) {
+    summary->set_out(0, Location::SameAsFirstInput());
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
 
-void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  CompileType* value_type = value()->Type();
-  const intptr_t value_cid = value_type->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
+void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
 
-  if (value_cid == kDoubleCid) {
-    __ movsd(result, FieldAddress(value, Double::value_offset()));
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(value);  // Untag input before conversion.
-    __ cvtsi2sdq(result, value);
+  switch (representation()) {
+    case kUnboxedMint: {
+      const Register result = locs()->out(0).reg();
+      __ movq(result, FieldAddress(box, ValueOffset()));
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ movsd(result, FieldAddress(box, ValueOffset()));
+      break;
+    }
+
+    case kUnboxedFloat32x4:
+    case kUnboxedFloat64x2:
+    case kUnboxedInt32x4: {
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ movups(result, FieldAddress(box, ValueOffset()));
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitSmiConversion(FlowGraphCompiler* compiler) {
+  const Register box = locs()->in(0).reg();
+
+  switch (representation()) {
+    case kUnboxedMint: {
+      const Register result = locs()->out(0).reg();
+      ASSERT(result == box);
+      __ SmiUntag(box);
+      break;
+    }
+
+    case kUnboxedDouble: {
+      const FpuRegister result = locs()->out(0).fpu_reg();
+      __ SmiUntag(box);
+      __ cvtsi2sdq(result, box);
+      break;
+    }
+
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void UnboxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t box_cid = BoxCid();
+
+  if (value_cid == box_cid) {
+    EmitLoadFromBox(compiler);
+  } else if (CanConvertSmi() && (value_cid == kSmiCid)) {
+    EmitSmiConversion(compiler);
   } else {
+    const Register box = locs()->in(0).reg();
     Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptBinaryDoubleOp);
-    if (value_type->is_nullable() &&
-        (value_type->ToNullableCid() == kDoubleCid)) {
+                                          ICData::kDeoptCheckClass);
+    Label is_smi;
+
+    if ((value()->Type()->ToNullableCid() == box_cid) &&
+        value()->Type()->is_nullable()) {
       const Immediate& raw_null =
           Immediate(reinterpret_cast<intptr_t>(Object::null()));
-      __ cmpq(value, raw_null);
+      __ cmpq(box, raw_null);
       __ j(EQUAL, deopt);
-      // It must be double now.
-      __ movsd(result, FieldAddress(value, Double::value_offset()));
     } else {
-      Label is_smi, done;
-      __ testq(value, Immediate(kSmiTagMask));
-      __ j(ZERO, &is_smi);
-      __ CompareClassId(value, kDoubleCid);
+      __ testq(box, Immediate(kSmiTagMask));
+      __ j(ZERO, CanConvertSmi() ? &is_smi : deopt);
+      __ CompareClassId(box, box_cid);
       __ j(NOT_EQUAL, deopt);
-      __ movsd(result, FieldAddress(value, Double::value_offset()));
+    }
+
+    EmitLoadFromBox(compiler);
+
+    if (is_smi.IsLinked()) {
+      Label done;
       __ jmp(&done);
       __ Bind(&is_smi);
-      __ SmiUntag(value);
-      __ cvtsi2sdq(result, value);
+      EmitSmiConversion(compiler);
       __ Bind(&done);
     }
   }
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float32x4_class(), out_reg);
-  __ movups(FieldAddress(out_reg, Float32x4::value_offset()), value);
-}
-
-
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
-  return LocationSummary::Make(isolate,
-                               kNumInputs,
-                               Location::RequiresFpuRegister(),
-                               LocationSummary::kNoCall);
-}
-
-
-void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kFloat32x4Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testq(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kFloat32x4Cid);
-    __ j(NOT_EQUAL, deopt);
-  }
-  __ movups(result, FieldAddress(value, Float32x4::value_offset()));
-}
-
-
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->float64x2_class(), out_reg);
-  __ movups(FieldAddress(out_reg, Float64x2::value_offset()), value);
-}
-
-
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1;
+  const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   return summary;
 }
 
 
-void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
+  Label* deopt = CanDeoptimize() ?
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
+  ASSERT(value == locs()->out(0).reg());
 
-  if (value_cid != kFloat64x2Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testq(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kFloat64x2Cid);
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(value);
+  } else if (value_cid == kMintCid) {
+    __ movq(value, FieldAddress(value, Mint::value_offset()));
+  } else {
+    Label done;
+    // Optimistically untag value.
+    __ SmiUntagOrCheckClass(value, kMintCid, &done);
+    __ j(NOT_EQUAL, deopt);
+    // Undo untagging by multiplying value with 2.
+    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+    __ Bind(&done);
+  }
+
+  // TODO(vegorov): as it is implemented right now truncating unboxing would
+  // leave "garbage" in the higher word.
+  if (!is_truncating() && (deopt != NULL)) {
+    ASSERT(representation() == kUnboxedInt32);
+    Register temp = locs()->temp(0).reg();
+    __ movsxd(temp, value);
+    __ cmpq(temp, value);
     __ j(NOT_EQUAL, deopt);
   }
-  __ movups(result, FieldAddress(value, Float64x2::value_offset()));
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  ASSERT((from_representation() == kUnboxedInt32) ||
+         (from_representation() == kUnboxedUint32));
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  ASSERT(kSmiTagSize == 1);
+  if (from_representation() == kUnboxedInt32) {
+    __ movsxd(out, value);
+  } else {
+    ASSERT(from_representation() == kUnboxedUint32);
+    __ movl(out, value);
+  }
+  __ SmiTag(out);
+}
+
+
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresFpuRegister());
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
 
 
-void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register out_reg = locs()->out(0).reg();
-  XmmRegister value = locs()->in(0).fpu_reg();
-
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->int32x4_class(), out_reg);
-  __ movups(FieldAddress(out_reg, Int32x4::value_offset()), value);
-}
-
-
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
-  return summary;
-}
-
-
-void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
+void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
-  const XmmRegister result = locs()->out(0).fpu_reg();
-
-  if (value_cid != kInt32x4Cid) {
-    Label* deopt =
-        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
-    __ testq(value, Immediate(kSmiTagMask));
-    __ j(ZERO, deopt);
-    __ CompareClassId(value, kInt32x4Cid);
-    __ j(NOT_EQUAL, deopt);
+  __ MoveRegister(out, value);
+  __ SmiTag(out);
+  if (!ValueFitsSmi()) {
+    Label done;
+    __ j(NO_OVERFLOW, &done);
+    BoxAllocationSlowPath::Allocate(
+        compiler, this, compiler->mint_class(), out);
+    __ movq(FieldAddress(out, Mint::value_offset()), value);
+    __ Bind(&done);
   }
-  __ movups(result, FieldAddress(value, Int32x4::value_offset()));
 }
 
 
@@ -5299,7 +5316,7 @@
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
@@ -5532,77 +5549,6 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                        bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(0, Location::RequiresRegister());
-  locs->set_out(0, Location::SameAsFirstInput());
-  return locs;
-}
-
-
-void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  const Register result = locs()->out(0).reg();
-  ASSERT(value == result);
-
-  if (value_cid == kMintCid) {
-    __ movq(result, FieldAddress(value, Mint::value_offset()));
-  } else if (value_cid == kSmiCid) {
-    __ SmiUntag(result);
-  } else {
-    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
-                                          ICData::kDeoptUnboxInteger);
-    Label done;
-    __ SmiUntagOrCheckClass(value, kMintCid, &done);
-    __ j(NOT_EQUAL, deopt);
-    // Undo untagging by multiplying value with 2.
-    __ movq(result, Address(value, TIMES_2, Mint::value_offset()));
-    __ Bind(&done);
-  }
-}
-
-
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
-                                                      bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, is_smi()
-                                          ? LocationSummary::kNoCall
-                                          : LocationSummary::kCallOnSlowPath);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register out = locs()->out(0).reg();
-  const Register value = locs()->in(0).reg();
-
-  if (is_smi()) {
-    __ movq(out, value);
-    __ SmiTag(out);
-    return;
-  }
-
-  Label is_smi;
-  Label done;
-  __ movq(out, value);
-  __ SmiTag(out);   // shlq sets OF := SF ^ CF on 1 bit shifts
-  __ j(NO_OVERFLOW, &done);
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->mint_class(), out);
-  __ movq(FieldAddress(out, Mint::value_offset()), value);
-  __ Bind(&done);
-}
-
-
 template<typename OperandType>
 static void EmitInt64Arithmetic(FlowGraphCompiler* compiler,
                                 Token::Kind op_kind,
@@ -5987,87 +5933,6 @@
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
-LocationSummary* UnboxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = (!is_truncating() && CanDeoptimize()) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::SameAsFirstInput());
-  if (kNumTemps > 0) {
-    summary->set_temp(0, Location::RequiresRegister());
-  }
-  return summary;
-}
-
-
-void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const intptr_t value_cid = value()->Type()->ToCid();
-  const Register value = locs()->in(0).reg();
-  Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
-  ASSERT(value == locs()->out(0).reg());
-
-  if (value_cid == kSmiCid) {
-    __ SmiUntag(value);
-  } else if (value_cid == kMintCid) {
-    __ movq(value, FieldAddress(value, Mint::value_offset()));
-  } else {
-    Label done;
-    // Optimistically untag value.
-    __ SmiUntagOrCheckClass(value, kMintCid, &done);
-    __ j(NOT_EQUAL, deopt);
-    // Undo untagging by multiplying value with 2.
-    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
-    __ Bind(&done);
-  }
-
-  // TODO(vegorov): as it is implemented right now truncating unboxing would
-  // leave "garbage" in the higher word.
-  if (!is_truncating() && (deopt != NULL)) {
-    ASSERT(representation() == kUnboxedInt32);
-    Register temp = locs()->temp(0).reg();
-    __ movsxd(temp, value);
-    __ cmpq(temp, value);
-    __ j(NOT_EQUAL, deopt);
-  }
-}
-
-
-LocationSummary* BoxIntNInstr::MakeLocationSummary(Isolate* isolate,
-                                                   bool opt) const {
-  ASSERT((from_representation() == kUnboxedInt32) ||
-         (from_representation() == kUnboxedUint32));
-  const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate,
-      kNumInputs,
-      kNumTemps,
-      LocationSummary::kNoCall);
-  summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
-  return summary;
-}
-
-
-void BoxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register value = locs()->in(0).reg();
-  const Register out = locs()->out(0).reg();
-  ASSERT(value != out);
-
-  ASSERT(kSmiTagSize == 1);
-  if (from_representation() == kUnboxedInt32) {
-    __ movsxd(out, value);
-  } else {
-    ASSERT(from_representation() == kUnboxedUint32);
-    __ movl(out, value);
-  }
-  __ SmiTag(out);
-}
-
-
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -6375,7 +6240,7 @@
 
 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
-  return MakeCallSummary();
+  return MakeCallSummary(isolate);
 }
 
 
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 0ba74eb..c195e30 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -451,10 +451,12 @@
                           value_check,
                           builder.TokenPos()));
   Definition* double_value = builder.AddDefinition(
-      new UnboxDoubleInstr(new Value(value), Isolate::kNoDeoptId));
+      UnboxInstr::Create(kUnboxedDouble,
+                         new Value(value),
+                         Isolate::kNoDeoptId));
   // Manually adjust reaching type because there is no type propagation
   // when building intrinsics.
-  double_value->AsUnboxDouble()->value()->SetReachingType(
+  double_value->AsUnbox()->value()->SetReachingType(
       ZoneCompileType::Wrap(CompileType::FromCid(kDoubleCid)));
 
   builder.AddInstruction(
@@ -494,7 +496,7 @@
                            Isolate::kNoDeoptId,
                            builder.TokenPos()));
   Definition* result = builder.AddDefinition(
-      new BoxDoubleInstr(new Value(unboxed_value)));
+      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_value)));
   builder.AddIntrinsicReturn(new Value(result));
   return true;
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index a87a87a..3c5e938 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -401,7 +401,6 @@
       terminate_capability_(0),
       heap_(NULL),
       object_store_(NULL),
-      top_context_(Context::null()),
       top_exit_frame_info_(0),
       init_callback_data_(NULL),
       environment_callback_(NULL),
@@ -461,7 +460,6 @@
       terminate_capability_(0),
       heap_(NULL),
       object_store_(NULL),
-      top_context_(Context::null()),
       top_exit_frame_info_(0),
       init_callback_data_(NULL),
       environment_callback_(NULL),
@@ -1130,9 +1128,6 @@
     api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles);
   }
 
-  // Visit the top context which is stored in the isolate.
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_context_));
-
   // Visit the current tag which is stored in the isolate.
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&current_tag_));
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index befb386..e0bbf42 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -187,12 +187,6 @@
     return OFFSET_OF(Isolate, object_store_);
   }
 
-  RawContext* top_context() const { return top_context_; }
-  void set_top_context(RawContext* value) { top_context_ = value; }
-  static intptr_t top_context_offset() {
-    return OFFSET_OF(Isolate, top_context_);
-  }
-
   uword top_exit_frame_info() const { return top_exit_frame_info_; }
   void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
   static intptr_t top_exit_frame_info_offset() {
@@ -640,7 +634,6 @@
   uint64_t terminate_capability_;
   Heap* heap_;
   ObjectStore* object_store_;
-  RawContext* top_context_;
   uword top_exit_frame_info_;
   void* init_callback_data_;
   Dart_EnvironmentCallback environment_callback_;
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 1451856..197f9ab 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -101,7 +101,9 @@
     int function_bits = FunctionBits::decode(argc_tag_);
     if (function_bits == (kClosureFunctionBit | kInstanceFunctionBit)) {
       // Retrieve the receiver from the context.
-      const Context& context = Context::Handle(isolate_->top_context());
+      const Object& closure = Object::Handle(ArgAt(0));
+      const Context& context =
+          Context::Handle(Closure::context(Instance::Cast(closure)));
       return context.At(0);
     }
     return ArgAt(NumHiddenArgs(function_bits));
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 197ef30..47ce72f 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -4955,6 +4955,27 @@
 }
 
 
+RawTypeArguments* TypeArguments::CloneUninstantiated(
+    const Class& new_owner) const {
+  ASSERT(!IsNull());
+  ASSERT(IsFinalized());
+  ASSERT(!IsInstantiated());
+  AbstractType& type = AbstractType::Handle();
+  const intptr_t num_types = Length();
+  const TypeArguments& clone = TypeArguments::Handle(
+      TypeArguments::New(num_types));
+  for (intptr_t i = 0; i < num_types; i++) {
+    type = TypeAt(i);
+    if (!type.IsInstantiated()) {
+      type = type.CloneUninstantiated(new_owner);
+    }
+    clone.SetTypeAt(i, type);
+  }
+  ASSERT(clone.IsFinalized());
+  return clone.raw();
+}
+
+
 RawTypeArguments* TypeArguments::Canonicalize(
     GrowableObjectArray* trail) const {
   if (IsNull() || IsCanonical()) {
@@ -5459,7 +5480,7 @@
 void Function::SetParameterTypeAt(
     intptr_t index, const AbstractType& value) const {
   ASSERT(!value.IsNull());
-  // Method extractor parameters are in the VM heap.
+  // Method extractor parameters are shared and are in the VM heap.
   ASSERT(kind() != RawFunction::kMethodExtractor);
   const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
   parameter_types.SetAt(index, value);
@@ -6155,6 +6176,21 @@
   clone.set_optimized_instruction_count(0);
   clone.set_optimized_call_site_count(0);
   clone.set_ic_data_array(Array::Handle());
+  if (new_owner.NumTypeParameters() > 0) {
+    // Adjust uninstantiated types to refer to type parameters of the new owner.
+    AbstractType& type = AbstractType::Handle(clone.result_type());
+    type ^= type.CloneUninstantiated(new_owner);
+    clone.set_result_type(type);
+    const intptr_t num_params = clone.NumParameters();
+    Array& array = Array::Handle(clone.parameter_types());
+    array ^= Object::Clone(array, Heap::kOld);
+    clone.set_parameter_types(array);
+    for (intptr_t i = 0; i < num_params; i++) {
+      type = clone.ParameterTypeAt(i);
+      type ^= type.CloneUninstantiated(new_owner);
+      clone.SetParameterTypeAt(i, type);
+    }
+  }
   return clone.raw();
 }
 
@@ -7027,6 +7063,12 @@
   if (!clone.is_static()) {
     clone.SetOffset(0);
   }
+  if (new_owner.NumTypeParameters() > 0) {
+    // Adjust the field type to refer to type parameters of the new owner.
+    AbstractType& type = AbstractType::Handle(clone.type());
+    type ^= type.CloneUninstantiated(new_owner);
+    clone.set_type(type);
+  }
   return clone.raw();
 }
 
@@ -10785,11 +10827,8 @@
     case RawLocalVarDescriptors::kContextLevel:
       return "ContextLevel";
       break;
-    case RawLocalVarDescriptors::kSavedEntryContext:
-      return "SavedEntryCtx";
-      break;
     case RawLocalVarDescriptors::kSavedCurrentContext:
-      return "SavedCurrentCtx";
+      return "CurrentCtx";
       break;
     default:
       UNREACHABLE();
@@ -10907,8 +10946,6 @@
       return "ContextVar";
     case RawLocalVarDescriptors::kContextLevel:
       return "ContextLevel";
-    case RawLocalVarDescriptors::kSavedEntryContext:
-      return "SavedEntryContext";
     case RawLocalVarDescriptors::kSavedCurrentContext:
       return "SavedCurrentContext";
     default:
@@ -13493,15 +13530,12 @@
 }
 
 
-bool Instance::IsCallable(Function* function, Context* context) const {
+bool Instance::IsCallable(Function* function) const {
   Class& cls = Class::Handle(clazz());
   if (cls.IsSignatureClass()) {
     if (function != NULL) {
       *function = Closure::function(*this);
     }
-    if (context != NULL) {
-      *context = Closure::context(*this);
-    }
     return true;
   }
   // Try to resolve a "call" method.
@@ -13512,9 +13546,6 @@
       if (function != NULL) {
         *function = call_function.raw();
       }
-      if (context != NULL) {
-        *context = Isolate::Current()->object_store()->empty_context();
-      }
       return true;
     }
     cls = cls.SuperClass();
@@ -13834,6 +13865,14 @@
 }
 
 
+RawAbstractType* AbstractType::CloneUninstantiated(
+    const Class& new_owner) const {
+  // AbstractType is an abstract class.
+  UNREACHABLE();
+  return NULL;
+}
+
+
 RawAbstractType* AbstractType::Canonicalize(GrowableObjectArray* trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -14533,9 +14572,24 @@
   TypeArguments& type_args = TypeArguments::Handle(arguments());
   type_args = type_args.CloneUnfinalized();
   const Class& type_cls = Class::Handle(type_class());
-  const Type& type = Type::Handle(Type::New(type_cls, type_args, token_pos()));
-  type.set_is_resolved();
-  return type.raw();
+  const Type& clone = Type::Handle(Type::New(type_cls, type_args, token_pos()));
+  clone.set_is_resolved();
+  return clone.raw();
+}
+
+
+RawAbstractType* Type::CloneUninstantiated(const Class& new_owner) const {
+  ASSERT(IsFinalized());
+  ASSERT(!IsMalformed());
+  if (IsInstantiated()) {
+    return raw();
+  }
+  TypeArguments& type_args = TypeArguments::Handle(arguments());
+  type_args = type_args.CloneUninstantiated(new_owner);
+  const Class& type_cls = Class::Handle(type_class());
+  const Type& clone = Type::Handle(Type::New(type_cls, type_args, token_pos()));
+  clone.SetIsFinalized();
+  return clone.raw();
 }
 
 
@@ -15075,6 +15129,25 @@
 }
 
 
+RawAbstractType* TypeParameter::CloneUninstantiated(
+    const Class& new_owner) const {
+  ASSERT(IsFinalized());
+  AbstractType& upper_bound = AbstractType::Handle(bound());
+  upper_bound = upper_bound.CloneUninstantiated(new_owner);
+  const Class& old_owner = Class::Handle(parameterized_class());
+  const intptr_t new_index = index() +
+      new_owner.NumTypeArguments() - old_owner.NumTypeArguments();
+  const TypeParameter& clone = TypeParameter::Handle(
+      TypeParameter::New(new_owner,
+                         new_index,
+                         String::Handle(name()),
+                         upper_bound,
+                         token_pos()));
+  clone.set_is_finalized();
+  return clone.raw();
+}
+
+
 intptr_t TypeParameter::Hash() const {
   ASSERT(IsFinalized());
   uint32_t result = Class::Handle(parameterized_class()).id();
@@ -15295,6 +15368,21 @@
 }
 
 
+RawAbstractType* BoundedType::CloneUninstantiated(
+    const Class& new_owner) const {
+  if (IsInstantiated()) {
+    return raw();
+  }
+  AbstractType& bounded_type = AbstractType::Handle(type());
+  bounded_type = bounded_type.CloneUninstantiated(new_owner);
+  AbstractType& upper_bound = AbstractType::Handle(bound());
+  upper_bound = upper_bound.CloneUninstantiated(new_owner);
+  TypeParameter& type_param =  TypeParameter::Handle(type_parameter());
+  type_param ^= type_param.CloneUninstantiated(new_owner);
+  return BoundedType::New(bounded_type, upper_bound, type_param);
+}
+
+
 intptr_t BoundedType::Hash() const {
   uint32_t result = AbstractType::Handle(type()).Hash();
   // No need to include the hash of the bound, since the bound is defined by the
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index d5e012a..dacb7ff 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1563,6 +1563,11 @@
   // Finalized type arguments are shared.
   RawTypeArguments* CloneUnfinalized() const;
 
+  // Clone this type argument vector and clone all uninstantiated type
+  // arguments, changing the class owner of type parameters.
+  // Instantiated type arguments are shared.
+  RawTypeArguments* CloneUninstantiated(const Class& new_owner) const;
+
   // Canonicalize only if instantiated, otherwise returns 'this'.
   RawTypeArguments* Canonicalize(GrowableObjectArray* trail = NULL) const;
 
@@ -4505,9 +4510,8 @@
 
   // If the instance is a callable object, i.e. a closure or the instance of a
   // class implementing a 'call' method, return true and set the function
-  // (if not NULL) to call and the context (if not NULL) to pass to the
-  // function.
-  bool IsCallable(Function* function, Context* context) const;
+  // (if not NULL) to call.
+  bool IsCallable(Function* function) const;
 
   // Evaluate the given expression as if it appeared in an instance
   // method of this instance and return the resulting value, or an
@@ -4665,6 +4669,13 @@
   // type arguments of an unfinalized type are not cloned, but shared.
   virtual RawAbstractType* CloneUnfinalized() const;
 
+  // Return a clone of this uninstantiated type where all references to type
+  // parameters are replaced with references to type parameters of the same name
+  // but belonging to the new owner class.
+  // Apply recursively to type arguments, i.e. instantiated type arguments of
+  // an uninstantiated type are not cloned, but shared.
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner) const;
+
   virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
     return Canonicalize();
   }
@@ -4825,6 +4836,7 @@
       Error* malformed_error,
       GrowableObjectArray* trail = NULL) const;
   virtual RawAbstractType* CloneUnfinalized() const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner) const;
   virtual RawAbstractType* Canonicalize(
       GrowableObjectArray* trail = NULL) const;
 
@@ -5024,6 +5036,7 @@
       Error* bound_error,
       GrowableObjectArray* trail = NULL) const;
   virtual RawAbstractType* CloneUnfinalized() const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner) const;
   virtual RawAbstractType* Canonicalize(
       GrowableObjectArray* trail = NULL) const {
     return raw();
@@ -5108,6 +5121,7 @@
       Error* bound_error,
       GrowableObjectArray* trail = NULL) const;
   virtual RawAbstractType* CloneUnfinalized() const;
+  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner) const;
   virtual RawAbstractType* Canonicalize(
       GrowableObjectArray* trail = NULL) const {
     return raw();
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 775ed5f..26bca7f 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -193,30 +193,6 @@
                                &context_owner,
                                &found_captured_variables);
 
-  // We save the entry context for a function when...
-  //
-  //   - some variable in the function is captured by nested functions, and
-  //   - the function does not capture any variables from parent functions.
-  //
-  // We used to link to the parent context in these cases, but this
-  // had the effect of unintentionally retaining parent contexts which
-  // would never be accessed.  By breaking the context chain at this
-  // point, we allow these outer contexts to be collected.
-  if (found_captured_variables) {
-    const ContextScope& context_scope =
-        ContextScope::Handle(function().context_scope());
-    if (context_scope.IsNull() || (context_scope.num_variables() == 0)) {
-      // Allocate a local variable for saving the entry context.
-      LocalVariable* context_var =
-          new LocalVariable(function().token_pos(),
-                            Symbols::SavedEntryContextVar(),
-                            Type::ZoneHandle(Type::DynamicType()));
-      context_var->set_index(next_free_frame_index--);
-      scope->AddVariable(context_var);
-      set_saved_entry_context_var(context_var);
-    }
-  }
-
   // Frame indices are relative to the frame pointer and are decreasing.
   ASSERT(next_free_frame_index <= first_stack_local_index_);
   num_stack_locals_ = first_stack_local_index_ - next_free_frame_index;
@@ -864,10 +840,8 @@
   if (parsed_function->has_expression_temp_var()) {
     node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
   }
-  if (parsed_function->has_saved_current_context_var()) {
-    node_sequence->scope()->AddVariable(
-        parsed_function->saved_current_context_var());
-  }
+  node_sequence->scope()->AddVariable(
+      parsed_function->current_context_var());
   if (parsed_function->has_finally_return_temp_var()) {
     node_sequence->scope()->AddVariable(
         parsed_function->finally_return_temp_var());
@@ -1068,9 +1042,7 @@
   if (parsed_function->has_expression_temp_var()) {
     body->scope()->AddVariable(parsed_function->expression_temp_var());
   }
-  if (parsed_function->has_saved_current_context_var()) {
-    body->scope()->AddVariable(parsed_function->saved_current_context_var());
-  }
+  body->scope()->AddVariable(parsed_function->current_context_var());
   if (parsed_function->has_finally_return_temp_var()) {
     body->scope()->AddVariable(parsed_function->finally_return_temp_var());
   }
@@ -1387,7 +1359,6 @@
   ASSERT(!owner.IsNull());
   AstNode* result = NULL;
   if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
-    EnsureSavedCurrentContext();
     result = new ClosureCallNode(token_pos, getter_call, args);
   } else {
     result = BuildClosureCall(token_pos, getter_call, args);
@@ -8695,19 +8666,6 @@
 }
 
 
-void Parser::EnsureSavedCurrentContext() {
-  // Used later by the flow_graph_builder to save current context.
-  if (!parsed_function()->has_saved_current_context_var()) {
-    LocalVariable* temp = new(I) LocalVariable(
-        current_function().token_pos(),
-        Symbols::SavedCurrentContextVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
-    ASSERT(temp != NULL);
-    parsed_function()->set_saved_current_context_var(temp);
-  }
-}
-
-
 LocalVariable* Parser::CreateTempConstVariable(intptr_t token_pos,
                                                const char* s) {
   char name[64];
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 207b03d..ca54975 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -44,8 +44,7 @@
         node_sequence_(NULL),
         instantiator_(NULL),
         default_parameter_values_(Array::ZoneHandle(isolate, Array::null())),
-        saved_current_context_var_(NULL),
-        saved_entry_context_var_(NULL),
+        current_context_var_(NULL),
         expression_temp_var_(NULL),
         finally_return_temp_var_(NULL),
         deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
@@ -58,6 +57,13 @@
         async_saved_try_ctx_name_(String::ZoneHandle(isolate, String::null())),
         isolate_(isolate) {
     ASSERT(function.IsZoneHandle());
+    // Every function has a local variable for the current context.
+    LocalVariable* temp = new(isolate) LocalVariable(
+        function.token_pos(),
+        Symbols::CurrentContextVar(),
+        Type::ZoneHandle(isolate, Type::DynamicType()));
+    ASSERT(temp != NULL);
+    current_context_var_ = temp;
   }
 
   const Function& function() const { return function_; }
@@ -81,23 +87,8 @@
     default_parameter_values_ = default_parameter_values.raw();
   }
 
-  LocalVariable* saved_current_context_var() const {
-    return saved_current_context_var_;
-  }
-  void set_saved_current_context_var(LocalVariable* saved_current_context_var) {
-    ASSERT(saved_current_context_var != NULL);
-    saved_current_context_var_ = saved_current_context_var;
-  }
-  bool has_saved_current_context_var() const {
-    return saved_current_context_var_ != NULL;
-  }
-
-  LocalVariable* saved_entry_context_var() const {
-    return saved_entry_context_var_;
-  }
-  void set_saved_entry_context_var(LocalVariable* saved_entry_context_var) {
-    ASSERT(saved_entry_context_var != NULL);
-    saved_entry_context_var_ = saved_entry_context_var;
+  LocalVariable* current_context_var() const {
+    return current_context_var_;
   }
 
   LocalVariable* expression_temp_var() const {
@@ -125,7 +116,6 @@
   }
   void EnsureFinallyReturnTemp();
 
-  static LocalVariable* CreateExpressionTempVar(intptr_t token_pos);
   LocalVariable* EnsureExpressionTemp();
 
   bool HasDeferredPrefixes() const { return deferred_prefixes_->length() != 0; }
@@ -173,8 +163,7 @@
   SequenceNode* node_sequence_;
   LocalVariable* instantiator_;
   Array& default_parameter_values_;
-  LocalVariable* saved_current_context_var_;
-  LocalVariable* saved_entry_context_var_;
+  LocalVariable* current_context_var_;
   LocalVariable* expression_temp_var_;
   LocalVariable* finally_return_temp_var_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
@@ -734,7 +723,6 @@
   void CheckOperatorArity(const MemberDesc& member);
 
   void EnsureExpressionTemp();
-  void EnsureSavedCurrentContext();
   bool IsLegalAssignableSyntax(AstNode* expr, intptr_t end_pos);
   AstNode* CreateAssignmentNode(AstNode* original,
                                 AstNode* rhs,
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 3595c16..1fb592f 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -263,18 +263,20 @@
       "::.main_f\n"
       " 0 ContextVar    level=0   begin=14  end=28  name=value\n"
       " 1 StackVar      scope=1   begin=16  end=28  name=param\n"
+      " 2 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "(dynamic, dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // function main uses one ctx var at (1); saves caller ctx.
       "::.main\n"
       " 0 ContextLevel  level=1   scope=1   begin=2   end=37\n"
-      " 1 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 2 ContextVar    level=1   begin=7   end=37  name=value\n"
       " 3 StackVar      scope=2   begin=12  end=37  name=f\n",
       CaptureVarsAtLine(lib, "main", 4));
@@ -300,34 +302,38 @@
       // function.
       "::.a_b_c\n"
       " 0 ContextVar    level=0   begin=20  end=30  name=value\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Middle function saves the entry context.  Notice that this
       // happens here and not in the outermost function.  We always
       // save the entry context at the last possible moment.
       "::.a_b\n"
       " 0 ContextLevel  level=1   scope=1   begin=8   end=38\n"
-      " 1 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 2 ContextVar    level=1   begin=13  end=38  name=value\n"
       " 3 StackVar      scope=2   begin=18  end=38  name=c\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Outermost function neglects to save the entry context.  We
       // don't save the entry context if the function has no captured
       // variables.
       "::.a\n"
-      " 0 StackVar      scope=2   begin=6   end=46  name=b\n",
+      " 0 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
+      " 1 StackVar      scope=2   begin=6   end=46  name=b\n",
       CaptureVarsAtLine(lib, "a", 5));
 }
 
@@ -350,49 +356,54 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
+
   EXPECT_STREQ(
       // bb captures only value2 from aa.  No others.
       "::.a_b_aa_bb\n"
       " 0 ContextVar    level=0   begin=32  end=42  name=value2\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // aa shares value2. Notice that we save the entry ctx instead
       // of chaining from b.  This keeps us from holding onto closures
       // that we would never access.
       "::.a_b_aa\n"
       " 0 ContextLevel  level=1   scope=1   begin=20  end=50\n"
-      " 1 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 2 ContextVar    level=1   begin=25  end=50  name=value2\n"
       " 3 StackVar      scope=2   begin=30  end=50  name=bb\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // b captures value1 from a.
       "::.a_b\n"
       " 0 ContextVar    level=0   begin=14  end=60  name=value1\n"
-      " 1 StackVar      scope=2   begin=18  end=60  name=aa\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
+      " 2 StackVar      scope=2   begin=18  end=60  name=aa\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // a shares value1, saves entry ctx.
       "::.a\n"
       " 0 ContextLevel  level=1   scope=1   begin=2   end=68\n"
-      " 1 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 2 ContextVar    level=1   begin=7   end=68  name=value1\n"
       " 3 StackVar      scope=2   begin=12  end=68  name=b\n",
       CaptureVarsAtLine(lib, "a", 7));
@@ -432,21 +443,25 @@
       "::.doIt_<anonymous closure>\n"
       " 0 ContextLevel  level=1   scope=1   begin=41  end=62\n"
       " 1 ContextVar    level=1   begin=42  end=62  name=y\n"
-      " 2 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 2 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "(dynamic, dynamic) => dynamic.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       "X.onX\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // No context is saved here since no vars are captured.
       "::.doIt\n"
-      " 0 StackVar      scope=2   begin=29  end=77  name=x\n",
+      " 0 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
+      " 1 StackVar      scope=2   begin=29  end=77  name=x\n",
       CaptureVarsAtLine(lib, "doIt", 12));
 }
 
@@ -473,18 +488,20 @@
       // inner function captures variable value.  That's fine.
       "::.outer_inner\n"
       " 0 ContextVar    level=0   begin=32  end=42  name=value\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Closure call saves current context.
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // The outer function saves the entry context, even though the
       // captured variable is in a loop.  Good.
       "::.outer\n"
-      " 0 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 0 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 1 StackVar      scope=3   begin=9   end=50  name=i\n"
       " 2 ContextLevel  level=1   scope=4   begin=20  end=50\n"
       " 3 ContextVar    level=1   begin=23  end=50  name=value\n"
@@ -514,28 +531,32 @@
   EXPECT_STREQ(
       "::.a_b_c\n"
       " 0 ContextVar    level=0   begin=48  end=60  name=x\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       "(dynamic) => int.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       // Doesn't save the entry context.  Chains to parent instead.
       "::.a_b\n"
       " 0 ContextVar    level=0   begin=12  end=68  name=x\n"
-      " 1 StackVar      scope=2   begin=46  end=68  name=c\n"
-      " 2 ContextLevel  level=1   scope=3   begin=18  end=46\n"
-      " 3 ContextVar    level=1   begin=19  end=46  name=i\n"
-      " 4 StackVar      scope=4   begin=32  end=46  name=d\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
+      " 2 StackVar      scope=2   begin=46  end=68  name=c\n"
+      " 3 ContextLevel  level=1   scope=3   begin=18  end=46\n"
+      " 4 ContextVar    level=1   begin=19  end=46  name=i\n"
+      " 5 StackVar      scope=4   begin=32  end=46  name=d\n"
 
       "(dynamic) => dynamic.call\n"
       " 0 StackVar      scope=1   begin=0   end=0   name=this\n"
-      " 1 SavedCurrentCtx scope=0   begin=0   end=0"
-      "   name=:saved_current_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
 
       "::.a\n"
       " 0 ContextLevel  level=1   scope=1   begin=1   end=76\n"
-      " 1 SavedEntryCtx scope=0   begin=0   end=0"
-      "   name=:saved_entry_context_var\n"
+      " 1 CurrentCtx    scope=0   begin=0   end=0"
+      "   name=:current_context_var\n"
       " 2 ContextVar    level=1   begin=6   end=76  name=x\n"
       " 3 StackVar      scope=2   begin=11  end=76  name=b\n",
       CaptureVarsAtLine(lib, "a", 10));
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index c59095d2..8e221e9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1059,7 +1059,6 @@
     kStackVar = 1,
     kContextVar,
     kContextLevel,
-    kSavedEntryContext,
     kSavedCurrentContext
   };
 
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
new file mode 100644
index 0000000..534e0c5
--- /dev/null
+++ b/runtime/vm/regexp.cc
@@ -0,0 +1,5438 @@
+// Copyright (c) 2014, 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.
+
+#include "vm/regexp.h"
+
+// SNIP
+
+namespace dart {
+
+// SNIP
+
+// -------------------------------------------------------------------
+// Implementation of the Irregexp regular expression engine.
+//
+// The Irregexp regular expression engine is intended to be a complete
+// implementation of ECMAScript regular expressions.  It generates either
+// bytecodes or native code.
+
+//   The Irregexp regexp engine is structured in three steps.
+//   1) The parser generates an abstract syntax tree.  See ast.cc.
+//   2) From the AST a node network is created.  The nodes are all
+//      subclasses of RegExpNode.  The nodes represent states when
+//      executing a regular expression.  Several optimizations are
+//      performed on the node network.
+//   3) From the nodes we generate either byte codes or native code
+//      that can actually execute the regular expression (perform
+//      the search).  The code generation step is described in more
+//      detail below.
+
+// Code generation.
+//
+//   The nodes are divided into four main categories.
+//   * Choice nodes
+//        These represent places where the regular expression can
+//        match in more than one way.  For example on entry to an
+//        alternation (foo|bar) or a repetition (*, +, ? or {}).
+//   * Action nodes
+//        These represent places where some action should be
+//        performed.  Examples include recording the current position
+//        in the input string to a register (in order to implement
+//        captures) or other actions on register for example in order
+//        to implement the counters needed for {} repetitions.
+//   * Matching nodes
+//        These attempt to match some element part of the input string.
+//        Examples of elements include character classes, plain strings
+//        or back references.
+//   * End nodes
+//        These are used to implement the actions required on finding
+//        a successful match or failing to find a match.
+//
+//   The code generated (whether as byte codes or native code) maintains
+//   some state as it runs.  This consists of the following elements:
+//
+//   * The capture registers.  Used for string captures.
+//   * Other registers.  Used for counters etc.
+//   * The current position.
+//   * The stack of backtracking information.  Used when a matching node
+//     fails to find a match and needs to try an alternative.
+//
+// Conceptual regular expression execution model:
+//
+//   There is a simple conceptual model of regular expression execution
+//   which will be presented first.  The actual code generated is a more
+//   efficient simulation of the simple conceptual model:
+//
+//   * Choice nodes are implemented as follows:
+//     For each choice except the last {
+//       push current position
+//       push backtrack code location
+//       <generate code to test for choice>
+//       backtrack code location:
+//       pop current position
+//     }
+//     <generate code to test for last choice>
+//
+//   * Actions nodes are generated as follows
+//     <push affected registers on backtrack stack>
+//     <generate code to perform action>
+//     push backtrack code location
+//     <generate code to test for following nodes>
+//     backtrack code location:
+//     <pop affected registers to restore their state>
+//     <pop backtrack location from stack and go to it>
+//
+//   * Matching nodes are generated as follows:
+//     if input string matches at current position
+//       update current position
+//       <generate code to test for following nodes>
+//     else
+//       <pop backtrack location from stack and go to it>
+//
+//   Thus it can be seen that the current position is saved and restored
+//   by the choice nodes, whereas the registers are saved and restored by
+//   by the action nodes that manipulate them.
+//
+//   The other interesting aspect of this model is that nodes are generated
+//   at the point where they are needed by a recursive call to Emit().  If
+//   the node has already been code generated then the Emit() call will
+//   generate a jump to the previously generated code instead.  In order to
+//   limit recursion it is possible for the Emit() function to put the node
+//   on a work list for later generation and instead generate a jump.  The
+//   destination of the jump is resolved later when the code is generated.
+//
+// Actual regular expression code generation.
+//
+//   Code generation is actually more complicated than the above.  In order
+//   to improve the efficiency of the generated code some optimizations are
+//   performed
+//
+//   * Choice nodes have 1-character lookahead.
+//     A choice node looks at the following character and eliminates some of
+//     the choices immediately based on that character.  This is not yet
+//     implemented.
+//   * Simple greedy loops store reduced backtracking information.
+//     A quantifier like /.*foo/m will greedily match the whole input.  It will
+//     then need to backtrack to a point where it can match "foo".  The naive
+//     implementation of this would push each character position onto the
+//     backtracking stack, then pop them off one by one.  This would use space
+//     proportional to the length of the input string.  However since the "."
+//     can only match in one way and always has a constant length (in this case
+//     of 1) it suffices to store the current position on the top of the stack
+//     once.  Matching now becomes merely incrementing the current position and
+//     backtracking becomes decrementing the current position and checking the
+//     result against the stored current position.  This is faster and saves
+//     space.
+//   * The current state is virtualized.
+//     This is used to defer expensive operations until it is clear that they
+//     are needed and to generate code for a node more than once, allowing
+//     specialized an efficient versions of the code to be created. This is
+//     explained in the section below.
+//
+// Execution state virtualization.
+//
+//   Instead of emitting code, nodes that manipulate the state can record their
+//   manipulation in an object called the Trace.  The Trace object can record a
+//   current position offset, an optional backtrack code location on the top of
+//   the virtualized backtrack stack and some register changes.  When a node is
+//   to be emitted it can flush the Trace or update it.  Flushing the Trace
+//   will emit code to bring the actual state into line with the virtual state.
+//   Avoiding flushing the state can postpone some work (e.g. updates of capture
+//   registers).  Postponing work can save time when executing the regular
+//   expression since it may be found that the work never has to be done as a
+//   failure to match can occur.  In addition it is much faster to jump to a
+//   known backtrack code location than it is to pop an unknown backtrack
+//   location from the stack and jump there.
+//
+//   The virtual state found in the Trace affects code generation.  For example
+//   the virtual state contains the difference between the actual current
+//   position and the virtual current position, and matching code needs to use
+//   this offset to attempt a match in the correct location of the input
+//   string.  Therefore code generated for a non-trivial trace is specialized
+//   to that trace.  The code generator therefore has the ability to generate
+//   code for each node several times.  In order to limit the size of the
+//   generated code there is an arbitrary limit on how many specialized sets of
+//   code may be generated for a given node.  If the limit is reached, the
+//   trace is flushed and a generic version of the code for a node is emitted.
+//   This is subsequently used for that node.  The code emitted for non-generic
+//   trace is not recorded in the node and so it cannot currently be reused in
+//   the event that code generation is requested for an identical trace.
+
+
+void RegExpTree::AppendToText(RegExpText* text, Zone* zone) {
+  UNREACHABLE();
+}
+
+
+void RegExpAtom::AppendToText(RegExpText* text, Zone* zone) {
+  text->AddElement(TextElement::Atom(this), zone);
+}
+
+
+void RegExpCharacterClass::AppendToText(RegExpText* text, Zone* zone) {
+  text->AddElement(TextElement::CharClass(this), zone);
+}
+
+
+void RegExpText::AppendToText(RegExpText* text, Zone* zone) {
+  for (int i = 0; i < elements()->length(); i++)
+    text->AddElement(elements()->at(i), zone);
+}
+
+
+TextElement TextElement::Atom(RegExpAtom* atom) {
+  return TextElement(ATOM, atom);
+}
+
+
+TextElement TextElement::CharClass(RegExpCharacterClass* char_class) {
+  return TextElement(CHAR_CLASS, char_class);
+}
+
+
+int TextElement::length() const {
+  switch (text_type()) {
+    case ATOM:
+      return atom()->length();
+
+    case CHAR_CLASS:
+      return 1;
+  }
+  UNREACHABLE();
+  return 0;
+}
+
+
+DispatchTable* ChoiceNode::GetTable(bool ignore_case) {
+  if (table_ == NULL) {
+    table_ = new(zone()) DispatchTable(zone());
+    DispatchTableConstructor cons(table_, ignore_case, zone());
+    cons.BuildTable(this);
+  }
+  return table_;
+}
+
+
+class FrequencyCollator {
+ public:
+  FrequencyCollator() : total_samples_(0) {
+    for (int i = 0; i < RegExpMacroAssembler::kTableSize; i++) {
+      frequencies_[i] = CharacterFrequency(i);
+    }
+  }
+
+  void CountCharacter(int character) {
+    int index = (character & RegExpMacroAssembler::kTableMask);
+    frequencies_[index].Increment();
+    total_samples_++;
+  }
+
+  // Does not measure in percent, but rather per-128 (the table size from the
+  // regexp macro assembler).
+  int Frequency(int in_character) {
+    DCHECK((in_character & RegExpMacroAssembler::kTableMask) == in_character);
+    if (total_samples_ < 1) return 1;  // Division by zero.
+    int freq_in_per128 =
+        (frequencies_[in_character].counter() * 128) / total_samples_;
+    return freq_in_per128;
+  }
+
+ private:
+  class CharacterFrequency {
+   public:
+    CharacterFrequency() : counter_(0), character_(-1) { }
+    explicit CharacterFrequency(int character)
+        : counter_(0), character_(character) { }
+
+    void Increment() { counter_++; }
+    int counter() { return counter_; }
+    int character() { return character_; }
+
+   private:
+    int counter_;
+    int character_;
+  };
+
+
+ private:
+  CharacterFrequency frequencies_[RegExpMacroAssembler::kTableSize];
+  int total_samples_;
+};
+
+
+class RegExpCompiler {
+ public:
+  RegExpCompiler(int capture_count, bool ignore_case, bool is_one_byte,
+                 Zone* zone);
+
+  int AllocateRegister() {
+    if (next_register_ >= RegExpMacroAssembler::kMaxRegister) {
+      reg_exp_too_big_ = true;
+      return next_register_;
+    }
+    return next_register_++;
+  }
+
+  RegExpEngine::CompilationResult Assemble(RegExpMacroAssembler* assembler,
+                                           RegExpNode* start,
+                                           int capture_count,
+                                           Handle<String> pattern);
+
+  inline void AddWork(RegExpNode* node) { work_list_->Add(node); }
+
+  static const int kImplementationOffset = 0;
+  static const int kNumberOfRegistersOffset = 0;
+  static const int kCodeOffset = 1;
+
+  RegExpMacroAssembler* macro_assembler() { return macro_assembler_; }
+  EndNode* accept() { return accept_; }
+
+  static const int kMaxRecursion = 100;
+  inline int recursion_depth() { return recursion_depth_; }
+  inline void IncrementRecursionDepth() { recursion_depth_++; }
+  inline void DecrementRecursionDepth() { recursion_depth_--; }
+
+  void SetRegExpTooBig() { reg_exp_too_big_ = true; }
+
+  inline bool ignore_case() { return ignore_case_; }
+  inline bool one_byte() { return one_byte_; }
+  FrequencyCollator* frequency_collator() { return &frequency_collator_; }
+
+  int current_expansion_factor() { return current_expansion_factor_; }
+  void set_current_expansion_factor(int value) {
+    current_expansion_factor_ = value;
+  }
+
+  Zone* zone() const { return zone_; }
+
+  static const int kNoRegister = -1;
+
+ private:
+  EndNode* accept_;
+  int next_register_;
+  List<RegExpNode*>* work_list_;
+  int recursion_depth_;
+  RegExpMacroAssembler* macro_assembler_;
+  bool ignore_case_;
+  bool one_byte_;
+  bool reg_exp_too_big_;
+  int current_expansion_factor_;
+  FrequencyCollator frequency_collator_;
+  Zone* zone_;
+};
+
+
+class RecursionCheck {
+ public:
+  explicit RecursionCheck(RegExpCompiler* compiler) : compiler_(compiler) {
+    compiler->IncrementRecursionDepth();
+  }
+  ~RecursionCheck() { compiler_->DecrementRecursionDepth(); }
+ private:
+  RegExpCompiler* compiler_;
+};
+
+
+static RegExpEngine::CompilationResult IrregexpRegExpTooBig(Isolate* isolate) {
+  return RegExpEngine::CompilationResult(isolate, "RegExp too big");
+}
+
+
+// Attempts to compile the regexp using an Irregexp code generator.  Returns
+// a fixed array or a null handle depending on whether it succeeded.
+RegExpCompiler::RegExpCompiler(int capture_count, bool ignore_case,
+                               bool one_byte, Zone* zone)
+    : next_register_(2 * (capture_count + 1)),
+      work_list_(NULL),
+      recursion_depth_(0),
+      ignore_case_(ignore_case),
+      one_byte_(one_byte),
+      reg_exp_too_big_(false),
+      current_expansion_factor_(1),
+      frequency_collator_(),
+      zone_(zone) {
+  accept_ = new(zone) EndNode(EndNode::ACCEPT, zone);
+  DCHECK(next_register_ - 1 <= RegExpMacroAssembler::kMaxRegister);
+}
+
+
+RegExpEngine::CompilationResult RegExpCompiler::Assemble(
+    RegExpMacroAssembler* macro_assembler,
+    RegExpNode* start,
+    int capture_count,
+    Handle<String> pattern) {
+  Heap* heap = pattern->GetHeap();
+
+  bool use_slow_safe_regexp_compiler = false;
+  if (heap->total_regexp_code_generated() >
+          RegExpImpl::kRegWxpCompiledLimit &&
+      heap->isolate()->memory_allocator()->SizeExecutable() >
+          RegExpImpl::kRegExpExecutableMemoryLimit) {
+    use_slow_safe_regexp_compiler = true;
+  }
+
+  macro_assembler->set_slow_safe(use_slow_safe_regexp_compiler);
+
+#ifdef DEBUG
+  if (FLAG_trace_regexp_assembler)
+    macro_assembler_ = new RegExpMacroAssemblerTracer(macro_assembler);
+  else
+#endif
+    macro_assembler_ = macro_assembler;
+
+  List <RegExpNode*> work_list(0);
+  work_list_ = &work_list;
+  Label fail;
+  macro_assembler_->PushBacktrack(&fail);
+  Trace new_trace;
+  start->Emit(this, &new_trace);
+  macro_assembler_->Bind(&fail);
+  macro_assembler_->Fail();
+  while (!work_list.is_empty()) {
+    work_list.RemoveLast()->Emit(this, &new_trace);
+  }
+  if (reg_exp_too_big_) return IrregexpRegExpTooBig(zone_->isolate());
+
+  Handle<HeapObject> code = macro_assembler_->GetCode(pattern);
+  heap->IncreaseTotalRegexpCodeGenerated(code->Size());
+  work_list_ = NULL;
+#ifdef DEBUG
+  if (FLAG_print_code) {
+    CodeTracer::Scope trace_scope(heap->isolate()->GetCodeTracer());
+    OFStream os(trace_scope.file());
+    Handle<Code>::cast(code)->Disassemble(pattern->ToCString().get(), os);
+  }
+  if (FLAG_trace_regexp_assembler) {
+    delete macro_assembler_;
+  }
+#endif
+  return RegExpEngine::CompilationResult(*code, next_register_);
+}
+
+
+bool Trace::DeferredAction::Mentions(int that) {
+  if (action_type() == ActionNode::CLEAR_CAPTURES) {
+    Interval range = static_cast<DeferredClearCaptures*>(this)->range();
+    return range.Contains(that);
+  } else {
+    return reg() == that;
+  }
+}
+
+
+bool Trace::mentions_reg(int reg) {
+  for (DeferredAction* action = actions_;
+       action != NULL;
+       action = action->next()) {
+    if (action->Mentions(reg))
+      return true;
+  }
+  return false;
+}
+
+
+bool Trace::GetStoredPosition(int reg, int* cp_offset) {
+  DCHECK_EQ(0, *cp_offset);
+  for (DeferredAction* action = actions_;
+       action != NULL;
+       action = action->next()) {
+    if (action->Mentions(reg)) {
+      if (action->action_type() == ActionNode::STORE_POSITION) {
+        *cp_offset = static_cast<DeferredCapture*>(action)->cp_offset();
+        return true;
+      } else {
+        return false;
+      }
+    }
+  }
+  return false;
+}
+
+
+int Trace::FindAffectedRegisters(OutSet* affected_registers,
+                                 Zone* zone) {
+  int max_register = RegExpCompiler::kNoRegister;
+  for (DeferredAction* action = actions_;
+       action != NULL;
+       action = action->next()) {
+    if (action->action_type() == ActionNode::CLEAR_CAPTURES) {
+      Interval range = static_cast<DeferredClearCaptures*>(action)->range();
+      for (int i = range.from(); i <= range.to(); i++)
+        affected_registers->Set(i, zone);
+      if (range.to() > max_register) max_register = range.to();
+    } else {
+      affected_registers->Set(action->reg(), zone);
+      if (action->reg() > max_register) max_register = action->reg();
+    }
+  }
+  return max_register;
+}
+
+
+void Trace::RestoreAffectedRegisters(RegExpMacroAssembler* assembler,
+                                     int max_register,
+                                     const OutSet& registers_to_pop,
+                                     const OutSet& registers_to_clear) {
+  for (int reg = max_register; reg >= 0; reg--) {
+    if (registers_to_pop.Get(reg)) {
+      assembler->PopRegister(reg);
+    } else if (registers_to_clear.Get(reg)) {
+      int clear_to = reg;
+      while (reg > 0 && registers_to_clear.Get(reg - 1)) {
+        reg--;
+      }
+      assembler->ClearRegisters(reg, clear_to);
+    }
+  }
+}
+
+
+void Trace::PerformDeferredActions(RegExpMacroAssembler* assembler,
+                                   int max_register,
+                                   const OutSet& affected_registers,
+                                   OutSet* registers_to_pop,
+                                   OutSet* registers_to_clear,
+                                   Zone* zone) {
+  // The "+1" is to avoid a push_limit of zero if stack_limit_slack() is 1.
+  const int push_limit = (assembler->stack_limit_slack() + 1) / 2;
+
+  // Count pushes performed to force a stack limit check occasionally.
+  int pushes = 0;
+
+  for (int reg = 0; reg <= max_register; reg++) {
+    if (!affected_registers.Get(reg)) {
+      continue;
+    }
+
+    // The chronologically first deferred action in the trace
+    // is used to infer the action needed to restore a register
+    // to its previous state (or not, if it's safe to ignore it).
+    enum DeferredActionUndoType { IGNORE, RESTORE, CLEAR };
+    DeferredActionUndoType undo_action = IGNORE;
+
+    int value = 0;
+    bool absolute = false;
+    bool clear = false;
+    int store_position = -1;
+    // This is a little tricky because we are scanning the actions in reverse
+    // historical order (newest first).
+    for (DeferredAction* action = actions_;
+         action != NULL;
+         action = action->next()) {
+      if (action->Mentions(reg)) {
+        switch (action->action_type()) {
+          case ActionNode::SET_REGISTER: {
+            Trace::DeferredSetRegister* psr =
+                static_cast<Trace::DeferredSetRegister*>(action);
+            if (!absolute) {
+              value += psr->value();
+              absolute = true;
+            }
+            // SET_REGISTER is currently only used for newly introduced loop
+            // counters. They can have a significant previous value if they
+            // occour in a loop. TODO(lrn): Propagate this information, so
+            // we can set undo_action to IGNORE if we know there is no value to
+            // restore.
+            undo_action = RESTORE;
+            DCHECK_EQ(store_position, -1);
+            DCHECK(!clear);
+            break;
+          }
+          case ActionNode::INCREMENT_REGISTER:
+            if (!absolute) {
+              value++;
+            }
+            DCHECK_EQ(store_position, -1);
+            DCHECK(!clear);
+            undo_action = RESTORE;
+            break;
+          case ActionNode::STORE_POSITION: {
+            Trace::DeferredCapture* pc =
+                static_cast<Trace::DeferredCapture*>(action);
+            if (!clear && store_position == -1) {
+              store_position = pc->cp_offset();
+            }
+
+            // For captures we know that stores and clears alternate.
+            // Other register, are never cleared, and if the occur
+            // inside a loop, they might be assigned more than once.
+            if (reg <= 1) {
+              // Registers zero and one, aka "capture zero", is
+              // always set correctly if we succeed. There is no
+              // need to undo a setting on backtrack, because we
+              // will set it again or fail.
+              undo_action = IGNORE;
+            } else {
+              undo_action = pc->is_capture() ? CLEAR : RESTORE;
+            }
+            DCHECK(!absolute);
+            DCHECK_EQ(value, 0);
+            break;
+          }
+          case ActionNode::CLEAR_CAPTURES: {
+            // Since we're scanning in reverse order, if we've already
+            // set the position we have to ignore historically earlier
+            // clearing operations.
+            if (store_position == -1) {
+              clear = true;
+            }
+            undo_action = RESTORE;
+            DCHECK(!absolute);
+            DCHECK_EQ(value, 0);
+            break;
+          }
+          default:
+            UNREACHABLE();
+            break;
+        }
+      }
+    }
+    // Prepare for the undo-action (e.g., push if it's going to be popped).
+    if (undo_action == RESTORE) {
+      pushes++;
+      RegExpMacroAssembler::StackCheckFlag stack_check =
+          RegExpMacroAssembler::kNoStackLimitCheck;
+      if (pushes == push_limit) {
+        stack_check = RegExpMacroAssembler::kCheckStackLimit;
+        pushes = 0;
+      }
+
+      assembler->PushRegister(reg, stack_check);
+      registers_to_pop->Set(reg, zone);
+    } else if (undo_action == CLEAR) {
+      registers_to_clear->Set(reg, zone);
+    }
+    // Perform the chronologically last action (or accumulated increment)
+    // for the register.
+    if (store_position != -1) {
+      assembler->WriteCurrentPositionToRegister(reg, store_position);
+    } else if (clear) {
+      assembler->ClearRegisters(reg, reg);
+    } else if (absolute) {
+      assembler->SetRegister(reg, value);
+    } else if (value != 0) {
+      assembler->AdvanceRegister(reg, value);
+    }
+  }
+}
+
+
+// This is called as we come into a loop choice node and some other tricky
+// nodes.  It normalizes the state of the code generator to ensure we can
+// generate generic code.
+void Trace::Flush(RegExpCompiler* compiler, RegExpNode* successor) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+
+  DCHECK(!is_trivial());
+
+  if (actions_ == NULL && backtrack() == NULL) {
+    // Here we just have some deferred cp advances to fix and we are back to
+    // a normal situation.  We may also have to forget some information gained
+    // through a quick check that was already performed.
+    if (cp_offset_ != 0) assembler->AdvanceCurrentPosition(cp_offset_);
+    // Create a new trivial state and generate the node with that.
+    Trace new_state;
+    successor->Emit(compiler, &new_state);
+    return;
+  }
+
+  // Generate deferred actions here along with code to undo them again.
+  OutSet affected_registers;
+
+  if (backtrack() != NULL) {
+    // Here we have a concrete backtrack location.  These are set up by choice
+    // nodes and so they indicate that we have a deferred save of the current
+    // position which we may need to emit here.
+    assembler->PushCurrentPosition();
+  }
+
+  int max_register = FindAffectedRegisters(&affected_registers,
+                                           compiler->zone());
+  OutSet registers_to_pop;
+  OutSet registers_to_clear;
+  PerformDeferredActions(assembler,
+                         max_register,
+                         affected_registers,
+                         &registers_to_pop,
+                         &registers_to_clear,
+                         compiler->zone());
+  if (cp_offset_ != 0) {
+    assembler->AdvanceCurrentPosition(cp_offset_);
+  }
+
+  // Create a new trivial state and generate the node with that.
+  Label undo;
+  assembler->PushBacktrack(&undo);
+  Trace new_state;
+  successor->Emit(compiler, &new_state);
+
+  // On backtrack we need to restore state.
+  assembler->Bind(&undo);
+  RestoreAffectedRegisters(assembler,
+                           max_register,
+                           registers_to_pop,
+                           registers_to_clear);
+  if (backtrack() == NULL) {
+    assembler->Backtrack();
+  } else {
+    assembler->PopCurrentPosition();
+    assembler->GoTo(backtrack());
+  }
+}
+
+
+void NegativeSubmatchSuccess::Emit(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+
+  // Omit flushing the trace. We discard the entire stack frame anyway.
+
+  if (!label()->is_bound()) {
+    // We are completely independent of the trace, since we ignore it,
+    // so this code can be used as the generic version.
+    assembler->Bind(label());
+  }
+
+  // Throw away everything on the backtrack stack since the start
+  // of the negative submatch and restore the character position.
+  assembler->ReadCurrentPositionFromRegister(current_position_register_);
+  assembler->ReadStackPointerFromRegister(stack_pointer_register_);
+  if (clear_capture_count_ > 0) {
+    // Clear any captures that might have been performed during the success
+    // of the body of the negative look-ahead.
+    int clear_capture_end = clear_capture_start_ + clear_capture_count_ - 1;
+    assembler->ClearRegisters(clear_capture_start_, clear_capture_end);
+  }
+  // Now that we have unwound the stack we find at the top of the stack the
+  // backtrack that the BeginSubmatch node got.
+  assembler->Backtrack();
+}
+
+
+void EndNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  if (!trace->is_trivial()) {
+    trace->Flush(compiler, this);
+    return;
+  }
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  if (!label()->is_bound()) {
+    assembler->Bind(label());
+  }
+  switch (action_) {
+    case ACCEPT:
+      assembler->Succeed();
+      return;
+    case BACKTRACK:
+      assembler->GoTo(trace->backtrack());
+      return;
+    case NEGATIVE_SUBMATCH_SUCCESS:
+      // This case is handled in a different virtual method.
+      UNREACHABLE();
+  }
+  UNIMPLEMENTED();
+}
+
+
+void GuardedAlternative::AddGuard(Guard* guard, Zone* zone) {
+  if (guards_ == NULL)
+    guards_ = new(zone) ZoneList<Guard*>(1, zone);
+  guards_->Add(guard, zone);
+}
+
+
+ActionNode* ActionNode::SetRegister(int reg,
+                                    int val,
+                                    RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(SET_REGISTER, on_success);
+  result->data_.u_store_register.reg = reg;
+  result->data_.u_store_register.value = val;
+  return result;
+}
+
+
+ActionNode* ActionNode::IncrementRegister(int reg, RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(INCREMENT_REGISTER, on_success);
+  result->data_.u_increment_register.reg = reg;
+  return result;
+}
+
+
+ActionNode* ActionNode::StorePosition(int reg,
+                                      bool is_capture,
+                                      RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(STORE_POSITION, on_success);
+  result->data_.u_position_register.reg = reg;
+  result->data_.u_position_register.is_capture = is_capture;
+  return result;
+}
+
+
+ActionNode* ActionNode::ClearCaptures(Interval range,
+                                      RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(CLEAR_CAPTURES, on_success);
+  result->data_.u_clear_captures.range_from = range.from();
+  result->data_.u_clear_captures.range_to = range.to();
+  return result;
+}
+
+
+ActionNode* ActionNode::BeginSubmatch(int stack_reg,
+                                      int position_reg,
+                                      RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(BEGIN_SUBMATCH, on_success);
+  result->data_.u_submatch.stack_pointer_register = stack_reg;
+  result->data_.u_submatch.current_position_register = position_reg;
+  return result;
+}
+
+
+ActionNode* ActionNode::PositiveSubmatchSuccess(int stack_reg,
+                                                int position_reg,
+                                                int clear_register_count,
+                                                int clear_register_from,
+                                                RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(POSITIVE_SUBMATCH_SUCCESS, on_success);
+  result->data_.u_submatch.stack_pointer_register = stack_reg;
+  result->data_.u_submatch.current_position_register = position_reg;
+  result->data_.u_submatch.clear_register_count = clear_register_count;
+  result->data_.u_submatch.clear_register_from = clear_register_from;
+  return result;
+}
+
+
+ActionNode* ActionNode::EmptyMatchCheck(int start_register,
+                                        int repetition_register,
+                                        int repetition_limit,
+                                        RegExpNode* on_success) {
+  ActionNode* result =
+      new(on_success->zone()) ActionNode(EMPTY_MATCH_CHECK, on_success);
+  result->data_.u_empty_match_check.start_register = start_register;
+  result->data_.u_empty_match_check.repetition_register = repetition_register;
+  result->data_.u_empty_match_check.repetition_limit = repetition_limit;
+  return result;
+}
+
+
+#define DEFINE_ACCEPT(Type)                                          \
+  void Type##Node::Accept(NodeVisitor* visitor) {                    \
+    visitor->Visit##Type(this);                                      \
+  }
+FOR_EACH_NODE_TYPE(DEFINE_ACCEPT)
+#undef DEFINE_ACCEPT
+
+
+void LoopChoiceNode::Accept(NodeVisitor* visitor) {
+  visitor->VisitLoopChoice(this);
+}
+
+
+// -------------------------------------------------------------------
+// Emit code.
+
+
+void ChoiceNode::GenerateGuard(RegExpMacroAssembler* macro_assembler,
+                               Guard* guard,
+                               Trace* trace) {
+  switch (guard->op()) {
+    case Guard::LT:
+      DCHECK(!trace->mentions_reg(guard->reg()));
+      macro_assembler->IfRegisterGE(guard->reg(),
+                                    guard->value(),
+                                    trace->backtrack());
+      break;
+    case Guard::GEQ:
+      DCHECK(!trace->mentions_reg(guard->reg()));
+      macro_assembler->IfRegisterLT(guard->reg(),
+                                    guard->value(),
+                                    trace->backtrack());
+      break;
+  }
+}
+
+
+// Returns the number of characters in the equivalence class, omitting those
+// that cannot occur in the source string because it is ASCII.
+static int GetCaseIndependentLetters(Isolate* isolate, uc16 character,
+                                     bool one_byte_subject,
+                                     unibrow::uchar* letters) {
+  int length =
+      isolate->jsregexp_uncanonicalize()->get(character, '\0', letters);
+  // Unibrow returns 0 or 1 for characters where case independence is
+  // trivial.
+  if (length == 0) {
+    letters[0] = character;
+    length = 1;
+  }
+  if (!one_byte_subject || character <= String::kMaxOneByteCharCode) {
+    return length;
+  }
+
+  // The standard requires that non-ASCII characters cannot have ASCII
+  // character codes in their equivalence class.
+  // TODO(dcarney): issue 3550 this is not actually true for Latin1 anymore,
+  // is it?  For example, \u00C5 is equivalent to \u212B.
+  return 0;
+}
+
+
+static inline bool EmitSimpleCharacter(Isolate* isolate,
+                                       RegExpCompiler* compiler,
+                                       uc16 c,
+                                       Label* on_failure,
+                                       int cp_offset,
+                                       bool check,
+                                       bool preloaded) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  bool bound_checked = false;
+  if (!preloaded) {
+    assembler->LoadCurrentCharacter(
+        cp_offset,
+        on_failure,
+        check);
+    bound_checked = true;
+  }
+  assembler->CheckNotCharacter(c, on_failure);
+  return bound_checked;
+}
+
+
+// Only emits non-letters (things that don't have case).  Only used for case
+// independent matches.
+static inline bool EmitAtomNonLetter(Isolate* isolate,
+                                     RegExpCompiler* compiler,
+                                     uc16 c,
+                                     Label* on_failure,
+                                     int cp_offset,
+                                     bool check,
+                                     bool preloaded) {
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  bool one_byte = compiler->one_byte();
+  unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+  int length = GetCaseIndependentLetters(isolate, c, one_byte, chars);
+  if (length < 1) {
+    // This can't match.  Must be an one-byte subject and a non-one-byte
+    // character.  We do not need to do anything since the one-byte pass
+    // already handled this.
+    return false;  // Bounds not checked.
+  }
+  bool checked = false;
+  // We handle the length > 1 case in a later pass.
+  if (length == 1) {
+    if (one_byte && c > String::kMaxOneByteCharCodeU) {
+      // Can't match - see above.
+      return false;  // Bounds not checked.
+    }
+    if (!preloaded) {
+      macro_assembler->LoadCurrentCharacter(cp_offset, on_failure, check);
+      checked = check;
+    }
+    macro_assembler->CheckNotCharacter(c, on_failure);
+  }
+  return checked;
+}
+
+
+static bool ShortCutEmitCharacterPair(RegExpMacroAssembler* macro_assembler,
+                                      bool one_byte, uc16 c1, uc16 c2,
+                                      Label* on_failure) {
+  uc16 char_mask;
+  if (one_byte) {
+    char_mask = String::kMaxOneByteCharCode;
+  } else {
+    char_mask = String::kMaxUtf16CodeUnit;
+  }
+  uc16 exor = c1 ^ c2;
+  // Check whether exor has only one bit set.
+  if (((exor - 1) & exor) == 0) {
+    // If c1 and c2 differ only by one bit.
+    // Ecma262UnCanonicalize always gives the highest number last.
+    DCHECK(c2 > c1);
+    uc16 mask = char_mask ^ exor;
+    macro_assembler->CheckNotCharacterAfterAnd(c1, mask, on_failure);
+    return true;
+  }
+  DCHECK(c2 > c1);
+  uc16 diff = c2 - c1;
+  if (((diff - 1) & diff) == 0 && c1 >= diff) {
+    // If the characters differ by 2^n but don't differ by one bit then
+    // subtract the difference from the found character, then do the or
+    // trick.  We avoid the theoretical case where negative numbers are
+    // involved in order to simplify code generation.
+    uc16 mask = char_mask ^ diff;
+    macro_assembler->CheckNotCharacterAfterMinusAnd(c1 - diff,
+                                                    diff,
+                                                    mask,
+                                                    on_failure);
+    return true;
+  }
+  return false;
+}
+
+
+typedef bool EmitCharacterFunction(Isolate* isolate,
+                                   RegExpCompiler* compiler,
+                                   uc16 c,
+                                   Label* on_failure,
+                                   int cp_offset,
+                                   bool check,
+                                   bool preloaded);
+
+// Only emits letters (things that have case).  Only used for case independent
+// matches.
+static inline bool EmitAtomLetter(Isolate* isolate,
+                                  RegExpCompiler* compiler,
+                                  uc16 c,
+                                  Label* on_failure,
+                                  int cp_offset,
+                                  bool check,
+                                  bool preloaded) {
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  bool one_byte = compiler->one_byte();
+  unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+  int length = GetCaseIndependentLetters(isolate, c, one_byte, chars);
+  if (length <= 1) return false;
+  // We may not need to check against the end of the input string
+  // if this character lies before a character that matched.
+  if (!preloaded) {
+    macro_assembler->LoadCurrentCharacter(cp_offset, on_failure, check);
+  }
+  Label ok;
+  DCHECK(unibrow::Ecma262UnCanonicalize::kMaxWidth == 4);
+  switch (length) {
+    case 2: {
+      if (ShortCutEmitCharacterPair(macro_assembler, one_byte, chars[0],
+                                    chars[1], on_failure)) {
+      } else {
+        macro_assembler->CheckCharacter(chars[0], &ok);
+        macro_assembler->CheckNotCharacter(chars[1], on_failure);
+        macro_assembler->Bind(&ok);
+      }
+      break;
+    }
+    case 4:
+      macro_assembler->CheckCharacter(chars[3], &ok);
+      // Fall through!
+    case 3:
+      macro_assembler->CheckCharacter(chars[0], &ok);
+      macro_assembler->CheckCharacter(chars[1], &ok);
+      macro_assembler->CheckNotCharacter(chars[2], on_failure);
+      macro_assembler->Bind(&ok);
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return true;
+}
+
+
+static void EmitBoundaryTest(RegExpMacroAssembler* masm,
+                             int border,
+                             Label* fall_through,
+                             Label* above_or_equal,
+                             Label* below) {
+  if (below != fall_through) {
+    masm->CheckCharacterLT(border, below);
+    if (above_or_equal != fall_through) masm->GoTo(above_or_equal);
+  } else {
+    masm->CheckCharacterGT(border - 1, above_or_equal);
+  }
+}
+
+
+static void EmitDoubleBoundaryTest(RegExpMacroAssembler* masm,
+                                   int first,
+                                   int last,
+                                   Label* fall_through,
+                                   Label* in_range,
+                                   Label* out_of_range) {
+  if (in_range == fall_through) {
+    if (first == last) {
+      masm->CheckNotCharacter(first, out_of_range);
+    } else {
+      masm->CheckCharacterNotInRange(first, last, out_of_range);
+    }
+  } else {
+    if (first == last) {
+      masm->CheckCharacter(first, in_range);
+    } else {
+      masm->CheckCharacterInRange(first, last, in_range);
+    }
+    if (out_of_range != fall_through) masm->GoTo(out_of_range);
+  }
+}
+
+
+// even_label is for ranges[i] to ranges[i + 1] where i - start_index is even.
+// odd_label is for ranges[i] to ranges[i + 1] where i - start_index is odd.
+static void EmitUseLookupTable(
+    RegExpMacroAssembler* masm,
+    ZoneList<int>* ranges,
+    int start_index,
+    int end_index,
+    int min_char,
+    Label* fall_through,
+    Label* even_label,
+    Label* odd_label) {
+  static const int kSize = RegExpMacroAssembler::kTableSize;
+  static const int kMask = RegExpMacroAssembler::kTableMask;
+
+  int base = (min_char & ~kMask);
+  USE(base);
+
+  // Assert that everything is on one kTableSize page.
+  for (int i = start_index; i <= end_index; i++) {
+    DCHECK_EQ(ranges->at(i) & ~kMask, base);
+  }
+  DCHECK(start_index == 0 || (ranges->at(start_index - 1) & ~kMask) <= base);
+
+  char templ[kSize];
+  Label* on_bit_set;
+  Label* on_bit_clear;
+  int bit;
+  if (even_label == fall_through) {
+    on_bit_set = odd_label;
+    on_bit_clear = even_label;
+    bit = 1;
+  } else {
+    on_bit_set = even_label;
+    on_bit_clear = odd_label;
+    bit = 0;
+  }
+  for (int i = 0; i < (ranges->at(start_index) & kMask) && i < kSize; i++) {
+    templ[i] = bit;
+  }
+  int j = 0;
+  bit ^= 1;
+  for (int i = start_index; i < end_index; i++) {
+    for (j = (ranges->at(i) & kMask); j < (ranges->at(i + 1) & kMask); j++) {
+      templ[j] = bit;
+    }
+    bit ^= 1;
+  }
+  for (int i = j; i < kSize; i++) {
+    templ[i] = bit;
+  }
+  Factory* factory = masm->zone()->isolate()->factory();
+  // TODO(erikcorry): Cache these.
+  Handle<ByteArray> ba = factory->NewByteArray(kSize, TENURED);
+  for (int i = 0; i < kSize; i++) {
+    ba->set(i, templ[i]);
+  }
+  masm->CheckBitInTable(ba, on_bit_set);
+  if (on_bit_clear != fall_through) masm->GoTo(on_bit_clear);
+}
+
+
+static void CutOutRange(RegExpMacroAssembler* masm,
+                        ZoneList<int>* ranges,
+                        int start_index,
+                        int end_index,
+                        int cut_index,
+                        Label* even_label,
+                        Label* odd_label) {
+  bool odd = (((cut_index - start_index) & 1) == 1);
+  Label* in_range_label = odd ? odd_label : even_label;
+  Label dummy;
+  EmitDoubleBoundaryTest(masm,
+                         ranges->at(cut_index),
+                         ranges->at(cut_index + 1) - 1,
+                         &dummy,
+                         in_range_label,
+                         &dummy);
+  DCHECK(!dummy.is_linked());
+  // Cut out the single range by rewriting the array.  This creates a new
+  // range that is a merger of the two ranges on either side of the one we
+  // are cutting out.  The oddity of the labels is preserved.
+  for (int j = cut_index; j > start_index; j--) {
+    ranges->at(j) = ranges->at(j - 1);
+  }
+  for (int j = cut_index + 1; j < end_index; j++) {
+    ranges->at(j) = ranges->at(j + 1);
+  }
+}
+
+
+// Unicode case.  Split the search space into kSize spaces that are handled
+// with recursion.
+static void SplitSearchSpace(ZoneList<int>* ranges,
+                             int start_index,
+                             int end_index,
+                             int* new_start_index,
+                             int* new_end_index,
+                             int* border) {
+  static const int kSize = RegExpMacroAssembler::kTableSize;
+  static const int kMask = RegExpMacroAssembler::kTableMask;
+
+  int first = ranges->at(start_index);
+  int last = ranges->at(end_index) - 1;
+
+  *new_start_index = start_index;
+  *border = (ranges->at(start_index) & ~kMask) + kSize;
+  while (*new_start_index < end_index) {
+    if (ranges->at(*new_start_index) > *border) break;
+    (*new_start_index)++;
+  }
+  // new_start_index is the index of the first edge that is beyond the
+  // current kSize space.
+
+  // For very large search spaces we do a binary chop search of the non-Latin1
+  // space instead of just going to the end of the current kSize space.  The
+  // heuristics are complicated a little by the fact that any 128-character
+  // encoding space can be quickly tested with a table lookup, so we don't
+  // wish to do binary chop search at a smaller granularity than that.  A
+  // 128-character space can take up a lot of space in the ranges array if,
+  // for example, we only want to match every second character (eg. the lower
+  // case characters on some Unicode pages).
+  int binary_chop_index = (end_index + start_index) / 2;
+  // The first test ensures that we get to the code that handles the Latin1
+  // range with a single not-taken branch, speeding up this important
+  // character range (even non-Latin1 charset-based text has spaces and
+  // punctuation).
+  if (*border - 1 > String::kMaxOneByteCharCode &&  // Latin1 case.
+      end_index - start_index > (*new_start_index - start_index) * 2 &&
+      last - first > kSize * 2 && binary_chop_index > *new_start_index &&
+      ranges->at(binary_chop_index) >= first + 2 * kSize) {
+    int scan_forward_for_section_border = binary_chop_index;;
+    int new_border = (ranges->at(binary_chop_index) | kMask) + 1;
+
+    while (scan_forward_for_section_border < end_index) {
+      if (ranges->at(scan_forward_for_section_border) > new_border) {
+        *new_start_index = scan_forward_for_section_border;
+        *border = new_border;
+        break;
+      }
+      scan_forward_for_section_border++;
+    }
+  }
+
+  DCHECK(*new_start_index > start_index);
+  *new_end_index = *new_start_index - 1;
+  if (ranges->at(*new_end_index) == *border) {
+    (*new_end_index)--;
+  }
+  if (*border >= ranges->at(end_index)) {
+    *border = ranges->at(end_index);
+    *new_start_index = end_index;  // Won't be used.
+    *new_end_index = end_index - 1;
+  }
+}
+
+
+// Gets a series of segment boundaries representing a character class.  If the
+// character is in the range between an even and an odd boundary (counting from
+// start_index) then go to even_label, otherwise go to odd_label.  We already
+// know that the character is in the range of min_char to max_char inclusive.
+// Either label can be NULL indicating backtracking.  Either label can also be
+// equal to the fall_through label.
+static void GenerateBranches(RegExpMacroAssembler* masm,
+                             ZoneList<int>* ranges,
+                             int start_index,
+                             int end_index,
+                             uc16 min_char,
+                             uc16 max_char,
+                             Label* fall_through,
+                             Label* even_label,
+                             Label* odd_label) {
+  int first = ranges->at(start_index);
+  int last = ranges->at(end_index) - 1;
+
+  DCHECK_LT(min_char, first);
+
+  // Just need to test if the character is before or on-or-after
+  // a particular character.
+  if (start_index == end_index) {
+    EmitBoundaryTest(masm, first, fall_through, even_label, odd_label);
+    return;
+  }
+
+  // Another almost trivial case:  There is one interval in the middle that is
+  // different from the end intervals.
+  if (start_index + 1 == end_index) {
+    EmitDoubleBoundaryTest(
+        masm, first, last, fall_through, even_label, odd_label);
+    return;
+  }
+
+  // It's not worth using table lookup if there are very few intervals in the
+  // character class.
+  if (end_index - start_index <= 6) {
+    // It is faster to test for individual characters, so we look for those
+    // first, then try arbitrary ranges in the second round.
+    static int kNoCutIndex = -1;
+    int cut = kNoCutIndex;
+    for (int i = start_index; i < end_index; i++) {
+      if (ranges->at(i) == ranges->at(i + 1) - 1) {
+        cut = i;
+        break;
+      }
+    }
+    if (cut == kNoCutIndex) cut = start_index;
+    CutOutRange(
+        masm, ranges, start_index, end_index, cut, even_label, odd_label);
+    DCHECK_GE(end_index - start_index, 2);
+    GenerateBranches(masm,
+                     ranges,
+                     start_index + 1,
+                     end_index - 1,
+                     min_char,
+                     max_char,
+                     fall_through,
+                     even_label,
+                     odd_label);
+    return;
+  }
+
+  // If there are a lot of intervals in the regexp, then we will use tables to
+  // determine whether the character is inside or outside the character class.
+  static const int kBits = RegExpMacroAssembler::kTableSizeBits;
+
+  if ((max_char >> kBits) == (min_char >> kBits)) {
+    EmitUseLookupTable(masm,
+                       ranges,
+                       start_index,
+                       end_index,
+                       min_char,
+                       fall_through,
+                       even_label,
+                       odd_label);
+    return;
+  }
+
+  if ((min_char >> kBits) != (first >> kBits)) {
+    masm->CheckCharacterLT(first, odd_label);
+    GenerateBranches(masm,
+                     ranges,
+                     start_index + 1,
+                     end_index,
+                     first,
+                     max_char,
+                     fall_through,
+                     odd_label,
+                     even_label);
+    return;
+  }
+
+  int new_start_index = 0;
+  int new_end_index = 0;
+  int border = 0;
+
+  SplitSearchSpace(ranges,
+                   start_index,
+                   end_index,
+                   &new_start_index,
+                   &new_end_index,
+                   &border);
+
+  Label handle_rest;
+  Label* above = &handle_rest;
+  if (border == last + 1) {
+    // We didn't find any section that started after the limit, so everything
+    // above the border is one of the terminal labels.
+    above = (end_index & 1) != (start_index & 1) ? odd_label : even_label;
+    DCHECK(new_end_index == end_index - 1);
+  }
+
+  DCHECK_LE(start_index, new_end_index);
+  DCHECK_LE(new_start_index, end_index);
+  DCHECK_LT(start_index, new_start_index);
+  DCHECK_LT(new_end_index, end_index);
+  DCHECK(new_end_index + 1 == new_start_index ||
+         (new_end_index + 2 == new_start_index &&
+          border == ranges->at(new_end_index + 1)));
+  DCHECK_LT(min_char, border - 1);
+  DCHECK_LT(border, max_char);
+  DCHECK_LT(ranges->at(new_end_index), border);
+  DCHECK(border < ranges->at(new_start_index) ||
+         (border == ranges->at(new_start_index) &&
+          new_start_index == end_index &&
+          new_end_index == end_index - 1 &&
+          border == last + 1));
+  DCHECK(new_start_index == 0 || border >= ranges->at(new_start_index - 1));
+
+  masm->CheckCharacterGT(border - 1, above);
+  Label dummy;
+  GenerateBranches(masm,
+                   ranges,
+                   start_index,
+                   new_end_index,
+                   min_char,
+                   border - 1,
+                   &dummy,
+                   even_label,
+                   odd_label);
+  if (handle_rest.is_linked()) {
+    masm->Bind(&handle_rest);
+    bool flip = (new_start_index & 1) != (start_index & 1);
+    GenerateBranches(masm,
+                     ranges,
+                     new_start_index,
+                     end_index,
+                     border,
+                     max_char,
+                     &dummy,
+                     flip ? odd_label : even_label,
+                     flip ? even_label : odd_label);
+  }
+}
+
+
+static void EmitCharClass(RegExpMacroAssembler* macro_assembler,
+                          RegExpCharacterClass* cc, bool one_byte,
+                          Label* on_failure, int cp_offset, bool check_offset,
+                          bool preloaded, Zone* zone) {
+  ZoneList<CharacterRange>* ranges = cc->ranges(zone);
+  if (!CharacterRange::IsCanonical(ranges)) {
+    CharacterRange::Canonicalize(ranges);
+  }
+
+  int max_char;
+  if (one_byte) {
+    max_char = String::kMaxOneByteCharCode;
+  } else {
+    max_char = String::kMaxUtf16CodeUnit;
+  }
+
+  int range_count = ranges->length();
+
+  int last_valid_range = range_count - 1;
+  while (last_valid_range >= 0) {
+    CharacterRange& range = ranges->at(last_valid_range);
+    if (range.from() <= max_char) {
+      break;
+    }
+    last_valid_range--;
+  }
+
+  if (last_valid_range < 0) {
+    if (!cc->is_negated()) {
+      macro_assembler->GoTo(on_failure);
+    }
+    if (check_offset) {
+      macro_assembler->CheckPosition(cp_offset, on_failure);
+    }
+    return;
+  }
+
+  if (last_valid_range == 0 &&
+      ranges->at(0).IsEverything(max_char)) {
+    if (cc->is_negated()) {
+      macro_assembler->GoTo(on_failure);
+    } else {
+      // This is a common case hit by non-anchored expressions.
+      if (check_offset) {
+        macro_assembler->CheckPosition(cp_offset, on_failure);
+      }
+    }
+    return;
+  }
+  if (last_valid_range == 0 &&
+      !cc->is_negated() &&
+      ranges->at(0).IsEverything(max_char)) {
+    // This is a common case hit by non-anchored expressions.
+    if (check_offset) {
+      macro_assembler->CheckPosition(cp_offset, on_failure);
+    }
+    return;
+  }
+
+  if (!preloaded) {
+    macro_assembler->LoadCurrentCharacter(cp_offset, on_failure, check_offset);
+  }
+
+  if (cc->is_standard(zone) &&
+        macro_assembler->CheckSpecialCharacterClass(cc->standard_type(),
+                                                    on_failure)) {
+      return;
+  }
+
+
+  // A new list with ascending entries.  Each entry is a code unit
+  // where there is a boundary between code units that are part of
+  // the class and code units that are not.  Normally we insert an
+  // entry at zero which goes to the failure label, but if there
+  // was already one there we fall through for success on that entry.
+  // Subsequent entries have alternating meaning (success/failure).
+  ZoneList<int>* range_boundaries =
+      new(zone) ZoneList<int>(last_valid_range, zone);
+
+  bool zeroth_entry_is_failure = !cc->is_negated();
+
+  for (int i = 0; i <= last_valid_range; i++) {
+    CharacterRange& range = ranges->at(i);
+    if (range.from() == 0) {
+      DCHECK_EQ(i, 0);
+      zeroth_entry_is_failure = !zeroth_entry_is_failure;
+    } else {
+      range_boundaries->Add(range.from(), zone);
+    }
+    range_boundaries->Add(range.to() + 1, zone);
+  }
+  int end_index = range_boundaries->length() - 1;
+  if (range_boundaries->at(end_index) > max_char) {
+    end_index--;
+  }
+
+  Label fall_through;
+  GenerateBranches(macro_assembler,
+                   range_boundaries,
+                   0,  // start_index.
+                   end_index,
+                   0,  // min_char.
+                   max_char,
+                   &fall_through,
+                   zeroth_entry_is_failure ? &fall_through : on_failure,
+                   zeroth_entry_is_failure ? on_failure : &fall_through);
+  macro_assembler->Bind(&fall_through);
+}
+
+
+RegExpNode::~RegExpNode() {
+}
+
+
+RegExpNode::LimitResult RegExpNode::LimitVersions(RegExpCompiler* compiler,
+                                                  Trace* trace) {
+  // If we are generating a greedy loop then don't stop and don't reuse code.
+  if (trace->stop_node() != NULL) {
+    return CONTINUE;
+  }
+
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  if (trace->is_trivial()) {
+    if (label_.is_bound()) {
+      // We are being asked to generate a generic version, but that's already
+      // been done so just go to it.
+      macro_assembler->GoTo(&label_);
+      return DONE;
+    }
+    if (compiler->recursion_depth() >= RegExpCompiler::kMaxRecursion) {
+      // To avoid too deep recursion we push the node to the work queue and just
+      // generate a goto here.
+      compiler->AddWork(this);
+      macro_assembler->GoTo(&label_);
+      return DONE;
+    }
+    // Generate generic version of the node and bind the label for later use.
+    macro_assembler->Bind(&label_);
+    return CONTINUE;
+  }
+
+  // We are being asked to make a non-generic version.  Keep track of how many
+  // non-generic versions we generate so as not to overdo it.
+  trace_count_++;
+  if (FLAG_regexp_optimization &&
+      trace_count_ < kMaxCopiesCodeGenerated &&
+      compiler->recursion_depth() <= RegExpCompiler::kMaxRecursion) {
+    return CONTINUE;
+  }
+
+  // If we get here code has been generated for this node too many times or
+  // recursion is too deep.  Time to switch to a generic version.  The code for
+  // generic versions above can handle deep recursion properly.
+  trace->Flush(compiler, this);
+  return DONE;
+}
+
+
+int ActionNode::EatsAtLeast(int still_to_find,
+                            int budget,
+                            bool not_at_start) {
+  if (budget <= 0) return 0;
+  if (action_type_ == POSITIVE_SUBMATCH_SUCCESS) return 0;  // Rewinds input!
+  return on_success()->EatsAtLeast(still_to_find,
+                                   budget - 1,
+                                   not_at_start);
+}
+
+
+void ActionNode::FillInBMInfo(int offset,
+                              int budget,
+                              BoyerMooreLookahead* bm,
+                              bool not_at_start) {
+  if (action_type_ == BEGIN_SUBMATCH) {
+    bm->SetRest(offset);
+  } else if (action_type_ != POSITIVE_SUBMATCH_SUCCESS) {
+    on_success()->FillInBMInfo(offset, budget - 1, bm, not_at_start);
+  }
+  SaveBMInfo(bm, not_at_start, offset);
+}
+
+
+int AssertionNode::EatsAtLeast(int still_to_find,
+                               int budget,
+                               bool not_at_start) {
+  if (budget <= 0) return 0;
+  // If we know we are not at the start and we are asked "how many characters
+  // will you match if you succeed?" then we can answer anything since false
+  // implies false.  So lets just return the max answer (still_to_find) since
+  // that won't prevent us from preloading a lot of characters for the other
+  // branches in the node graph.
+  if (assertion_type() == AT_START && not_at_start) return still_to_find;
+  return on_success()->EatsAtLeast(still_to_find,
+                                   budget - 1,
+                                   not_at_start);
+}
+
+
+void AssertionNode::FillInBMInfo(int offset,
+                                 int budget,
+                                 BoyerMooreLookahead* bm,
+                                 bool not_at_start) {
+  // Match the behaviour of EatsAtLeast on this node.
+  if (assertion_type() == AT_START && not_at_start) return;
+  on_success()->FillInBMInfo(offset, budget - 1, bm, not_at_start);
+  SaveBMInfo(bm, not_at_start, offset);
+}
+
+
+int BackReferenceNode::EatsAtLeast(int still_to_find,
+                                   int budget,
+                                   bool not_at_start) {
+  if (budget <= 0) return 0;
+  return on_success()->EatsAtLeast(still_to_find,
+                                   budget - 1,
+                                   not_at_start);
+}
+
+
+int TextNode::EatsAtLeast(int still_to_find,
+                          int budget,
+                          bool not_at_start) {
+  int answer = Length();
+  if (answer >= still_to_find) return answer;
+  if (budget <= 0) return answer;
+  // We are not at start after this node so we set the last argument to 'true'.
+  return answer + on_success()->EatsAtLeast(still_to_find - answer,
+                                            budget - 1,
+                                            true);
+}
+
+
+int NegativeLookaheadChoiceNode::EatsAtLeast(int still_to_find,
+                                             int budget,
+                                             bool not_at_start) {
+  if (budget <= 0) return 0;
+  // Alternative 0 is the negative lookahead, alternative 1 is what comes
+  // afterwards.
+  RegExpNode* node = alternatives_->at(1).node();
+  return node->EatsAtLeast(still_to_find, budget - 1, not_at_start);
+}
+
+
+void NegativeLookaheadChoiceNode::GetQuickCheckDetails(
+    QuickCheckDetails* details,
+    RegExpCompiler* compiler,
+    int filled_in,
+    bool not_at_start) {
+  // Alternative 0 is the negative lookahead, alternative 1 is what comes
+  // afterwards.
+  RegExpNode* node = alternatives_->at(1).node();
+  return node->GetQuickCheckDetails(details, compiler, filled_in, not_at_start);
+}
+
+
+int ChoiceNode::EatsAtLeastHelper(int still_to_find,
+                                  int budget,
+                                  RegExpNode* ignore_this_node,
+                                  bool not_at_start) {
+  if (budget <= 0) return 0;
+  int min = 100;
+  int choice_count = alternatives_->length();
+  budget = (budget - 1) / choice_count;
+  for (int i = 0; i < choice_count; i++) {
+    RegExpNode* node = alternatives_->at(i).node();
+    if (node == ignore_this_node) continue;
+    int node_eats_at_least =
+        node->EatsAtLeast(still_to_find, budget, not_at_start);
+    if (node_eats_at_least < min) min = node_eats_at_least;
+    if (min == 0) return 0;
+  }
+  return min;
+}
+
+
+int LoopChoiceNode::EatsAtLeast(int still_to_find,
+                                int budget,
+                                bool not_at_start) {
+  return EatsAtLeastHelper(still_to_find,
+                           budget - 1,
+                           loop_node_,
+                           not_at_start);
+}
+
+
+int ChoiceNode::EatsAtLeast(int still_to_find,
+                            int budget,
+                            bool not_at_start) {
+  return EatsAtLeastHelper(still_to_find,
+                           budget,
+                           NULL,
+                           not_at_start);
+}
+
+
+// Takes the left-most 1-bit and smears it out, setting all bits to its right.
+static inline uint32_t SmearBitsRight(uint32_t v) {
+  v |= v >> 1;
+  v |= v >> 2;
+  v |= v >> 4;
+  v |= v >> 8;
+  v |= v >> 16;
+  return v;
+}
+
+
+bool QuickCheckDetails::Rationalize(bool asc) {
+  bool found_useful_op = false;
+  uint32_t char_mask;
+  if (asc) {
+    char_mask = String::kMaxOneByteCharCode;
+  } else {
+    char_mask = String::kMaxUtf16CodeUnit;
+  }
+  mask_ = 0;
+  value_ = 0;
+  int char_shift = 0;
+  for (int i = 0; i < characters_; i++) {
+    Position* pos = &positions_[i];
+    if ((pos->mask & String::kMaxOneByteCharCode) != 0) {
+      found_useful_op = true;
+    }
+    mask_ |= (pos->mask & char_mask) << char_shift;
+    value_ |= (pos->value & char_mask) << char_shift;
+    char_shift += asc ? 8 : 16;
+  }
+  return found_useful_op;
+}
+
+
+bool RegExpNode::EmitQuickCheck(RegExpCompiler* compiler,
+                                Trace* bounds_check_trace,
+                                Trace* trace,
+                                bool preload_has_checked_bounds,
+                                Label* on_possible_success,
+                                QuickCheckDetails* details,
+                                bool fall_through_on_failure) {
+  if (details->characters() == 0) return false;
+  GetQuickCheckDetails(
+      details, compiler, 0, trace->at_start() == Trace::FALSE_VALUE);
+  if (details->cannot_match()) return false;
+  if (!details->Rationalize(compiler->one_byte())) return false;
+  DCHECK(details->characters() == 1 ||
+         compiler->macro_assembler()->CanReadUnaligned());
+  uint32_t mask = details->mask();
+  uint32_t value = details->value();
+
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+
+  if (trace->characters_preloaded() != details->characters()) {
+    DCHECK(trace->cp_offset() == bounds_check_trace->cp_offset());
+    // We are attempting to preload the minimum number of characters
+    // any choice would eat, so if the bounds check fails, then none of the
+    // choices can succeed, so we can just immediately backtrack, rather
+    // than go to the next choice.
+    assembler->LoadCurrentCharacter(trace->cp_offset(),
+                                    bounds_check_trace->backtrack(),
+                                    !preload_has_checked_bounds,
+                                    details->characters());
+  }
+
+
+  bool need_mask = true;
+
+  if (details->characters() == 1) {
+    // If number of characters preloaded is 1 then we used a byte or 16 bit
+    // load so the value is already masked down.
+    uint32_t char_mask;
+    if (compiler->one_byte()) {
+      char_mask = String::kMaxOneByteCharCode;
+    } else {
+      char_mask = String::kMaxUtf16CodeUnit;
+    }
+    if ((mask & char_mask) == char_mask) need_mask = false;
+    mask &= char_mask;
+  } else {
+    // For 2-character preloads in one-byte mode or 1-character preloads in
+    // two-byte mode we also use a 16 bit load with zero extend.
+    if (details->characters() == 2 && compiler->one_byte()) {
+      if ((mask & 0xffff) == 0xffff) need_mask = false;
+    } else if (details->characters() == 1 && !compiler->one_byte()) {
+      if ((mask & 0xffff) == 0xffff) need_mask = false;
+    } else {
+      if (mask == 0xffffffff) need_mask = false;
+    }
+  }
+
+  if (fall_through_on_failure) {
+    if (need_mask) {
+      assembler->CheckCharacterAfterAnd(value, mask, on_possible_success);
+    } else {
+      assembler->CheckCharacter(value, on_possible_success);
+    }
+  } else {
+    if (need_mask) {
+      assembler->CheckNotCharacterAfterAnd(value, mask, trace->backtrack());
+    } else {
+      assembler->CheckNotCharacter(value, trace->backtrack());
+    }
+  }
+  return true;
+}
+
+
+// Here is the meat of GetQuickCheckDetails (see also the comment on the
+// super-class in the .h file).
+//
+// We iterate along the text object, building up for each character a
+// mask and value that can be used to test for a quick failure to match.
+// The masks and values for the positions will be combined into a single
+// machine word for the current character width in order to be used in
+// generating a quick check.
+void TextNode::GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start) {
+  Isolate* isolate = compiler->macro_assembler()->zone()->isolate();
+  DCHECK(characters_filled_in < details->characters());
+  int characters = details->characters();
+  int char_mask;
+  if (compiler->one_byte()) {
+    char_mask = String::kMaxOneByteCharCode;
+  } else {
+    char_mask = String::kMaxUtf16CodeUnit;
+  }
+  for (int k = 0; k < elms_->length(); k++) {
+    TextElement elm = elms_->at(k);
+    if (elm.text_type() == TextElement::ATOM) {
+      Vector<const uc16> quarks = elm.atom()->data();
+      for (int i = 0; i < characters && i < quarks.length(); i++) {
+        QuickCheckDetails::Position* pos =
+            details->positions(characters_filled_in);
+        uc16 c = quarks[i];
+        if (c > char_mask) {
+          // If we expect a non-Latin1 character from an one-byte string,
+          // there is no way we can match. Not even case-independent
+          // matching can turn an Latin1 character into non-Latin1 or
+          // vice versa.
+          // TODO(dcarney): issue 3550.  Verify that this works as expected.
+          // For example, \u0178 is uppercase of \u00ff (y-umlaut).
+          details->set_cannot_match();
+          pos->determines_perfectly = false;
+          return;
+        }
+        if (compiler->ignore_case()) {
+          unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+          int length = GetCaseIndependentLetters(isolate, c,
+                                                 compiler->one_byte(), chars);
+          DCHECK(length != 0);  // Can only happen if c > char_mask (see above).
+          if (length == 1) {
+            // This letter has no case equivalents, so it's nice and simple
+            // and the mask-compare will determine definitely whether we have
+            // a match at this character position.
+            pos->mask = char_mask;
+            pos->value = c;
+            pos->determines_perfectly = true;
+          } else {
+            uint32_t common_bits = char_mask;
+            uint32_t bits = chars[0];
+            for (int j = 1; j < length; j++) {
+              uint32_t differing_bits = ((chars[j] & common_bits) ^ bits);
+              common_bits ^= differing_bits;
+              bits &= common_bits;
+            }
+            // If length is 2 and common bits has only one zero in it then
+            // our mask and compare instruction will determine definitely
+            // whether we have a match at this character position.  Otherwise
+            // it can only be an approximate check.
+            uint32_t one_zero = (common_bits | ~char_mask);
+            if (length == 2 && ((~one_zero) & ((~one_zero) - 1)) == 0) {
+              pos->determines_perfectly = true;
+            }
+            pos->mask = common_bits;
+            pos->value = bits;
+          }
+        } else {
+          // Don't ignore case.  Nice simple case where the mask-compare will
+          // determine definitely whether we have a match at this character
+          // position.
+          pos->mask = char_mask;
+          pos->value = c;
+          pos->determines_perfectly = true;
+        }
+        characters_filled_in++;
+        DCHECK(characters_filled_in <= details->characters());
+        if (characters_filled_in == details->characters()) {
+          return;
+        }
+      }
+    } else {
+      QuickCheckDetails::Position* pos =
+          details->positions(characters_filled_in);
+      RegExpCharacterClass* tree = elm.char_class();
+      ZoneList<CharacterRange>* ranges = tree->ranges(zone());
+      if (tree->is_negated()) {
+        // A quick check uses multi-character mask and compare.  There is no
+        // useful way to incorporate a negative char class into this scheme
+        // so we just conservatively create a mask and value that will always
+        // succeed.
+        pos->mask = 0;
+        pos->value = 0;
+      } else {
+        int first_range = 0;
+        while (ranges->at(first_range).from() > char_mask) {
+          first_range++;
+          if (first_range == ranges->length()) {
+            details->set_cannot_match();
+            pos->determines_perfectly = false;
+            return;
+          }
+        }
+        CharacterRange range = ranges->at(first_range);
+        uc16 from = range.from();
+        uc16 to = range.to();
+        if (to > char_mask) {
+          to = char_mask;
+        }
+        uint32_t differing_bits = (from ^ to);
+        // A mask and compare is only perfect if the differing bits form a
+        // number like 00011111 with one single block of trailing 1s.
+        if ((differing_bits & (differing_bits + 1)) == 0 &&
+             from + differing_bits == to) {
+          pos->determines_perfectly = true;
+        }
+        uint32_t common_bits = ~SmearBitsRight(differing_bits);
+        uint32_t bits = (from & common_bits);
+        for (int i = first_range + 1; i < ranges->length(); i++) {
+          CharacterRange range = ranges->at(i);
+          uc16 from = range.from();
+          uc16 to = range.to();
+          if (from > char_mask) continue;
+          if (to > char_mask) to = char_mask;
+          // Here we are combining more ranges into the mask and compare
+          // value.  With each new range the mask becomes more sparse and
+          // so the chances of a false positive rise.  A character class
+          // with multiple ranges is assumed never to be equivalent to a
+          // mask and compare operation.
+          pos->determines_perfectly = false;
+          uint32_t new_common_bits = (from ^ to);
+          new_common_bits = ~SmearBitsRight(new_common_bits);
+          common_bits &= new_common_bits;
+          bits &= new_common_bits;
+          uint32_t differing_bits = (from & common_bits) ^ bits;
+          common_bits ^= differing_bits;
+          bits &= common_bits;
+        }
+        pos->mask = common_bits;
+        pos->value = bits;
+      }
+      characters_filled_in++;
+      DCHECK(characters_filled_in <= details->characters());
+      if (characters_filled_in == details->characters()) {
+        return;
+      }
+    }
+  }
+  DCHECK(characters_filled_in != details->characters());
+  if (!details->cannot_match()) {
+    on_success()-> GetQuickCheckDetails(details,
+                                        compiler,
+                                        characters_filled_in,
+                                        true);
+  }
+}
+
+
+void QuickCheckDetails::Clear() {
+  for (int i = 0; i < characters_; i++) {
+    positions_[i].mask = 0;
+    positions_[i].value = 0;
+    positions_[i].determines_perfectly = false;
+  }
+  characters_ = 0;
+}
+
+
+void QuickCheckDetails::Advance(int by, bool one_byte) {
+  DCHECK(by >= 0);
+  if (by >= characters_) {
+    Clear();
+    return;
+  }
+  for (int i = 0; i < characters_ - by; i++) {
+    positions_[i] = positions_[by + i];
+  }
+  for (int i = characters_ - by; i < characters_; i++) {
+    positions_[i].mask = 0;
+    positions_[i].value = 0;
+    positions_[i].determines_perfectly = false;
+  }
+  characters_ -= by;
+  // We could change mask_ and value_ here but we would never advance unless
+  // they had already been used in a check and they won't be used again because
+  // it would gain us nothing.  So there's no point.
+}
+
+
+void QuickCheckDetails::Merge(QuickCheckDetails* other, int from_index) {
+  DCHECK(characters_ == other->characters_);
+  if (other->cannot_match_) {
+    return;
+  }
+  if (cannot_match_) {
+    *this = *other;
+    return;
+  }
+  for (int i = from_index; i < characters_; i++) {
+    QuickCheckDetails::Position* pos = positions(i);
+    QuickCheckDetails::Position* other_pos = other->positions(i);
+    if (pos->mask != other_pos->mask ||
+        pos->value != other_pos->value ||
+        !other_pos->determines_perfectly) {
+      // Our mask-compare operation will be approximate unless we have the
+      // exact same operation on both sides of the alternation.
+      pos->determines_perfectly = false;
+    }
+    pos->mask &= other_pos->mask;
+    pos->value &= pos->mask;
+    other_pos->value &= pos->mask;
+    uc16 differing_bits = (pos->value ^ other_pos->value);
+    pos->mask &= ~differing_bits;
+    pos->value &= pos->mask;
+  }
+}
+
+
+class VisitMarker {
+ public:
+  explicit VisitMarker(NodeInfo* info) : info_(info) {
+    DCHECK(!info->visited);
+    info->visited = true;
+  }
+  ~VisitMarker() {
+    info_->visited = false;
+  }
+ private:
+  NodeInfo* info_;
+};
+
+
+RegExpNode* SeqRegExpNode::FilterOneByte(int depth, bool ignore_case) {
+  if (info()->replacement_calculated) return replacement();
+  if (depth < 0) return this;
+  DCHECK(!info()->visited);
+  VisitMarker marker(info());
+  return FilterSuccessor(depth - 1, ignore_case);
+}
+
+
+RegExpNode* SeqRegExpNode::FilterSuccessor(int depth, bool ignore_case) {
+  RegExpNode* next = on_success_->FilterOneByte(depth - 1, ignore_case);
+  if (next == NULL) return set_replacement(NULL);
+  on_success_ = next;
+  return set_replacement(this);
+}
+
+
+// We need to check for the following characters: 0x39c 0x3bc 0x178.
+static inline bool RangeContainsLatin1Equivalents(CharacterRange range) {
+  // TODO(dcarney): this could be a lot more efficient.
+  return range.Contains(0x39c) ||
+      range.Contains(0x3bc) || range.Contains(0x178);
+}
+
+
+static bool RangesContainLatin1Equivalents(ZoneList<CharacterRange>* ranges) {
+  for (int i = 0; i < ranges->length(); i++) {
+    // TODO(dcarney): this could be a lot more efficient.
+    if (RangeContainsLatin1Equivalents(ranges->at(i))) return true;
+  }
+  return false;
+}
+
+
+RegExpNode* TextNode::FilterOneByte(int depth, bool ignore_case) {
+  if (info()->replacement_calculated) return replacement();
+  if (depth < 0) return this;
+  DCHECK(!info()->visited);
+  VisitMarker marker(info());
+  int element_count = elms_->length();
+  for (int i = 0; i < element_count; i++) {
+    TextElement elm = elms_->at(i);
+    if (elm.text_type() == TextElement::ATOM) {
+      Vector<const uc16> quarks = elm.atom()->data();
+      for (int j = 0; j < quarks.length(); j++) {
+        uint16_t c = quarks[j];
+        if (c <= String::kMaxOneByteCharCode) continue;
+        if (!ignore_case) return set_replacement(NULL);
+        // Here, we need to check for characters whose upper and lower cases
+        // are outside the Latin-1 range.
+        uint16_t converted = unibrow::Latin1::ConvertNonLatin1ToLatin1(c);
+        // Character is outside Latin-1 completely
+        if (converted == 0) return set_replacement(NULL);
+        // Convert quark to Latin-1 in place.
+        uint16_t* copy = const_cast<uint16_t*>(quarks.start());
+        copy[j] = converted;
+      }
+    } else {
+      DCHECK(elm.text_type() == TextElement::CHAR_CLASS);
+      RegExpCharacterClass* cc = elm.char_class();
+      ZoneList<CharacterRange>* ranges = cc->ranges(zone());
+      if (!CharacterRange::IsCanonical(ranges)) {
+        CharacterRange::Canonicalize(ranges);
+      }
+      // Now they are in order so we only need to look at the first.
+      int range_count = ranges->length();
+      if (cc->is_negated()) {
+        if (range_count != 0 &&
+            ranges->at(0).from() == 0 &&
+            ranges->at(0).to() >= String::kMaxOneByteCharCode) {
+          // This will be handled in a later filter.
+          if (ignore_case && RangesContainLatin1Equivalents(ranges)) continue;
+          return set_replacement(NULL);
+        }
+      } else {
+        if (range_count == 0 ||
+            ranges->at(0).from() > String::kMaxOneByteCharCode) {
+          // This will be handled in a later filter.
+          if (ignore_case && RangesContainLatin1Equivalents(ranges)) continue;
+          return set_replacement(NULL);
+        }
+      }
+    }
+  }
+  return FilterSuccessor(depth - 1, ignore_case);
+}
+
+
+RegExpNode* LoopChoiceNode::FilterOneByte(int depth, bool ignore_case) {
+  if (info()->replacement_calculated) return replacement();
+  if (depth < 0) return this;
+  if (info()->visited) return this;
+  {
+    VisitMarker marker(info());
+
+    RegExpNode* continue_replacement =
+        continue_node_->FilterOneByte(depth - 1, ignore_case);
+    // If we can't continue after the loop then there is no sense in doing the
+    // loop.
+    if (continue_replacement == NULL) return set_replacement(NULL);
+  }
+
+  return ChoiceNode::FilterOneByte(depth - 1, ignore_case);
+}
+
+
+RegExpNode* ChoiceNode::FilterOneByte(int depth, bool ignore_case) {
+  if (info()->replacement_calculated) return replacement();
+  if (depth < 0) return this;
+  if (info()->visited) return this;
+  VisitMarker marker(info());
+  int choice_count = alternatives_->length();
+
+  for (int i = 0; i < choice_count; i++) {
+    GuardedAlternative alternative = alternatives_->at(i);
+    if (alternative.guards() != NULL && alternative.guards()->length() != 0) {
+      set_replacement(this);
+      return this;
+    }
+  }
+
+  int surviving = 0;
+  RegExpNode* survivor = NULL;
+  for (int i = 0; i < choice_count; i++) {
+    GuardedAlternative alternative = alternatives_->at(i);
+    RegExpNode* replacement =
+        alternative.node()->FilterOneByte(depth - 1, ignore_case);
+    DCHECK(replacement != this);  // No missing EMPTY_MATCH_CHECK.
+    if (replacement != NULL) {
+      alternatives_->at(i).set_node(replacement);
+      surviving++;
+      survivor = replacement;
+    }
+  }
+  if (surviving < 2) return set_replacement(survivor);
+
+  set_replacement(this);
+  if (surviving == choice_count) {
+    return this;
+  }
+  // Only some of the nodes survived the filtering.  We need to rebuild the
+  // alternatives list.
+  ZoneList<GuardedAlternative>* new_alternatives =
+      new(zone()) ZoneList<GuardedAlternative>(surviving, zone());
+  for (int i = 0; i < choice_count; i++) {
+    RegExpNode* replacement =
+        alternatives_->at(i).node()->FilterOneByte(depth - 1, ignore_case);
+    if (replacement != NULL) {
+      alternatives_->at(i).set_node(replacement);
+      new_alternatives->Add(alternatives_->at(i), zone());
+    }
+  }
+  alternatives_ = new_alternatives;
+  return this;
+}
+
+
+RegExpNode* NegativeLookaheadChoiceNode::FilterOneByte(int depth,
+                                                       bool ignore_case) {
+  if (info()->replacement_calculated) return replacement();
+  if (depth < 0) return this;
+  if (info()->visited) return this;
+  VisitMarker marker(info());
+  // Alternative 0 is the negative lookahead, alternative 1 is what comes
+  // afterwards.
+  RegExpNode* node = alternatives_->at(1).node();
+  RegExpNode* replacement = node->FilterOneByte(depth - 1, ignore_case);
+  if (replacement == NULL) return set_replacement(NULL);
+  alternatives_->at(1).set_node(replacement);
+
+  RegExpNode* neg_node = alternatives_->at(0).node();
+  RegExpNode* neg_replacement = neg_node->FilterOneByte(depth - 1, ignore_case);
+  // If the negative lookahead is always going to fail then
+  // we don't need to check it.
+  if (neg_replacement == NULL) return set_replacement(replacement);
+  alternatives_->at(0).set_node(neg_replacement);
+  return set_replacement(this);
+}
+
+
+void LoopChoiceNode::GetQuickCheckDetails(QuickCheckDetails* details,
+                                          RegExpCompiler* compiler,
+                                          int characters_filled_in,
+                                          bool not_at_start) {
+  if (body_can_be_zero_length_ || info()->visited) return;
+  VisitMarker marker(info());
+  return ChoiceNode::GetQuickCheckDetails(details,
+                                          compiler,
+                                          characters_filled_in,
+                                          not_at_start);
+}
+
+
+void LoopChoiceNode::FillInBMInfo(int offset,
+                                  int budget,
+                                  BoyerMooreLookahead* bm,
+                                  bool not_at_start) {
+  if (body_can_be_zero_length_ || budget <= 0) {
+    bm->SetRest(offset);
+    SaveBMInfo(bm, not_at_start, offset);
+    return;
+  }
+  ChoiceNode::FillInBMInfo(offset, budget - 1, bm, not_at_start);
+  SaveBMInfo(bm, not_at_start, offset);
+}
+
+
+void ChoiceNode::GetQuickCheckDetails(QuickCheckDetails* details,
+                                      RegExpCompiler* compiler,
+                                      int characters_filled_in,
+                                      bool not_at_start) {
+  not_at_start = (not_at_start || not_at_start_);
+  int choice_count = alternatives_->length();
+  DCHECK(choice_count > 0);
+  alternatives_->at(0).node()->GetQuickCheckDetails(details,
+                                                    compiler,
+                                                    characters_filled_in,
+                                                    not_at_start);
+  for (int i = 1; i < choice_count; i++) {
+    QuickCheckDetails new_details(details->characters());
+    RegExpNode* node = alternatives_->at(i).node();
+    node->GetQuickCheckDetails(&new_details, compiler,
+                               characters_filled_in,
+                               not_at_start);
+    // Here we merge the quick match details of the two branches.
+    details->Merge(&new_details, characters_filled_in);
+  }
+}
+
+
+// Check for [0-9A-Z_a-z].
+static void EmitWordCheck(RegExpMacroAssembler* assembler,
+                          Label* word,
+                          Label* non_word,
+                          bool fall_through_on_word) {
+  if (assembler->CheckSpecialCharacterClass(
+          fall_through_on_word ? 'w' : 'W',
+          fall_through_on_word ? non_word : word)) {
+    // Optimized implementation available.
+    return;
+  }
+  assembler->CheckCharacterGT('z', non_word);
+  assembler->CheckCharacterLT('0', non_word);
+  assembler->CheckCharacterGT('a' - 1, word);
+  assembler->CheckCharacterLT('9' + 1, word);
+  assembler->CheckCharacterLT('A', non_word);
+  assembler->CheckCharacterLT('Z' + 1, word);
+  if (fall_through_on_word) {
+    assembler->CheckNotCharacter('_', non_word);
+  } else {
+    assembler->CheckCharacter('_', word);
+  }
+}
+
+
+// Emit the code to check for a ^ in multiline mode (1-character lookbehind
+// that matches newline or the start of input).
+static void EmitHat(RegExpCompiler* compiler,
+                    RegExpNode* on_success,
+                    Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  // We will be loading the previous character into the current character
+  // register.
+  Trace new_trace(*trace);
+  new_trace.InvalidateCurrentCharacter();
+
+  Label ok;
+  if (new_trace.cp_offset() == 0) {
+    // The start of input counts as a newline in this context, so skip to
+    // ok if we are at the start.
+    assembler->CheckAtStart(&ok);
+  }
+  // We already checked that we are not at the start of input so it must be
+  // OK to load the previous character.
+  assembler->LoadCurrentCharacter(new_trace.cp_offset() -1,
+                                  new_trace.backtrack(),
+                                  false);
+  if (!assembler->CheckSpecialCharacterClass('n',
+                                             new_trace.backtrack())) {
+    // Newline means \n, \r, 0x2028 or 0x2029.
+    if (!compiler->one_byte()) {
+      assembler->CheckCharacterAfterAnd(0x2028, 0xfffe, &ok);
+    }
+    assembler->CheckCharacter('\n', &ok);
+    assembler->CheckNotCharacter('\r', new_trace.backtrack());
+  }
+  assembler->Bind(&ok);
+  on_success->Emit(compiler, &new_trace);
+}
+
+
+// Emit the code to handle \b and \B (word-boundary or non-word-boundary).
+void AssertionNode::EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  Trace::TriBool next_is_word_character = Trace::UNKNOWN;
+  bool not_at_start = (trace->at_start() == Trace::FALSE_VALUE);
+  BoyerMooreLookahead* lookahead = bm_info(not_at_start);
+  if (lookahead == NULL) {
+    int eats_at_least =
+        Min(kMaxLookaheadForBoyerMoore, EatsAtLeast(kMaxLookaheadForBoyerMoore,
+                                                    kRecursionBudget,
+                                                    not_at_start));
+    if (eats_at_least >= 1) {
+      BoyerMooreLookahead* bm =
+          new(zone()) BoyerMooreLookahead(eats_at_least, compiler, zone());
+      FillInBMInfo(0, kRecursionBudget, bm, not_at_start);
+      if (bm->at(0)->is_non_word())
+        next_is_word_character = Trace::FALSE_VALUE;
+      if (bm->at(0)->is_word()) next_is_word_character = Trace::TRUE_VALUE;
+    }
+  } else {
+    if (lookahead->at(0)->is_non_word())
+      next_is_word_character = Trace::FALSE_VALUE;
+    if (lookahead->at(0)->is_word())
+      next_is_word_character = Trace::TRUE_VALUE;
+  }
+  bool at_boundary = (assertion_type_ == AssertionNode::AT_BOUNDARY);
+  if (next_is_word_character == Trace::UNKNOWN) {
+    Label before_non_word;
+    Label before_word;
+    if (trace->characters_preloaded() != 1) {
+      assembler->LoadCurrentCharacter(trace->cp_offset(), &before_non_word);
+    }
+    // Fall through on non-word.
+    EmitWordCheck(assembler, &before_word, &before_non_word, false);
+    // Next character is not a word character.
+    assembler->Bind(&before_non_word);
+    Label ok;
+    BacktrackIfPrevious(compiler, trace, at_boundary ? kIsNonWord : kIsWord);
+    assembler->GoTo(&ok);
+
+    assembler->Bind(&before_word);
+    BacktrackIfPrevious(compiler, trace, at_boundary ? kIsWord : kIsNonWord);
+    assembler->Bind(&ok);
+  } else if (next_is_word_character == Trace::TRUE_VALUE) {
+    BacktrackIfPrevious(compiler, trace, at_boundary ? kIsWord : kIsNonWord);
+  } else {
+    DCHECK(next_is_word_character == Trace::FALSE_VALUE);
+    BacktrackIfPrevious(compiler, trace, at_boundary ? kIsNonWord : kIsWord);
+  }
+}
+
+
+void AssertionNode::BacktrackIfPrevious(
+    RegExpCompiler* compiler,
+    Trace* trace,
+    AssertionNode::IfPrevious backtrack_if_previous) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  Trace new_trace(*trace);
+  new_trace.InvalidateCurrentCharacter();
+
+  Label fall_through, dummy;
+
+  Label* non_word = backtrack_if_previous == kIsNonWord ?
+                    new_trace.backtrack() :
+                    &fall_through;
+  Label* word = backtrack_if_previous == kIsNonWord ?
+                &fall_through :
+                new_trace.backtrack();
+
+  if (new_trace.cp_offset() == 0) {
+    // The start of input counts as a non-word character, so the question is
+    // decided if we are at the start.
+    assembler->CheckAtStart(non_word);
+  }
+  // We already checked that we are not at the start of input so it must be
+  // OK to load the previous character.
+  assembler->LoadCurrentCharacter(new_trace.cp_offset() - 1, &dummy, false);
+  EmitWordCheck(assembler, word, non_word, backtrack_if_previous == kIsNonWord);
+
+  assembler->Bind(&fall_through);
+  on_success()->Emit(compiler, &new_trace);
+}
+
+
+void AssertionNode::GetQuickCheckDetails(QuickCheckDetails* details,
+                                         RegExpCompiler* compiler,
+                                         int filled_in,
+                                         bool not_at_start) {
+  if (assertion_type_ == AT_START && not_at_start) {
+    details->set_cannot_match();
+    return;
+  }
+  return on_success()->GetQuickCheckDetails(details,
+                                            compiler,
+                                            filled_in,
+                                            not_at_start);
+}
+
+
+void AssertionNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  switch (assertion_type_) {
+    case AT_END: {
+      Label ok;
+      assembler->CheckPosition(trace->cp_offset(), &ok);
+      assembler->GoTo(trace->backtrack());
+      assembler->Bind(&ok);
+      break;
+    }
+    case AT_START: {
+      if (trace->at_start() == Trace::FALSE_VALUE) {
+        assembler->GoTo(trace->backtrack());
+        return;
+      }
+      if (trace->at_start() == Trace::UNKNOWN) {
+        assembler->CheckNotAtStart(trace->backtrack());
+        Trace at_start_trace = *trace;
+        at_start_trace.set_at_start(true);
+        on_success()->Emit(compiler, &at_start_trace);
+        return;
+      }
+    }
+    break;
+    case AFTER_NEWLINE:
+      EmitHat(compiler, on_success(), trace);
+      return;
+    case AT_BOUNDARY:
+    case AT_NON_BOUNDARY: {
+      EmitBoundaryCheck(compiler, trace);
+      return;
+    }
+  }
+  on_success()->Emit(compiler, trace);
+}
+
+
+static bool DeterminedAlready(QuickCheckDetails* quick_check, int offset) {
+  if (quick_check == NULL) return false;
+  if (offset >= quick_check->characters()) return false;
+  return quick_check->positions(offset)->determines_perfectly;
+}
+
+
+static void UpdateBoundsCheck(int index, int* checked_up_to) {
+  if (index > *checked_up_to) {
+    *checked_up_to = index;
+  }
+}
+
+
+// We call this repeatedly to generate code for each pass over the text node.
+// The passes are in increasing order of difficulty because we hope one
+// of the first passes will fail in which case we are saved the work of the
+// later passes.  for example for the case independent regexp /%[asdfghjkl]a/
+// we will check the '%' in the first pass, the case independent 'a' in the
+// second pass and the character class in the last pass.
+//
+// The passes are done from right to left, so for example to test for /bar/
+// we will first test for an 'r' with offset 2, then an 'a' with offset 1
+// and then a 'b' with offset 0.  This means we can avoid the end-of-input
+// bounds check most of the time.  In the example we only need to check for
+// end-of-input when loading the putative 'r'.
+//
+// A slight complication involves the fact that the first character may already
+// be fetched into a register by the previous node.  In this case we want to
+// do the test for that character first.  We do this in separate passes.  The
+// 'preloaded' argument indicates that we are doing such a 'pass'.  If such a
+// pass has been performed then subsequent passes will have true in
+// first_element_checked to indicate that that character does not need to be
+// checked again.
+//
+// In addition to all this we are passed a Trace, which can
+// contain an AlternativeGeneration object.  In this AlternativeGeneration
+// object we can see details of any quick check that was already passed in
+// order to get to the code we are now generating.  The quick check can involve
+// loading characters, which means we do not need to recheck the bounds
+// up to the limit the quick check already checked.  In addition the quick
+// check can have involved a mask and compare operation which may simplify
+// or obviate the need for further checks at some character positions.
+void TextNode::TextEmitPass(RegExpCompiler* compiler,
+                            TextEmitPassType pass,
+                            bool preloaded,
+                            Trace* trace,
+                            bool first_element_checked,
+                            int* checked_up_to) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  Isolate* isolate = assembler->zone()->isolate();
+  bool one_byte = compiler->one_byte();
+  Label* backtrack = trace->backtrack();
+  QuickCheckDetails* quick_check = trace->quick_check_performed();
+  int element_count = elms_->length();
+  for (int i = preloaded ? 0 : element_count - 1; i >= 0; i--) {
+    TextElement elm = elms_->at(i);
+    int cp_offset = trace->cp_offset() + elm.cp_offset();
+    if (elm.text_type() == TextElement::ATOM) {
+      Vector<const uc16> quarks = elm.atom()->data();
+      for (int j = preloaded ? 0 : quarks.length() - 1; j >= 0; j--) {
+        if (first_element_checked && i == 0 && j == 0) continue;
+        if (DeterminedAlready(quick_check, elm.cp_offset() + j)) continue;
+        EmitCharacterFunction* emit_function = NULL;
+        switch (pass) {
+          case NON_LATIN1_MATCH:
+            DCHECK(one_byte);
+            if (quarks[j] > String::kMaxOneByteCharCode) {
+              assembler->GoTo(backtrack);
+              return;
+            }
+            break;
+          case NON_LETTER_CHARACTER_MATCH:
+            emit_function = &EmitAtomNonLetter;
+            break;
+          case SIMPLE_CHARACTER_MATCH:
+            emit_function = &EmitSimpleCharacter;
+            break;
+          case CASE_CHARACTER_MATCH:
+            emit_function = &EmitAtomLetter;
+            break;
+          default:
+            break;
+        }
+        if (emit_function != NULL) {
+          bool bound_checked = emit_function(isolate,
+                                             compiler,
+                                             quarks[j],
+                                             backtrack,
+                                             cp_offset + j,
+                                             *checked_up_to < cp_offset + j,
+                                             preloaded);
+          if (bound_checked) UpdateBoundsCheck(cp_offset + j, checked_up_to);
+        }
+      }
+    } else {
+      DCHECK_EQ(TextElement::CHAR_CLASS, elm.text_type());
+      if (pass == CHARACTER_CLASS_MATCH) {
+        if (first_element_checked && i == 0) continue;
+        if (DeterminedAlready(quick_check, elm.cp_offset())) continue;
+        RegExpCharacterClass* cc = elm.char_class();
+        EmitCharClass(assembler, cc, one_byte, backtrack, cp_offset,
+                      *checked_up_to < cp_offset, preloaded, zone());
+        UpdateBoundsCheck(cp_offset, checked_up_to);
+      }
+    }
+  }
+}
+
+
+int TextNode::Length() {
+  TextElement elm = elms_->last();
+  DCHECK(elm.cp_offset() >= 0);
+  return elm.cp_offset() + elm.length();
+}
+
+
+bool TextNode::SkipPass(int int_pass, bool ignore_case) {
+  TextEmitPassType pass = static_cast<TextEmitPassType>(int_pass);
+  if (ignore_case) {
+    return pass == SIMPLE_CHARACTER_MATCH;
+  } else {
+    return pass == NON_LETTER_CHARACTER_MATCH || pass == CASE_CHARACTER_MATCH;
+  }
+}
+
+
+// This generates the code to match a text node.  A text node can contain
+// straight character sequences (possibly to be matched in a case-independent
+// way) and character classes.  For efficiency we do not do this in a single
+// pass from left to right.  Instead we pass over the text node several times,
+// emitting code for some character positions every time.  See the comment on
+// TextEmitPass for details.
+void TextNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  LimitResult limit_result = LimitVersions(compiler, trace);
+  if (limit_result == DONE) return;
+  DCHECK(limit_result == CONTINUE);
+
+  if (trace->cp_offset() + Length() > RegExpMacroAssembler::kMaxCPOffset) {
+    compiler->SetRegExpTooBig();
+    return;
+  }
+
+  if (compiler->one_byte()) {
+    int dummy = 0;
+    TextEmitPass(compiler, NON_LATIN1_MATCH, false, trace, false, &dummy);
+  }
+
+  bool first_elt_done = false;
+  int bound_checked_to = trace->cp_offset() - 1;
+  bound_checked_to += trace->bound_checked_up_to();
+
+  // If a character is preloaded into the current character register then
+  // check that now.
+  if (trace->characters_preloaded() == 1) {
+    for (int pass = kFirstRealPass; pass <= kLastPass; pass++) {
+      if (!SkipPass(pass, compiler->ignore_case())) {
+        TextEmitPass(compiler,
+                     static_cast<TextEmitPassType>(pass),
+                     true,
+                     trace,
+                     false,
+                     &bound_checked_to);
+      }
+    }
+    first_elt_done = true;
+  }
+
+  for (int pass = kFirstRealPass; pass <= kLastPass; pass++) {
+    if (!SkipPass(pass, compiler->ignore_case())) {
+      TextEmitPass(compiler,
+                   static_cast<TextEmitPassType>(pass),
+                   false,
+                   trace,
+                   first_elt_done,
+                   &bound_checked_to);
+    }
+  }
+
+  Trace successor_trace(*trace);
+  successor_trace.set_at_start(false);
+  successor_trace.AdvanceCurrentPositionInTrace(Length(), compiler);
+  RecursionCheck rc(compiler);
+  on_success()->Emit(compiler, &successor_trace);
+}
+
+
+void Trace::InvalidateCurrentCharacter() {
+  characters_preloaded_ = 0;
+}
+
+
+void Trace::AdvanceCurrentPositionInTrace(int by, RegExpCompiler* compiler) {
+  DCHECK(by > 0);
+  // We don't have an instruction for shifting the current character register
+  // down or for using a shifted value for anything so lets just forget that
+  // we preloaded any characters into it.
+  characters_preloaded_ = 0;
+  // Adjust the offsets of the quick check performed information.  This
+  // information is used to find out what we already determined about the
+  // characters by means of mask and compare.
+  quick_check_performed_.Advance(by, compiler->one_byte());
+  cp_offset_ += by;
+  if (cp_offset_ > RegExpMacroAssembler::kMaxCPOffset) {
+    compiler->SetRegExpTooBig();
+    cp_offset_ = 0;
+  }
+  bound_checked_up_to_ = Max(0, bound_checked_up_to_ - by);
+}
+
+
+void TextNode::MakeCaseIndependent(bool is_one_byte) {
+  int element_count = elms_->length();
+  for (int i = 0; i < element_count; i++) {
+    TextElement elm = elms_->at(i);
+    if (elm.text_type() == TextElement::CHAR_CLASS) {
+      RegExpCharacterClass* cc = elm.char_class();
+      // None of the standard character classes is different in the case
+      // independent case and it slows us down if we don't know that.
+      if (cc->is_standard(zone())) continue;
+      ZoneList<CharacterRange>* ranges = cc->ranges(zone());
+      int range_count = ranges->length();
+      for (int j = 0; j < range_count; j++) {
+        ranges->at(j).AddCaseEquivalents(ranges, is_one_byte, zone());
+      }
+    }
+  }
+}
+
+
+int TextNode::GreedyLoopTextLength() {
+  TextElement elm = elms_->at(elms_->length() - 1);
+  return elm.cp_offset() + elm.length();
+}
+
+
+RegExpNode* TextNode::GetSuccessorOfOmnivorousTextNode(
+    RegExpCompiler* compiler) {
+  if (elms_->length() != 1) return NULL;
+  TextElement elm = elms_->at(0);
+  if (elm.text_type() != TextElement::CHAR_CLASS) return NULL;
+  RegExpCharacterClass* node = elm.char_class();
+  ZoneList<CharacterRange>* ranges = node->ranges(zone());
+  if (!CharacterRange::IsCanonical(ranges)) {
+    CharacterRange::Canonicalize(ranges);
+  }
+  if (node->is_negated()) {
+    return ranges->length() == 0 ? on_success() : NULL;
+  }
+  if (ranges->length() != 1) return NULL;
+  uint32_t max_char;
+  if (compiler->one_byte()) {
+    max_char = String::kMaxOneByteCharCode;
+  } else {
+    max_char = String::kMaxUtf16CodeUnit;
+  }
+  return ranges->at(0).IsEverything(max_char) ? on_success() : NULL;
+}
+
+
+// Finds the fixed match length of a sequence of nodes that goes from
+// this alternative and back to this choice node.  If there are variable
+// length nodes or other complications in the way then return a sentinel
+// value indicating that a greedy loop cannot be constructed.
+int ChoiceNode::GreedyLoopTextLengthForAlternative(
+    GuardedAlternative* alternative) {
+  int length = 0;
+  RegExpNode* node = alternative->node();
+  // Later we will generate code for all these text nodes using recursion
+  // so we have to limit the max number.
+  int recursion_depth = 0;
+  while (node != this) {
+    if (recursion_depth++ > RegExpCompiler::kMaxRecursion) {
+      return kNodeIsTooComplexForGreedyLoops;
+    }
+    int node_length = node->GreedyLoopTextLength();
+    if (node_length == kNodeIsTooComplexForGreedyLoops) {
+      return kNodeIsTooComplexForGreedyLoops;
+    }
+    length += node_length;
+    SeqRegExpNode* seq_node = static_cast<SeqRegExpNode*>(node);
+    node = seq_node->on_success();
+  }
+  return length;
+}
+
+
+void LoopChoiceNode::AddLoopAlternative(GuardedAlternative alt) {
+  DCHECK_EQ(loop_node_, NULL);
+  AddAlternative(alt);
+  loop_node_ = alt.node();
+}
+
+
+void LoopChoiceNode::AddContinueAlternative(GuardedAlternative alt) {
+  DCHECK_EQ(continue_node_, NULL);
+  AddAlternative(alt);
+  continue_node_ = alt.node();
+}
+
+
+void LoopChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  if (trace->stop_node() == this) {
+    // Back edge of greedy optimized loop node graph.
+    int text_length =
+        GreedyLoopTextLengthForAlternative(&(alternatives_->at(0)));
+    DCHECK(text_length != kNodeIsTooComplexForGreedyLoops);
+    // Update the counter-based backtracking info on the stack.  This is an
+    // optimization for greedy loops (see below).
+    DCHECK(trace->cp_offset() == text_length);
+    macro_assembler->AdvanceCurrentPosition(text_length);
+    macro_assembler->GoTo(trace->loop_label());
+    return;
+  }
+  DCHECK(trace->stop_node() == NULL);
+  if (!trace->is_trivial()) {
+    trace->Flush(compiler, this);
+    return;
+  }
+  ChoiceNode::Emit(compiler, trace);
+}
+
+
+int ChoiceNode::CalculatePreloadCharacters(RegExpCompiler* compiler,
+                                           int eats_at_least) {
+  int preload_characters = Min(4, eats_at_least);
+  if (compiler->macro_assembler()->CanReadUnaligned()) {
+    bool one_byte = compiler->one_byte();
+    if (one_byte) {
+      if (preload_characters > 4) preload_characters = 4;
+      // We can't preload 3 characters because there is no machine instruction
+      // to do that.  We can't just load 4 because we could be reading
+      // beyond the end of the string, which could cause a memory fault.
+      if (preload_characters == 3) preload_characters = 2;
+    } else {
+      if (preload_characters > 2) preload_characters = 2;
+    }
+  } else {
+    if (preload_characters > 1) preload_characters = 1;
+  }
+  return preload_characters;
+}
+
+
+// This class is used when generating the alternatives in a choice node.  It
+// records the way the alternative is being code generated.
+class AlternativeGeneration: public Malloced {
+ public:
+  AlternativeGeneration()
+      : possible_success(),
+        expects_preload(false),
+        after(),
+        quick_check_details() { }
+  Label possible_success;
+  bool expects_preload;
+  Label after;
+  QuickCheckDetails quick_check_details;
+};
+
+
+// Creates a list of AlternativeGenerations.  If the list has a reasonable
+// size then it is on the stack, otherwise the excess is on the heap.
+class AlternativeGenerationList {
+ public:
+  AlternativeGenerationList(int count, Zone* zone)
+      : alt_gens_(count, zone) {
+    for (int i = 0; i < count && i < kAFew; i++) {
+      alt_gens_.Add(a_few_alt_gens_ + i, zone);
+    }
+    for (int i = kAFew; i < count; i++) {
+      alt_gens_.Add(new AlternativeGeneration(), zone);
+    }
+  }
+  ~AlternativeGenerationList() {
+    for (int i = kAFew; i < alt_gens_.length(); i++) {
+      delete alt_gens_[i];
+      alt_gens_[i] = NULL;
+    }
+  }
+
+  AlternativeGeneration* at(int i) {
+    return alt_gens_[i];
+  }
+
+ private:
+  static const int kAFew = 10;
+  ZoneList<AlternativeGeneration*> alt_gens_;
+  AlternativeGeneration a_few_alt_gens_[kAFew];
+};
+
+
+// The '2' variant is has inclusive from and exclusive to.
+// This covers \s as defined in ECMA-262 5.1, 15.10.2.12,
+// which include WhiteSpace (7.2) or LineTerminator (7.3) values.
+static const int kSpaceRanges[] = { '\t', '\r' + 1, ' ', ' ' + 1,
+    0x00A0, 0x00A1, 0x1680, 0x1681, 0x180E, 0x180F, 0x2000, 0x200B,
+    0x2028, 0x202A, 0x202F, 0x2030, 0x205F, 0x2060, 0x3000, 0x3001,
+    0xFEFF, 0xFF00, 0x10000 };
+static const int kSpaceRangeCount = arraysize(kSpaceRanges);
+
+static const int kWordRanges[] = {
+    '0', '9' + 1, 'A', 'Z' + 1, '_', '_' + 1, 'a', 'z' + 1, 0x10000 };
+static const int kWordRangeCount = arraysize(kWordRanges);
+static const int kDigitRanges[] = { '0', '9' + 1, 0x10000 };
+static const int kDigitRangeCount = arraysize(kDigitRanges);
+static const int kSurrogateRanges[] = { 0xd800, 0xe000, 0x10000 };
+static const int kSurrogateRangeCount = arraysize(kSurrogateRanges);
+static const int kLineTerminatorRanges[] = { 0x000A, 0x000B, 0x000D, 0x000E,
+    0x2028, 0x202A, 0x10000 };
+static const int kLineTerminatorRangeCount = arraysize(kLineTerminatorRanges);
+
+
+void BoyerMoorePositionInfo::Set(int character) {
+  SetInterval(Interval(character, character));
+}
+
+
+void BoyerMoorePositionInfo::SetInterval(const Interval& interval) {
+  s_ = AddRange(s_, kSpaceRanges, kSpaceRangeCount, interval);
+  w_ = AddRange(w_, kWordRanges, kWordRangeCount, interval);
+  d_ = AddRange(d_, kDigitRanges, kDigitRangeCount, interval);
+  surrogate_ =
+      AddRange(surrogate_, kSurrogateRanges, kSurrogateRangeCount, interval);
+  if (interval.to() - interval.from() >= kMapSize - 1) {
+    if (map_count_ != kMapSize) {
+      map_count_ = kMapSize;
+      for (int i = 0; i < kMapSize; i++) map_->at(i) = true;
+    }
+    return;
+  }
+  for (int i = interval.from(); i <= interval.to(); i++) {
+    int mod_character = (i & kMask);
+    if (!map_->at(mod_character)) {
+      map_count_++;
+      map_->at(mod_character) = true;
+    }
+    if (map_count_ == kMapSize) return;
+  }
+}
+
+
+void BoyerMoorePositionInfo::SetAll() {
+  s_ = w_ = d_ = kLatticeUnknown;
+  if (map_count_ != kMapSize) {
+    map_count_ = kMapSize;
+    for (int i = 0; i < kMapSize; i++) map_->at(i) = true;
+  }
+}
+
+
+BoyerMooreLookahead::BoyerMooreLookahead(
+    int length, RegExpCompiler* compiler, Zone* zone)
+    : length_(length),
+      compiler_(compiler) {
+  if (compiler->one_byte()) {
+    max_char_ = String::kMaxOneByteCharCode;
+  } else {
+    max_char_ = String::kMaxUtf16CodeUnit;
+  }
+  bitmaps_ = new(zone) ZoneList<BoyerMoorePositionInfo*>(length, zone);
+  for (int i = 0; i < length; i++) {
+    bitmaps_->Add(new(zone) BoyerMoorePositionInfo(zone), zone);
+  }
+}
+
+
+// Find the longest range of lookahead that has the fewest number of different
+// characters that can occur at a given position.  Since we are optimizing two
+// different parameters at once this is a tradeoff.
+bool BoyerMooreLookahead::FindWorthwhileInterval(int* from, int* to) {
+  int biggest_points = 0;
+  // If more than 32 characters out of 128 can occur it is unlikely that we can
+  // be lucky enough to step forwards much of the time.
+  const int kMaxMax = 32;
+  for (int max_number_of_chars = 4;
+       max_number_of_chars < kMaxMax;
+       max_number_of_chars *= 2) {
+    biggest_points =
+        FindBestInterval(max_number_of_chars, biggest_points, from, to);
+  }
+  if (biggest_points == 0) return false;
+  return true;
+}
+
+
+// Find the highest-points range between 0 and length_ where the character
+// information is not too vague.  'Too vague' means that there are more than
+// max_number_of_chars that can occur at this position.  Calculates the number
+// of points as the product of width-of-the-range and
+// probability-of-finding-one-of-the-characters, where the probability is
+// calculated using the frequency distribution of the sample subject string.
+int BoyerMooreLookahead::FindBestInterval(
+    int max_number_of_chars, int old_biggest_points, int* from, int* to) {
+  int biggest_points = old_biggest_points;
+  static const int kSize = RegExpMacroAssembler::kTableSize;
+  for (int i = 0; i < length_; ) {
+    while (i < length_ && Count(i) > max_number_of_chars) i++;
+    if (i == length_) break;
+    int remembered_from = i;
+    bool union_map[kSize];
+    for (int j = 0; j < kSize; j++) union_map[j] = false;
+    while (i < length_ && Count(i) <= max_number_of_chars) {
+      BoyerMoorePositionInfo* map = bitmaps_->at(i);
+      for (int j = 0; j < kSize; j++) union_map[j] |= map->at(j);
+      i++;
+    }
+    int frequency = 0;
+    for (int j = 0; j < kSize; j++) {
+      if (union_map[j]) {
+        // Add 1 to the frequency to give a small per-character boost for
+        // the cases where our sampling is not good enough and many
+        // characters have a frequency of zero.  This means the frequency
+        // can theoretically be up to 2*kSize though we treat it mostly as
+        // a fraction of kSize.
+        frequency += compiler_->frequency_collator()->Frequency(j) + 1;
+      }
+    }
+    // We use the probability of skipping times the distance we are skipping to
+    // judge the effectiveness of this.  Actually we have a cut-off:  By
+    // dividing by 2 we switch off the skipping if the probability of skipping
+    // is less than 50%.  This is because the multibyte mask-and-compare
+    // skipping in quickcheck is more likely to do well on this case.
+    bool in_quickcheck_range =
+        ((i - remembered_from < 4) ||
+         (compiler_->one_byte() ? remembered_from <= 4 : remembered_from <= 2));
+    // Called 'probability' but it is only a rough estimate and can actually
+    // be outside the 0-kSize range.
+    int probability = (in_quickcheck_range ? kSize / 2 : kSize) - frequency;
+    int points = (i - remembered_from) * probability;
+    if (points > biggest_points) {
+      *from = remembered_from;
+      *to = i - 1;
+      biggest_points = points;
+    }
+  }
+  return biggest_points;
+}
+
+
+// Take all the characters that will not prevent a successful match if they
+// occur in the subject string in the range between min_lookahead and
+// max_lookahead (inclusive) measured from the current position.  If the
+// character at max_lookahead offset is not one of these characters, then we
+// can safely skip forwards by the number of characters in the range.
+int BoyerMooreLookahead::GetSkipTable(int min_lookahead,
+                                      int max_lookahead,
+                                      Handle<ByteArray> boolean_skip_table) {
+  const int kSize = RegExpMacroAssembler::kTableSize;
+
+  const int kSkipArrayEntry = 0;
+  const int kDontSkipArrayEntry = 1;
+
+  for (int i = 0; i < kSize; i++) {
+    boolean_skip_table->set(i, kSkipArrayEntry);
+  }
+  int skip = max_lookahead + 1 - min_lookahead;
+
+  for (int i = max_lookahead; i >= min_lookahead; i--) {
+    BoyerMoorePositionInfo* map = bitmaps_->at(i);
+    for (int j = 0; j < kSize; j++) {
+      if (map->at(j)) {
+        boolean_skip_table->set(j, kDontSkipArrayEntry);
+      }
+    }
+  }
+
+  return skip;
+}
+
+
+// See comment above on the implementation of GetSkipTable.
+void BoyerMooreLookahead::EmitSkipInstructions(RegExpMacroAssembler* masm) {
+  const int kSize = RegExpMacroAssembler::kTableSize;
+
+  int min_lookahead = 0;
+  int max_lookahead = 0;
+
+  if (!FindWorthwhileInterval(&min_lookahead, &max_lookahead)) return;
+
+  bool found_single_character = false;
+  int single_character = 0;
+  for (int i = max_lookahead; i >= min_lookahead; i--) {
+    BoyerMoorePositionInfo* map = bitmaps_->at(i);
+    if (map->map_count() > 1 ||
+        (found_single_character && map->map_count() != 0)) {
+      found_single_character = false;
+      break;
+    }
+    for (int j = 0; j < kSize; j++) {
+      if (map->at(j)) {
+        found_single_character = true;
+        single_character = j;
+        break;
+      }
+    }
+  }
+
+  int lookahead_width = max_lookahead + 1 - min_lookahead;
+
+  if (found_single_character && lookahead_width == 1 && max_lookahead < 3) {
+    // The mask-compare can probably handle this better.
+    return;
+  }
+
+  if (found_single_character) {
+    Label cont, again;
+    masm->Bind(&again);
+    masm->LoadCurrentCharacter(max_lookahead, &cont, true);
+    if (max_char_ > kSize) {
+      masm->CheckCharacterAfterAnd(single_character,
+                                   RegExpMacroAssembler::kTableMask,
+                                   &cont);
+    } else {
+      masm->CheckCharacter(single_character, &cont);
+    }
+    masm->AdvanceCurrentPosition(lookahead_width);
+    masm->GoTo(&again);
+    masm->Bind(&cont);
+    return;
+  }
+
+  Factory* factory = masm->zone()->isolate()->factory();
+  Handle<ByteArray> boolean_skip_table = factory->NewByteArray(kSize, TENURED);
+  int skip_distance = GetSkipTable(
+      min_lookahead, max_lookahead, boolean_skip_table);
+  DCHECK(skip_distance != 0);
+
+  Label cont, again;
+  masm->Bind(&again);
+  masm->LoadCurrentCharacter(max_lookahead, &cont, true);
+  masm->CheckBitInTable(boolean_skip_table, &cont);
+  masm->AdvanceCurrentPosition(skip_distance);
+  masm->GoTo(&again);
+  masm->Bind(&cont);
+}
+
+
+/* Code generation for choice nodes.
+ *
+ * We generate quick checks that do a mask and compare to eliminate a
+ * choice.  If the quick check succeeds then it jumps to the continuation to
+ * do slow checks and check subsequent nodes.  If it fails (the common case)
+ * it falls through to the next choice.
+ *
+ * Here is the desired flow graph.  Nodes directly below each other imply
+ * fallthrough.  Alternatives 1 and 2 have quick checks.  Alternative
+ * 3 doesn't have a quick check so we have to call the slow check.
+ * Nodes are marked Qn for quick checks and Sn for slow checks.  The entire
+ * regexp continuation is generated directly after the Sn node, up to the
+ * next GoTo if we decide to reuse some already generated code.  Some
+ * nodes expect preload_characters to be preloaded into the current
+ * character register.  R nodes do this preloading.  Vertices are marked
+ * F for failures and S for success (possible success in the case of quick
+ * nodes).  L, V, < and > are used as arrow heads.
+ *
+ * ----------> R
+ *             |
+ *             V
+ *            Q1 -----> S1
+ *             |   S   /
+ *            F|      /
+ *             |    F/
+ *             |    /
+ *             |   R
+ *             |  /
+ *             V L
+ *            Q2 -----> S2
+ *             |   S   /
+ *            F|      /
+ *             |    F/
+ *             |    /
+ *             |   R
+ *             |  /
+ *             V L
+ *            S3
+ *             |
+ *            F|
+ *             |
+ *             R
+ *             |
+ * backtrack   V
+ * <----------Q4
+ *   \    F    |
+ *    \        |S
+ *     \   F   V
+ *      \-----S4
+ *
+ * For greedy loops we push the current position, then generate the code that
+ * eats the input specially in EmitGreedyLoop.  The other choice (the
+ * continuation) is generated by the normal code in EmitChoices, and steps back
+ * in the input to the starting position when it fails to match.  The loop code
+ * looks like this (U is the unwind code that steps back in the greedy loop).
+ *
+ *              _____
+ *             /     \
+ *             V     |
+ * ----------> S1    |
+ *            /|     |
+ *           / |S    |
+ *         F/  \_____/
+ *         /
+ *        |<-----
+ *        |      \
+ *        V       |S
+ *        Q2 ---> U----->backtrack
+ *        |  F   /
+ *       S|     /
+ *        V  F /
+ *        S2--/
+ */
+
+GreedyLoopState::GreedyLoopState(bool not_at_start) {
+  counter_backtrack_trace_.set_backtrack(&label_);
+  if (not_at_start) counter_backtrack_trace_.set_at_start(false);
+}
+
+
+void ChoiceNode::AssertGuardsMentionRegisters(Trace* trace) {
+#ifdef DEBUG
+  int choice_count = alternatives_->length();
+  for (int i = 0; i < choice_count - 1; i++) {
+    GuardedAlternative alternative = alternatives_->at(i);
+    ZoneList<Guard*>* guards = alternative.guards();
+    int guard_count = (guards == NULL) ? 0 : guards->length();
+    for (int j = 0; j < guard_count; j++) {
+      DCHECK(!trace->mentions_reg(guards->at(j)->reg()));
+    }
+  }
+#endif
+}
+
+
+void ChoiceNode::SetUpPreLoad(RegExpCompiler* compiler,
+                              Trace* current_trace,
+                              PreloadState* state) {
+    if (state->eats_at_least_ == PreloadState::kEatsAtLeastNotYetInitialized) {
+      // Save some time by looking at most one machine word ahead.
+      state->eats_at_least_ =
+          EatsAtLeast(compiler->one_byte() ? 4 : 2, kRecursionBudget,
+                      current_trace->at_start() == Trace::FALSE_VALUE);
+    }
+    state->preload_characters_ =
+        CalculatePreloadCharacters(compiler, state->eats_at_least_);
+
+    state->preload_is_current_ =
+        (current_trace->characters_preloaded() == state->preload_characters_);
+    state->preload_has_checked_bounds_ = state->preload_is_current_;
+}
+
+
+void ChoiceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  int choice_count = alternatives_->length();
+
+  AssertGuardsMentionRegisters(trace);
+
+  LimitResult limit_result = LimitVersions(compiler, trace);
+  if (limit_result == DONE) return;
+  DCHECK(limit_result == CONTINUE);
+
+  // For loop nodes we already flushed (see LoopChoiceNode::Emit), but for
+  // other choice nodes we only flush if we are out of code size budget.
+  if (trace->flush_budget() == 0 && trace->actions() != NULL) {
+    trace->Flush(compiler, this);
+    return;
+  }
+
+  RecursionCheck rc(compiler);
+
+  PreloadState preload;
+  preload.init();
+  GreedyLoopState greedy_loop_state(not_at_start());
+
+  int text_length = GreedyLoopTextLengthForAlternative(&alternatives_->at(0));
+  AlternativeGenerationList alt_gens(choice_count, zone());
+
+  if (choice_count > 1 && text_length != kNodeIsTooComplexForGreedyLoops) {
+    trace = EmitGreedyLoop(compiler,
+                           trace,
+                           &alt_gens,
+                           &preload,
+                           &greedy_loop_state,
+                           text_length);
+  } else {
+    // TODO(erikcorry): Delete this.  We don't need this label, but it makes us
+    // match the traces produced pre-cleanup.
+    Label second_choice;
+    compiler->macro_assembler()->Bind(&second_choice);
+
+    preload.eats_at_least_ = EmitOptimizedUnanchoredSearch(compiler, trace);
+
+    EmitChoices(compiler,
+                &alt_gens,
+                0,
+                trace,
+                &preload);
+  }
+
+  // At this point we need to generate slow checks for the alternatives where
+  // the quick check was inlined.  We can recognize these because the associated
+  // label was bound.
+  int new_flush_budget = trace->flush_budget() / choice_count;
+  for (int i = 0; i < choice_count; i++) {
+    AlternativeGeneration* alt_gen = alt_gens.at(i);
+    Trace new_trace(*trace);
+    // If there are actions to be flushed we have to limit how many times
+    // they are flushed.  Take the budget of the parent trace and distribute
+    // it fairly amongst the children.
+    if (new_trace.actions() != NULL) {
+      new_trace.set_flush_budget(new_flush_budget);
+    }
+    bool next_expects_preload =
+        i == choice_count - 1 ? false : alt_gens.at(i + 1)->expects_preload;
+    EmitOutOfLineContinuation(compiler,
+                              &new_trace,
+                              alternatives_->at(i),
+                              alt_gen,
+                              preload.preload_characters_,
+                              next_expects_preload);
+  }
+}
+
+
+Trace* ChoiceNode::EmitGreedyLoop(RegExpCompiler* compiler,
+                                  Trace* trace,
+                                  AlternativeGenerationList* alt_gens,
+                                  PreloadState* preload,
+                                  GreedyLoopState* greedy_loop_state,
+                                  int text_length) {
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  // Here we have special handling for greedy loops containing only text nodes
+  // and other simple nodes.  These are handled by pushing the current
+  // position on the stack and then incrementing the current position each
+  // time around the switch.  On backtrack we decrement the current position
+  // and check it against the pushed value.  This avoids pushing backtrack
+  // information for each iteration of the loop, which could take up a lot of
+  // space.
+  DCHECK(trace->stop_node() == NULL);
+  macro_assembler->PushCurrentPosition();
+  Label greedy_match_failed;
+  Trace greedy_match_trace;
+  if (not_at_start()) greedy_match_trace.set_at_start(false);
+  greedy_match_trace.set_backtrack(&greedy_match_failed);
+  Label loop_label;
+  macro_assembler->Bind(&loop_label);
+  greedy_match_trace.set_stop_node(this);
+  greedy_match_trace.set_loop_label(&loop_label);
+  alternatives_->at(0).node()->Emit(compiler, &greedy_match_trace);
+  macro_assembler->Bind(&greedy_match_failed);
+
+  Label second_choice;  // For use in greedy matches.
+  macro_assembler->Bind(&second_choice);
+
+  Trace* new_trace = greedy_loop_state->counter_backtrack_trace();
+
+  EmitChoices(compiler,
+              alt_gens,
+              1,
+              new_trace,
+              preload);
+
+  macro_assembler->Bind(greedy_loop_state->label());
+  // If we have unwound to the bottom then backtrack.
+  macro_assembler->CheckGreedyLoop(trace->backtrack());
+  // Otherwise try the second priority at an earlier position.
+  macro_assembler->AdvanceCurrentPosition(-text_length);
+  macro_assembler->GoTo(&second_choice);
+  return new_trace;
+}
+
+int ChoiceNode::EmitOptimizedUnanchoredSearch(RegExpCompiler* compiler,
+                                              Trace* trace) {
+  int eats_at_least = PreloadState::kEatsAtLeastNotYetInitialized;
+  if (alternatives_->length() != 2) return eats_at_least;
+
+  GuardedAlternative alt1 = alternatives_->at(1);
+  if (alt1.guards() != NULL && alt1.guards()->length() != 0) {
+    return eats_at_least;
+  }
+  RegExpNode* eats_anything_node = alt1.node();
+  if (eats_anything_node->GetSuccessorOfOmnivorousTextNode(compiler) != this) {
+    return eats_at_least;
+  }
+
+  // Really we should be creating a new trace when we execute this function,
+  // but there is no need, because the code it generates cannot backtrack, and
+  // we always arrive here with a trivial trace (since it's the entry to a
+  // loop.  That also implies that there are no preloaded characters, which is
+  // good, because it means we won't be violating any assumptions by
+  // overwriting those characters with new load instructions.
+  DCHECK(trace->is_trivial());
+
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  // At this point we know that we are at a non-greedy loop that will eat
+  // any character one at a time.  Any non-anchored regexp has such a
+  // loop prepended to it in order to find where it starts.  We look for
+  // a pattern of the form ...abc... where we can look 6 characters ahead
+  // and step forwards 3 if the character is not one of abc.  Abc need
+  // not be atoms, they can be any reasonably limited character class or
+  // small alternation.
+  BoyerMooreLookahead* bm = bm_info(false);
+  if (bm == NULL) {
+    eats_at_least = Min(kMaxLookaheadForBoyerMoore,
+                        EatsAtLeast(kMaxLookaheadForBoyerMoore,
+                                    kRecursionBudget,
+                                    false));
+    if (eats_at_least >= 1) {
+      bm = new(zone()) BoyerMooreLookahead(eats_at_least,
+                                           compiler,
+                                           zone());
+      GuardedAlternative alt0 = alternatives_->at(0);
+      alt0.node()->FillInBMInfo(0, kRecursionBudget, bm, false);
+    }
+  }
+  if (bm != NULL) {
+    bm->EmitSkipInstructions(macro_assembler);
+  }
+  return eats_at_least;
+}
+
+
+void ChoiceNode::EmitChoices(RegExpCompiler* compiler,
+                             AlternativeGenerationList* alt_gens,
+                             int first_choice,
+                             Trace* trace,
+                             PreloadState* preload) {
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  SetUpPreLoad(compiler, trace, preload);
+
+  // For now we just call all choices one after the other.  The idea ultimately
+  // is to use the Dispatch table to try only the relevant ones.
+  int choice_count = alternatives_->length();
+
+  int new_flush_budget = trace->flush_budget() / choice_count;
+
+  for (int i = first_choice; i < choice_count; i++) {
+    bool is_last = i == choice_count - 1;
+    bool fall_through_on_failure = !is_last;
+    GuardedAlternative alternative = alternatives_->at(i);
+    AlternativeGeneration* alt_gen = alt_gens->at(i);
+    alt_gen->quick_check_details.set_characters(preload->preload_characters_);
+    ZoneList<Guard*>* guards = alternative.guards();
+    int guard_count = (guards == NULL) ? 0 : guards->length();
+    Trace new_trace(*trace);
+    new_trace.set_characters_preloaded(preload->preload_is_current_ ?
+                                         preload->preload_characters_ :
+                                         0);
+    if (preload->preload_has_checked_bounds_) {
+      new_trace.set_bound_checked_up_to(preload->preload_characters_);
+    }
+    new_trace.quick_check_performed()->Clear();
+    if (not_at_start_) new_trace.set_at_start(Trace::FALSE_VALUE);
+    if (!is_last) {
+      new_trace.set_backtrack(&alt_gen->after);
+    }
+    alt_gen->expects_preload = preload->preload_is_current_;
+    bool generate_full_check_inline = false;
+    if (FLAG_regexp_optimization &&
+        try_to_emit_quick_check_for_alternative(i == 0) &&
+        alternative.node()->EmitQuickCheck(compiler,
+                                           trace,
+                                           &new_trace,
+                                           preload->preload_has_checked_bounds_,
+                                           &alt_gen->possible_success,
+                                           &alt_gen->quick_check_details,
+                                           fall_through_on_failure)) {
+      // Quick check was generated for this choice.
+      preload->preload_is_current_ = true;
+      preload->preload_has_checked_bounds_ = true;
+      // If we generated the quick check to fall through on possible success,
+      // we now need to generate the full check inline.
+      if (!fall_through_on_failure) {
+        macro_assembler->Bind(&alt_gen->possible_success);
+        new_trace.set_quick_check_performed(&alt_gen->quick_check_details);
+        new_trace.set_characters_preloaded(preload->preload_characters_);
+        new_trace.set_bound_checked_up_to(preload->preload_characters_);
+        generate_full_check_inline = true;
+      }
+    } else if (alt_gen->quick_check_details.cannot_match()) {
+      if (!fall_through_on_failure) {
+        macro_assembler->GoTo(trace->backtrack());
+      }
+      continue;
+    } else {
+      // No quick check was generated.  Put the full code here.
+      // If this is not the first choice then there could be slow checks from
+      // previous cases that go here when they fail.  There's no reason to
+      // insist that they preload characters since the slow check we are about
+      // to generate probably can't use it.
+      if (i != first_choice) {
+        alt_gen->expects_preload = false;
+        new_trace.InvalidateCurrentCharacter();
+      }
+      generate_full_check_inline = true;
+    }
+    if (generate_full_check_inline) {
+      if (new_trace.actions() != NULL) {
+        new_trace.set_flush_budget(new_flush_budget);
+      }
+      for (int j = 0; j < guard_count; j++) {
+        GenerateGuard(macro_assembler, guards->at(j), &new_trace);
+      }
+      alternative.node()->Emit(compiler, &new_trace);
+      preload->preload_is_current_ = false;
+    }
+    macro_assembler->Bind(&alt_gen->after);
+  }
+}
+
+
+void ChoiceNode::EmitOutOfLineContinuation(RegExpCompiler* compiler,
+                                           Trace* trace,
+                                           GuardedAlternative alternative,
+                                           AlternativeGeneration* alt_gen,
+                                           int preload_characters,
+                                           bool next_expects_preload) {
+  if (!alt_gen->possible_success.is_linked()) return;
+
+  RegExpMacroAssembler* macro_assembler = compiler->macro_assembler();
+  macro_assembler->Bind(&alt_gen->possible_success);
+  Trace out_of_line_trace(*trace);
+  out_of_line_trace.set_characters_preloaded(preload_characters);
+  out_of_line_trace.set_quick_check_performed(&alt_gen->quick_check_details);
+  if (not_at_start_) out_of_line_trace.set_at_start(Trace::FALSE_VALUE);
+  ZoneList<Guard*>* guards = alternative.guards();
+  int guard_count = (guards == NULL) ? 0 : guards->length();
+  if (next_expects_preload) {
+    Label reload_current_char;
+    out_of_line_trace.set_backtrack(&reload_current_char);
+    for (int j = 0; j < guard_count; j++) {
+      GenerateGuard(macro_assembler, guards->at(j), &out_of_line_trace);
+    }
+    alternative.node()->Emit(compiler, &out_of_line_trace);
+    macro_assembler->Bind(&reload_current_char);
+    // Reload the current character, since the next quick check expects that.
+    // We don't need to check bounds here because we only get into this
+    // code through a quick check which already did the checked load.
+    macro_assembler->LoadCurrentCharacter(trace->cp_offset(),
+                                          NULL,
+                                          false,
+                                          preload_characters);
+    macro_assembler->GoTo(&(alt_gen->after));
+  } else {
+    out_of_line_trace.set_backtrack(&(alt_gen->after));
+    for (int j = 0; j < guard_count; j++) {
+      GenerateGuard(macro_assembler, guards->at(j), &out_of_line_trace);
+    }
+    alternative.node()->Emit(compiler, &out_of_line_trace);
+  }
+}
+
+
+void ActionNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  LimitResult limit_result = LimitVersions(compiler, trace);
+  if (limit_result == DONE) return;
+  DCHECK(limit_result == CONTINUE);
+
+  RecursionCheck rc(compiler);
+
+  switch (action_type_) {
+    case STORE_POSITION: {
+      Trace::DeferredCapture
+          new_capture(data_.u_position_register.reg,
+                      data_.u_position_register.is_capture,
+                      trace);
+      Trace new_trace = *trace;
+      new_trace.add_action(&new_capture);
+      on_success()->Emit(compiler, &new_trace);
+      break;
+    }
+    case INCREMENT_REGISTER: {
+      Trace::DeferredIncrementRegister
+          new_increment(data_.u_increment_register.reg);
+      Trace new_trace = *trace;
+      new_trace.add_action(&new_increment);
+      on_success()->Emit(compiler, &new_trace);
+      break;
+    }
+    case SET_REGISTER: {
+      Trace::DeferredSetRegister
+          new_set(data_.u_store_register.reg, data_.u_store_register.value);
+      Trace new_trace = *trace;
+      new_trace.add_action(&new_set);
+      on_success()->Emit(compiler, &new_trace);
+      break;
+    }
+    case CLEAR_CAPTURES: {
+      Trace::DeferredClearCaptures
+        new_capture(Interval(data_.u_clear_captures.range_from,
+                             data_.u_clear_captures.range_to));
+      Trace new_trace = *trace;
+      new_trace.add_action(&new_capture);
+      on_success()->Emit(compiler, &new_trace);
+      break;
+    }
+    case BEGIN_SUBMATCH:
+      if (!trace->is_trivial()) {
+        trace->Flush(compiler, this);
+      } else {
+        assembler->WriteCurrentPositionToRegister(
+            data_.u_submatch.current_position_register, 0);
+        assembler->WriteStackPointerToRegister(
+            data_.u_submatch.stack_pointer_register);
+        on_success()->Emit(compiler, trace);
+      }
+      break;
+    case EMPTY_MATCH_CHECK: {
+      int start_pos_reg = data_.u_empty_match_check.start_register;
+      int stored_pos = 0;
+      int rep_reg = data_.u_empty_match_check.repetition_register;
+      bool has_minimum = (rep_reg != RegExpCompiler::kNoRegister);
+      bool know_dist = trace->GetStoredPosition(start_pos_reg, &stored_pos);
+      if (know_dist && !has_minimum && stored_pos == trace->cp_offset()) {
+        // If we know we haven't advanced and there is no minimum we
+        // can just backtrack immediately.
+        assembler->GoTo(trace->backtrack());
+      } else if (know_dist && stored_pos < trace->cp_offset()) {
+        // If we know we've advanced we can generate the continuation
+        // immediately.
+        on_success()->Emit(compiler, trace);
+      } else if (!trace->is_trivial()) {
+        trace->Flush(compiler, this);
+      } else {
+        Label skip_empty_check;
+        // If we have a minimum number of repetitions we check the current
+        // number first and skip the empty check if it's not enough.
+        if (has_minimum) {
+          int limit = data_.u_empty_match_check.repetition_limit;
+          assembler->IfRegisterLT(rep_reg, limit, &skip_empty_check);
+        }
+        // If the match is empty we bail out, otherwise we fall through
+        // to the on-success continuation.
+        assembler->IfRegisterEqPos(data_.u_empty_match_check.start_register,
+                                   trace->backtrack());
+        assembler->Bind(&skip_empty_check);
+        on_success()->Emit(compiler, trace);
+      }
+      break;
+    }
+    case POSITIVE_SUBMATCH_SUCCESS: {
+      if (!trace->is_trivial()) {
+        trace->Flush(compiler, this);
+        return;
+      }
+      assembler->ReadCurrentPositionFromRegister(
+          data_.u_submatch.current_position_register);
+      assembler->ReadStackPointerFromRegister(
+          data_.u_submatch.stack_pointer_register);
+      int clear_register_count = data_.u_submatch.clear_register_count;
+      if (clear_register_count == 0) {
+        on_success()->Emit(compiler, trace);
+        return;
+      }
+      int clear_registers_from = data_.u_submatch.clear_register_from;
+      Label clear_registers_backtrack;
+      Trace new_trace = *trace;
+      new_trace.set_backtrack(&clear_registers_backtrack);
+      on_success()->Emit(compiler, &new_trace);
+
+      assembler->Bind(&clear_registers_backtrack);
+      int clear_registers_to = clear_registers_from + clear_register_count - 1;
+      assembler->ClearRegisters(clear_registers_from, clear_registers_to);
+
+      DCHECK(trace->backtrack() == NULL);
+      assembler->Backtrack();
+      return;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+void BackReferenceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
+  RegExpMacroAssembler* assembler = compiler->macro_assembler();
+  if (!trace->is_trivial()) {
+    trace->Flush(compiler, this);
+    return;
+  }
+
+  LimitResult limit_result = LimitVersions(compiler, trace);
+  if (limit_result == DONE) return;
+  DCHECK(limit_result == CONTINUE);
+
+  RecursionCheck rc(compiler);
+
+  DCHECK_EQ(start_reg_ + 1, end_reg_);
+  if (compiler->ignore_case()) {
+    assembler->CheckNotBackReferenceIgnoreCase(start_reg_,
+                                               trace->backtrack());
+  } else {
+    assembler->CheckNotBackReference(start_reg_, trace->backtrack());
+  }
+  on_success()->Emit(compiler, trace);
+}
+
+
+// -------------------------------------------------------------------
+// Dot/dotty output
+
+
+#ifdef DEBUG
+
+
+class DotPrinter: public NodeVisitor {
+ public:
+  DotPrinter(OStream& os, bool ignore_case)  // NOLINT
+      : os_(os),
+        ignore_case_(ignore_case) {}
+  void PrintNode(const char* label, RegExpNode* node);
+  void Visit(RegExpNode* node);
+  void PrintAttributes(RegExpNode* from);
+  void PrintOnFailure(RegExpNode* from, RegExpNode* to);
+#define DECLARE_VISIT(Type)                                          \
+  virtual void Visit##Type(Type##Node* that);
+FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+#undef DECLARE_VISIT
+ private:
+  OStream& os_;
+  bool ignore_case_;
+};
+
+
+void DotPrinter::PrintNode(const char* label, RegExpNode* node) {
+  os_ << "digraph G {\n  graph [label=\"";
+  for (int i = 0; label[i]; i++) {
+    switch (label[i]) {
+      case '\\':
+        os_ << "\\\\";
+        break;
+      case '"':
+        os_ << "\"";
+        break;
+      default:
+        os_ << label[i];
+        break;
+    }
+  }
+  os_ << "\"];\n";
+  Visit(node);
+  os_ << "}" << endl;
+}
+
+
+void DotPrinter::Visit(RegExpNode* node) {
+  if (node->info()->visited) return;
+  node->info()->visited = true;
+  node->Accept(this);
+}
+
+
+void DotPrinter::PrintOnFailure(RegExpNode* from, RegExpNode* on_failure) {
+  os_ << "  n" << from << " -> n" << on_failure << " [style=dotted];\n";
+  Visit(on_failure);
+}
+
+
+class TableEntryBodyPrinter {
+ public:
+  TableEntryBodyPrinter(OStream& os, ChoiceNode* choice)  // NOLINT
+      : os_(os),
+        choice_(choice) {}
+  void Call(uc16 from, DispatchTable::Entry entry) {
+    OutSet* out_set = entry.out_set();
+    for (unsigned i = 0; i < OutSet::kFirstLimit; i++) {
+      if (out_set->Get(i)) {
+        os_ << "    n" << choice() << ":s" << from << "o" << i << " -> n"
+            << choice()->alternatives()->at(i).node() << ";\n";
+      }
+    }
+  }
+ private:
+  ChoiceNode* choice() { return choice_; }
+  OStream& os_;
+  ChoiceNode* choice_;
+};
+
+
+class TableEntryHeaderPrinter {
+ public:
+  explicit TableEntryHeaderPrinter(OStream& os)  // NOLINT
+      : first_(true),
+        os_(os) {}
+  void Call(uc16 from, DispatchTable::Entry entry) {
+    if (first_) {
+      first_ = false;
+    } else {
+      os_ << "|";
+    }
+    os_ << "{\\" << AsUC16(from) << "-\\" << AsUC16(entry.to()) << "|{";
+    OutSet* out_set = entry.out_set();
+    int priority = 0;
+    for (unsigned i = 0; i < OutSet::kFirstLimit; i++) {
+      if (out_set->Get(i)) {
+        if (priority > 0) os_ << "|";
+        os_ << "<s" << from << "o" << i << "> " << priority;
+        priority++;
+      }
+    }
+    os_ << "}}";
+  }
+
+ private:
+  bool first_;
+  OStream& os_;
+};
+
+
+class AttributePrinter {
+ public:
+  explicit AttributePrinter(OStream& os)  // NOLINT
+      : os_(os),
+        first_(true) {}
+  void PrintSeparator() {
+    if (first_) {
+      first_ = false;
+    } else {
+      os_ << "|";
+    }
+  }
+  void PrintBit(const char* name, bool value) {
+    if (!value) return;
+    PrintSeparator();
+    os_ << "{" << name << "}";
+  }
+  void PrintPositive(const char* name, int value) {
+    if (value < 0) return;
+    PrintSeparator();
+    os_ << "{" << name << "|" << value << "}";
+  }
+
+ private:
+  OStream& os_;
+  bool first_;
+};
+
+
+void DotPrinter::PrintAttributes(RegExpNode* that) {
+  os_ << "  a" << that << " [shape=Mrecord, color=grey, fontcolor=grey, "
+      << "margin=0.1, fontsize=10, label=\"{";
+  AttributePrinter printer(os_);
+  NodeInfo* info = that->info();
+  printer.PrintBit("NI", info->follows_newline_interest);
+  printer.PrintBit("WI", info->follows_word_interest);
+  printer.PrintBit("SI", info->follows_start_interest);
+  Label* label = that->label();
+  if (label->is_bound())
+    printer.PrintPositive("@", label->pos());
+  os_ << "}\"];\n"
+      << "  a" << that << " -> n" << that
+      << " [style=dashed, color=grey, arrowhead=none];\n";
+}
+
+
+static const bool kPrintDispatchTable = false;
+void DotPrinter::VisitChoice(ChoiceNode* that) {
+  if (kPrintDispatchTable) {
+    os_ << "  n" << that << " [shape=Mrecord, label=\"";
+    TableEntryHeaderPrinter header_printer(os_);
+    that->GetTable(ignore_case_)->ForEach(&header_printer);
+    os_ << "\"]\n";
+    PrintAttributes(that);
+    TableEntryBodyPrinter body_printer(os_, that);
+    that->GetTable(ignore_case_)->ForEach(&body_printer);
+  } else {
+    os_ << "  n" << that << " [shape=Mrecord, label=\"?\"];\n";
+    for (int i = 0; i < that->alternatives()->length(); i++) {
+      GuardedAlternative alt = that->alternatives()->at(i);
+      os_ << "  n" << that << " -> n" << alt.node();
+    }
+  }
+  for (int i = 0; i < that->alternatives()->length(); i++) {
+    GuardedAlternative alt = that->alternatives()->at(i);
+    alt.node()->Accept(this);
+  }
+}
+
+
+void DotPrinter::VisitText(TextNode* that) {
+  Zone* zone = that->zone();
+  os_ << "  n" << that << " [label=\"";
+  for (int i = 0; i < that->elements()->length(); i++) {
+    if (i > 0) os_ << " ";
+    TextElement elm = that->elements()->at(i);
+    switch (elm.text_type()) {
+      case TextElement::ATOM: {
+        Vector<const uc16> data = elm.atom()->data();
+        for (int i = 0; i < data.length(); i++) {
+          os_ << static_cast<char>(data[i]);
+        }
+        break;
+      }
+      case TextElement::CHAR_CLASS: {
+        RegExpCharacterClass* node = elm.char_class();
+        os_ << "[";
+        if (node->is_negated()) os_ << "^";
+        for (int j = 0; j < node->ranges(zone)->length(); j++) {
+          CharacterRange range = node->ranges(zone)->at(j);
+          os_ << AsUC16(range.from()) << "-" << AsUC16(range.to());
+        }
+        os_ << "]";
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+  os_ << "\", shape=box, peripheries=2];\n";
+  PrintAttributes(that);
+  os_ << "  n" << that << " -> n" << that->on_success() << ";\n";
+  Visit(that->on_success());
+}
+
+
+void DotPrinter::VisitBackReference(BackReferenceNode* that) {
+  os_ << "  n" << that << " [label=\"$" << that->start_register() << "..$"
+      << that->end_register() << "\", shape=doubleoctagon];\n";
+  PrintAttributes(that);
+  os_ << "  n" << that << " -> n" << that->on_success() << ";\n";
+  Visit(that->on_success());
+}
+
+
+void DotPrinter::VisitEnd(EndNode* that) {
+  os_ << "  n" << that << " [style=bold, shape=point];\n";
+  PrintAttributes(that);
+}
+
+
+void DotPrinter::VisitAssertion(AssertionNode* that) {
+  os_ << "  n" << that << " [";
+  switch (that->assertion_type()) {
+    case AssertionNode::AT_END:
+      os_ << "label=\"$\", shape=septagon";
+      break;
+    case AssertionNode::AT_START:
+      os_ << "label=\"^\", shape=septagon";
+      break;
+    case AssertionNode::AT_BOUNDARY:
+      os_ << "label=\"\\b\", shape=septagon";
+      break;
+    case AssertionNode::AT_NON_BOUNDARY:
+      os_ << "label=\"\\B\", shape=septagon";
+      break;
+    case AssertionNode::AFTER_NEWLINE:
+      os_ << "label=\"(?<=\\n)\", shape=septagon";
+      break;
+  }
+  os_ << "];\n";
+  PrintAttributes(that);
+  RegExpNode* successor = that->on_success();
+  os_ << "  n" << that << " -> n" << successor << ";\n";
+  Visit(successor);
+}
+
+
+void DotPrinter::VisitAction(ActionNode* that) {
+  os_ << "  n" << that << " [";
+  switch (that->action_type_) {
+    case ActionNode::SET_REGISTER:
+      os_ << "label=\"$" << that->data_.u_store_register.reg
+          << ":=" << that->data_.u_store_register.value << "\", shape=octagon";
+      break;
+    case ActionNode::INCREMENT_REGISTER:
+      os_ << "label=\"$" << that->data_.u_increment_register.reg
+          << "++\", shape=octagon";
+      break;
+    case ActionNode::STORE_POSITION:
+      os_ << "label=\"$" << that->data_.u_position_register.reg
+          << ":=$pos\", shape=octagon";
+      break;
+    case ActionNode::BEGIN_SUBMATCH:
+      os_ << "label=\"$" << that->data_.u_submatch.current_position_register
+          << ":=$pos,begin\", shape=septagon";
+      break;
+    case ActionNode::POSITIVE_SUBMATCH_SUCCESS:
+      os_ << "label=\"escape\", shape=septagon";
+      break;
+    case ActionNode::EMPTY_MATCH_CHECK:
+      os_ << "label=\"$" << that->data_.u_empty_match_check.start_register
+          << "=$pos?,$" << that->data_.u_empty_match_check.repetition_register
+          << "<" << that->data_.u_empty_match_check.repetition_limit
+          << "?\", shape=septagon";
+      break;
+    case ActionNode::CLEAR_CAPTURES: {
+      os_ << "label=\"clear $" << that->data_.u_clear_captures.range_from
+          << " to $" << that->data_.u_clear_captures.range_to
+          << "\", shape=septagon";
+      break;
+    }
+  }
+  os_ << "];\n";
+  PrintAttributes(that);
+  RegExpNode* successor = that->on_success();
+  os_ << "  n" << that << " -> n" << successor << ";\n";
+  Visit(successor);
+}
+
+
+class DispatchTableDumper {
+ public:
+  explicit DispatchTableDumper(OStream& os) : os_(os) {}
+  void Call(uc16 key, DispatchTable::Entry entry);
+ private:
+  OStream& os_;
+};
+
+
+void DispatchTableDumper::Call(uc16 key, DispatchTable::Entry entry) {
+  os_ << "[" << AsUC16(key) << "-" << AsUC16(entry.to()) << "]: {";
+  OutSet* set = entry.out_set();
+  bool first = true;
+  for (unsigned i = 0; i < OutSet::kFirstLimit; i++) {
+    if (set->Get(i)) {
+      if (first) {
+        first = false;
+      } else {
+        os_ << ", ";
+      }
+      os_ << i;
+    }
+  }
+  os_ << "}\n";
+}
+
+
+void DispatchTable::Dump() {
+  OFStream os(stderr);
+  DispatchTableDumper dumper(os);
+  tree()->ForEach(&dumper);
+}
+
+
+void RegExpEngine::DotPrint(const char* label,
+                            RegExpNode* node,
+                            bool ignore_case) {
+  OFStream os(stdout);
+  DotPrinter printer(os, ignore_case);
+  printer.PrintNode(label, node);
+}
+
+
+#endif  // DEBUG
+
+
+// -------------------------------------------------------------------
+// Tree to graph conversion
+
+RegExpNode* RegExpAtom::ToNode(RegExpCompiler* compiler,
+                               RegExpNode* on_success) {
+  ZoneList<TextElement>* elms =
+      new(compiler->zone()) ZoneList<TextElement>(1, compiler->zone());
+  elms->Add(TextElement::Atom(this), compiler->zone());
+  return new(compiler->zone()) TextNode(elms, on_success);
+}
+
+
+RegExpNode* RegExpText::ToNode(RegExpCompiler* compiler,
+                               RegExpNode* on_success) {
+  return new(compiler->zone()) TextNode(elements(), on_success);
+}
+
+
+static bool CompareInverseRanges(ZoneList<CharacterRange>* ranges,
+                                 const int* special_class,
+                                 int length) {
+  length--;  // Remove final 0x10000.
+  DCHECK(special_class[length] == 0x10000);
+  DCHECK(ranges->length() != 0);
+  DCHECK(length != 0);
+  DCHECK(special_class[0] != 0);
+  if (ranges->length() != (length >> 1) + 1) {
+    return false;
+  }
+  CharacterRange range = ranges->at(0);
+  if (range.from() != 0) {
+    return false;
+  }
+  for (int i = 0; i < length; i += 2) {
+    if (special_class[i] != (range.to() + 1)) {
+      return false;
+    }
+    range = ranges->at((i >> 1) + 1);
+    if (special_class[i+1] != range.from()) {
+      return false;
+    }
+  }
+  if (range.to() != 0xffff) {
+    return false;
+  }
+  return true;
+}
+
+
+static bool CompareRanges(ZoneList<CharacterRange>* ranges,
+                          const int* special_class,
+                          int length) {
+  length--;  // Remove final 0x10000.
+  DCHECK(special_class[length] == 0x10000);
+  if (ranges->length() * 2 != length) {
+    return false;
+  }
+  for (int i = 0; i < length; i += 2) {
+    CharacterRange range = ranges->at(i >> 1);
+    if (range.from() != special_class[i] ||
+        range.to() != special_class[i + 1] - 1) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool RegExpCharacterClass::is_standard(Zone* zone) {
+  // TODO(lrn): Remove need for this function, by not throwing away information
+  // along the way.
+  if (is_negated_) {
+    return false;
+  }
+  if (set_.is_standard()) {
+    return true;
+  }
+  if (CompareRanges(set_.ranges(zone), kSpaceRanges, kSpaceRangeCount)) {
+    set_.set_standard_set_type('s');
+    return true;
+  }
+  if (CompareInverseRanges(set_.ranges(zone), kSpaceRanges, kSpaceRangeCount)) {
+    set_.set_standard_set_type('S');
+    return true;
+  }
+  if (CompareInverseRanges(set_.ranges(zone),
+                           kLineTerminatorRanges,
+                           kLineTerminatorRangeCount)) {
+    set_.set_standard_set_type('.');
+    return true;
+  }
+  if (CompareRanges(set_.ranges(zone),
+                    kLineTerminatorRanges,
+                    kLineTerminatorRangeCount)) {
+    set_.set_standard_set_type('n');
+    return true;
+  }
+  if (CompareRanges(set_.ranges(zone), kWordRanges, kWordRangeCount)) {
+    set_.set_standard_set_type('w');
+    return true;
+  }
+  if (CompareInverseRanges(set_.ranges(zone), kWordRanges, kWordRangeCount)) {
+    set_.set_standard_set_type('W');
+    return true;
+  }
+  return false;
+}
+
+
+RegExpNode* RegExpCharacterClass::ToNode(RegExpCompiler* compiler,
+                                         RegExpNode* on_success) {
+  return new(compiler->zone()) TextNode(this, on_success);
+}
+
+
+RegExpNode* RegExpDisjunction::ToNode(RegExpCompiler* compiler,
+                                      RegExpNode* on_success) {
+  ZoneList<RegExpTree*>* alternatives = this->alternatives();
+  int length = alternatives->length();
+  ChoiceNode* result =
+      new(compiler->zone()) ChoiceNode(length, compiler->zone());
+  for (int i = 0; i < length; i++) {
+    GuardedAlternative alternative(alternatives->at(i)->ToNode(compiler,
+                                                               on_success));
+    result->AddAlternative(alternative);
+  }
+  return result;
+}
+
+
+RegExpNode* RegExpQuantifier::ToNode(RegExpCompiler* compiler,
+                                     RegExpNode* on_success) {
+  return ToNode(min(),
+                max(),
+                is_greedy(),
+                body(),
+                compiler,
+                on_success);
+}
+
+
+// Scoped object to keep track of how much we unroll quantifier loops in the
+// regexp graph generator.
+class RegExpExpansionLimiter {
+ public:
+  static const int kMaxExpansionFactor = 6;
+  RegExpExpansionLimiter(RegExpCompiler* compiler, int factor)
+      : compiler_(compiler),
+        saved_expansion_factor_(compiler->current_expansion_factor()),
+        ok_to_expand_(saved_expansion_factor_ <= kMaxExpansionFactor) {
+    DCHECK(factor > 0);
+    if (ok_to_expand_) {
+      if (factor > kMaxExpansionFactor) {
+        // Avoid integer overflow of the current expansion factor.
+        ok_to_expand_ = false;
+        compiler->set_current_expansion_factor(kMaxExpansionFactor + 1);
+      } else {
+        int new_factor = saved_expansion_factor_ * factor;
+        ok_to_expand_ = (new_factor <= kMaxExpansionFactor);
+        compiler->set_current_expansion_factor(new_factor);
+      }
+    }
+  }
+
+  ~RegExpExpansionLimiter() {
+    compiler_->set_current_expansion_factor(saved_expansion_factor_);
+  }
+
+  bool ok_to_expand() { return ok_to_expand_; }
+
+ private:
+  RegExpCompiler* compiler_;
+  int saved_expansion_factor_;
+  bool ok_to_expand_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpExpansionLimiter);
+};
+
+
+RegExpNode* RegExpQuantifier::ToNode(int min,
+                                     int max,
+                                     bool is_greedy,
+                                     RegExpTree* body,
+                                     RegExpCompiler* compiler,
+                                     RegExpNode* on_success,
+                                     bool not_at_start) {
+  // x{f, t} becomes this:
+  //
+  //             (r++)<-.
+  //               |     `
+  //               |     (x)
+  //               v     ^
+  //      (r=0)-->(?)---/ [if r < t]
+  //               |
+  //   [if r >= f] \----> ...
+  //
+
+  // 15.10.2.5 RepeatMatcher algorithm.
+  // The parser has already eliminated the case where max is 0.  In the case
+  // where max_match is zero the parser has removed the quantifier if min was
+  // > 0 and removed the atom if min was 0.  See AddQuantifierToAtom.
+
+  // If we know that we cannot match zero length then things are a little
+  // simpler since we don't need to make the special zero length match check
+  // from step 2.1.  If the min and max are small we can unroll a little in
+  // this case.
+  static const int kMaxUnrolledMinMatches = 3;  // Unroll (foo)+ and (foo){3,}
+  static const int kMaxUnrolledMaxMatches = 3;  // Unroll (foo)? and (foo){x,3}
+  if (max == 0) return on_success;  // This can happen due to recursion.
+  bool body_can_be_empty = (body->min_match() == 0);
+  int body_start_reg = RegExpCompiler::kNoRegister;
+  Interval capture_registers = body->CaptureRegisters();
+  bool needs_capture_clearing = !capture_registers.is_empty();
+  Zone* zone = compiler->zone();
+
+  if (body_can_be_empty) {
+    body_start_reg = compiler->AllocateRegister();
+  } else if (FLAG_regexp_optimization && !needs_capture_clearing) {
+    // Only unroll if there are no captures and the body can't be
+    // empty.
+    {
+      RegExpExpansionLimiter limiter(
+          compiler, min + ((max != min) ? 1 : 0));
+      if (min > 0 && min <= kMaxUnrolledMinMatches && limiter.ok_to_expand()) {
+        int new_max = (max == kInfinity) ? max : max - min;
+        // Recurse once to get the loop or optional matches after the fixed
+        // ones.
+        RegExpNode* answer = ToNode(
+            0, new_max, is_greedy, body, compiler, on_success, true);
+        // Unroll the forced matches from 0 to min.  This can cause chains of
+        // TextNodes (which the parser does not generate).  These should be
+        // combined if it turns out they hinder good code generation.
+        for (int i = 0; i < min; i++) {
+          answer = body->ToNode(compiler, answer);
+        }
+        return answer;
+      }
+    }
+    if (max <= kMaxUnrolledMaxMatches && min == 0) {
+      DCHECK(max > 0);  // Due to the 'if' above.
+      RegExpExpansionLimiter limiter(compiler, max);
+      if (limiter.ok_to_expand()) {
+        // Unroll the optional matches up to max.
+        RegExpNode* answer = on_success;
+        for (int i = 0; i < max; i++) {
+          ChoiceNode* alternation = new(zone) ChoiceNode(2, zone);
+          if (is_greedy) {
+            alternation->AddAlternative(
+                GuardedAlternative(body->ToNode(compiler, answer)));
+            alternation->AddAlternative(GuardedAlternative(on_success));
+          } else {
+            alternation->AddAlternative(GuardedAlternative(on_success));
+            alternation->AddAlternative(
+                GuardedAlternative(body->ToNode(compiler, answer)));
+          }
+          answer = alternation;
+          if (not_at_start) alternation->set_not_at_start();
+        }
+        return answer;
+      }
+    }
+  }
+  bool has_min = min > 0;
+  bool has_max = max < RegExpTree::kInfinity;
+  bool needs_counter = has_min || has_max;
+  int reg_ctr = needs_counter
+      ? compiler->AllocateRegister()
+      : RegExpCompiler::kNoRegister;
+  LoopChoiceNode* center = new(zone) LoopChoiceNode(body->min_match() == 0,
+                                                    zone);
+  if (not_at_start) center->set_not_at_start();
+  RegExpNode* loop_return = needs_counter
+      ? static_cast<RegExpNode*>(ActionNode::IncrementRegister(reg_ctr, center))
+      : static_cast<RegExpNode*>(center);
+  if (body_can_be_empty) {
+    // If the body can be empty we need to check if it was and then
+    // backtrack.
+    loop_return = ActionNode::EmptyMatchCheck(body_start_reg,
+                                              reg_ctr,
+                                              min,
+                                              loop_return);
+  }
+  RegExpNode* body_node = body->ToNode(compiler, loop_return);
+  if (body_can_be_empty) {
+    // If the body can be empty we need to store the start position
+    // so we can bail out if it was empty.
+    body_node = ActionNode::StorePosition(body_start_reg, false, body_node);
+  }
+  if (needs_capture_clearing) {
+    // Before entering the body of this loop we need to clear captures.
+    body_node = ActionNode::ClearCaptures(capture_registers, body_node);
+  }
+  GuardedAlternative body_alt(body_node);
+  if (has_max) {
+    Guard* body_guard =
+        new(zone) Guard(reg_ctr, Guard::LT, max);
+    body_alt.AddGuard(body_guard, zone);
+  }
+  GuardedAlternative rest_alt(on_success);
+  if (has_min) {
+    Guard* rest_guard = new(compiler->zone()) Guard(reg_ctr, Guard::GEQ, min);
+    rest_alt.AddGuard(rest_guard, zone);
+  }
+  if (is_greedy) {
+    center->AddLoopAlternative(body_alt);
+    center->AddContinueAlternative(rest_alt);
+  } else {
+    center->AddContinueAlternative(rest_alt);
+    center->AddLoopAlternative(body_alt);
+  }
+  if (needs_counter) {
+    return ActionNode::SetRegister(reg_ctr, 0, center);
+  } else {
+    return center;
+  }
+}
+
+
+RegExpNode* RegExpAssertion::ToNode(RegExpCompiler* compiler,
+                                    RegExpNode* on_success) {
+  NodeInfo info;
+  Zone* zone = compiler->zone();
+
+  switch (assertion_type()) {
+    case START_OF_LINE:
+      return AssertionNode::AfterNewline(on_success);
+    case START_OF_INPUT:
+      return AssertionNode::AtStart(on_success);
+    case BOUNDARY:
+      return AssertionNode::AtBoundary(on_success);
+    case NON_BOUNDARY:
+      return AssertionNode::AtNonBoundary(on_success);
+    case END_OF_INPUT:
+      return AssertionNode::AtEnd(on_success);
+    case END_OF_LINE: {
+      // Compile $ in multiline regexps as an alternation with a positive
+      // lookahead in one side and an end-of-input on the other side.
+      // We need two registers for the lookahead.
+      int stack_pointer_register = compiler->AllocateRegister();
+      int position_register = compiler->AllocateRegister();
+      // The ChoiceNode to distinguish between a newline and end-of-input.
+      ChoiceNode* result = new(zone) ChoiceNode(2, zone);
+      // Create a newline atom.
+      ZoneList<CharacterRange>* newline_ranges =
+          new(zone) ZoneList<CharacterRange>(3, zone);
+      CharacterRange::AddClassEscape('n', newline_ranges, zone);
+      RegExpCharacterClass* newline_atom = new(zone) RegExpCharacterClass('n');
+      TextNode* newline_matcher = new(zone) TextNode(
+         newline_atom,
+         ActionNode::PositiveSubmatchSuccess(stack_pointer_register,
+                                             position_register,
+                                             0,  // No captures inside.
+                                             -1,  // Ignored if no captures.
+                                             on_success));
+      // Create an end-of-input matcher.
+      RegExpNode* end_of_line = ActionNode::BeginSubmatch(
+          stack_pointer_register,
+          position_register,
+          newline_matcher);
+      // Add the two alternatives to the ChoiceNode.
+      GuardedAlternative eol_alternative(end_of_line);
+      result->AddAlternative(eol_alternative);
+      GuardedAlternative end_alternative(AssertionNode::AtEnd(on_success));
+      result->AddAlternative(end_alternative);
+      return result;
+    }
+    default:
+      UNREACHABLE();
+  }
+  return on_success;
+}
+
+
+RegExpNode* RegExpBackReference::ToNode(RegExpCompiler* compiler,
+                                        RegExpNode* on_success) {
+  return new(compiler->zone())
+      BackReferenceNode(RegExpCapture::StartRegister(index()),
+                        RegExpCapture::EndRegister(index()),
+                        on_success);
+}
+
+
+RegExpNode* RegExpEmpty::ToNode(RegExpCompiler* compiler,
+                                RegExpNode* on_success) {
+  return on_success;
+}
+
+
+RegExpNode* RegExpLookahead::ToNode(RegExpCompiler* compiler,
+                                    RegExpNode* on_success) {
+  int stack_pointer_register = compiler->AllocateRegister();
+  int position_register = compiler->AllocateRegister();
+
+  const int registers_per_capture = 2;
+  const int register_of_first_capture = 2;
+  int register_count = capture_count_ * registers_per_capture;
+  int register_start =
+    register_of_first_capture + capture_from_ * registers_per_capture;
+
+  RegExpNode* success;
+  if (is_positive()) {
+    RegExpNode* node = ActionNode::BeginSubmatch(
+        stack_pointer_register,
+        position_register,
+        body()->ToNode(
+            compiler,
+            ActionNode::PositiveSubmatchSuccess(stack_pointer_register,
+                                                position_register,
+                                                register_count,
+                                                register_start,
+                                                on_success)));
+    return node;
+  } else {
+    // We use a ChoiceNode for a negative lookahead because it has most of
+    // the characteristics we need.  It has the body of the lookahead as its
+    // first alternative and the expression after the lookahead of the second
+    // alternative.  If the first alternative succeeds then the
+    // NegativeSubmatchSuccess will unwind the stack including everything the
+    // choice node set up and backtrack.  If the first alternative fails then
+    // the second alternative is tried, which is exactly the desired result
+    // for a negative lookahead.  The NegativeLookaheadChoiceNode is a special
+    // ChoiceNode that knows to ignore the first exit when calculating quick
+    // checks.
+    Zone* zone = compiler->zone();
+
+    GuardedAlternative body_alt(
+        body()->ToNode(
+            compiler,
+            success = new(zone) NegativeSubmatchSuccess(stack_pointer_register,
+                                                        position_register,
+                                                        register_count,
+                                                        register_start,
+                                                        zone)));
+    ChoiceNode* choice_node =
+        new(zone) NegativeLookaheadChoiceNode(body_alt,
+                                              GuardedAlternative(on_success),
+                                              zone);
+    return ActionNode::BeginSubmatch(stack_pointer_register,
+                                     position_register,
+                                     choice_node);
+  }
+}
+
+
+RegExpNode* RegExpCapture::ToNode(RegExpCompiler* compiler,
+                                  RegExpNode* on_success) {
+  return ToNode(body(), index(), compiler, on_success);
+}
+
+
+RegExpNode* RegExpCapture::ToNode(RegExpTree* body,
+                                  int index,
+                                  RegExpCompiler* compiler,
+                                  RegExpNode* on_success) {
+  int start_reg = RegExpCapture::StartRegister(index);
+  int end_reg = RegExpCapture::EndRegister(index);
+  RegExpNode* store_end = ActionNode::StorePosition(end_reg, true, on_success);
+  RegExpNode* body_node = body->ToNode(compiler, store_end);
+  return ActionNode::StorePosition(start_reg, true, body_node);
+}
+
+
+RegExpNode* RegExpAlternative::ToNode(RegExpCompiler* compiler,
+                                      RegExpNode* on_success) {
+  ZoneList<RegExpTree*>* children = nodes();
+  RegExpNode* current = on_success;
+  for (int i = children->length() - 1; i >= 0; i--) {
+    current = children->at(i)->ToNode(compiler, current);
+  }
+  return current;
+}
+
+
+static void AddClass(const int* elmv,
+                     int elmc,
+                     ZoneList<CharacterRange>* ranges,
+                     Zone* zone) {
+  elmc--;
+  DCHECK(elmv[elmc] == 0x10000);
+  for (int i = 0; i < elmc; i += 2) {
+    DCHECK(elmv[i] < elmv[i + 1]);
+    ranges->Add(CharacterRange(elmv[i], elmv[i + 1] - 1), zone);
+  }
+}
+
+
+static void AddClassNegated(const int *elmv,
+                            int elmc,
+                            ZoneList<CharacterRange>* ranges,
+                            Zone* zone) {
+  elmc--;
+  DCHECK(elmv[elmc] == 0x10000);
+  DCHECK(elmv[0] != 0x0000);
+  DCHECK(elmv[elmc-1] != String::kMaxUtf16CodeUnit);
+  uc16 last = 0x0000;
+  for (int i = 0; i < elmc; i += 2) {
+    DCHECK(last <= elmv[i] - 1);
+    DCHECK(elmv[i] < elmv[i + 1]);
+    ranges->Add(CharacterRange(last, elmv[i] - 1), zone);
+    last = elmv[i + 1];
+  }
+  ranges->Add(CharacterRange(last, String::kMaxUtf16CodeUnit), zone);
+}
+
+
+void CharacterRange::AddClassEscape(uc16 type,
+                                    ZoneList<CharacterRange>* ranges,
+                                    Zone* zone) {
+  switch (type) {
+    case 's':
+      AddClass(kSpaceRanges, kSpaceRangeCount, ranges, zone);
+      break;
+    case 'S':
+      AddClassNegated(kSpaceRanges, kSpaceRangeCount, ranges, zone);
+      break;
+    case 'w':
+      AddClass(kWordRanges, kWordRangeCount, ranges, zone);
+      break;
+    case 'W':
+      AddClassNegated(kWordRanges, kWordRangeCount, ranges, zone);
+      break;
+    case 'd':
+      AddClass(kDigitRanges, kDigitRangeCount, ranges, zone);
+      break;
+    case 'D':
+      AddClassNegated(kDigitRanges, kDigitRangeCount, ranges, zone);
+      break;
+    case '.':
+      AddClassNegated(kLineTerminatorRanges,
+                      kLineTerminatorRangeCount,
+                      ranges,
+                      zone);
+      break;
+    // This is not a character range as defined by the spec but a
+    // convenient shorthand for a character class that matches any
+    // character.
+    case '*':
+      ranges->Add(CharacterRange::Everything(), zone);
+      break;
+    // This is the set of characters matched by the $ and ^ symbols
+    // in multiline mode.
+    case 'n':
+      AddClass(kLineTerminatorRanges,
+               kLineTerminatorRangeCount,
+               ranges,
+               zone);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+Vector<const int> CharacterRange::GetWordBounds() {
+  return Vector<const int>(kWordRanges, kWordRangeCount - 1);
+}
+
+
+class CharacterRangeSplitter {
+ public:
+  CharacterRangeSplitter(ZoneList<CharacterRange>** included,
+                         ZoneList<CharacterRange>** excluded,
+                         Zone* zone)
+      : included_(included),
+        excluded_(excluded),
+        zone_(zone) { }
+  void Call(uc16 from, DispatchTable::Entry entry);
+
+  static const int kInBase = 0;
+  static const int kInOverlay = 1;
+
+ private:
+  ZoneList<CharacterRange>** included_;
+  ZoneList<CharacterRange>** excluded_;
+  Zone* zone_;
+};
+
+
+void CharacterRangeSplitter::Call(uc16 from, DispatchTable::Entry entry) {
+  if (!entry.out_set()->Get(kInBase)) return;
+  ZoneList<CharacterRange>** target = entry.out_set()->Get(kInOverlay)
+    ? included_
+    : excluded_;
+  if (*target == NULL) *target = new(zone_) ZoneList<CharacterRange>(2, zone_);
+  (*target)->Add(CharacterRange(entry.from(), entry.to()), zone_);
+}
+
+
+void CharacterRange::Split(ZoneList<CharacterRange>* base,
+                           Vector<const int> overlay,
+                           ZoneList<CharacterRange>** included,
+                           ZoneList<CharacterRange>** excluded,
+                           Zone* zone) {
+  DCHECK_EQ(NULL, *included);
+  DCHECK_EQ(NULL, *excluded);
+  DispatchTable table(zone);
+  for (int i = 0; i < base->length(); i++)
+    table.AddRange(base->at(i), CharacterRangeSplitter::kInBase, zone);
+  for (int i = 0; i < overlay.length(); i += 2) {
+    table.AddRange(CharacterRange(overlay[i], overlay[i + 1] - 1),
+                   CharacterRangeSplitter::kInOverlay, zone);
+  }
+  CharacterRangeSplitter callback(included, excluded, zone);
+  table.ForEach(&callback);
+}
+
+
+void CharacterRange::AddCaseEquivalents(ZoneList<CharacterRange>* ranges,
+                                        bool is_one_byte, Zone* zone) {
+  Isolate* isolate = zone->isolate();
+  uc16 bottom = from();
+  uc16 top = to();
+  if (is_one_byte && !RangeContainsLatin1Equivalents(*this)) {
+    if (bottom > String::kMaxOneByteCharCode) return;
+    if (top > String::kMaxOneByteCharCode) top = String::kMaxOneByteCharCode;
+  }
+  unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+  if (top == bottom) {
+    // If this is a singleton we just expand the one character.
+    int length = isolate->jsregexp_uncanonicalize()->get(bottom, '\0', chars);
+    for (int i = 0; i < length; i++) {
+      uc32 chr = chars[i];
+      if (chr != bottom) {
+        ranges->Add(CharacterRange::Singleton(chars[i]), zone);
+      }
+    }
+  } else {
+    // If this is a range we expand the characters block by block,
+    // expanding contiguous subranges (blocks) one at a time.
+    // The approach is as follows.  For a given start character we
+    // look up the remainder of the block that contains it (represented
+    // by the end point), for instance we find 'z' if the character
+    // is 'c'.  A block is characterized by the property
+    // that all characters uncanonicalize in the same way, except that
+    // each entry in the result is incremented by the distance from the first
+    // element.  So a-z is a block because 'a' uncanonicalizes to ['a', 'A'] and
+    // the k'th letter uncanonicalizes to ['a' + k, 'A' + k].
+    // Once we've found the end point we look up its uncanonicalization
+    // and produce a range for each element.  For instance for [c-f]
+    // we look up ['z', 'Z'] and produce [c-f] and [C-F].  We then only
+    // add a range if it is not already contained in the input, so [c-f]
+    // will be skipped but [C-F] will be added.  If this range is not
+    // completely contained in a block we do this for all the blocks
+    // covered by the range (handling characters that is not in a block
+    // as a "singleton block").
+    unibrow::uchar range[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+    int pos = bottom;
+    while (pos <= top) {
+      int length = isolate->jsregexp_canonrange()->get(pos, '\0', range);
+      uc16 block_end;
+      if (length == 0) {
+        block_end = pos;
+      } else {
+        DCHECK_EQ(1, length);
+        block_end = range[0];
+      }
+      int end = (block_end > top) ? top : block_end;
+      length = isolate->jsregexp_uncanonicalize()->get(block_end, '\0', range);
+      for (int i = 0; i < length; i++) {
+        uc32 c = range[i];
+        uc16 range_from = c - (block_end - pos);
+        uc16 range_to = c - (block_end - end);
+        if (!(bottom <= range_from && range_to <= top)) {
+          ranges->Add(CharacterRange(range_from, range_to), zone);
+        }
+      }
+      pos = end + 1;
+    }
+  }
+}
+
+
+bool CharacterRange::IsCanonical(ZoneList<CharacterRange>* ranges) {
+  DCHECK_NOT_NULL(ranges);
+  int n = ranges->length();
+  if (n <= 1) return true;
+  int max = ranges->at(0).to();
+  for (int i = 1; i < n; i++) {
+    CharacterRange next_range = ranges->at(i);
+    if (next_range.from() <= max + 1) return false;
+    max = next_range.to();
+  }
+  return true;
+}
+
+
+ZoneList<CharacterRange>* CharacterSet::ranges(Zone* zone) {
+  if (ranges_ == NULL) {
+    ranges_ = new(zone) ZoneList<CharacterRange>(2, zone);
+    CharacterRange::AddClassEscape(standard_set_type_, ranges_, zone);
+  }
+  return ranges_;
+}
+
+
+// Move a number of elements in a zonelist to another position
+// in the same list. Handles overlapping source and target areas.
+static void MoveRanges(ZoneList<CharacterRange>* list,
+                       int from,
+                       int to,
+                       int count) {
+  // Ranges are potentially overlapping.
+  if (from < to) {
+    for (int i = count - 1; i >= 0; i--) {
+      list->at(to + i) = list->at(from + i);
+    }
+  } else {
+    for (int i = 0; i < count; i++) {
+      list->at(to + i) = list->at(from + i);
+    }
+  }
+}
+
+
+static int InsertRangeInCanonicalList(ZoneList<CharacterRange>* list,
+                                      int count,
+                                      CharacterRange insert) {
+  // Inserts a range into list[0..count[, which must be sorted
+  // by from value and non-overlapping and non-adjacent, using at most
+  // list[0..count] for the result. Returns the number of resulting
+  // canonicalized ranges. Inserting a range may collapse existing ranges into
+  // fewer ranges, so the return value can be anything in the range 1..count+1.
+  uc16 from = insert.from();
+  uc16 to = insert.to();
+  int start_pos = 0;
+  int end_pos = count;
+  for (int i = count - 1; i >= 0; i--) {
+    CharacterRange current = list->at(i);
+    if (current.from() > to + 1) {
+      end_pos = i;
+    } else if (current.to() + 1 < from) {
+      start_pos = i + 1;
+      break;
+    }
+  }
+
+  // Inserted range overlaps, or is adjacent to, ranges at positions
+  // [start_pos..end_pos[. Ranges before start_pos or at or after end_pos are
+  // not affected by the insertion.
+  // If start_pos == end_pos, the range must be inserted before start_pos.
+  // if start_pos < end_pos, the entire range from start_pos to end_pos
+  // must be merged with the insert range.
+
+  if (start_pos == end_pos) {
+    // Insert between existing ranges at position start_pos.
+    if (start_pos < count) {
+      MoveRanges(list, start_pos, start_pos + 1, count - start_pos);
+    }
+    list->at(start_pos) = insert;
+    return count + 1;
+  }
+  if (start_pos + 1 == end_pos) {
+    // Replace single existing range at position start_pos.
+    CharacterRange to_replace = list->at(start_pos);
+    int new_from = Min(to_replace.from(), from);
+    int new_to = Max(to_replace.to(), to);
+    list->at(start_pos) = CharacterRange(new_from, new_to);
+    return count;
+  }
+  // Replace a number of existing ranges from start_pos to end_pos - 1.
+  // Move the remaining ranges down.
+
+  int new_from = Min(list->at(start_pos).from(), from);
+  int new_to = Max(list->at(end_pos - 1).to(), to);
+  if (end_pos < count) {
+    MoveRanges(list, end_pos, start_pos + 1, count - end_pos);
+  }
+  list->at(start_pos) = CharacterRange(new_from, new_to);
+  return count - (end_pos - start_pos) + 1;
+}
+
+
+void CharacterSet::Canonicalize() {
+  // Special/default classes are always considered canonical. The result
+  // of calling ranges() will be sorted.
+  if (ranges_ == NULL) return;
+  CharacterRange::Canonicalize(ranges_);
+}
+
+
+void CharacterRange::Canonicalize(ZoneList<CharacterRange>* character_ranges) {
+  if (character_ranges->length() <= 1) return;
+  // Check whether ranges are already canonical (increasing, non-overlapping,
+  // non-adjacent).
+  int n = character_ranges->length();
+  int max = character_ranges->at(0).to();
+  int i = 1;
+  while (i < n) {
+    CharacterRange current = character_ranges->at(i);
+    if (current.from() <= max + 1) {
+      break;
+    }
+    max = current.to();
+    i++;
+  }
+  // Canonical until the i'th range. If that's all of them, we are done.
+  if (i == n) return;
+
+  // The ranges at index i and forward are not canonicalized. Make them so by
+  // doing the equivalent of insertion sort (inserting each into the previous
+  // list, in order).
+  // Notice that inserting a range can reduce the number of ranges in the
+  // result due to combining of adjacent and overlapping ranges.
+  int read = i;  // Range to insert.
+  int num_canonical = i;  // Length of canonicalized part of list.
+  do {
+    num_canonical = InsertRangeInCanonicalList(character_ranges,
+                                               num_canonical,
+                                               character_ranges->at(read));
+    read++;
+  } while (read < n);
+  character_ranges->Rewind(num_canonical);
+
+  DCHECK(CharacterRange::IsCanonical(character_ranges));
+}
+
+
+void CharacterRange::Negate(ZoneList<CharacterRange>* ranges,
+                            ZoneList<CharacterRange>* negated_ranges,
+                            Zone* zone) {
+  DCHECK(CharacterRange::IsCanonical(ranges));
+  DCHECK_EQ(0, negated_ranges->length());
+  int range_count = ranges->length();
+  uc16 from = 0;
+  int i = 0;
+  if (range_count > 0 && ranges->at(0).from() == 0) {
+    from = ranges->at(0).to();
+    i = 1;
+  }
+  while (i < range_count) {
+    CharacterRange range = ranges->at(i);
+    negated_ranges->Add(CharacterRange(from + 1, range.from() - 1), zone);
+    from = range.to();
+    i++;
+  }
+  if (from < String::kMaxUtf16CodeUnit) {
+    negated_ranges->Add(CharacterRange(from + 1, String::kMaxUtf16CodeUnit),
+                        zone);
+  }
+}
+
+
+// -------------------------------------------------------------------
+// Splay tree
+
+
+OutSet* OutSet::Extend(unsigned value, Zone* zone) {
+  if (Get(value))
+    return this;
+  if (successors(zone) != NULL) {
+    for (int i = 0; i < successors(zone)->length(); i++) {
+      OutSet* successor = successors(zone)->at(i);
+      if (successor->Get(value))
+        return successor;
+    }
+  } else {
+    successors_ = new(zone) ZoneList<OutSet*>(2, zone);
+  }
+  OutSet* result = new(zone) OutSet(first_, remaining_);
+  result->Set(value, zone);
+  successors(zone)->Add(result, zone);
+  return result;
+}
+
+
+void OutSet::Set(unsigned value, Zone *zone) {
+  if (value < kFirstLimit) {
+    first_ |= (1 << value);
+  } else {
+    if (remaining_ == NULL)
+      remaining_ = new(zone) ZoneList<unsigned>(1, zone);
+    if (remaining_->is_empty() || !remaining_->Contains(value))
+      remaining_->Add(value, zone);
+  }
+}
+
+
+bool OutSet::Get(unsigned value) const {
+  if (value < kFirstLimit) {
+    return (first_ & (1 << value)) != 0;
+  } else if (remaining_ == NULL) {
+    return false;
+  } else {
+    return remaining_->Contains(value);
+  }
+}
+
+
+const uc16 DispatchTable::Config::kNoKey = unibrow::Utf8::kBadChar;
+
+
+void DispatchTable::AddRange(CharacterRange full_range, int value,
+                             Zone* zone) {
+  CharacterRange current = full_range;
+  if (tree()->is_empty()) {
+    // If this is the first range we just insert into the table.
+    ZoneSplayTree<Config>::Locator loc;
+    DCHECK_RESULT(tree()->Insert(current.from(), &loc));
+    loc.set_value(Entry(current.from(), current.to(),
+                        empty()->Extend(value, zone)));
+    return;
+  }
+  // First see if there is a range to the left of this one that
+  // overlaps.
+  ZoneSplayTree<Config>::Locator loc;
+  if (tree()->FindGreatestLessThan(current.from(), &loc)) {
+    Entry* entry = &loc.value();
+    // If we've found a range that overlaps with this one, and it
+    // starts strictly to the left of this one, we have to fix it
+    // because the following code only handles ranges that start on
+    // or after the start point of the range we're adding.
+    if (entry->from() < current.from() && entry->to() >= current.from()) {
+      // Snap the overlapping range in half around the start point of
+      // the range we're adding.
+      CharacterRange left(entry->from(), current.from() - 1);
+      CharacterRange right(current.from(), entry->to());
+      // The left part of the overlapping range doesn't overlap.
+      // Truncate the whole entry to be just the left part.
+      entry->set_to(left.to());
+      // The right part is the one that overlaps.  We add this part
+      // to the map and let the next step deal with merging it with
+      // the range we're adding.
+      ZoneSplayTree<Config>::Locator loc;
+      DCHECK_RESULT(tree()->Insert(right.from(), &loc));
+      loc.set_value(Entry(right.from(),
+                          right.to(),
+                          entry->out_set()));
+    }
+  }
+  while (current.is_valid()) {
+    if (tree()->FindLeastGreaterThan(current.from(), &loc) &&
+        (loc.value().from() <= current.to()) &&
+        (loc.value().to() >= current.from())) {
+      Entry* entry = &loc.value();
+      // We have overlap.  If there is space between the start point of
+      // the range we're adding and where the overlapping range starts
+      // then we have to add a range covering just that space.
+      if (current.from() < entry->from()) {
+        ZoneSplayTree<Config>::Locator ins;
+        DCHECK_RESULT(tree()->Insert(current.from(), &ins));
+        ins.set_value(Entry(current.from(),
+                            entry->from() - 1,
+                            empty()->Extend(value, zone)));
+        current.set_from(entry->from());
+      }
+      DCHECK_EQ(current.from(), entry->from());
+      // If the overlapping range extends beyond the one we want to add
+      // we have to snap the right part off and add it separately.
+      if (entry->to() > current.to()) {
+        ZoneSplayTree<Config>::Locator ins;
+        DCHECK_RESULT(tree()->Insert(current.to() + 1, &ins));
+        ins.set_value(Entry(current.to() + 1,
+                            entry->to(),
+                            entry->out_set()));
+        entry->set_to(current.to());
+      }
+      DCHECK(entry->to() <= current.to());
+      // The overlapping range is now completely contained by the range
+      // we're adding so we can just update it and move the start point
+      // of the range we're adding just past it.
+      entry->AddValue(value, zone);
+      // Bail out if the last interval ended at 0xFFFF since otherwise
+      // adding 1 will wrap around to 0.
+      if (entry->to() == String::kMaxUtf16CodeUnit)
+        break;
+      DCHECK(entry->to() + 1 > current.from());
+      current.set_from(entry->to() + 1);
+    } else {
+      // There is no overlap so we can just add the range
+      ZoneSplayTree<Config>::Locator ins;
+      DCHECK_RESULT(tree()->Insert(current.from(), &ins));
+      ins.set_value(Entry(current.from(),
+                          current.to(),
+                          empty()->Extend(value, zone)));
+      break;
+    }
+  }
+}
+
+
+OutSet* DispatchTable::Get(uc16 value) {
+  ZoneSplayTree<Config>::Locator loc;
+  if (!tree()->FindGreatestLessThan(value, &loc))
+    return empty();
+  Entry* entry = &loc.value();
+  if (value <= entry->to())
+    return entry->out_set();
+  else
+    return empty();
+}
+
+
+// -------------------------------------------------------------------
+// Analysis
+
+
+void Analysis::EnsureAnalyzed(RegExpNode* that) {
+  StackLimitCheck check(that->zone()->isolate());
+  if (check.HasOverflowed()) {
+    fail("Stack overflow");
+    return;
+  }
+  if (that->info()->been_analyzed || that->info()->being_analyzed)
+    return;
+  that->info()->being_analyzed = true;
+  that->Accept(this);
+  that->info()->being_analyzed = false;
+  that->info()->been_analyzed = true;
+}
+
+
+void Analysis::VisitEnd(EndNode* that) {
+  // nothing to do
+}
+
+
+void TextNode::CalculateOffsets() {
+  int element_count = elements()->length();
+  // Set up the offsets of the elements relative to the start.  This is a fixed
+  // quantity since a TextNode can only contain fixed-width things.
+  int cp_offset = 0;
+  for (int i = 0; i < element_count; i++) {
+    TextElement& elm = elements()->at(i);
+    elm.set_cp_offset(cp_offset);
+    cp_offset += elm.length();
+  }
+}
+
+
+void Analysis::VisitText(TextNode* that) {
+  if (ignore_case_) {
+    that->MakeCaseIndependent(is_one_byte_);
+  }
+  EnsureAnalyzed(that->on_success());
+  if (!has_failed()) {
+    that->CalculateOffsets();
+  }
+}
+
+
+void Analysis::VisitAction(ActionNode* that) {
+  RegExpNode* target = that->on_success();
+  EnsureAnalyzed(target);
+  if (!has_failed()) {
+    // If the next node is interested in what it follows then this node
+    // has to be interested too so it can pass the information on.
+    that->info()->AddFromFollowing(target->info());
+  }
+}
+
+
+void Analysis::VisitChoice(ChoiceNode* that) {
+  NodeInfo* info = that->info();
+  for (int i = 0; i < that->alternatives()->length(); i++) {
+    RegExpNode* node = that->alternatives()->at(i).node();
+    EnsureAnalyzed(node);
+    if (has_failed()) return;
+    // Anything the following nodes need to know has to be known by
+    // this node also, so it can pass it on.
+    info->AddFromFollowing(node->info());
+  }
+}
+
+
+void Analysis::VisitLoopChoice(LoopChoiceNode* that) {
+  NodeInfo* info = that->info();
+  for (int i = 0; i < that->alternatives()->length(); i++) {
+    RegExpNode* node = that->alternatives()->at(i).node();
+    if (node != that->loop_node()) {
+      EnsureAnalyzed(node);
+      if (has_failed()) return;
+      info->AddFromFollowing(node->info());
+    }
+  }
+  // Check the loop last since it may need the value of this node
+  // to get a correct result.
+  EnsureAnalyzed(that->loop_node());
+  if (!has_failed()) {
+    info->AddFromFollowing(that->loop_node()->info());
+  }
+}
+
+
+void Analysis::VisitBackReference(BackReferenceNode* that) {
+  EnsureAnalyzed(that->on_success());
+}
+
+
+void Analysis::VisitAssertion(AssertionNode* that) {
+  EnsureAnalyzed(that->on_success());
+}
+
+
+void BackReferenceNode::FillInBMInfo(int offset,
+                                     int budget,
+                                     BoyerMooreLookahead* bm,
+                                     bool not_at_start) {
+  // Working out the set of characters that a backreference can match is too
+  // hard, so we just say that any character can match.
+  bm->SetRest(offset);
+  SaveBMInfo(bm, not_at_start, offset);
+}
+
+
+STATIC_ASSERT(BoyerMoorePositionInfo::kMapSize ==
+              RegExpMacroAssembler::kTableSize);
+
+
+void ChoiceNode::FillInBMInfo(int offset,
+                              int budget,
+                              BoyerMooreLookahead* bm,
+                              bool not_at_start) {
+  ZoneList<GuardedAlternative>* alts = alternatives();
+  budget = (budget - 1) / alts->length();
+  for (int i = 0; i < alts->length(); i++) {
+    GuardedAlternative& alt = alts->at(i);
+    if (alt.guards() != NULL && alt.guards()->length() != 0) {
+      bm->SetRest(offset);  // Give up trying to fill in info.
+      SaveBMInfo(bm, not_at_start, offset);
+      return;
+    }
+    alt.node()->FillInBMInfo(offset, budget, bm, not_at_start);
+  }
+  SaveBMInfo(bm, not_at_start, offset);
+}
+
+
+void TextNode::FillInBMInfo(int initial_offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start) {
+  if (initial_offset >= bm->length()) return;
+  int offset = initial_offset;
+  int max_char = bm->max_char();
+  for (int i = 0; i < elements()->length(); i++) {
+    if (offset >= bm->length()) {
+      if (initial_offset == 0) set_bm_info(not_at_start, bm);
+      return;
+    }
+    TextElement text = elements()->at(i);
+    if (text.text_type() == TextElement::ATOM) {
+      RegExpAtom* atom = text.atom();
+      for (int j = 0; j < atom->length(); j++, offset++) {
+        if (offset >= bm->length()) {
+          if (initial_offset == 0) set_bm_info(not_at_start, bm);
+          return;
+        }
+        uc16 character = atom->data()[j];
+        if (bm->compiler()->ignore_case()) {
+          unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
+          int length = GetCaseIndependentLetters(
+              Isolate::Current(),
+              character,
+              bm->max_char() == String::kMaxOneByteCharCode,
+              chars);
+          for (int j = 0; j < length; j++) {
+            bm->Set(offset, chars[j]);
+          }
+        } else {
+          if (character <= max_char) bm->Set(offset, character);
+        }
+      }
+    } else {
+      DCHECK_EQ(TextElement::CHAR_CLASS, text.text_type());
+      RegExpCharacterClass* char_class = text.char_class();
+      ZoneList<CharacterRange>* ranges = char_class->ranges(zone());
+      if (char_class->is_negated()) {
+        bm->SetAll(offset);
+      } else {
+        for (int k = 0; k < ranges->length(); k++) {
+          CharacterRange& range = ranges->at(k);
+          if (range.from() > max_char) continue;
+          int to = Min(max_char, static_cast<int>(range.to()));
+          bm->SetInterval(offset, Interval(range.from(), to));
+        }
+      }
+      offset++;
+    }
+  }
+  if (offset >= bm->length()) {
+    if (initial_offset == 0) set_bm_info(not_at_start, bm);
+    return;
+  }
+  on_success()->FillInBMInfo(offset,
+                             budget - 1,
+                             bm,
+                             true);  // Not at start after a text node.
+  if (initial_offset == 0) set_bm_info(not_at_start, bm);
+}
+
+
+// -------------------------------------------------------------------
+// Dispatch table construction
+
+
+void DispatchTableConstructor::VisitEnd(EndNode* that) {
+  AddRange(CharacterRange::Everything());
+}
+
+
+void DispatchTableConstructor::BuildTable(ChoiceNode* node) {
+  node->set_being_calculated(true);
+  ZoneList<GuardedAlternative>* alternatives = node->alternatives();
+  for (int i = 0; i < alternatives->length(); i++) {
+    set_choice_index(i);
+    alternatives->at(i).node()->Accept(this);
+  }
+  node->set_being_calculated(false);
+}
+
+
+class AddDispatchRange {
+ public:
+  explicit AddDispatchRange(DispatchTableConstructor* constructor)
+    : constructor_(constructor) { }
+  void Call(uc32 from, DispatchTable::Entry entry);
+ private:
+  DispatchTableConstructor* constructor_;
+};
+
+
+void AddDispatchRange::Call(uc32 from, DispatchTable::Entry entry) {
+  CharacterRange range(from, entry.to());
+  constructor_->AddRange(range);
+}
+
+
+void DispatchTableConstructor::VisitChoice(ChoiceNode* node) {
+  if (node->being_calculated())
+    return;
+  DispatchTable* table = node->GetTable(ignore_case_);
+  AddDispatchRange adder(this);
+  table->ForEach(&adder);
+}
+
+
+void DispatchTableConstructor::VisitBackReference(BackReferenceNode* that) {
+  // TODO(160): Find the node that we refer back to and propagate its start
+  // set back to here.  For now we just accept anything.
+  AddRange(CharacterRange::Everything());
+}
+
+
+void DispatchTableConstructor::VisitAssertion(AssertionNode* that) {
+  RegExpNode* target = that->on_success();
+  target->Accept(this);
+}
+
+
+static int CompareRangeByFrom(const CharacterRange* a,
+                              const CharacterRange* b) {
+  return Compare<uc16>(a->from(), b->from());
+}
+
+
+void DispatchTableConstructor::AddInverse(ZoneList<CharacterRange>* ranges) {
+  ranges->Sort(CompareRangeByFrom);
+  uc16 last = 0;
+  for (int i = 0; i < ranges->length(); i++) {
+    CharacterRange range = ranges->at(i);
+    if (last < range.from())
+      AddRange(CharacterRange(last, range.from() - 1));
+    if (range.to() >= last) {
+      if (range.to() == String::kMaxUtf16CodeUnit) {
+        return;
+      } else {
+        last = range.to() + 1;
+      }
+    }
+  }
+  AddRange(CharacterRange(last, String::kMaxUtf16CodeUnit));
+}
+
+
+void DispatchTableConstructor::VisitText(TextNode* that) {
+  TextElement elm = that->elements()->at(0);
+  switch (elm.text_type()) {
+    case TextElement::ATOM: {
+      uc16 c = elm.atom()->data()[0];
+      AddRange(CharacterRange(c, c));
+      break;
+    }
+    case TextElement::CHAR_CLASS: {
+      RegExpCharacterClass* tree = elm.char_class();
+      ZoneList<CharacterRange>* ranges = tree->ranges(that->zone());
+      if (tree->is_negated()) {
+        AddInverse(ranges);
+      } else {
+        for (int i = 0; i < ranges->length(); i++)
+          AddRange(ranges->at(i));
+      }
+      break;
+    }
+    default: {
+      UNIMPLEMENTED();
+    }
+  }
+}
+
+
+void DispatchTableConstructor::VisitAction(ActionNode* that) {
+  RegExpNode* target = that->on_success();
+  target->Accept(this);
+}
+
+
+RegExpEngine::CompilationResult RegExpEngine::Compile(
+    RegExpCompileData* data, bool ignore_case, bool is_global,
+    bool is_multiline, bool is_sticky, Handle<String> pattern,
+    Handle<String> sample_subject, bool is_one_byte, Zone* zone) {
+  if ((data->capture_count + 1) * 2 - 1 > RegExpMacroAssembler::kMaxRegister) {
+    return IrregexpRegExpTooBig(zone->isolate());
+  }
+  RegExpCompiler compiler(data->capture_count, ignore_case, is_one_byte, zone);
+
+  // Sample some characters from the middle of the string.
+  static const int kSampleSize = 128;
+
+  sample_subject = String::Flatten(sample_subject);
+  int chars_sampled = 0;
+  int half_way = (sample_subject->length() - kSampleSize) / 2;
+  for (int i = Max(0, half_way);
+       i < sample_subject->length() && chars_sampled < kSampleSize;
+       i++, chars_sampled++) {
+    compiler.frequency_collator()->CountCharacter(sample_subject->Get(i));
+  }
+
+  // Wrap the body of the regexp in capture #0.
+  RegExpNode* captured_body = RegExpCapture::ToNode(data->tree,
+                                                    0,
+                                                    &compiler,
+                                                    compiler.accept());
+  RegExpNode* node = captured_body;
+  bool is_end_anchored = data->tree->IsAnchoredAtEnd();
+  bool is_start_anchored = data->tree->IsAnchoredAtStart();
+  int max_length = data->tree->max_match();
+  if (!is_start_anchored && !is_sticky) {
+    // Add a .*? at the beginning, outside the body capture, unless
+    // this expression is anchored at the beginning or sticky.
+    RegExpNode* loop_node =
+        RegExpQuantifier::ToNode(0,
+                                 RegExpTree::kInfinity,
+                                 false,
+                                 new(zone) RegExpCharacterClass('*'),
+                                 &compiler,
+                                 captured_body,
+                                 data->contains_anchor);
+
+    if (data->contains_anchor) {
+      // Unroll loop once, to take care of the case that might start
+      // at the start of input.
+      ChoiceNode* first_step_node = new(zone) ChoiceNode(2, zone);
+      first_step_node->AddAlternative(GuardedAlternative(captured_body));
+      first_step_node->AddAlternative(GuardedAlternative(
+          new(zone) TextNode(new(zone) RegExpCharacterClass('*'), loop_node)));
+      node = first_step_node;
+    } else {
+      node = loop_node;
+    }
+  }
+  if (is_one_byte) {
+    node = node->FilterOneByte(RegExpCompiler::kMaxRecursion, ignore_case);
+    // Do it again to propagate the new nodes to places where they were not
+    // put because they had not been calculated yet.
+    if (node != NULL) {
+      node = node->FilterOneByte(RegExpCompiler::kMaxRecursion, ignore_case);
+    }
+  }
+
+  if (node == NULL) node = new(zone) EndNode(EndNode::BACKTRACK, zone);
+  data->node = node;
+  Analysis analysis(ignore_case, is_one_byte);
+  analysis.EnsureAnalyzed(node);
+  if (analysis.has_failed()) {
+    const char* error_message = analysis.error_message();
+    return CompilationResult(zone->isolate(), error_message);
+  }
+
+  // Create the correct assembler for the architecture.
+#ifndef V8_INTERPRETED_REGEXP
+  // Native regexp implementation.
+
+  NativeRegExpMacroAssembler::Mode mode =
+      is_one_byte ? NativeRegExpMacroAssembler::LATIN1
+                  : NativeRegExpMacroAssembler::UC16;
+
+#if V8_TARGET_ARCH_IA32
+  RegExpMacroAssemblerIA32 macro_assembler(mode, (data->capture_count + 1) * 2,
+                                           zone);
+#elif V8_TARGET_ARCH_X64
+  RegExpMacroAssemblerX64 macro_assembler(mode, (data->capture_count + 1) * 2,
+                                          zone);
+#elif V8_TARGET_ARCH_ARM
+  RegExpMacroAssemblerARM macro_assembler(mode, (data->capture_count + 1) * 2,
+                                          zone);
+#elif V8_TARGET_ARCH_ARM64
+  RegExpMacroAssemblerARM64 macro_assembler(mode, (data->capture_count + 1) * 2,
+                                            zone);
+#elif V8_TARGET_ARCH_MIPS
+  RegExpMacroAssemblerMIPS macro_assembler(mode, (data->capture_count + 1) * 2,
+                                           zone);
+#elif V8_TARGET_ARCH_MIPS64
+  RegExpMacroAssemblerMIPS macro_assembler(mode, (data->capture_count + 1) * 2,
+                                           zone);
+#elif V8_TARGET_ARCH_X87
+  RegExpMacroAssemblerX87 macro_assembler(mode, (data->capture_count + 1) * 2,
+                                          zone);
+#else
+#error "Unsupported architecture"
+#endif
+
+#else  // V8_INTERPRETED_REGEXP
+  // Interpreted regexp implementation.
+  EmbeddedVector<byte, 1024> codes;
+  RegExpMacroAssemblerIrregexp macro_assembler(codes, zone);
+#endif  // V8_INTERPRETED_REGEXP
+
+  // Inserted here, instead of in Assembler, because it depends on information
+  // in the AST that isn't replicated in the Node structure.
+  static const int kMaxBacksearchLimit = 1024;
+  if (is_end_anchored &&
+      !is_start_anchored &&
+      max_length < kMaxBacksearchLimit) {
+    macro_assembler.SetCurrentPositionFromEnd(max_length);
+  }
+
+  if (is_global) {
+    macro_assembler.set_global_mode(
+        (data->tree->min_match() > 0)
+            ? RegExpMacroAssembler::GLOBAL_NO_ZERO_LENGTH_CHECK
+            : RegExpMacroAssembler::GLOBAL);
+  }
+
+  return compiler.Assemble(&macro_assembler,
+                           node,
+                           data->capture_count,
+                           pattern);
+}
+
+}  // namespace dart
diff --git a/runtime/vm/regexp.h b/runtime/vm/regexp.h
new file mode 100644
index 0000000..921ec20
--- /dev/null
+++ b/runtime/vm/regexp.h
@@ -0,0 +1,1466 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_REGEXP_H_
+#define VM_REGEXP_H_
+
+// SNIP
+
+namespace dart {
+
+class NodeVisitor;
+class RegExpCompiler;
+class RegExpMacroAssembler;
+class RegExpNode;
+class RegExpTree;
+class BoyerMooreLookahead;
+
+// Represents the location of one element relative to the intersection of
+// two sets. Corresponds to the four areas of a Venn diagram.
+enum ElementInSetsRelation {
+  kInsideNone = 0,
+  kInsideFirst = 1,
+  kInsideSecond = 2,
+  kInsideBoth = 3
+};
+
+
+// Represents code units in the range from from_ to to_, both ends are
+// inclusive.
+class CharacterRange {
+ public:
+  CharacterRange() : from_(0), to_(0) { }
+  // For compatibility with the CHECK_OK macro
+  CharacterRange(void* null) { DCHECK_EQ(NULL, null); }  //NOLINT
+  CharacterRange(uc16 from, uc16 to) : from_(from), to_(to) { }
+  static void AddClassEscape(uc16 type, ZoneList<CharacterRange>* ranges,
+                             Zone* zone);
+  static Vector<const int> GetWordBounds();
+  static inline CharacterRange Singleton(uc16 value) {
+    return CharacterRange(value, value);
+  }
+  static inline CharacterRange Range(uc16 from, uc16 to) {
+    DCHECK(from <= to);
+    return CharacterRange(from, to);
+  }
+  static inline CharacterRange Everything() {
+    return CharacterRange(0, 0xFFFF);
+  }
+  bool Contains(uc16 i) { return from_ <= i && i <= to_; }
+  uc16 from() const { return from_; }
+  void set_from(uc16 value) { from_ = value; }
+  uc16 to() const { return to_; }
+  void set_to(uc16 value) { to_ = value; }
+  bool is_valid() { return from_ <= to_; }
+  bool IsEverything(uc16 max) { return from_ == 0 && to_ >= max; }
+  bool IsSingleton() { return (from_ == to_); }
+  void AddCaseEquivalents(ZoneList<CharacterRange>* ranges, bool is_one_byte,
+                          Zone* zone);
+  static void Split(ZoneList<CharacterRange>* base,
+                    Vector<const int> overlay,
+                    ZoneList<CharacterRange>** included,
+                    ZoneList<CharacterRange>** excluded,
+                    Zone* zone);
+  // Whether a range list is in canonical form: Ranges ordered by from value,
+  // and ranges non-overlapping and non-adjacent.
+  static bool IsCanonical(ZoneList<CharacterRange>* ranges);
+  // Convert range list to canonical form. The characters covered by the ranges
+  // will still be the same, but no character is in more than one range, and
+  // adjacent ranges are merged. The resulting list may be shorter than the
+  // original, but cannot be longer.
+  static void Canonicalize(ZoneList<CharacterRange>* ranges);
+  // Negate the contents of a character range in canonical form.
+  static void Negate(ZoneList<CharacterRange>* src,
+                     ZoneList<CharacterRange>* dst,
+                     Zone* zone);
+  static const int kStartMarker = (1 << 24);
+  static const int kPayloadMask = (1 << 24) - 1;
+
+ private:
+  uc16 from_;
+  uc16 to_;
+};
+
+
+// A set of unsigned integers that behaves especially well on small
+// integers (< 32).  May do zone-allocation.
+class OutSet: public ZoneObject {
+ public:
+  OutSet() : first_(0), remaining_(NULL), successors_(NULL) { }
+  OutSet* Extend(unsigned value, Zone* zone);
+  bool Get(unsigned value) const;
+  static const unsigned kFirstLimit = 32;
+
+ private:
+  // Destructively set a value in this set.  In most cases you want
+  // to use Extend instead to ensure that only one instance exists
+  // that contains the same values.
+  void Set(unsigned value, Zone* zone);
+
+  // The successors are a list of sets that contain the same values
+  // as this set and the one more value that is not present in this
+  // set.
+  ZoneList<OutSet*>* successors(Zone* zone) { return successors_; }
+
+  OutSet(uint32_t first, ZoneList<unsigned>* remaining)
+      : first_(first), remaining_(remaining), successors_(NULL) { }
+  uint32_t first_;
+  ZoneList<unsigned>* remaining_;
+  ZoneList<OutSet*>* successors_;
+  friend class Trace;
+};
+
+
+// A mapping from integers, specified as ranges, to a set of integers.
+// Used for mapping character ranges to choices.
+class DispatchTable : public ZoneObject {
+ public:
+  explicit DispatchTable(Zone* zone) : tree_(zone) { }
+
+  class Entry {
+   public:
+    Entry() : from_(0), to_(0), out_set_(NULL) { }
+    Entry(uc16 from, uc16 to, OutSet* out_set)
+        : from_(from), to_(to), out_set_(out_set) { }
+    uc16 from() { return from_; }
+    uc16 to() { return to_; }
+    void set_to(uc16 value) { to_ = value; }
+    void AddValue(int value, Zone* zone) {
+      out_set_ = out_set_->Extend(value, zone);
+    }
+    OutSet* out_set() { return out_set_; }
+   private:
+    uc16 from_;
+    uc16 to_;
+    OutSet* out_set_;
+  };
+
+  class Config {
+   public:
+    typedef uc16 Key;
+    typedef Entry Value;
+    static const uc16 kNoKey;
+    static const Entry NoValue() { return Value(); }
+    static inline int Compare(uc16 a, uc16 b) {
+      if (a == b)
+        return 0;
+      else if (a < b)
+        return -1;
+      else
+        return 1;
+    }
+  };
+
+  void AddRange(CharacterRange range, int value, Zone* zone);
+  OutSet* Get(uc16 value);
+  void Dump();
+
+  template <typename Callback>
+  void ForEach(Callback* callback) {
+    return tree()->ForEach(callback);
+  }
+
+ private:
+  // There can't be a static empty set since it allocates its
+  // successors in a zone and caches them.
+  OutSet* empty() { return &empty_; }
+  OutSet empty_;
+  ZoneSplayTree<Config>* tree() { return &tree_; }
+  ZoneSplayTree<Config> tree_;
+};
+
+
+#define FOR_EACH_NODE_TYPE(VISIT)                                    \
+  VISIT(End)                                                         \
+  VISIT(Action)                                                      \
+  VISIT(Choice)                                                      \
+  VISIT(BackReference)                                               \
+  VISIT(Assertion)                                                   \
+  VISIT(Text)
+
+
+#define FOR_EACH_REG_EXP_TREE_TYPE(VISIT)                            \
+  VISIT(Disjunction)                                                 \
+  VISIT(Alternative)                                                 \
+  VISIT(Assertion)                                                   \
+  VISIT(CharacterClass)                                              \
+  VISIT(Atom)                                                        \
+  VISIT(Quantifier)                                                  \
+  VISIT(Capture)                                                     \
+  VISIT(Lookahead)                                                   \
+  VISIT(BackReference)                                               \
+  VISIT(Empty)                                                       \
+  VISIT(Text)
+
+
+#define FORWARD_DECLARE(Name) class RegExp##Name;
+FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE)
+#undef FORWARD_DECLARE
+
+
+class TextElement FINAL BASE_EMBEDDED {
+ public:
+  enum TextType {
+    ATOM,
+    CHAR_CLASS
+  };
+
+  static TextElement Atom(RegExpAtom* atom);
+  static TextElement CharClass(RegExpCharacterClass* char_class);
+
+  int cp_offset() const { return cp_offset_; }
+  void set_cp_offset(int cp_offset) { cp_offset_ = cp_offset; }
+  int length() const;
+
+  TextType text_type() const { return text_type_; }
+
+  RegExpTree* tree() const { return tree_; }
+
+  RegExpAtom* atom() const {
+    DCHECK(text_type() == ATOM);
+    return reinterpret_cast<RegExpAtom*>(tree());
+  }
+
+  RegExpCharacterClass* char_class() const {
+    DCHECK(text_type() == CHAR_CLASS);
+    return reinterpret_cast<RegExpCharacterClass*>(tree());
+  }
+
+ private:
+  TextElement(TextType text_type, RegExpTree* tree)
+      : cp_offset_(-1), text_type_(text_type), tree_(tree) {}
+
+  int cp_offset_;
+  TextType text_type_;
+  RegExpTree* tree_;
+};
+
+
+class Trace;
+struct PreloadState;
+class GreedyLoopState;
+class AlternativeGenerationList;
+
+struct NodeInfo {
+  NodeInfo()
+      : being_analyzed(false),
+        been_analyzed(false),
+        follows_word_interest(false),
+        follows_newline_interest(false),
+        follows_start_interest(false),
+        at_end(false),
+        visited(false),
+        replacement_calculated(false) { }
+
+  // Returns true if the interests and assumptions of this node
+  // matches the given one.
+  bool Matches(NodeInfo* that) {
+    return (at_end == that->at_end) &&
+           (follows_word_interest == that->follows_word_interest) &&
+           (follows_newline_interest == that->follows_newline_interest) &&
+           (follows_start_interest == that->follows_start_interest);
+  }
+
+  // Updates the interests of this node given the interests of the
+  // node preceding it.
+  void AddFromPreceding(NodeInfo* that) {
+    at_end |= that->at_end;
+    follows_word_interest |= that->follows_word_interest;
+    follows_newline_interest |= that->follows_newline_interest;
+    follows_start_interest |= that->follows_start_interest;
+  }
+
+  bool HasLookbehind() {
+    return follows_word_interest ||
+           follows_newline_interest ||
+           follows_start_interest;
+  }
+
+  // Sets the interests of this node to include the interests of the
+  // following node.
+  void AddFromFollowing(NodeInfo* that) {
+    follows_word_interest |= that->follows_word_interest;
+    follows_newline_interest |= that->follows_newline_interest;
+    follows_start_interest |= that->follows_start_interest;
+  }
+
+  void ResetCompilationState() {
+    being_analyzed = false;
+    been_analyzed = false;
+  }
+
+  bool being_analyzed: 1;
+  bool been_analyzed: 1;
+
+  // These bits are set of this node has to know what the preceding
+  // character was.
+  bool follows_word_interest: 1;
+  bool follows_newline_interest: 1;
+  bool follows_start_interest: 1;
+
+  bool at_end: 1;
+  bool visited: 1;
+  bool replacement_calculated: 1;
+};
+
+
+// Details of a quick mask-compare check that can look ahead in the
+// input stream.
+class QuickCheckDetails {
+ public:
+  QuickCheckDetails()
+      : characters_(0),
+        mask_(0),
+        value_(0),
+        cannot_match_(false) { }
+  explicit QuickCheckDetails(int characters)
+      : characters_(characters),
+        mask_(0),
+        value_(0),
+        cannot_match_(false) { }
+  bool Rationalize(bool one_byte);
+  // Merge in the information from another branch of an alternation.
+  void Merge(QuickCheckDetails* other, int from_index);
+  // Advance the current position by some amount.
+  void Advance(int by, bool one_byte);
+  void Clear();
+  bool cannot_match() { return cannot_match_; }
+  void set_cannot_match() { cannot_match_ = true; }
+  struct Position {
+    Position() : mask(0), value(0), determines_perfectly(false) { }
+    uc16 mask;
+    uc16 value;
+    bool determines_perfectly;
+  };
+  int characters() { return characters_; }
+  void set_characters(int characters) { characters_ = characters; }
+  Position* positions(int index) {
+    DCHECK(index >= 0);
+    DCHECK(index < characters_);
+    return positions_ + index;
+  }
+  uint32_t mask() { return mask_; }
+  uint32_t value() { return value_; }
+
+ private:
+  // How many characters do we have quick check information from.  This is
+  // the same for all branches of a choice node.
+  int characters_;
+  Position positions_[4];
+  // These values are the condensate of the above array after Rationalize().
+  uint32_t mask_;
+  uint32_t value_;
+  // If set to true, there is no way this quick check can match at all.
+  // E.g., if it requires to be at the start of the input, and isn't.
+  bool cannot_match_;
+};
+
+
+extern int kUninitializedRegExpNodePlaceHolder;
+
+
+class RegExpNode: public ZoneObject {
+ public:
+  explicit RegExpNode(Zone* zone)
+  : replacement_(NULL), trace_count_(0), zone_(zone) {
+    bm_info_[0] = bm_info_[1] = NULL;
+  }
+  virtual ~RegExpNode();
+  virtual void Accept(NodeVisitor* visitor) = 0;
+  // Generates a goto to this node or actually generates the code at this point.
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace) = 0;
+  // How many characters must this node consume at a minimum in order to
+  // succeed.  If we have found at least 'still_to_find' characters that
+  // must be consumed there is no need to ask any following nodes whether
+  // they are sure to eat any more characters.  The not_at_start argument is
+  // used to indicate that we know we are not at the start of the input.  In
+  // this case anchored branches will always fail and can be ignored when
+  // determining how many characters are consumed on success.
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start) = 0;
+  // Emits some quick code that checks whether the preloaded characters match.
+  // Falls through on certain failure, jumps to the label on possible success.
+  // If the node cannot make a quick check it does nothing and returns false.
+  bool EmitQuickCheck(RegExpCompiler* compiler,
+                      Trace* bounds_check_trace,
+                      Trace* trace,
+                      bool preload_has_checked_bounds,
+                      Label* on_possible_success,
+                      QuickCheckDetails* details_return,
+                      bool fall_through_on_failure);
+  // For a given number of characters this returns a mask and a value.  The
+  // next n characters are anded with the mask and compared with the value.
+  // A comparison failure indicates the node cannot match the next n characters.
+  // A comparison success indicates the node may match.
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start) = 0;
+  static const int kNodeIsTooComplexForGreedyLoops = -1;
+  virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; }
+  // Only returns the successor for a text node of length 1 that matches any
+  // character and that has no guards on it.
+  virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
+      RegExpCompiler* compiler) {
+    return NULL;
+  }
+
+  // Collects information on the possible code units (mod 128) that can match if
+  // we look forward.  This is used for a Boyer-Moore-like string searching
+  // implementation.  TODO(erikcorry):  This should share more code with
+  // EatsAtLeast, GetQuickCheckDetails.  The budget argument is used to limit
+  // the number of nodes we are willing to look at in order to create this data.
+  static const int kRecursionBudget = 200;
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start) {
+    UNREACHABLE();
+  }
+
+  // If we know that the input is one-byte then there are some nodes that can
+  // never match.  This method returns a node that can be substituted for
+  // itself, or NULL if the node can never match.
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case) {
+    return this;
+  }
+  // Helper for FilterOneByte.
+  RegExpNode* replacement() {
+    DCHECK(info()->replacement_calculated);
+    return replacement_;
+  }
+  RegExpNode* set_replacement(RegExpNode* replacement) {
+    info()->replacement_calculated = true;
+    replacement_ =  replacement;
+    return replacement;  // For convenience.
+  }
+
+  // We want to avoid recalculating the lookahead info, so we store it on the
+  // node.  Only info that is for this node is stored.  We can tell that the
+  // info is for this node when offset == 0, so the information is calculated
+  // relative to this node.
+  void SaveBMInfo(BoyerMooreLookahead* bm, bool not_at_start, int offset) {
+    if (offset == 0) set_bm_info(not_at_start, bm);
+  }
+
+  Label* label() { return &label_; }
+  // If non-generic code is generated for a node (i.e. the node is not at the
+  // start of the trace) then it cannot be reused.  This variable sets a limit
+  // on how often we allow that to happen before we insist on starting a new
+  // trace and generating generic code for a node that can be reused by flushing
+  // the deferred actions in the current trace and generating a goto.
+  static const int kMaxCopiesCodeGenerated = 10;
+
+  NodeInfo* info() { return &info_; }
+
+  BoyerMooreLookahead* bm_info(bool not_at_start) {
+    return bm_info_[not_at_start ? 1 : 0];
+  }
+
+  Zone* zone() const { return zone_; }
+
+ protected:
+  enum LimitResult { DONE, CONTINUE };
+  RegExpNode* replacement_;
+
+  LimitResult LimitVersions(RegExpCompiler* compiler, Trace* trace);
+
+  void set_bm_info(bool not_at_start, BoyerMooreLookahead* bm) {
+    bm_info_[not_at_start ? 1 : 0] = bm;
+  }
+
+ private:
+  static const int kFirstCharBudget = 10;
+  Label label_;
+  NodeInfo info_;
+  // This variable keeps track of how many times code has been generated for
+  // this node (in different traces).  We don't keep track of where the
+  // generated code is located unless the code is generated at the start of
+  // a trace, in which case it is generic and can be reused by flushing the
+  // deferred operations in the current trace and generating a goto.
+  int trace_count_;
+  BoyerMooreLookahead* bm_info_[2];
+
+  Zone* zone_;
+};
+
+
+// A simple closed interval.
+class Interval {
+ public:
+  Interval() : from_(kNone), to_(kNone) { }
+  Interval(int from, int to) : from_(from), to_(to) { }
+  Interval Union(Interval that) {
+    if (that.from_ == kNone)
+      return *this;
+    else if (from_ == kNone)
+      return that;
+    else
+      return Interval(Min(from_, that.from_), Max(to_, that.to_));
+  }
+  bool Contains(int value) {
+    return (from_ <= value) && (value <= to_);
+  }
+  bool is_empty() { return from_ == kNone; }
+  int from() const { return from_; }
+  int to() const { return to_; }
+  static Interval Empty() { return Interval(); }
+  static const int kNone = -1;
+ private:
+  int from_;
+  int to_;
+};
+
+
+class SeqRegExpNode: public RegExpNode {
+ public:
+  explicit SeqRegExpNode(RegExpNode* on_success)
+      : RegExpNode(on_success->zone()), on_success_(on_success) { }
+  RegExpNode* on_success() { return on_success_; }
+  void set_on_success(RegExpNode* node) { on_success_ = node; }
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start) {
+    on_success_->FillInBMInfo(offset, budget - 1, bm, not_at_start);
+    if (offset == 0) set_bm_info(not_at_start, bm);
+  }
+
+ protected:
+  RegExpNode* FilterSuccessor(int depth, bool ignore_case);
+
+ private:
+  RegExpNode* on_success_;
+};
+
+
+class ActionNode: public SeqRegExpNode {
+ public:
+  enum ActionType {
+    SET_REGISTER,
+    INCREMENT_REGISTER,
+    STORE_POSITION,
+    BEGIN_SUBMATCH,
+    POSITIVE_SUBMATCH_SUCCESS,
+    EMPTY_MATCH_CHECK,
+    CLEAR_CAPTURES
+  };
+  static ActionNode* SetRegister(int reg, int val, RegExpNode* on_success);
+  static ActionNode* IncrementRegister(int reg, RegExpNode* on_success);
+  static ActionNode* StorePosition(int reg,
+                                   bool is_capture,
+                                   RegExpNode* on_success);
+  static ActionNode* ClearCaptures(Interval range, RegExpNode* on_success);
+  static ActionNode* BeginSubmatch(int stack_pointer_reg,
+                                   int position_reg,
+                                   RegExpNode* on_success);
+  static ActionNode* PositiveSubmatchSuccess(int stack_pointer_reg,
+                                             int restore_reg,
+                                             int clear_capture_count,
+                                             int clear_capture_from,
+                                             RegExpNode* on_success);
+  static ActionNode* EmptyMatchCheck(int start_register,
+                                     int repetition_register,
+                                     int repetition_limit,
+                                     RegExpNode* on_success);
+  virtual void Accept(NodeVisitor* visitor);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int filled_in,
+                                    bool not_at_start) {
+    return on_success()->GetQuickCheckDetails(
+        details, compiler, filled_in, not_at_start);
+  }
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+  ActionType action_type() { return action_type_; }
+  // TODO(erikcorry): We should allow some action nodes in greedy loops.
+  virtual int GreedyLoopTextLength() { return kNodeIsTooComplexForGreedyLoops; }
+
+ private:
+  union {
+    struct {
+      int reg;
+      int value;
+    } u_store_register;
+    struct {
+      int reg;
+    } u_increment_register;
+    struct {
+      int reg;
+      bool is_capture;
+    } u_position_register;
+    struct {
+      int stack_pointer_register;
+      int current_position_register;
+      int clear_register_count;
+      int clear_register_from;
+    } u_submatch;
+    struct {
+      int start_register;
+      int repetition_register;
+      int repetition_limit;
+    } u_empty_match_check;
+    struct {
+      int range_from;
+      int range_to;
+    } u_clear_captures;
+  } data_;
+  ActionNode(ActionType action_type, RegExpNode* on_success)
+      : SeqRegExpNode(on_success),
+        action_type_(action_type) { }
+  ActionType action_type_;
+  friend class DotPrinter;
+};
+
+
+class TextNode: public SeqRegExpNode {
+ public:
+  TextNode(ZoneList<TextElement>* elms,
+           RegExpNode* on_success)
+      : SeqRegExpNode(on_success),
+        elms_(elms) { }
+  TextNode(RegExpCharacterClass* that,
+           RegExpNode* on_success)
+      : SeqRegExpNode(on_success),
+        elms_(new(zone()) ZoneList<TextElement>(1, zone())) {
+    elms_->Add(TextElement::CharClass(that), zone());
+  }
+  virtual void Accept(NodeVisitor* visitor);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start);
+  ZoneList<TextElement>* elements() { return elms_; }
+  void MakeCaseIndependent(bool is_one_byte);
+  virtual int GreedyLoopTextLength();
+  virtual RegExpNode* GetSuccessorOfOmnivorousTextNode(
+      RegExpCompiler* compiler);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+  void CalculateOffsets();
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
+
+ private:
+  enum TextEmitPassType {
+    NON_LATIN1_MATCH,            // Check for characters that can't match.
+    SIMPLE_CHARACTER_MATCH,      // Case-dependent single character check.
+    NON_LETTER_CHARACTER_MATCH,  // Check characters that have no case equivs.
+    CASE_CHARACTER_MATCH,        // Case-independent single character check.
+    CHARACTER_CLASS_MATCH        // Character class.
+  };
+  static bool SkipPass(int pass, bool ignore_case);
+  static const int kFirstRealPass = SIMPLE_CHARACTER_MATCH;
+  static const int kLastPass = CHARACTER_CLASS_MATCH;
+  void TextEmitPass(RegExpCompiler* compiler,
+                    TextEmitPassType pass,
+                    bool preloaded,
+                    Trace* trace,
+                    bool first_element_checked,
+                    int* checked_up_to);
+  int Length();
+  ZoneList<TextElement>* elms_;
+};
+
+
+class AssertionNode: public SeqRegExpNode {
+ public:
+  enum AssertionType {
+    AT_END,
+    AT_START,
+    AT_BOUNDARY,
+    AT_NON_BOUNDARY,
+    AFTER_NEWLINE
+  };
+  static AssertionNode* AtEnd(RegExpNode* on_success) {
+    return new(on_success->zone()) AssertionNode(AT_END, on_success);
+  }
+  static AssertionNode* AtStart(RegExpNode* on_success) {
+    return new(on_success->zone()) AssertionNode(AT_START, on_success);
+  }
+  static AssertionNode* AtBoundary(RegExpNode* on_success) {
+    return new(on_success->zone()) AssertionNode(AT_BOUNDARY, on_success);
+  }
+  static AssertionNode* AtNonBoundary(RegExpNode* on_success) {
+    return new(on_success->zone()) AssertionNode(AT_NON_BOUNDARY, on_success);
+  }
+  static AssertionNode* AfterNewline(RegExpNode* on_success) {
+    return new(on_success->zone()) AssertionNode(AFTER_NEWLINE, on_success);
+  }
+  virtual void Accept(NodeVisitor* visitor);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int filled_in,
+                                    bool not_at_start);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+  AssertionType assertion_type() { return assertion_type_; }
+
+ private:
+  void EmitBoundaryCheck(RegExpCompiler* compiler, Trace* trace);
+  enum IfPrevious { kIsNonWord, kIsWord };
+  void BacktrackIfPrevious(RegExpCompiler* compiler,
+                           Trace* trace,
+                           IfPrevious backtrack_if_previous);
+  AssertionNode(AssertionType t, RegExpNode* on_success)
+      : SeqRegExpNode(on_success), assertion_type_(t) { }
+  AssertionType assertion_type_;
+};
+
+
+class BackReferenceNode: public SeqRegExpNode {
+ public:
+  BackReferenceNode(int start_reg,
+                    int end_reg,
+                    RegExpNode* on_success)
+      : SeqRegExpNode(on_success),
+        start_reg_(start_reg),
+        end_reg_(end_reg) { }
+  virtual void Accept(NodeVisitor* visitor);
+  int start_register() { return start_reg_; }
+  int end_register() { return end_reg_; }
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find,
+                          int recursion_depth,
+                          bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start) {
+    return;
+  }
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+
+ private:
+  int start_reg_;
+  int end_reg_;
+};
+
+
+class EndNode: public RegExpNode {
+ public:
+  enum Action { ACCEPT, BACKTRACK, NEGATIVE_SUBMATCH_SUCCESS };
+  explicit EndNode(Action action, Zone* zone)
+      : RegExpNode(zone), action_(action) { }
+  virtual void Accept(NodeVisitor* visitor);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find,
+                          int recursion_depth,
+                          bool not_at_start) { return 0; }
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start) {
+    // Returning 0 from EatsAtLeast should ensure we never get here.
+    UNREACHABLE();
+  }
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start) {
+    // Returning 0 from EatsAtLeast should ensure we never get here.
+    UNREACHABLE();
+  }
+
+ private:
+  Action action_;
+};
+
+
+class NegativeSubmatchSuccess: public EndNode {
+ public:
+  NegativeSubmatchSuccess(int stack_pointer_reg,
+                          int position_reg,
+                          int clear_capture_count,
+                          int clear_capture_start,
+                          Zone* zone)
+      : EndNode(NEGATIVE_SUBMATCH_SUCCESS, zone),
+        stack_pointer_register_(stack_pointer_reg),
+        current_position_register_(position_reg),
+        clear_capture_count_(clear_capture_count),
+        clear_capture_start_(clear_capture_start) { }
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+
+ private:
+  int stack_pointer_register_;
+  int current_position_register_;
+  int clear_capture_count_;
+  int clear_capture_start_;
+};
+
+
+class Guard: public ZoneObject {
+ public:
+  enum Relation { LT, GEQ };
+  Guard(int reg, Relation op, int value)
+      : reg_(reg),
+        op_(op),
+        value_(value) { }
+  int reg() { return reg_; }
+  Relation op() { return op_; }
+  int value() { return value_; }
+
+ private:
+  int reg_;
+  Relation op_;
+  int value_;
+};
+
+
+class GuardedAlternative {
+ public:
+  explicit GuardedAlternative(RegExpNode* node) : node_(node), guards_(NULL) { }
+  void AddGuard(Guard* guard, Zone* zone);
+  RegExpNode* node() { return node_; }
+  void set_node(RegExpNode* node) { node_ = node; }
+  ZoneList<Guard*>* guards() { return guards_; }
+
+ private:
+  RegExpNode* node_;
+  ZoneList<Guard*>* guards_;
+};
+
+
+class AlternativeGeneration;
+
+
+class ChoiceNode: public RegExpNode {
+ public:
+  explicit ChoiceNode(int expected_size, Zone* zone)
+      : RegExpNode(zone),
+        alternatives_(new(zone)
+                      ZoneList<GuardedAlternative>(expected_size, zone)),
+        table_(NULL),
+        not_at_start_(false),
+        being_calculated_(false) { }
+  virtual void Accept(NodeVisitor* visitor);
+  void AddAlternative(GuardedAlternative node) {
+    alternatives()->Add(node, zone());
+  }
+  ZoneList<GuardedAlternative>* alternatives() { return alternatives_; }
+  DispatchTable* GetTable(bool ignore_case);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
+  int EatsAtLeastHelper(int still_to_find,
+                        int budget,
+                        RegExpNode* ignore_this_node,
+                        bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+
+  bool being_calculated() { return being_calculated_; }
+  bool not_at_start() { return not_at_start_; }
+  void set_not_at_start() { not_at_start_ = true; }
+  void set_being_calculated(bool b) { being_calculated_ = b; }
+  virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
+    return true;
+  }
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
+
+ protected:
+  int GreedyLoopTextLengthForAlternative(GuardedAlternative* alternative);
+  ZoneList<GuardedAlternative>* alternatives_;
+
+ private:
+  friend class DispatchTableConstructor;
+  friend class Analysis;
+  void GenerateGuard(RegExpMacroAssembler* macro_assembler,
+                     Guard* guard,
+                     Trace* trace);
+  int CalculatePreloadCharacters(RegExpCompiler* compiler, int eats_at_least);
+  void EmitOutOfLineContinuation(RegExpCompiler* compiler,
+                                 Trace* trace,
+                                 GuardedAlternative alternative,
+                                 AlternativeGeneration* alt_gen,
+                                 int preload_characters,
+                                 bool next_expects_preload);
+  void SetUpPreLoad(RegExpCompiler* compiler,
+                    Trace* current_trace,
+                    PreloadState* preloads);
+  void AssertGuardsMentionRegisters(Trace* trace);
+  int EmitOptimizedUnanchoredSearch(RegExpCompiler* compiler, Trace* trace);
+  Trace* EmitGreedyLoop(RegExpCompiler* compiler,
+                        Trace* trace,
+                        AlternativeGenerationList* alt_gens,
+                        PreloadState* preloads,
+                        GreedyLoopState* greedy_loop_state,
+                        int text_length);
+  void EmitChoices(RegExpCompiler* compiler,
+                   AlternativeGenerationList* alt_gens,
+                   int first_choice,
+                   Trace* trace,
+                   PreloadState* preloads);
+  DispatchTable* table_;
+  // If true, this node is never checked at the start of the input.
+  // Allows a new trace to start with at_start() set to false.
+  bool not_at_start_;
+  bool being_calculated_;
+};
+
+
+class NegativeLookaheadChoiceNode: public ChoiceNode {
+ public:
+  explicit NegativeLookaheadChoiceNode(GuardedAlternative this_must_fail,
+                                       GuardedAlternative then_do_this,
+                                       Zone* zone)
+      : ChoiceNode(2, zone) {
+    AddAlternative(this_must_fail);
+    AddAlternative(then_do_this);
+  }
+  virtual int EatsAtLeast(int still_to_find, int budget, bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start) {
+    alternatives_->at(1).node()->FillInBMInfo(
+        offset, budget - 1, bm, not_at_start);
+    if (offset == 0) set_bm_info(not_at_start, bm);
+  }
+  // For a negative lookahead we don't emit the quick check for the
+  // alternative that is expected to fail.  This is because quick check code
+  // starts by loading enough characters for the alternative that takes fewest
+  // characters, but on a negative lookahead the negative branch did not take
+  // part in that calculation (EatsAtLeast) so the assumptions don't hold.
+  virtual bool try_to_emit_quick_check_for_alternative(bool is_first) {
+    return !is_first;
+  }
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
+};
+
+
+class LoopChoiceNode: public ChoiceNode {
+ public:
+  explicit LoopChoiceNode(bool body_can_be_zero_length, Zone* zone)
+      : ChoiceNode(2, zone),
+        loop_node_(NULL),
+        continue_node_(NULL),
+        body_can_be_zero_length_(body_can_be_zero_length)
+        { }
+  void AddLoopAlternative(GuardedAlternative alt);
+  void AddContinueAlternative(GuardedAlternative alt);
+  virtual void Emit(RegExpCompiler* compiler, Trace* trace);
+  virtual int EatsAtLeast(int still_to_find,  int budget, bool not_at_start);
+  virtual void GetQuickCheckDetails(QuickCheckDetails* details,
+                                    RegExpCompiler* compiler,
+                                    int characters_filled_in,
+                                    bool not_at_start);
+  virtual void FillInBMInfo(int offset,
+                            int budget,
+                            BoyerMooreLookahead* bm,
+                            bool not_at_start);
+  RegExpNode* loop_node() { return loop_node_; }
+  RegExpNode* continue_node() { return continue_node_; }
+  bool body_can_be_zero_length() { return body_can_be_zero_length_; }
+  virtual void Accept(NodeVisitor* visitor);
+  virtual RegExpNode* FilterOneByte(int depth, bool ignore_case);
+
+ private:
+  // AddAlternative is made private for loop nodes because alternatives
+  // should not be added freely, we need to keep track of which node
+  // goes back to the node itself.
+  void AddAlternative(GuardedAlternative node) {
+    ChoiceNode::AddAlternative(node);
+  }
+
+  RegExpNode* loop_node_;
+  RegExpNode* continue_node_;
+  bool body_can_be_zero_length_;
+};
+
+
+// Improve the speed that we scan for an initial point where a non-anchored
+// regexp can match by using a Boyer-Moore-like table. This is done by
+// identifying non-greedy non-capturing loops in the nodes that eat any
+// character one at a time.  For example in the middle of the regexp
+// /foo[\s\S]*?bar/ we find such a loop.  There is also such a loop implicitly
+// inserted at the start of any non-anchored regexp.
+//
+// When we have found such a loop we look ahead in the nodes to find the set of
+// characters that can come at given distances. For example for the regexp
+// /.?foo/ we know that there are at least 3 characters ahead of us, and the
+// sets of characters that can occur are [any, [f, o], [o]]. We find a range in
+// the lookahead info where the set of characters is reasonably constrained. In
+// our example this is from index 1 to 2 (0 is not constrained). We can now
+// look 3 characters ahead and if we don't find one of [f, o] (the union of
+// [f, o] and [o]) then we can skip forwards by the range size (in this case 2).
+//
+// For Unicode input strings we do the same, but modulo 128.
+//
+// We also look at the first string fed to the regexp and use that to get a hint
+// of the character frequencies in the inputs. This affects the assessment of
+// whether the set of characters is 'reasonably constrained'.
+//
+// We also have another lookahead mechanism (called quick check in the code),
+// which uses a wide load of multiple characters followed by a mask and compare
+// to determine whether a match is possible at this point.
+enum ContainedInLattice {
+  kNotYet = 0,
+  kLatticeIn = 1,
+  kLatticeOut = 2,
+  kLatticeUnknown = 3  // Can also mean both in and out.
+};
+
+
+inline ContainedInLattice Combine(ContainedInLattice a, ContainedInLattice b) {
+  return static_cast<ContainedInLattice>(a | b);
+}
+
+
+ContainedInLattice AddRange(ContainedInLattice a,
+                            const int* ranges,
+                            int ranges_size,
+                            Interval new_range);
+
+
+class BoyerMoorePositionInfo : public ZoneObject {
+ public:
+  explicit BoyerMoorePositionInfo(Zone* zone)
+      : map_(new(zone) ZoneList<bool>(kMapSize, zone)),
+        map_count_(0),
+        w_(kNotYet),
+        s_(kNotYet),
+        d_(kNotYet),
+        surrogate_(kNotYet) {
+     for (int i = 0; i < kMapSize; i++) {
+       map_->Add(false, zone);
+     }
+  }
+
+  bool& at(int i) { return map_->at(i); }
+
+  static const int kMapSize = 128;
+  static const int kMask = kMapSize - 1;
+
+  int map_count() const { return map_count_; }
+
+  void Set(int character);
+  void SetInterval(const Interval& interval);
+  void SetAll();
+  bool is_non_word() { return w_ == kLatticeOut; }
+  bool is_word() { return w_ == kLatticeIn; }
+
+ private:
+  ZoneList<bool>* map_;
+  int map_count_;  // Number of set bits in the map.
+  ContainedInLattice w_;  // The \w character class.
+  ContainedInLattice s_;  // The \s character class.
+  ContainedInLattice d_;  // The \d character class.
+  ContainedInLattice surrogate_;  // Surrogate UTF-16 code units.
+};
+
+
+class BoyerMooreLookahead : public ZoneObject {
+ public:
+  BoyerMooreLookahead(int length, RegExpCompiler* compiler, Zone* zone);
+
+  int length() { return length_; }
+  int max_char() { return max_char_; }
+  RegExpCompiler* compiler() { return compiler_; }
+
+  int Count(int map_number) {
+    return bitmaps_->at(map_number)->map_count();
+  }
+
+  BoyerMoorePositionInfo* at(int i) { return bitmaps_->at(i); }
+
+  void Set(int map_number, int character) {
+    if (character > max_char_) return;
+    BoyerMoorePositionInfo* info = bitmaps_->at(map_number);
+    info->Set(character);
+  }
+
+  void SetInterval(int map_number, const Interval& interval) {
+    if (interval.from() > max_char_) return;
+    BoyerMoorePositionInfo* info = bitmaps_->at(map_number);
+    if (interval.to() > max_char_) {
+      info->SetInterval(Interval(interval.from(), max_char_));
+    } else {
+      info->SetInterval(interval);
+    }
+  }
+
+  void SetAll(int map_number) {
+    bitmaps_->at(map_number)->SetAll();
+  }
+
+  void SetRest(int from_map) {
+    for (int i = from_map; i < length_; i++) SetAll(i);
+  }
+  void EmitSkipInstructions(RegExpMacroAssembler* masm);
+
+ private:
+  // This is the value obtained by EatsAtLeast.  If we do not have at least this
+  // many characters left in the sample string then the match is bound to fail.
+  // Therefore it is OK to read a character this far ahead of the current match
+  // point.
+  int length_;
+  RegExpCompiler* compiler_;
+  // 0xff for Latin1, 0xffff for UTF-16.
+  int max_char_;
+  ZoneList<BoyerMoorePositionInfo*>* bitmaps_;
+
+  int GetSkipTable(int min_lookahead,
+                   int max_lookahead,
+                   Handle<ByteArray> boolean_skip_table);
+  bool FindWorthwhileInterval(int* from, int* to);
+  int FindBestInterval(
+    int max_number_of_chars, int old_biggest_points, int* from, int* to);
+};
+
+
+// There are many ways to generate code for a node.  This class encapsulates
+// the current way we should be generating.  In other words it encapsulates
+// the current state of the code generator.  The effect of this is that we
+// generate code for paths that the matcher can take through the regular
+// expression.  A given node in the regexp can be code-generated several times
+// as it can be part of several traces.  For example for the regexp:
+// /foo(bar|ip)baz/ the code to match baz will be generated twice, once as part
+// of the foo-bar-baz trace and once as part of the foo-ip-baz trace.  The code
+// to match foo is generated only once (the traces have a common prefix).  The
+// code to store the capture is deferred and generated (twice) after the places
+// where baz has been matched.
+class Trace {
+ public:
+  // A value for a property that is either known to be true, know to be false,
+  // or not known.
+  enum TriBool {
+    UNKNOWN = -1, FALSE_VALUE = 0, TRUE_VALUE = 1
+  };
+
+  class DeferredAction {
+   public:
+    DeferredAction(ActionNode::ActionType action_type, int reg)
+        : action_type_(action_type), reg_(reg), next_(NULL) { }
+    DeferredAction* next() { return next_; }
+    bool Mentions(int reg);
+    int reg() { return reg_; }
+    ActionNode::ActionType action_type() { return action_type_; }
+   private:
+    ActionNode::ActionType action_type_;
+    int reg_;
+    DeferredAction* next_;
+    friend class Trace;
+  };
+
+  class DeferredCapture : public DeferredAction {
+   public:
+    DeferredCapture(int reg, bool is_capture, Trace* trace)
+        : DeferredAction(ActionNode::STORE_POSITION, reg),
+          cp_offset_(trace->cp_offset()),
+          is_capture_(is_capture) { }
+    int cp_offset() { return cp_offset_; }
+    bool is_capture() { return is_capture_; }
+   private:
+    int cp_offset_;
+    bool is_capture_;
+    void set_cp_offset(int cp_offset) { cp_offset_ = cp_offset; }
+  };
+
+  class DeferredSetRegister : public DeferredAction {
+   public:
+    DeferredSetRegister(int reg, int value)
+        : DeferredAction(ActionNode::SET_REGISTER, reg),
+          value_(value) { }
+    int value() { return value_; }
+   private:
+    int value_;
+  };
+
+  class DeferredClearCaptures : public DeferredAction {
+   public:
+    explicit DeferredClearCaptures(Interval range)
+        : DeferredAction(ActionNode::CLEAR_CAPTURES, -1),
+          range_(range) { }
+    Interval range() { return range_; }
+   private:
+    Interval range_;
+  };
+
+  class DeferredIncrementRegister : public DeferredAction {
+   public:
+    explicit DeferredIncrementRegister(int reg)
+        : DeferredAction(ActionNode::INCREMENT_REGISTER, reg) { }
+  };
+
+  Trace()
+      : cp_offset_(0),
+        actions_(NULL),
+        backtrack_(NULL),
+        stop_node_(NULL),
+        loop_label_(NULL),
+        characters_preloaded_(0),
+        bound_checked_up_to_(0),
+        flush_budget_(100),
+        at_start_(UNKNOWN) { }
+
+  // End the trace.  This involves flushing the deferred actions in the trace
+  // and pushing a backtrack location onto the backtrack stack.  Once this is
+  // done we can start a new trace or go to one that has already been
+  // generated.
+  void Flush(RegExpCompiler* compiler, RegExpNode* successor);
+  int cp_offset() { return cp_offset_; }
+  DeferredAction* actions() { return actions_; }
+  // A trivial trace is one that has no deferred actions or other state that
+  // affects the assumptions used when generating code.  There is no recorded
+  // backtrack location in a trivial trace, so with a trivial trace we will
+  // generate code that, on a failure to match, gets the backtrack location
+  // from the backtrack stack rather than using a direct jump instruction.  We
+  // always start code generation with a trivial trace and non-trivial traces
+  // are created as we emit code for nodes or add to the list of deferred
+  // actions in the trace.  The location of the code generated for a node using
+  // a trivial trace is recorded in a label in the node so that gotos can be
+  // generated to that code.
+  bool is_trivial() {
+    return backtrack_ == NULL &&
+           actions_ == NULL &&
+           cp_offset_ == 0 &&
+           characters_preloaded_ == 0 &&
+           bound_checked_up_to_ == 0 &&
+           quick_check_performed_.characters() == 0 &&
+           at_start_ == UNKNOWN;
+  }
+  TriBool at_start() { return at_start_; }
+  void set_at_start(bool at_start) {
+    at_start_ = at_start ? TRUE_VALUE : FALSE_VALUE;
+  }
+  Label* backtrack() { return backtrack_; }
+  Label* loop_label() { return loop_label_; }
+  RegExpNode* stop_node() { return stop_node_; }
+  int characters_preloaded() { return characters_preloaded_; }
+  int bound_checked_up_to() { return bound_checked_up_to_; }
+  int flush_budget() { return flush_budget_; }
+  QuickCheckDetails* quick_check_performed() { return &quick_check_performed_; }
+  bool mentions_reg(int reg);
+  // Returns true if a deferred position store exists to the specified
+  // register and stores the offset in the out-parameter.  Otherwise
+  // returns false.
+  bool GetStoredPosition(int reg, int* cp_offset);
+  // These set methods and AdvanceCurrentPositionInTrace should be used only on
+  // new traces - the intention is that traces are immutable after creation.
+  void add_action(DeferredAction* new_action) {
+    DCHECK(new_action->next_ == NULL);
+    new_action->next_ = actions_;
+    actions_ = new_action;
+  }
+  void set_backtrack(Label* backtrack) { backtrack_ = backtrack; }
+  void set_stop_node(RegExpNode* node) { stop_node_ = node; }
+  void set_loop_label(Label* label) { loop_label_ = label; }
+  void set_characters_preloaded(int count) { characters_preloaded_ = count; }
+  void set_bound_checked_up_to(int to) { bound_checked_up_to_ = to; }
+  void set_flush_budget(int to) { flush_budget_ = to; }
+  void set_quick_check_performed(QuickCheckDetails* d) {
+    quick_check_performed_ = *d;
+  }
+  void InvalidateCurrentCharacter();
+  void AdvanceCurrentPositionInTrace(int by, RegExpCompiler* compiler);
+
+ private:
+  int FindAffectedRegisters(OutSet* affected_registers, Zone* zone);
+  void PerformDeferredActions(RegExpMacroAssembler* macro,
+                              int max_register,
+                              const OutSet& affected_registers,
+                              OutSet* registers_to_pop,
+                              OutSet* registers_to_clear,
+                              Zone* zone);
+  void RestoreAffectedRegisters(RegExpMacroAssembler* macro,
+                                int max_register,
+                                const OutSet& registers_to_pop,
+                                const OutSet& registers_to_clear);
+  int cp_offset_;
+  DeferredAction* actions_;
+  Label* backtrack_;
+  RegExpNode* stop_node_;
+  Label* loop_label_;
+  int characters_preloaded_;
+  int bound_checked_up_to_;
+  QuickCheckDetails quick_check_performed_;
+  int flush_budget_;
+  TriBool at_start_;
+};
+
+
+class GreedyLoopState {
+ public:
+  explicit GreedyLoopState(bool not_at_start);
+
+  Label* label() { return &label_; }
+  Trace* counter_backtrack_trace() { return &counter_backtrack_trace_; }
+
+ private:
+  Label label_;
+  Trace counter_backtrack_trace_;
+};
+
+
+struct PreloadState {
+  static const int kEatsAtLeastNotYetInitialized = -1;
+  bool preload_is_current_;
+  bool preload_has_checked_bounds_;
+  int preload_characters_;
+  int eats_at_least_;
+  void init() {
+    eats_at_least_ = kEatsAtLeastNotYetInitialized;
+  }
+};
+
+
+class NodeVisitor {
+ public:
+  virtual ~NodeVisitor() { }
+#define DECLARE_VISIT(Type)                                          \
+  virtual void Visit##Type(Type##Node* that) = 0;
+FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+#undef DECLARE_VISIT
+  virtual void VisitLoopChoice(LoopChoiceNode* that) { VisitChoice(that); }
+};
+
+
+// Node visitor used to add the start set of the alternatives to the
+// dispatch table of a choice node.
+class DispatchTableConstructor: public NodeVisitor {
+ public:
+  DispatchTableConstructor(DispatchTable* table, bool ignore_case,
+                           Zone* zone)
+      : table_(table),
+        choice_index_(-1),
+        ignore_case_(ignore_case),
+        zone_(zone) { }
+
+  void BuildTable(ChoiceNode* node);
+
+  void AddRange(CharacterRange range) {
+    table()->AddRange(range, choice_index_, zone_);
+  }
+
+  void AddInverse(ZoneList<CharacterRange>* ranges);
+
+#define DECLARE_VISIT(Type)                                          \
+  virtual void Visit##Type(Type##Node* that);
+FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+#undef DECLARE_VISIT
+
+  DispatchTable* table() { return table_; }
+  void set_choice_index(int value) { choice_index_ = value; }
+
+ protected:
+  DispatchTable* table_;
+  int choice_index_;
+  bool ignore_case_;
+  Zone* zone_;
+};
+
+
+// Assertion propagation moves information about assertions such as
+// \b to the affected nodes.  For instance, in /.\b./ information must
+// be propagated to the first '.' that whatever follows needs to know
+// if it matched a word or a non-word, and to the second '.' that it
+// has to check if it succeeds a word or non-word.  In this case the
+// result will be something like:
+//
+//   +-------+        +------------+
+//   |   .   |        |      .     |
+//   +-------+  --->  +------------+
+//   | word? |        | check word |
+//   +-------+        +------------+
+class Analysis: public NodeVisitor {
+ public:
+  Analysis(bool ignore_case, bool is_one_byte)
+      : ignore_case_(ignore_case),
+        is_one_byte_(is_one_byte),
+        error_message_(NULL) {}
+  void EnsureAnalyzed(RegExpNode* node);
+
+#define DECLARE_VISIT(Type)                                          \
+  virtual void Visit##Type(Type##Node* that);
+FOR_EACH_NODE_TYPE(DECLARE_VISIT)
+#undef DECLARE_VISIT
+  virtual void VisitLoopChoice(LoopChoiceNode* that);
+
+  bool has_failed() { return error_message_ != NULL; }
+  const char* error_message() {
+    DCHECK(error_message_ != NULL);
+    return error_message_;
+  }
+  void fail(const char* error_message) {
+    error_message_ = error_message;
+  }
+
+ private:
+  bool ignore_case_;
+  bool is_one_byte_;
+  const char* error_message_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(Analysis);
+};
+
+
+struct RegExpCompileData {
+  RegExpCompileData()
+    : tree(NULL),
+      node(NULL),
+      simple(true),
+      contains_anchor(false),
+      capture_count(0) { }
+  RegExpTree* tree;
+  RegExpNode* node;
+  bool simple;
+  bool contains_anchor;
+  Handle<String> error;
+  int capture_count;
+};
+
+
+class RegExpEngine: public AllStatic {
+ public:
+  struct CompilationResult {
+    CompilationResult(Isolate* isolate, const char* error_message)
+        : error_message(error_message),
+          code(isolate->heap()->the_hole_value()),
+          num_registers(0) {}
+    CompilationResult(Object* code, int registers)
+      : error_message(NULL),
+        code(code),
+        num_registers(registers) {}
+    const char* error_message;
+    Object* code;
+    int num_registers;
+  };
+
+  static CompilationResult Compile(RegExpCompileData* input, bool ignore_case,
+                                   bool global, bool multiline, bool sticky,
+                                   Handle<String> pattern,
+                                   Handle<String> sample_subject,
+                                   bool is_one_byte, Zone* zone);
+
+  static void DotPrint(const char* label, RegExpNode* node, bool ignore_case);
+};
+
+}  // namespace dart
+
+#endif  // VM_REGEXP_H_
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
new file mode 100644
index 0000000..8936d9d
--- /dev/null
+++ b/runtime/vm/regexp_assembler.cc
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, 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.
+
+#include "vm/regexp_assembler.h"
+
+// SNIP
+
+namespace dart {
+
+RegExpMacroAssembler::RegExpMacroAssembler(Zone* zone)
+  : slow_safe_compiler_(false),
+    global_mode_(NOT_GLOBAL),
+    zone_(zone) {
+}
+
+
+RegExpMacroAssembler::~RegExpMacroAssembler() {
+}
+
+// SNIP
+
+}  // namespace dart
diff --git a/runtime/vm/regexp_assembler.h b/runtime/vm/regexp_assembler.h
new file mode 100644
index 0000000..ace607b
--- /dev/null
+++ b/runtime/vm/regexp_assembler.h
@@ -0,0 +1,167 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_REGEXP_ASSEMBLER_H_
+#define VM_REGEXP_ASSEMBLER_H_
+
+// SNIP
+
+namespace dart {
+
+// SNIP
+
+class RegExpMacroAssembler {
+ public:
+  // The implementation must be able to handle at least:
+  static const int kMaxRegister = (1 << 16) - 1;
+  static const int kMaxCPOffset = (1 << 15) - 1;
+  static const int kMinCPOffset = -(1 << 15);
+
+  static const int kTableSizeBits = 7;
+  static const int kTableSize = 1 << kTableSizeBits;
+  static const int kTableMask = kTableSize - 1;
+
+  enum IrregexpImplementation {
+    kIA32Implementation,
+    kARMImplementation,
+    kARM64Implementation,
+    kMIPSImplementation,
+    kX64Implementation,
+    kX87Implementation,
+    kBytecodeImplementation
+  };
+
+  enum StackCheckFlag {
+    kNoStackLimitCheck = false,
+    kCheckStackLimit = true
+  };
+
+  explicit RegExpMacroAssembler(Zone* zone);
+  virtual ~RegExpMacroAssembler();
+  // The maximal number of pushes between stack checks. Users must supply
+  // kCheckStackLimit flag to push operations (instead of kNoStackLimitCheck)
+  // at least once for every stack_limit() pushes that are executed.
+  virtual int stack_limit_slack() = 0;
+  virtual bool CanReadUnaligned() = 0;
+  virtual void AdvanceCurrentPosition(int by) = 0;  // Signed cp change.
+  virtual void AdvanceRegister(int reg, int by) = 0;  // r[reg] += by.
+  // Continues execution from the position pushed on the top of the backtrack
+  // stack by an earlier PushBacktrack(Label*).
+  virtual void Backtrack() = 0;
+  virtual void Bind(Label* label) = 0;
+  virtual void CheckAtStart(Label* on_at_start) = 0;
+  // Dispatch after looking the current character up in a 2-bits-per-entry
+  // map.  The destinations vector has up to 4 labels.
+  virtual void CheckCharacter(unsigned c, Label* on_equal) = 0;
+  // Bitwise and the current character with the given constant and then
+  // check for a match with c.
+  virtual void CheckCharacterAfterAnd(unsigned c,
+                                      unsigned and_with,
+                                      Label* on_equal) = 0;
+  virtual void CheckCharacterGT(uc16 limit, Label* on_greater) = 0;
+  virtual void CheckCharacterLT(uc16 limit, Label* on_less) = 0;
+  virtual void CheckGreedyLoop(Label* on_tos_equals_current_position) = 0;
+  virtual void CheckNotAtStart(Label* on_not_at_start) = 0;
+  virtual void CheckNotBackReference(int start_reg, Label* on_no_match) = 0;
+  virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
+                                               Label* on_no_match) = 0;
+  // Check the current character for a match with a literal character.  If we
+  // fail to match then goto the on_failure label.  End of input always
+  // matches.  If the label is NULL then we should pop a backtrack address off
+  // the stack and go to that.
+  virtual void CheckNotCharacter(unsigned c, Label* on_not_equal) = 0;
+  virtual void CheckNotCharacterAfterAnd(unsigned c,
+                                         unsigned and_with,
+                                         Label* on_not_equal) = 0;
+  // Subtract a constant from the current character, then and with the given
+  // constant and then check for a match with c.
+  virtual void CheckNotCharacterAfterMinusAnd(uc16 c,
+                                              uc16 minus,
+                                              uc16 and_with,
+                                              Label* on_not_equal) = 0;
+  virtual void CheckCharacterInRange(uc16 from,
+                                     uc16 to,  // Both inclusive.
+                                     Label* on_in_range) = 0;
+  virtual void CheckCharacterNotInRange(uc16 from,
+                                        uc16 to,  // Both inclusive.
+                                        Label* on_not_in_range) = 0;
+
+  // The current character (modulus the kTableSize) is looked up in the byte
+  // array, and if the found byte is non-zero, we jump to the on_bit_set label.
+  virtual void CheckBitInTable(Handle<ByteArray> table, Label* on_bit_set) = 0;
+
+  // Checks whether the given offset from the current position is before
+  // the end of the string.  May overwrite the current character.
+  virtual void CheckPosition(int cp_offset, Label* on_outside_input) {
+    LoadCurrentCharacter(cp_offset, on_outside_input, true);
+  }
+  // Check whether a standard/default character class matches the current
+  // character. Returns false if the type of special character class does
+  // not have custom support.
+  // May clobber the current loaded character.
+  virtual bool CheckSpecialCharacterClass(uc16 type,
+                                          Label* on_no_match) {
+    return false;
+  }
+  virtual void Fail() = 0;
+  virtual Handle<HeapObject> GetCode(Handle<String> source) = 0;
+  virtual void GoTo(Label* label) = 0;
+  // Check whether a register is >= a given constant and go to a label if it
+  // is.  Backtracks instead if the label is NULL.
+  virtual void IfRegisterGE(int reg, int comparand, Label* if_ge) = 0;
+  // Check whether a register is < a given constant and go to a label if it is.
+  // Backtracks instead if the label is NULL.
+  virtual void IfRegisterLT(int reg, int comparand, Label* if_lt) = 0;
+  // Check whether a register is == to the current position and go to a
+  // label if it is.
+  virtual void IfRegisterEqPos(int reg, Label* if_eq) = 0;
+  virtual IrregexpImplementation Implementation() = 0;
+  virtual void LoadCurrentCharacter(int cp_offset,
+                                    Label* on_end_of_input,
+                                    bool check_bounds = true,
+                                    int characters = 1) = 0;
+  virtual void PopCurrentPosition() = 0;
+  virtual void PopRegister(int register_index) = 0;
+  // Pushes the label on the backtrack stack, so that a following Backtrack
+  // will go to this label. Always checks the backtrack stack limit.
+  virtual void PushBacktrack(Label* label) = 0;
+  virtual void PushCurrentPosition() = 0;
+  virtual void PushRegister(int register_index,
+                            StackCheckFlag check_stack_limit) = 0;
+  virtual void ReadCurrentPositionFromRegister(int reg) = 0;
+  virtual void ReadStackPointerFromRegister(int reg) = 0;
+  virtual void SetCurrentPositionFromEnd(int by) = 0;
+  virtual void SetRegister(int register_index, int to) = 0;
+  // Return whether the matching (with a global regexp) will be restarted.
+  virtual bool Succeed() = 0;
+  virtual void WriteCurrentPositionToRegister(int reg, int cp_offset) = 0;
+  virtual void ClearRegisters(int reg_from, int reg_to) = 0;
+  virtual void WriteStackPointerToRegister(int reg) = 0;
+
+  // Controls the generation of large inlined constants in the code.
+  void set_slow_safe(bool ssc) { slow_safe_compiler_ = ssc; }
+  bool slow_safe() { return slow_safe_compiler_; }
+
+  enum GlobalMode { NOT_GLOBAL, GLOBAL, GLOBAL_NO_ZERO_LENGTH_CHECK };
+  // Set whether the regular expression has the global flag.  Exiting due to
+  // a failure in a global regexp may still mean success overall.
+  inline void set_global_mode(GlobalMode mode) { global_mode_ = mode; }
+  inline bool global() { return global_mode_ != NOT_GLOBAL; }
+  inline bool global_with_zero_length_check() {
+    return global_mode_ == GLOBAL;
+  }
+
+  Zone* zone() const { return zone_; }
+
+ private:
+  bool slow_safe_compiler_;
+  bool global_mode_;
+  Zone* zone_;
+};
+
+// SNIP
+
+}  // namespace dart
+
+#endif  // VM_REGEXP_ASSEMBLER_H_
diff --git a/runtime/vm/regexp_ast.cc b/runtime/vm/regexp_ast.cc
new file mode 100644
index 0000000..c36b890
--- /dev/null
+++ b/runtime/vm/regexp_ast.cc
@@ -0,0 +1,336 @@
+// Copyright (c) 2014, 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.
+
+#include "vm/regexp_ast.h"
+
+// SNIP
+
+namespace dart {
+
+#define MAKE_ACCEPT(Name)                                            \
+  void* RegExp##Name::Accept(RegExpVisitor* visitor, void* data) {   \
+    return visitor->Visit##Name(this, data);                         \
+  }
+FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ACCEPT)
+#undef MAKE_ACCEPT
+
+#define MAKE_TYPE_CASE(Name)                                         \
+  RegExp##Name* RegExpTree::As##Name() {                             \
+    return NULL;                                                     \
+  }                                                                  \
+  bool RegExpTree::Is##Name() { return false; }
+FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
+#undef MAKE_TYPE_CASE
+
+#define MAKE_TYPE_CASE(Name)                                        \
+  RegExp##Name* RegExp##Name::As##Name() {                          \
+    return this;                                                    \
+  }                                                                 \
+  bool RegExp##Name::Is##Name() { return true; }
+FOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
+#undef MAKE_TYPE_CASE
+
+
+static Interval ListCaptureRegisters(ZoneList<RegExpTree*>* children) {
+  Interval result = Interval::Empty();
+  for (int i = 0; i < children->length(); i++)
+    result = result.Union(children->at(i)->CaptureRegisters());
+  return result;
+}
+
+
+Interval RegExpAlternative::CaptureRegisters() {
+  return ListCaptureRegisters(nodes());
+}
+
+
+Interval RegExpDisjunction::CaptureRegisters() {
+  return ListCaptureRegisters(alternatives());
+}
+
+
+Interval RegExpLookahead::CaptureRegisters() {
+  return body()->CaptureRegisters();
+}
+
+
+Interval RegExpCapture::CaptureRegisters() {
+  Interval self(StartRegister(index()), EndRegister(index()));
+  return self.Union(body()->CaptureRegisters());
+}
+
+
+Interval RegExpQuantifier::CaptureRegisters() {
+  return body()->CaptureRegisters();
+}
+
+
+bool RegExpAssertion::IsAnchoredAtStart() {
+  return assertion_type() == RegExpAssertion::START_OF_INPUT;
+}
+
+
+bool RegExpAssertion::IsAnchoredAtEnd() {
+  return assertion_type() == RegExpAssertion::END_OF_INPUT;
+}
+
+
+bool RegExpAlternative::IsAnchoredAtStart() {
+  ZoneList<RegExpTree*>* nodes = this->nodes();
+  for (int i = 0; i < nodes->length(); i++) {
+    RegExpTree* node = nodes->at(i);
+    if (node->IsAnchoredAtStart()) { return true; }
+    if (node->max_match() > 0) { return false; }
+  }
+  return false;
+}
+
+
+bool RegExpAlternative::IsAnchoredAtEnd() {
+  ZoneList<RegExpTree*>* nodes = this->nodes();
+  for (int i = nodes->length() - 1; i >= 0; i--) {
+    RegExpTree* node = nodes->at(i);
+    if (node->IsAnchoredAtEnd()) { return true; }
+    if (node->max_match() > 0) { return false; }
+  }
+  return false;
+}
+
+
+bool RegExpDisjunction::IsAnchoredAtStart() {
+  ZoneList<RegExpTree*>* alternatives = this->alternatives();
+  for (int i = 0; i < alternatives->length(); i++) {
+    if (!alternatives->at(i)->IsAnchoredAtStart())
+      return false;
+  }
+  return true;
+}
+
+
+bool RegExpDisjunction::IsAnchoredAtEnd() {
+  ZoneList<RegExpTree*>* alternatives = this->alternatives();
+  for (int i = 0; i < alternatives->length(); i++) {
+    if (!alternatives->at(i)->IsAnchoredAtEnd())
+      return false;
+  }
+  return true;
+}
+
+
+bool RegExpLookahead::IsAnchoredAtStart() {
+  return is_positive() && body()->IsAnchoredAtStart();
+}
+
+
+bool RegExpCapture::IsAnchoredAtStart() {
+  return body()->IsAnchoredAtStart();
+}
+
+
+bool RegExpCapture::IsAnchoredAtEnd() {
+  return body()->IsAnchoredAtEnd();
+}
+
+
+// Convert regular expression trees to a simple sexp representation.
+// This representation should be different from the input grammar
+// in as many cases as possible, to make it more difficult for incorrect
+// parses to look as correct ones which is likely if the input and
+// output formats are alike.
+class RegExpUnparser FINAL : public RegExpVisitor {
+ public:
+  RegExpUnparser(OStream& os, Zone* zone) : os_(os), zone_(zone) {}
+  void VisitCharacterRange(CharacterRange that);
+#define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*,          \
+                                                  void* data) OVERRIDE;
+  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
+#undef MAKE_CASE
+ private:
+  OStream& os_;
+  Zone* zone_;
+};
+
+
+void* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) {
+  os_ << "(|";
+  for (int i = 0; i <  that->alternatives()->length(); i++) {
+    os_ << " ";
+    that->alternatives()->at(i)->Accept(this, data);
+  }
+  os_ << ")";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitAlternative(RegExpAlternative* that, void* data) {
+  os_ << "(:";
+  for (int i = 0; i <  that->nodes()->length(); i++) {
+    os_ << " ";
+    that->nodes()->at(i)->Accept(this, data);
+  }
+  os_ << ")";
+  return NULL;
+}
+
+
+void RegExpUnparser::VisitCharacterRange(CharacterRange that) {
+  os_ << AsUC16(that.from());
+  if (!that.IsSingleton()) {
+    os_ << "-" << AsUC16(that.to());
+  }
+}
+
+
+
+void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that,
+                                          void* data) {
+  if (that->is_negated()) os_ << "^";
+  os_ << "[";
+  for (int i = 0; i < that->ranges(zone_)->length(); i++) {
+    if (i > 0) os_ << " ";
+    VisitCharacterRange(that->ranges(zone_)->at(i));
+  }
+  os_ << "]";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) {
+  switch (that->assertion_type()) {
+    case RegExpAssertion::START_OF_INPUT:
+      os_ << "@^i";
+      break;
+    case RegExpAssertion::END_OF_INPUT:
+      os_ << "@$i";
+      break;
+    case RegExpAssertion::START_OF_LINE:
+      os_ << "@^l";
+      break;
+    case RegExpAssertion::END_OF_LINE:
+      os_ << "@$l";
+       break;
+    case RegExpAssertion::BOUNDARY:
+      os_ << "@b";
+      break;
+    case RegExpAssertion::NON_BOUNDARY:
+      os_ << "@B";
+      break;
+  }
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitAtom(RegExpAtom* that, void* data) {
+  os_ << "'";
+  Vector<const uc16> chardata = that->data();
+  for (int i = 0; i < chardata.length(); i++) {
+    os_ << AsUC16(chardata[i]);
+  }
+  os_ << "'";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitText(RegExpText* that, void* data) {
+  if (that->elements()->length() == 1) {
+    that->elements()->at(0).tree()->Accept(this, data);
+  } else {
+    os_ << "(!";
+    for (int i = 0; i < that->elements()->length(); i++) {
+      os_ << " ";
+      that->elements()->at(i).tree()->Accept(this, data);
+    }
+    os_ << ")";
+  }
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitQuantifier(RegExpQuantifier* that, void* data) {
+  os_ << "(# " << that->min() << " ";
+  if (that->max() == RegExpTree::kInfinity) {
+    os_ << "- ";
+  } else {
+    os_ << that->max() << " ";
+  }
+  os_ << (that->is_greedy() ? "g " : that->is_possessive() ? "p " : "n ");
+  that->body()->Accept(this, data);
+  os_ << ")";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitCapture(RegExpCapture* that, void* data) {
+  os_ << "(^ ";
+  that->body()->Accept(this, data);
+  os_ << ")";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitLookahead(RegExpLookahead* that, void* data) {
+  os_ << "(-> " << (that->is_positive() ? "+ " : "- ");
+  that->body()->Accept(this, data);
+  os_ << ")";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitBackReference(RegExpBackReference* that,
+                                         void* data) {
+  os_ << "(<- " << that->index() << ")";
+  return NULL;
+}
+
+
+void* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) {
+  os_ << '%';
+  return NULL;
+}
+
+
+OStream& RegExpTree::Print(OStream& os, Zone* zone) {  // NOLINT
+  RegExpUnparser unparser(os, zone);
+  Accept(&unparser, NULL);
+  return os;
+}
+
+
+RegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives)
+    : alternatives_(alternatives) {
+  DCHECK(alternatives->length() > 1);
+  RegExpTree* first_alternative = alternatives->at(0);
+  min_match_ = first_alternative->min_match();
+  max_match_ = first_alternative->max_match();
+  for (int i = 1; i < alternatives->length(); i++) {
+    RegExpTree* alternative = alternatives->at(i);
+    min_match_ = Min(min_match_, alternative->min_match());
+    max_match_ = Max(max_match_, alternative->max_match());
+  }
+}
+
+
+static int IncreaseBy(int previous, int increase) {
+  if (RegExpTree::kInfinity - previous < increase) {
+    return RegExpTree::kInfinity;
+  } else {
+    return previous + increase;
+  }
+}
+
+RegExpAlternative::RegExpAlternative(ZoneList<RegExpTree*>* nodes)
+    : nodes_(nodes) {
+  DCHECK(nodes->length() > 1);
+  min_match_ = 0;
+  max_match_ = 0;
+  for (int i = 0; i < nodes->length(); i++) {
+    RegExpTree* node = nodes->at(i);
+    int node_min_match = node->min_match();
+    min_match_ = IncreaseBy(min_match_, node_min_match);
+    int node_max_match = node->max_match();
+    max_match_ = IncreaseBy(max_match_, node_max_match);
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/regexp_ast.h b/runtime/vm/regexp_ast.h
new file mode 100644
index 0000000..e0d68c9
--- /dev/null
+++ b/runtime/vm/regexp_ast.h
@@ -0,0 +1,386 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_REGEXP_AST_H_
+#define VM_REGEXP_AST_H_
+
+// SNIP
+
+namespace dart {
+
+// SNIP
+
+class RegExpAlternative;
+class RegExpAssertion;
+class RegExpAtom;
+class RegExpBackReference;
+class RegExpCapture;
+class RegExpCharacterClass;
+class RegExpCompiler;
+class RegExpDisjunction;
+class RegExpEmpty;
+class RegExpLookahead;
+class RegExpQuantifier;
+class RegExpText;
+
+// SNIP
+
+class RegExpVisitor BASE_EMBEDDED {
+ public:
+  virtual ~RegExpVisitor() { }
+#define MAKE_CASE(Name)                                              \
+  virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
+  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
+#undef MAKE_CASE
+};
+
+
+class RegExpTree : public ZoneObject {
+ public:
+  static const int kInfinity = kMaxInt;
+  virtual ~RegExpTree() {}
+  virtual void* Accept(RegExpVisitor* visitor, void* data) = 0;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) = 0;
+  virtual bool IsTextElement() { return false; }
+  virtual bool IsAnchoredAtStart() { return false; }
+  virtual bool IsAnchoredAtEnd() { return false; }
+  virtual int min_match() = 0;
+  virtual int max_match() = 0;
+  // Returns the interval of registers used for captures within this
+  // expression.
+  virtual Interval CaptureRegisters() { return Interval::Empty(); }
+  virtual void AppendToText(RegExpText* text, Zone* zone);
+  OStream& Print(OStream& os, Zone* zone);  // NOLINT
+#define MAKE_ASTYPE(Name)                                                  \
+  virtual RegExp##Name* As##Name();                                        \
+  virtual bool Is##Name();
+  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
+#undef MAKE_ASTYPE
+};
+
+
+class RegExpDisjunction FINAL : public RegExpTree {
+ public:
+  explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives);
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpDisjunction* AsDisjunction() OVERRIDE;
+  virtual Interval CaptureRegisters() OVERRIDE;
+  virtual bool IsDisjunction() OVERRIDE;
+  virtual bool IsAnchoredAtStart() OVERRIDE;
+  virtual bool IsAnchoredAtEnd() OVERRIDE;
+  virtual int min_match() OVERRIDE { return min_match_; }
+  virtual int max_match() OVERRIDE { return max_match_; }
+  ZoneList<RegExpTree*>* alternatives() { return alternatives_; }
+ private:
+  ZoneList<RegExpTree*>* alternatives_;
+  int min_match_;
+  int max_match_;
+};
+
+
+class RegExpAlternative FINAL : public RegExpTree {
+ public:
+  explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes);
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpAlternative* AsAlternative() OVERRIDE;
+  virtual Interval CaptureRegisters() OVERRIDE;
+  virtual bool IsAlternative() OVERRIDE;
+  virtual bool IsAnchoredAtStart() OVERRIDE;
+  virtual bool IsAnchoredAtEnd() OVERRIDE;
+  virtual int min_match() OVERRIDE { return min_match_; }
+  virtual int max_match() OVERRIDE { return max_match_; }
+  ZoneList<RegExpTree*>* nodes() { return nodes_; }
+ private:
+  ZoneList<RegExpTree*>* nodes_;
+  int min_match_;
+  int max_match_;
+};
+
+
+class RegExpAssertion FINAL : public RegExpTree {
+ public:
+  enum AssertionType {
+    START_OF_LINE,
+    START_OF_INPUT,
+    END_OF_LINE,
+    END_OF_INPUT,
+    BOUNDARY,
+    NON_BOUNDARY
+  };
+  explicit RegExpAssertion(AssertionType type) : assertion_type_(type) { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpAssertion* AsAssertion() OVERRIDE;
+  virtual bool IsAssertion() OVERRIDE;
+  virtual bool IsAnchoredAtStart() OVERRIDE;
+  virtual bool IsAnchoredAtEnd() OVERRIDE;
+  virtual int min_match() OVERRIDE { return 0; }
+  virtual int max_match() OVERRIDE { return 0; }
+  AssertionType assertion_type() { return assertion_type_; }
+ private:
+  AssertionType assertion_type_;
+};
+
+
+class CharacterSet FINAL BASE_EMBEDDED {
+ public:
+  explicit CharacterSet(uc16 standard_set_type)
+      : ranges_(NULL),
+        standard_set_type_(standard_set_type) {}
+  explicit CharacterSet(ZoneList<CharacterRange>* ranges)
+      : ranges_(ranges),
+        standard_set_type_(0) {}
+  ZoneList<CharacterRange>* ranges(Zone* zone);
+  uc16 standard_set_type() { return standard_set_type_; }
+  void set_standard_set_type(uc16 special_set_type) {
+    standard_set_type_ = special_set_type;
+  }
+  bool is_standard() { return standard_set_type_ != 0; }
+  void Canonicalize();
+ private:
+  ZoneList<CharacterRange>* ranges_;
+  // If non-zero, the value represents a standard set (e.g., all whitespace
+  // characters) without having to expand the ranges.
+  uc16 standard_set_type_;
+};
+
+
+class RegExpCharacterClass FINAL : public RegExpTree {
+ public:
+  RegExpCharacterClass(ZoneList<CharacterRange>* ranges, bool is_negated)
+      : set_(ranges),
+        is_negated_(is_negated) { }
+  explicit RegExpCharacterClass(uc16 type)
+      : set_(type),
+        is_negated_(false) { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpCharacterClass* AsCharacterClass() OVERRIDE;
+  virtual bool IsCharacterClass() OVERRIDE;
+  virtual bool IsTextElement() OVERRIDE { return true; }
+  virtual int min_match() OVERRIDE { return 1; }
+  virtual int max_match() OVERRIDE { return 1; }
+  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
+  CharacterSet character_set() { return set_; }
+  // TODO(lrn): Remove need for complex version if is_standard that
+  // recognizes a mangled standard set and just do { return set_.is_special(); }
+  bool is_standard(Zone* zone);
+  // Returns a value representing the standard character set if is_standard()
+  // returns true.
+  // Currently used values are:
+  // s : unicode whitespace
+  // S : unicode non-whitespace
+  // w : ASCII word character (digit, letter, underscore)
+  // W : non-ASCII word character
+  // d : ASCII digit
+  // D : non-ASCII digit
+  // . : non-unicode non-newline
+  // * : All characters
+  uc16 standard_type() { return set_.standard_set_type(); }
+  ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); }
+  bool is_negated() { return is_negated_; }
+
+ private:
+  CharacterSet set_;
+  bool is_negated_;
+};
+
+
+class RegExpAtom FINAL : public RegExpTree {
+ public:
+  explicit RegExpAtom(Vector<const uc16> data) : data_(data) { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpAtom* AsAtom() OVERRIDE;
+  virtual bool IsAtom() OVERRIDE;
+  virtual bool IsTextElement() OVERRIDE { return true; }
+  virtual int min_match() OVERRIDE { return data_.length(); }
+  virtual int max_match() OVERRIDE { return data_.length(); }
+  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
+  Vector<const uc16> data() { return data_; }
+  int length() { return data_.length(); }
+ private:
+  Vector<const uc16> data_;
+};
+
+
+class RegExpText FINAL : public RegExpTree {
+ public:
+  explicit RegExpText(Zone* zone) : elements_(2, zone), length_(0) {}
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpText* AsText() OVERRIDE;
+  virtual bool IsText() OVERRIDE;
+  virtual bool IsTextElement() OVERRIDE { return true; }
+  virtual int min_match() OVERRIDE { return length_; }
+  virtual int max_match() OVERRIDE { return length_; }
+  virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE;
+  void AddElement(TextElement elm, Zone* zone)  {
+    elements_.Add(elm, zone);
+    length_ += elm.length();
+  }
+  ZoneList<TextElement>* elements() { return &elements_; }
+ private:
+  ZoneList<TextElement> elements_;
+  int length_;
+};
+
+
+class RegExpQuantifier FINAL : public RegExpTree {
+ public:
+  enum QuantifierType { GREEDY, NON_GREEDY, POSSESSIVE };
+  RegExpQuantifier(int min, int max, QuantifierType type, RegExpTree* body)
+      : body_(body),
+        min_(min),
+        max_(max),
+        min_match_(min * body->min_match()),
+        quantifier_type_(type) {
+    if (max > 0 && body->max_match() > kInfinity / max) {
+      max_match_ = kInfinity;
+    } else {
+      max_match_ = max * body->max_match();
+    }
+  }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  static RegExpNode* ToNode(int min,
+                            int max,
+                            bool is_greedy,
+                            RegExpTree* body,
+                            RegExpCompiler* compiler,
+                            RegExpNode* on_success,
+                            bool not_at_start = false);
+  virtual RegExpQuantifier* AsQuantifier() OVERRIDE;
+  virtual Interval CaptureRegisters() OVERRIDE;
+  virtual bool IsQuantifier() OVERRIDE;
+  virtual int min_match() OVERRIDE { return min_match_; }
+  virtual int max_match() OVERRIDE { return max_match_; }
+  int min() { return min_; }
+  int max() { return max_; }
+  bool is_possessive() { return quantifier_type_ == POSSESSIVE; }
+  bool is_non_greedy() { return quantifier_type_ == NON_GREEDY; }
+  bool is_greedy() { return quantifier_type_ == GREEDY; }
+  RegExpTree* body() { return body_; }
+
+ private:
+  RegExpTree* body_;
+  int min_;
+  int max_;
+  int min_match_;
+  int max_match_;
+  QuantifierType quantifier_type_;
+};
+
+
+class RegExpCapture FINAL : public RegExpTree {
+ public:
+  explicit RegExpCapture(RegExpTree* body, int index)
+      : body_(body), index_(index) { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  static RegExpNode* ToNode(RegExpTree* body,
+                            int index,
+                            RegExpCompiler* compiler,
+                            RegExpNode* on_success);
+  virtual RegExpCapture* AsCapture() OVERRIDE;
+  virtual bool IsAnchoredAtStart() OVERRIDE;
+  virtual bool IsAnchoredAtEnd() OVERRIDE;
+  virtual Interval CaptureRegisters() OVERRIDE;
+  virtual bool IsCapture() OVERRIDE;
+  virtual int min_match() OVERRIDE { return body_->min_match(); }
+  virtual int max_match() OVERRIDE { return body_->max_match(); }
+  RegExpTree* body() { return body_; }
+  int index() { return index_; }
+  static int StartRegister(int index) { return index * 2; }
+  static int EndRegister(int index) { return index * 2 + 1; }
+
+ private:
+  RegExpTree* body_;
+  int index_;
+};
+
+
+class RegExpLookahead FINAL : public RegExpTree {
+ public:
+  RegExpLookahead(RegExpTree* body,
+                  bool is_positive,
+                  int capture_count,
+                  int capture_from)
+      : body_(body),
+        is_positive_(is_positive),
+        capture_count_(capture_count),
+        capture_from_(capture_from) { }
+
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpLookahead* AsLookahead() OVERRIDE;
+  virtual Interval CaptureRegisters() OVERRIDE;
+  virtual bool IsLookahead() OVERRIDE;
+  virtual bool IsAnchoredAtStart() OVERRIDE;
+  virtual int min_match() OVERRIDE { return 0; }
+  virtual int max_match() OVERRIDE { return 0; }
+  RegExpTree* body() { return body_; }
+  bool is_positive() { return is_positive_; }
+  int capture_count() { return capture_count_; }
+  int capture_from() { return capture_from_; }
+
+ private:
+  RegExpTree* body_;
+  bool is_positive_;
+  int capture_count_;
+  int capture_from_;
+};
+
+
+class RegExpBackReference FINAL : public RegExpTree {
+ public:
+  explicit RegExpBackReference(RegExpCapture* capture)
+      : capture_(capture) { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpBackReference* AsBackReference() OVERRIDE;
+  virtual bool IsBackReference() OVERRIDE;
+  virtual int min_match() OVERRIDE { return 0; }
+  virtual int max_match() OVERRIDE { return capture_->max_match(); }
+  int index() { return capture_->index(); }
+  RegExpCapture* capture() { return capture_; }
+ private:
+  RegExpCapture* capture_;
+};
+
+
+class RegExpEmpty FINAL : public RegExpTree {
+ public:
+  RegExpEmpty() { }
+  virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE;
+  virtual RegExpNode* ToNode(RegExpCompiler* compiler,
+                             RegExpNode* on_success) OVERRIDE;
+  virtual RegExpEmpty* AsEmpty() OVERRIDE;
+  virtual bool IsEmpty() OVERRIDE;
+  virtual int min_match() OVERRIDE { return 0; }
+  virtual int max_match() OVERRIDE { return 0; }
+  static RegExpEmpty* GetInstance() {
+    static RegExpEmpty* instance = ::new RegExpEmpty();
+    return instance;
+  }
+};
+
+// SNIP
+
+}  // namespace dart
+
+#endif  // VM_REGEXP_AST_H_
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
new file mode 100644
index 0000000..72e8d7f
--- /dev/null
+++ b/runtime/vm/regexp_parser.cc
@@ -0,0 +1,1003 @@
+// Copyright (c) 2014, 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.
+
+#include "vm/regexp_parser.h"
+
+// SNIP
+
+namespace dart {
+
+RegExpBuilder::RegExpBuilder(Zone* zone)
+    : zone_(zone),
+      pending_empty_(false),
+      characters_(NULL),
+      terms_(),
+      alternatives_()
+#ifdef DEBUG
+    , last_added_(ADD_NONE)
+#endif
+  {}
+
+
+void RegExpBuilder::FlushCharacters() {
+  pending_empty_ = false;
+  if (characters_ != NULL) {
+    RegExpTree* atom = new(zone()) RegExpAtom(characters_->ToConstVector());
+    characters_ = NULL;
+    text_.Add(atom, zone());
+    LAST(ADD_ATOM);
+  }
+}
+
+
+void RegExpBuilder::FlushText() {
+  FlushCharacters();
+  int num_text = text_.length();
+  if (num_text == 0) {
+    return;
+  } else if (num_text == 1) {
+    terms_.Add(text_.last(), zone());
+  } else {
+    RegExpText* text = new(zone()) RegExpText(zone());
+    for (int i = 0; i < num_text; i++)
+      text_.Get(i)->AppendToText(text, zone());
+    terms_.Add(text, zone());
+  }
+  text_.Clear();
+}
+
+
+void RegExpBuilder::AddCharacter(uc16 c) {
+  pending_empty_ = false;
+  if (characters_ == NULL) {
+    characters_ = new(zone()) ZoneList<uc16>(4, zone());
+  }
+  characters_->Add(c, zone());
+  LAST(ADD_CHAR);
+}
+
+
+void RegExpBuilder::AddEmpty() {
+  pending_empty_ = true;
+}
+
+
+void RegExpBuilder::AddAtom(RegExpTree* term) {
+  if (term->IsEmpty()) {
+    AddEmpty();
+    return;
+  }
+  if (term->IsTextElement()) {
+    FlushCharacters();
+    text_.Add(term, zone());
+  } else {
+    FlushText();
+    terms_.Add(term, zone());
+  }
+  LAST(ADD_ATOM);
+}
+
+
+void RegExpBuilder::AddAssertion(RegExpTree* assert) {
+  FlushText();
+  terms_.Add(assert, zone());
+  LAST(ADD_ASSERT);
+}
+
+
+void RegExpBuilder::NewAlternative() {
+  FlushTerms();
+}
+
+
+void RegExpBuilder::FlushTerms() {
+  FlushText();
+  int num_terms = terms_.length();
+  RegExpTree* alternative;
+  if (num_terms == 0) {
+    alternative = RegExpEmpty::GetInstance();
+  } else if (num_terms == 1) {
+    alternative = terms_.last();
+  } else {
+    alternative = new(zone()) RegExpAlternative(terms_.GetList(zone()));
+  }
+  alternatives_.Add(alternative, zone());
+  terms_.Clear();
+  LAST(ADD_NONE);
+}
+
+
+RegExpTree* RegExpBuilder::ToRegExp() {
+  FlushTerms();
+  int num_alternatives = alternatives_.length();
+  if (num_alternatives == 0) {
+    return RegExpEmpty::GetInstance();
+  }
+  if (num_alternatives == 1) {
+    return alternatives_.last();
+  }
+  return new(zone()) RegExpDisjunction(alternatives_.GetList(zone()));
+}
+
+
+void RegExpBuilder::AddQuantifierToAtom(
+    int min, int max, RegExpQuantifier::QuantifierType quantifier_type) {
+  if (pending_empty_) {
+    pending_empty_ = false;
+    return;
+  }
+  RegExpTree* atom;
+  if (characters_ != NULL) {
+    DCHECK(last_added_ == ADD_CHAR);
+    // Last atom was character.
+    Vector<const uc16> char_vector = characters_->ToConstVector();
+    int num_chars = char_vector.length();
+    if (num_chars > 1) {
+      Vector<const uc16> prefix = char_vector.SubVector(0, num_chars - 1);
+      text_.Add(new(zone()) RegExpAtom(prefix), zone());
+      char_vector = char_vector.SubVector(num_chars - 1, num_chars);
+    }
+    characters_ = NULL;
+    atom = new(zone()) RegExpAtom(char_vector);
+    FlushText();
+  } else if (text_.length() > 0) {
+    DCHECK(last_added_ == ADD_ATOM);
+    atom = text_.RemoveLast();
+    FlushText();
+  } else if (terms_.length() > 0) {
+    DCHECK(last_added_ == ADD_ATOM);
+    atom = terms_.RemoveLast();
+    if (atom->max_match() == 0) {
+      // Guaranteed to only match an empty string.
+      LAST(ADD_TERM);
+      if (min == 0) {
+        return;
+      }
+      terms_.Add(atom, zone());
+      return;
+    }
+  } else {
+    // Only call immediately after adding an atom or character!
+    UNREACHABLE();
+    return;
+  }
+  terms_.Add(
+      new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone());
+  LAST(ADD_TERM);
+}
+
+// SNIP
+
+// ----------------------------------------------------------------------------
+// Regular expressions
+
+RegExpParser::RegExpParser(FlatStringReader* in,
+                           Handle<String>* error,
+                           bool multiline,
+                           Zone* zone)
+    : isolate_(zone->isolate()),
+      zone_(zone),
+      error_(error),
+      captures_(NULL),
+      in_(in),
+      current_(kEndMarker),
+      next_pos_(0),
+      capture_count_(0),
+      has_more_(true),
+      multiline_(multiline),
+      simple_(false),
+      contains_anchor_(false),
+      is_scanned_for_captures_(false),
+      failed_(false) {
+  Advance();
+}
+
+
+uc32 RegExpParser::Next() {
+  if (has_next()) {
+    return in()->Get(next_pos_);
+  } else {
+    return kEndMarker;
+  }
+}
+
+
+void RegExpParser::Advance() {
+  if (next_pos_ < in()->length()) {
+    StackLimitCheck check(isolate());
+    if (check.HasOverflowed()) {
+      ReportError(CStrVector(Isolate::kStackOverflowMessage));
+    } else if (zone()->excess_allocation()) {
+      ReportError(CStrVector("Regular expression too large"));
+    } else {
+      current_ = in()->Get(next_pos_);
+      next_pos_++;
+    }
+  } else {
+    current_ = kEndMarker;
+    has_more_ = false;
+  }
+}
+
+
+void RegExpParser::Reset(int pos) {
+  next_pos_ = pos;
+  has_more_ = (pos < in()->length());
+  Advance();
+}
+
+
+void RegExpParser::Advance(int dist) {
+  next_pos_ += dist - 1;
+  Advance();
+}
+
+
+bool RegExpParser::simple() {
+  return simple_;
+}
+
+
+RegExpTree* RegExpParser::ReportError(Vector<const char> message) {
+  failed_ = true;
+  *error_ = isolate()->factory()->NewStringFromAscii(message).ToHandleChecked();
+  // Zip to the end to make sure the no more input is read.
+  current_ = kEndMarker;
+  next_pos_ = in()->length();
+  return NULL;
+}
+
+
+// Pattern ::
+//   Disjunction
+RegExpTree* RegExpParser::ParsePattern() {
+  RegExpTree* result = ParseDisjunction(CHECK_FAILED);
+  DCHECK(!has_more());
+  // If the result of parsing is a literal string atom, and it has the
+  // same length as the input, then the atom is identical to the input.
+  if (result->IsAtom() && result->AsAtom()->length() == in()->length()) {
+    simple_ = true;
+  }
+  return result;
+}
+
+
+// Disjunction ::
+//   Alternative
+//   Alternative | Disjunction
+// Alternative ::
+//   [empty]
+//   Term Alternative
+// Term ::
+//   Assertion
+//   Atom
+//   Atom Quantifier
+RegExpTree* RegExpParser::ParseDisjunction() {
+  // Used to store current state while parsing subexpressions.
+  RegExpParserState initial_state(NULL, INITIAL, 0, zone());
+  RegExpParserState* stored_state = &initial_state;
+  // Cache the builder in a local variable for quick access.
+  RegExpBuilder* builder = initial_state.builder();
+  while (true) {
+    switch (current()) {
+    case kEndMarker:
+      if (stored_state->IsSubexpression()) {
+        // Inside a parenthesized group when hitting end of input.
+        ReportError(CStrVector("Unterminated group") CHECK_FAILED);
+      }
+      DCHECK_EQ(INITIAL, stored_state->group_type());
+      // Parsing completed successfully.
+      return builder->ToRegExp();
+    case ')': {
+      if (!stored_state->IsSubexpression()) {
+        ReportError(CStrVector("Unmatched ')'") CHECK_FAILED);
+      }
+      DCHECK_NE(INITIAL, stored_state->group_type());
+
+      Advance();
+      // End disjunction parsing and convert builder content to new single
+      // regexp atom.
+      RegExpTree* body = builder->ToRegExp();
+
+      int end_capture_index = captures_started();
+
+      int capture_index = stored_state->capture_index();
+      SubexpressionType group_type = stored_state->group_type();
+
+      // Restore previous state.
+      stored_state = stored_state->previous_state();
+      builder = stored_state->builder();
+
+      // Build result of subexpression.
+      if (group_type == CAPTURE) {
+        RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index);
+        captures_->at(capture_index - 1) = capture;
+        body = capture;
+      } else if (group_type != GROUPING) {
+        DCHECK(group_type == POSITIVE_LOOKAHEAD ||
+               group_type == NEGATIVE_LOOKAHEAD);
+        bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
+        body = new(zone()) RegExpLookahead(body,
+                                   is_positive,
+                                   end_capture_index - capture_index,
+                                   capture_index);
+      }
+      builder->AddAtom(body);
+      // For compatability with JSC and ES3, we allow quantifiers after
+      // lookaheads, and break in all cases.
+      break;
+    }
+    case '|': {
+      Advance();
+      builder->NewAlternative();
+      continue;
+    }
+    case '*':
+    case '+':
+    case '?':
+      return ReportError(CStrVector("Nothing to repeat"));
+    case '^': {
+      Advance();
+      if (multiline_) {
+        builder->AddAssertion(
+            new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
+      } else {
+        builder->AddAssertion(
+            new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
+        set_contains_anchor();
+      }
+      continue;
+    }
+    case '$': {
+      Advance();
+      RegExpAssertion::AssertionType assertion_type =
+          multiline_ ? RegExpAssertion::END_OF_LINE :
+                       RegExpAssertion::END_OF_INPUT;
+      builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type));
+      continue;
+    }
+    case '.': {
+      Advance();
+      // everything except \x0a, \x0d, \u2028 and \u2029
+      ZoneList<CharacterRange>* ranges =
+          new(zone()) ZoneList<CharacterRange>(2, zone());
+      CharacterRange::AddClassEscape('.', ranges, zone());
+      RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
+      builder->AddAtom(atom);
+      break;
+    }
+    case '(': {
+      SubexpressionType subexpr_type = CAPTURE;
+      Advance();
+      if (current() == '?') {
+        switch (Next()) {
+          case ':':
+            subexpr_type = GROUPING;
+            break;
+          case '=':
+            subexpr_type = POSITIVE_LOOKAHEAD;
+            break;
+          case '!':
+            subexpr_type = NEGATIVE_LOOKAHEAD;
+            break;
+          default:
+            ReportError(CStrVector("Invalid group") CHECK_FAILED);
+            break;
+        }
+        Advance(2);
+      } else {
+        if (captures_ == NULL) {
+          captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone());
+        }
+        if (captures_started() >= kMaxCaptures) {
+          ReportError(CStrVector("Too many captures") CHECK_FAILED);
+        }
+        captures_->Add(NULL, zone());
+      }
+      // Store current state and begin new disjunction parsing.
+      stored_state = new(zone()) RegExpParserState(stored_state, subexpr_type,
+                                                   captures_started(), zone());
+      builder = stored_state->builder();
+      continue;
+    }
+    case '[': {
+      RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
+      builder->AddAtom(atom);
+      break;
+    }
+    // Atom ::
+    //   \ AtomEscape
+    case '\\':
+      switch (Next()) {
+      case kEndMarker:
+        return ReportError(CStrVector("\\ at end of pattern"));
+      case 'b':
+        Advance(2);
+        builder->AddAssertion(
+            new(zone()) RegExpAssertion(RegExpAssertion::BOUNDARY));
+        continue;
+      case 'B':
+        Advance(2);
+        builder->AddAssertion(
+            new(zone()) RegExpAssertion(RegExpAssertion::NON_BOUNDARY));
+        continue;
+      // AtomEscape ::
+      //   CharacterClassEscape
+      //
+      // CharacterClassEscape :: one of
+      //   d D s S w W
+      case 'd': case 'D': case 's': case 'S': case 'w': case 'W': {
+        uc32 c = Next();
+        Advance(2);
+        ZoneList<CharacterRange>* ranges =
+            new(zone()) ZoneList<CharacterRange>(2, zone());
+        CharacterRange::AddClassEscape(c, ranges, zone());
+        RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
+        builder->AddAtom(atom);
+        break;
+      }
+      case '1': case '2': case '3': case '4': case '5': case '6':
+      case '7': case '8': case '9': {
+        int index = 0;
+        if (ParseBackReferenceIndex(&index)) {
+          RegExpCapture* capture = NULL;
+          if (captures_ != NULL && index <= captures_->length()) {
+            capture = captures_->at(index - 1);
+          }
+          if (capture == NULL) {
+            builder->AddEmpty();
+            break;
+          }
+          RegExpTree* atom = new(zone()) RegExpBackReference(capture);
+          builder->AddAtom(atom);
+          break;
+        }
+        uc32 first_digit = Next();
+        if (first_digit == '8' || first_digit == '9') {
+          // Treat as identity escape
+          builder->AddCharacter(first_digit);
+          Advance(2);
+          break;
+        }
+      }
+      // FALLTHROUGH
+      case '0': {
+        Advance();
+        uc32 octal = ParseOctalLiteral();
+        builder->AddCharacter(octal);
+        break;
+      }
+      // ControlEscape :: one of
+      //   f n r t v
+      case 'f':
+        Advance(2);
+        builder->AddCharacter('\f');
+        break;
+      case 'n':
+        Advance(2);
+        builder->AddCharacter('\n');
+        break;
+      case 'r':
+        Advance(2);
+        builder->AddCharacter('\r');
+        break;
+      case 't':
+        Advance(2);
+        builder->AddCharacter('\t');
+        break;
+      case 'v':
+        Advance(2);
+        builder->AddCharacter('\v');
+        break;
+      case 'c': {
+        Advance();
+        uc32 controlLetter = Next();
+        // Special case if it is an ASCII letter.
+        // Convert lower case letters to uppercase.
+        uc32 letter = controlLetter & ~('a' ^ 'A');
+        if (letter < 'A' || 'Z' < letter) {
+          // controlLetter is not in range 'A'-'Z' or 'a'-'z'.
+          // This is outside the specification. We match JSC in
+          // reading the backslash as a literal character instead
+          // of as starting an escape.
+          builder->AddCharacter('\\');
+        } else {
+          Advance(2);
+          builder->AddCharacter(controlLetter & 0x1f);
+        }
+        break;
+      }
+      case 'x': {
+        Advance(2);
+        uc32 value;
+        if (ParseHexEscape(2, &value)) {
+          builder->AddCharacter(value);
+        } else {
+          builder->AddCharacter('x');
+        }
+        break;
+      }
+      case 'u': {
+        Advance(2);
+        uc32 value;
+        if (ParseHexEscape(4, &value)) {
+          builder->AddCharacter(value);
+        } else {
+          builder->AddCharacter('u');
+        }
+        break;
+      }
+      default:
+        // Identity escape.
+        builder->AddCharacter(Next());
+        Advance(2);
+        break;
+      }
+      break;
+    case '{': {
+      int dummy;
+      if (ParseIntervalQuantifier(&dummy, &dummy)) {
+        ReportError(CStrVector("Nothing to repeat") CHECK_FAILED);
+      }
+      // fallthrough
+    }
+    default:
+      builder->AddCharacter(current());
+      Advance();
+      break;
+    }  // end switch(current())
+
+    int min;
+    int max;
+    switch (current()) {
+    // QuantifierPrefix ::
+    //   *
+    //   +
+    //   ?
+    //   {
+    case '*':
+      min = 0;
+      max = RegExpTree::kInfinity;
+      Advance();
+      break;
+    case '+':
+      min = 1;
+      max = RegExpTree::kInfinity;
+      Advance();
+      break;
+    case '?':
+      min = 0;
+      max = 1;
+      Advance();
+      break;
+    case '{':
+      if (ParseIntervalQuantifier(&min, &max)) {
+        if (max < min) {
+          ReportError(CStrVector("numbers out of order in {} quantifier.")
+                      CHECK_FAILED);
+        }
+        break;
+      } else {
+        continue;
+      }
+    default:
+      continue;
+    }
+    RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
+    if (current() == '?') {
+      quantifier_type = RegExpQuantifier::NON_GREEDY;
+      Advance();
+    } else if (FLAG_regexp_possessive_quantifier && current() == '+') {
+      // FLAG_regexp_possessive_quantifier is a debug-only flag.
+      quantifier_type = RegExpQuantifier::POSSESSIVE;
+      Advance();
+    }
+    builder->AddQuantifierToAtom(min, max, quantifier_type);
+  }
+}
+
+
+#ifdef DEBUG
+// Currently only used in an DCHECK.
+static bool IsSpecialClassEscape(uc32 c) {
+  switch (c) {
+    case 'd': case 'D':
+    case 's': case 'S':
+    case 'w': case 'W':
+      return true;
+    default:
+      return false;
+  }
+}
+#endif
+
+
+// In order to know whether an escape is a backreference or not we have to scan
+// the entire regexp and find the number of capturing parentheses.  However we
+// don't want to scan the regexp twice unless it is necessary.  This mini-parser
+// is called when needed.  It can see the difference between capturing and
+// noncapturing parentheses and can skip character classes and backslash-escaped
+// characters.
+void RegExpParser::ScanForCaptures() {
+  // Start with captures started previous to current position
+  int capture_count = captures_started();
+  // Add count of captures after this position.
+  int n;
+  while ((n = current()) != kEndMarker) {
+    Advance();
+    switch (n) {
+      case '\\':
+        Advance();
+        break;
+      case '[': {
+        int c;
+        while ((c = current()) != kEndMarker) {
+          Advance();
+          if (c == '\\') {
+            Advance();
+          } else {
+            if (c == ']') break;
+          }
+        }
+        break;
+      }
+      case '(':
+        if (current() != '?') capture_count++;
+        break;
+    }
+  }
+  capture_count_ = capture_count;
+  is_scanned_for_captures_ = true;
+}
+
+
+bool RegExpParser::ParseBackReferenceIndex(int* index_out) {
+  DCHECK_EQ('\\', current());
+  DCHECK('1' <= Next() && Next() <= '9');
+  // Try to parse a decimal literal that is no greater than the total number
+  // of left capturing parentheses in the input.
+  int start = position();
+  int value = Next() - '0';
+  Advance(2);
+  while (true) {
+    uc32 c = current();
+    if (IsDecimalDigit(c)) {
+      value = 10 * value + (c - '0');
+      if (value > kMaxCaptures) {
+        Reset(start);
+        return false;
+      }
+      Advance();
+    } else {
+      break;
+    }
+  }
+  if (value > captures_started()) {
+    if (!is_scanned_for_captures_) {
+      int saved_position = position();
+      ScanForCaptures();
+      Reset(saved_position);
+    }
+    if (value > capture_count_) {
+      Reset(start);
+      return false;
+    }
+  }
+  *index_out = value;
+  return true;
+}
+
+
+// QuantifierPrefix ::
+//   { DecimalDigits }
+//   { DecimalDigits , }
+//   { DecimalDigits , DecimalDigits }
+//
+// Returns true if parsing succeeds, and set the min_out and max_out
+// values. Values are truncated to RegExpTree::kInfinity if they overflow.
+bool RegExpParser::ParseIntervalQuantifier(int* min_out, int* max_out) {
+  DCHECK_EQ(current(), '{');
+  int start = position();
+  Advance();
+  int min = 0;
+  if (!IsDecimalDigit(current())) {
+    Reset(start);
+    return false;
+  }
+  while (IsDecimalDigit(current())) {
+    int next = current() - '0';
+    if (min > (RegExpTree::kInfinity - next) / 10) {
+      // Overflow. Skip past remaining decimal digits and return -1.
+      do {
+        Advance();
+      } while (IsDecimalDigit(current()));
+      min = RegExpTree::kInfinity;
+      break;
+    }
+    min = 10 * min + next;
+    Advance();
+  }
+  int max = 0;
+  if (current() == '}') {
+    max = min;
+    Advance();
+  } else if (current() == ',') {
+    Advance();
+    if (current() == '}') {
+      max = RegExpTree::kInfinity;
+      Advance();
+    } else {
+      while (IsDecimalDigit(current())) {
+        int next = current() - '0';
+        if (max > (RegExpTree::kInfinity - next) / 10) {
+          do {
+            Advance();
+          } while (IsDecimalDigit(current()));
+          max = RegExpTree::kInfinity;
+          break;
+        }
+        max = 10 * max + next;
+        Advance();
+      }
+      if (current() != '}') {
+        Reset(start);
+        return false;
+      }
+      Advance();
+    }
+  } else {
+    Reset(start);
+    return false;
+  }
+  *min_out = min;
+  *max_out = max;
+  return true;
+}
+
+
+uc32 RegExpParser::ParseOctalLiteral() {
+  DCHECK(('0' <= current() && current() <= '7') || current() == kEndMarker);
+  // For compatibility with some other browsers (not all), we parse
+  // up to three octal digits with a value below 256.
+  uc32 value = current() - '0';
+  Advance();
+  if ('0' <= current() && current() <= '7') {
+    value = value * 8 + current() - '0';
+    Advance();
+    if (value < 32 && '0' <= current() && current() <= '7') {
+      value = value * 8 + current() - '0';
+      Advance();
+    }
+  }
+  return value;
+}
+
+
+bool RegExpParser::ParseHexEscape(int length, uc32 *value) {
+  int start = position();
+  uc32 val = 0;
+  bool done = false;
+  for (int i = 0; !done; i++) {
+    uc32 c = current();
+    int d = HexValue(c);
+    if (d < 0) {
+      Reset(start);
+      return false;
+    }
+    val = val * 16 + d;
+    Advance();
+    if (i == length - 1) {
+      done = true;
+    }
+  }
+  *value = val;
+  return true;
+}
+
+
+uc32 RegExpParser::ParseClassCharacterEscape() {
+  DCHECK(current() == '\\');
+  DCHECK(has_next() && !IsSpecialClassEscape(Next()));
+  Advance();
+  switch (current()) {
+    case 'b':
+      Advance();
+      return '\b';
+    // ControlEscape :: one of
+    //   f n r t v
+    case 'f':
+      Advance();
+      return '\f';
+    case 'n':
+      Advance();
+      return '\n';
+    case 'r':
+      Advance();
+      return '\r';
+    case 't':
+      Advance();
+      return '\t';
+    case 'v':
+      Advance();
+      return '\v';
+    case 'c': {
+      uc32 controlLetter = Next();
+      uc32 letter = controlLetter & ~('A' ^ 'a');
+      // For compatibility with JSC, inside a character class
+      // we also accept digits and underscore as control characters.
+      if ((controlLetter >= '0' && controlLetter <= '9') ||
+          controlLetter == '_' ||
+          (letter >= 'A' && letter <= 'Z')) {
+        Advance(2);
+        // Control letters mapped to ASCII control characters in the range
+        // 0x00-0x1f.
+        return controlLetter & 0x1f;
+      }
+      // We match JSC in reading the backslash as a literal
+      // character instead of as starting an escape.
+      return '\\';
+    }
+    case '0': case '1': case '2': case '3': case '4': case '5':
+    case '6': case '7':
+      // For compatibility, we interpret a decimal escape that isn't
+      // a back reference (and therefore either \0 or not valid according
+      // to the specification) as a 1..3 digit octal character code.
+      return ParseOctalLiteral();
+    case 'x': {
+      Advance();
+      uc32 value;
+      if (ParseHexEscape(2, &value)) {
+        return value;
+      }
+      // If \x is not followed by a two-digit hexadecimal, treat it
+      // as an identity escape.
+      return 'x';
+    }
+    case 'u': {
+      Advance();
+      uc32 value;
+      if (ParseHexEscape(4, &value)) {
+        return value;
+      }
+      // If \u is not followed by a four-digit hexadecimal, treat it
+      // as an identity escape.
+      return 'u';
+    }
+    default: {
+      // Extended identity escape. We accept any character that hasn't
+      // been matched by a more specific case, not just the subset required
+      // by the ECMAScript specification.
+      uc32 result = current();
+      Advance();
+      return result;
+    }
+  }
+  return 0;
+}
+
+
+CharacterRange RegExpParser::ParseClassAtom(uc16* char_class) {
+  DCHECK_EQ(0, *char_class);
+  uc32 first = current();
+  if (first == '\\') {
+    switch (Next()) {
+      case 'w': case 'W': case 'd': case 'D': case 's': case 'S': {
+        *char_class = Next();
+        Advance(2);
+        return CharacterRange::Singleton(0);  // Return dummy value.
+      }
+      case kEndMarker:
+        return ReportError(CStrVector("\\ at end of pattern"));
+      default:
+        uc32 c = ParseClassCharacterEscape(CHECK_FAILED);
+        return CharacterRange::Singleton(c);
+    }
+  } else {
+    Advance();
+    return CharacterRange::Singleton(first);
+  }
+}
+
+
+static const uc16 kNoCharClass = 0;
+
+// Adds range or pre-defined character class to character ranges.
+// If char_class is not kInvalidClass, it's interpreted as a class
+// escape (i.e., 's' means whitespace, from '\s').
+static inline void AddRangeOrEscape(ZoneList<CharacterRange>* ranges,
+                                    uc16 char_class,
+                                    CharacterRange range,
+                                    Zone* zone) {
+  if (char_class != kNoCharClass) {
+    CharacterRange::AddClassEscape(char_class, ranges, zone);
+  } else {
+    ranges->Add(range, zone);
+  }
+}
+
+
+RegExpTree* RegExpParser::ParseCharacterClass() {
+  static const char* kUnterminated = "Unterminated character class";
+  static const char* kRangeOutOfOrder = "Range out of order in character class";
+
+  DCHECK_EQ(current(), '[');
+  Advance();
+  bool is_negated = false;
+  if (current() == '^') {
+    is_negated = true;
+    Advance();
+  }
+  ZoneList<CharacterRange>* ranges =
+      new(zone()) ZoneList<CharacterRange>(2, zone());
+  while (has_more() && current() != ']') {
+    uc16 char_class = kNoCharClass;
+    CharacterRange first = ParseClassAtom(&char_class CHECK_FAILED);
+    if (current() == '-') {
+      Advance();
+      if (current() == kEndMarker) {
+        // If we reach the end we break out of the loop and let the
+        // following code report an error.
+        break;
+      } else if (current() == ']') {
+        AddRangeOrEscape(ranges, char_class, first, zone());
+        ranges->Add(CharacterRange::Singleton('-'), zone());
+        break;
+      }
+      uc16 char_class_2 = kNoCharClass;
+      CharacterRange next = ParseClassAtom(&char_class_2 CHECK_FAILED);
+      if (char_class != kNoCharClass || char_class_2 != kNoCharClass) {
+        // Either end is an escaped character class. Treat the '-' verbatim.
+        AddRangeOrEscape(ranges, char_class, first, zone());
+        ranges->Add(CharacterRange::Singleton('-'), zone());
+        AddRangeOrEscape(ranges, char_class_2, next, zone());
+        continue;
+      }
+      if (first.from() > next.to()) {
+        return ReportError(CStrVector(kRangeOutOfOrder) CHECK_FAILED);
+      }
+      ranges->Add(CharacterRange::Range(first.from(), next.to()), zone());
+    } else {
+      AddRangeOrEscape(ranges, char_class, first, zone());
+    }
+  }
+  if (!has_more()) {
+    return ReportError(CStrVector(kUnterminated) CHECK_FAILED);
+  }
+  Advance();
+  if (ranges->length() == 0) {
+    ranges->Add(CharacterRange::Everything(), zone());
+    is_negated = !is_negated;
+  }
+  return new(zone()) RegExpCharacterClass(ranges, is_negated);
+}
+
+
+// ----------------------------------------------------------------------------
+// The Parser interface.
+
+bool RegExpParser::ParseRegExp(FlatStringReader* input,
+                               bool multiline,
+                               RegExpCompileData* result,
+                               Zone* zone) {
+  DCHECK(result != NULL);
+  RegExpParser parser(input, &result->error, multiline, zone);
+  RegExpTree* tree = parser.ParsePattern();
+  if (parser.failed()) {
+    DCHECK(tree == NULL);
+    DCHECK(!result->error.is_null());
+  } else {
+    DCHECK(tree != NULL);
+    DCHECK(result->error.is_null());
+    result->tree = tree;
+    int capture_count = parser.captures_started();
+    result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
+    result->contains_anchor = parser.contains_anchor();
+    result->capture_count = capture_count;
+  }
+  return !parser.failed();
+}
+
+// SNIP
+
+}  // namespace dart
diff --git a/runtime/vm/regexp_parser.h b/runtime/vm/regexp_parser.h
new file mode 100644
index 0000000..42cedd4
--- /dev/null
+++ b/runtime/vm/regexp_parser.h
@@ -0,0 +1,178 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_REGEXP_PARSER_H_
+#define VM_REGEXP_PARSER_H_
+
+// SNIP
+
+namespace dart {
+
+// SNIP
+
+// Accumulates RegExp atoms and assertions into lists of terms and alternatives.
+class RegExpBuilder: public ZoneObject {
+ public:
+  explicit RegExpBuilder(Zone* zone);
+  void AddCharacter(uc16 character);
+  // "Adds" an empty expression. Does nothing except consume a
+  // following quantifier
+  void AddEmpty();
+  void AddAtom(RegExpTree* tree);
+  void AddAssertion(RegExpTree* tree);
+  void NewAlternative();  // '|'
+  void AddQuantifierToAtom(
+      int min, int max, RegExpQuantifier::QuantifierType type);
+  RegExpTree* ToRegExp();
+
+ private:
+  void FlushCharacters();
+  void FlushText();
+  void FlushTerms();
+  Zone* zone() const { return zone_; }
+
+  Zone* zone_;
+  bool pending_empty_;
+  ZoneList<uc16>* characters_;
+  BufferedZoneList<RegExpTree, 2> terms_;
+  BufferedZoneList<RegExpTree, 2> text_;
+  BufferedZoneList<RegExpTree, 2> alternatives_;
+#ifdef DEBUG
+  enum {ADD_NONE, ADD_CHAR, ADD_TERM, ADD_ASSERT, ADD_ATOM} last_added_;
+#define LAST(x) last_added_ = x;
+#else
+#define LAST(x)
+#endif
+};
+
+
+class RegExpParser BASE_EMBEDDED {
+ public:
+  RegExpParser(FlatStringReader* in,
+               Handle<String>* error,
+               bool multiline_mode,
+               Zone* zone);
+
+  static bool ParseRegExp(FlatStringReader* input,
+                          bool multiline,
+                          RegExpCompileData* result,
+                          Zone* zone);
+
+  RegExpTree* ParsePattern();
+  RegExpTree* ParseDisjunction();
+  RegExpTree* ParseGroup();
+  RegExpTree* ParseCharacterClass();
+
+  // Parses a {...,...} quantifier and stores the range in the given
+  // out parameters.
+  bool ParseIntervalQuantifier(int* min_out, int* max_out);
+
+  // Parses and returns a single escaped character.  The character
+  // must not be 'b' or 'B' since they are usually handle specially.
+  uc32 ParseClassCharacterEscape();
+
+  // Checks whether the following is a length-digit hexadecimal number,
+  // and sets the value if it is.
+  bool ParseHexEscape(int length, uc32* value);
+
+  uc32 ParseOctalLiteral();
+
+  // Tries to parse the input as a back reference.  If successful it
+  // stores the result in the output parameter and returns true.  If
+  // it fails it will push back the characters read so the same characters
+  // can be reparsed.
+  bool ParseBackReferenceIndex(int* index_out);
+
+  CharacterRange ParseClassAtom(uc16* char_class);
+  RegExpTree* ReportError(Vector<const char> message);
+  void Advance();
+  void Advance(int dist);
+  void Reset(int pos);
+
+  // Reports whether the pattern might be used as a literal search string.
+  // Only use if the result of the parse is a single atom node.
+  bool simple();
+  bool contains_anchor() { return contains_anchor_; }
+  void set_contains_anchor() { contains_anchor_ = true; }
+  int captures_started() { return captures_ == NULL ? 0 : captures_->length(); }
+  int position() { return next_pos_ - 1; }
+  bool failed() { return failed_; }
+
+  static const int kMaxCaptures = 1 << 16;
+  static const uc32 kEndMarker = (1 << 21);
+
+ private:
+  enum SubexpressionType {
+    INITIAL,
+    CAPTURE,  // All positive values represent captures.
+    POSITIVE_LOOKAHEAD,
+    NEGATIVE_LOOKAHEAD,
+    GROUPING
+  };
+
+  class RegExpParserState : public ZoneObject {
+   public:
+    RegExpParserState(RegExpParserState* previous_state,
+                      SubexpressionType group_type,
+                      int disjunction_capture_index,
+                      Zone* zone)
+        : previous_state_(previous_state),
+          builder_(new(zone) RegExpBuilder(zone)),
+          group_type_(group_type),
+          disjunction_capture_index_(disjunction_capture_index) {}
+    // Parser state of containing expression, if any.
+    RegExpParserState* previous_state() { return previous_state_; }
+    bool IsSubexpression() { return previous_state_ != NULL; }
+    // RegExpBuilder building this regexp's AST.
+    RegExpBuilder* builder() { return builder_; }
+    // Type of regexp being parsed (parenthesized group or entire regexp).
+    SubexpressionType group_type() { return group_type_; }
+    // Index in captures array of first capture in this sub-expression, if any.
+    // Also the capture index of this sub-expression itself, if group_type
+    // is CAPTURE.
+    int capture_index() { return disjunction_capture_index_; }
+
+   private:
+    // Linked list implementation of stack of states.
+    RegExpParserState* previous_state_;
+    // Builder for the stored disjunction.
+    RegExpBuilder* builder_;
+    // Stored disjunction type (capture, look-ahead or grouping), if any.
+    SubexpressionType group_type_;
+    // Stored disjunction's capture index (if any).
+    int disjunction_capture_index_;
+  };
+
+  Isolate* isolate() { return isolate_; }
+  Zone* zone() const { return zone_; }
+
+  uc32 current() { return current_; }
+  bool has_more() { return has_more_; }
+  bool has_next() { return next_pos_ < in()->length(); }
+  uc32 Next();
+  FlatStringReader* in() { return in_; }
+  void ScanForCaptures();
+
+  Isolate* isolate_;
+  Zone* zone_;
+  Handle<String>* error_;
+  ZoneList<RegExpCapture*>* captures_;
+  FlatStringReader* in_;
+  uc32 current_;
+  int next_pos_;
+  // The capture count is only valid after we have scanned for captures.
+  int capture_count_;
+  bool has_more_;
+  bool multiline_;
+  bool simple_;
+  bool contains_anchor_;
+  bool is_scanned_for_captures_;
+  bool failed_;
+};
+
+// SNIP
+
+}  // namespace dart
+
+#endif  // VM_REGEXP_PARSER_H_
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index dd3f1bd..b92feae 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -325,18 +325,7 @@
         desc.info.end_pos = var->owner()->end_token_pos();
         desc.info.set_index(var->index());
         vars->Add(desc);
-      } else if (var->name().raw() == Symbols::SavedEntryContextVar().raw()) {
-        // This is the local variable in which the function saves the
-        // caller's chain of closure contexts (caller's CTX register).
-        VarDesc desc;
-        desc.name = &var->name();
-        desc.info.set_kind(RawLocalVarDescriptors::kSavedEntryContext);
-        desc.info.scope_id = 0;
-        desc.info.begin_pos = 0;
-        desc.info.end_pos = 0;
-        desc.info.set_index(var->index());
-        vars->Add(desc);
-      } else if (var->name().raw() == Symbols::SavedCurrentContextVar().raw()) {
+      } else if (var->name().raw() == Symbols::CurrentContextVar().raw()) {
         // This is the local variable in which the function saves its
         // own context before calling a closure function.
         VarDesc desc;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 950f02e..e37bf11 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -60,12 +60,6 @@
 }
 
 
-RawContext* EntryFrame::SavedContext() const {
-  return *(reinterpret_cast<RawContext**>(
-      fp() + (kSavedContextSlotFromEntryFp * kWordSize)));
-}
-
-
 void EntryFrame::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(isolate() == Isolate::Current());
   // Visit objects between SP and (FP - callee_save_area).
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index d80eca7..2195d81 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -150,8 +150,6 @@
   bool IsStubFrame() const { return false; }
   bool IsEntryFrame() const { return true; }
 
-  RawContext* SavedContext() const;
-
   // Visit objects in the frame.
   virtual void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index ef2bd1e..b23b719 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -43,9 +43,7 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -27;
-static const int kExitLinkSlotFromEntryFp = -26;
-static const int kSavedVMTagSlotFromEntryFp = -25;
+static const int kExitLinkSlotFromEntryFp = -25;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index 491b8f2..d8a848f 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -44,9 +44,7 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -22;
-static const int kExitLinkSlotFromEntryFp = -21;
-static const int kSavedVMTagSlotFromEntryFp = -20;
+static const int kExitLinkSlotFromEntryFp = -20;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index b7d5997..7b5032f 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -42,9 +42,7 @@
 static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -6;
 static const int kExitLinkSlotFromEntryFp = -5;
-static const int kSavedVMTagSlotFromEntryFp = -4;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index 94c8c25..891fa2e 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -41,9 +41,7 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -24;
-static const int kExitLinkSlotFromEntryFp = -23;
-static const int kSavedVMTagSlotFromEntryFp = -22;
+static const int kExitLinkSlotFromEntryFp = -22;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index 125735d..a80a291 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -46,13 +46,9 @@
 
 // Entry and exit frame layout.
 #if defined(_WIN64)
-static const int kSavedContextSlotFromEntryFp = -32;
-static const int kExitLinkSlotFromEntryFp = -31;
-static const int kSavedVMTagSlotFromEntryFp = -30;
+static const int kExitLinkSlotFromEntryFp = -30;
 #else
-static const int kSavedContextSlotFromEntryFp = -10;
-static const int kExitLinkSlotFromEntryFp = -9;
-static const int kSavedVMTagSlotFromEntryFp = -8;
+static const int kExitLinkSlotFromEntryFp = -8;
 #endif  // defined(_WIN64)
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 77f9f74..7e836b3 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -45,22 +45,17 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  __ LoadIsolate(R0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
+  __ LoadIsolate(R9);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
-
-  // Cache Isolate pointer into CTX while executing runtime code.
-  __ mov(CTX, Operand(R0));
+  __ StoreToOffset(kWord, SP, R9, Isolate::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -69,7 +64,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ StoreToOffset(kWord, R5, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -80,7 +75,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, Operand(R9));
 
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -100,21 +96,11 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
-
-  // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(kWord, R2, CTX, Isolate::top_context_offset());
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
-  __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, Operand(R2));
+  __ StoreToOffset(kWord, R2, R9, Isolate::top_exit_frame_info_offset());
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -158,22 +144,17 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  __ LoadIsolate(R0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
+  __ LoadIsolate(R9);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, Operand(R0));
+  __ StoreToOffset(kWord, SP, R9, Isolate::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -182,7 +163,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(kWord, R5, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -193,7 +174,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, Operand(R9));
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -226,21 +208,11 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
-
-  // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(kWord, R2, CTX, Isolate::top_context_offset());
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
-  __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, Operand(R2));
+  __ StoreToOffset(kWord, R2, R9, Isolate::top_exit_frame_info_offset());
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -265,22 +237,17 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  __ LoadIsolate(R0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
+  __ LoadIsolate(R9);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ StoreToOffset(kWord, SP, R0, Isolate::top_exit_frame_info_offset());
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(kWord, CTX, R0, Isolate::top_context_offset());
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, Operand(R0));
+  __ StoreToOffset(kWord, SP, R9, Isolate::top_exit_frame_info_offset());
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -289,7 +256,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(kWord, R5, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -300,7 +267,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, Operand(R9));
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -324,21 +292,11 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
-  __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
-
-  // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(kWord, R2, CTX, Isolate::top_context_offset());
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadImmediate(R3, reinterpret_cast<intptr_t>(Object::null()));
-  __ StoreToOffset(kWord, R3, CTX, Isolate::top_context_offset());
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, Operand(R2));
+  __ StoreToOffset(kWord, R2, R9, Isolate::top_exit_frame_info_offset());
 
   __ LeaveFrame((1 << FP) | (1 << LR));
   // Adjust SP for the empty PC marker.
@@ -785,7 +743,7 @@
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Save new context and C++ ABI callee-saved registers.
-  __ PushList((1 << R3) | kAbiPreservedCpuRegs);
+  __ PushList(kAbiPreservedCpuRegs);
 
   const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
   if (TargetCPUFeatures::vfp_supported()) {
@@ -801,19 +759,9 @@
   // set up.
   __ LoadPoolPointer();
 
-  // The new Context structure contains a pointer to the current Isolate
-  // structure. Cache the Context pointer in the CTX register so that it is
-  // available in generated code and calls to Isolate::Current() need not be
-  // done. The assumption is that this register will never be clobbered by
-  // compiled or runtime stub code.
-
-  // Cache the new Context pointer into CTX while executing Dart code.
-  __ ldr(CTX, Address(R3, VMHandles::kOffsetOfRawPtrInHandle));
-
   __ LoadIsolate(R8);
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -25);
   __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset());
   __ Push(R5);
 
@@ -827,18 +775,9 @@
   __ LoadImmediate(R6, 0);
   __ StoreToOffset(kWord, R6, R8, Isolate::top_exit_frame_info_offset());
 
-  // Save the old Context pointer. Use R4 as a temporary register.
-  // Note that VisitObjectPointers will find this saved Context pointer during
-  // GC marking, since it traverses any information between SP and
-  // FP - kExitLinkSlotFromEntryFp.
-  // EntryFrame::SavedContext reads the context saved in this frame.
-  __ LoadFromOffset(kWord, R4, R8, Isolate::top_context_offset());
-
-  // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -26);
-  ASSERT(kSavedContextSlotFromEntryFp == -27);
-  __ PushList((1 << R4) | (1 << R5));
+  ASSERT(kExitLinkSlotFromEntryFp == -25);
+  __ Push(R5);
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ ldr(R4, Address(R1, VMHandles::kOffsetOfRawPtrInHandle));
@@ -870,22 +809,18 @@
   __ blx(R0);  // R4 is the arguments descriptor array.
 
   // Get rid of arguments pushed on the stack.
-  __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
+  __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer into CTX.
-  __ LoadIsolate(CTX);
+  __ LoadIsolate(R8);
 
-  // Restore the saved Context pointer into the Isolate structure.
-  // Uses R4 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
   // Uses R5 as a temporary register for this.
-  __ PopList((1 << R4) | (1 << R5));
-  __ StoreToOffset(kWord, R4, CTX, Isolate::top_context_offset());
-  __ StoreToOffset(kWord, R5, CTX, Isolate::top_exit_frame_info_offset());
+  __ Pop(R5);
+  __ StoreToOffset(kWord, R5, R8, Isolate::top_exit_frame_info_offset());
 
   // Restore the current VMTag from the stack.
   __ Pop(R4);
-  __ StoreToOffset(kWord, R4, CTX, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R4, R8, Isolate::vm_tag_offset());
 
   // Restore C++ ABI callee-saved registers.
   if (TargetCPUFeatures::vfp_supported()) {
@@ -895,7 +830,7 @@
     __ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
   }
   // Restore CPU registers.
-  __ PopList((1 << R3) | kAbiPreservedCpuRegs);  // Ignore restored R3.
+  __ PopList(kAbiPreservedCpuRegs);
 
   // Restore the frame pointer and return.
   __ LeaveFrame((1 << FP) | (1 << LR));
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 6fb4a0d..4228a7f 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -44,22 +44,17 @@
   __ Comment("CallToRuntimeStub");
   __ EnterFrame(0);
 
-  __ LoadIsolate(R0, kNoPP);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0);
+  __ LoadIsolate(R28, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Isolate pointer into CTX while executing runtime code.
-  __ mov(CTX, R0);
+  __ StoreToOffset(SP, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R8, R0, Isolate::vm_tag_offset(), kNoPP);
+    __ LoadFromOffset(R8, R28, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R8, VMTag::kDartTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -68,7 +63,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ StoreToOffset(R5, R0, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R5, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -81,7 +76,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, R28);
 
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -119,22 +115,10 @@
   // Retval is next to 1st argument.
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R2, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Load Context pointer from Isolate structure into A2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Load null.
-  __ LoadObject(TMP, Object::null_object(), PP);
-
-  // Reset Context pointer in Isolate structure.
-  __ StoreToOffset(TMP, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, R2);
+  __ StoreToOffset(ZR, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   __ LeaveFrame();
   __ ret();
@@ -160,22 +144,17 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(R0, kNoPP);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0);
+  __ LoadIsolate(R28, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, R0);
+  __ StoreToOffset(SP, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset(), kNoPP);
+    __ LoadFromOffset(R6, R28, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R6, VMTag::kDartTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -184,7 +163,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R5, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -195,7 +174,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, R28);
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -242,20 +222,10 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R2, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadObject(R3, Object::null_object(), PP);
-  __ StoreToOffset(R3, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, R2);
+  __ StoreToOffset(ZR, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   __ LeaveFrame();
   __ ret();
@@ -276,22 +246,17 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(R0, kNoPP);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0);
+  __ LoadIsolate(R28, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ StoreToOffset(SP, R0, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Save current Context pointer into Isolate structure.
-  __ StoreToOffset(CTX, R0, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, R0);
+  __ StoreToOffset(SP, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(R6, CTX, Isolate::vm_tag_offset(), kNoPP);
+    __ LoadFromOffset(R6, R28, Isolate::vm_tag_offset(), kNoPP);
     __ CompareImmediate(R6, VMTag::kDartTagId, kNoPP);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -300,7 +265,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(R5, CTX, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R5, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -311,7 +276,8 @@
   // Registers R0, R1, R2, and R3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: R0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(R0, R28);
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -349,20 +315,10 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId, kNoPP);
-  __ StoreToOffset(R2, CTX, Isolate::vm_tag_offset(), kNoPP);
+  __ StoreToOffset(R2, R28, Isolate::vm_tag_offset(), kNoPP);
 
   // Reset exit frame information in Isolate structure.
-  __ StoreToOffset(ZR, CTX, Isolate::top_exit_frame_info_offset(), kNoPP);
-
-  // Load Context pointer from Isolate structure into R2.
-  __ LoadFromOffset(R2, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadObject(R3, Object::null_object(), PP);
-  __ StoreToOffset(R3, CTX, Isolate::top_context_offset(), kNoPP);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, R2);
+  __ StoreToOffset(ZR, R28, Isolate::top_exit_frame_info_offset(), kNoPP);
 
   __ LeaveFrame();
   __ ret();
@@ -833,41 +789,15 @@
     __ PushDouble(r);
   }
 
-  // Push new context.
-  __ Push(R3);
-#if defined(DEBUG)
-  {
-    Label ok;
-    // The new context, saved vm tag, the top exit frame, and the old context.
-    const intptr_t kNewContextOffsetFromFp =
-        -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
-    __ AddImmediate(R4, FP, kNewContextOffsetFromFp, kNoPP);
-    __ CompareRegisters(R4, SP);
-    __ b(&ok, EQ);
-    __ Stop("kNewContextOffsetFromFp mismatch");
-    __ Bind(&ok);
-  }
-#endif
-
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
   // set up.
   __ LoadPoolPointer(PP);
 
-  // The new Context structure contains a pointer to the current Isolate
-  // structure. Cache the Context pointer in the CTX register so that it is
-  // available in generated code and calls to Isolate::Current() need not be
-  // done. The assumption is that this register will never be clobbered by
-  // compiled or runtime stub code.
-
-  // Cache the new Context pointer into CTX while executing Dart code.
-  __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP);
-
   // Load Isolate pointer into temporary register R5.
   __ LoadIsolate(R5, PP);
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -20);
   __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP);
   __ Push(R4);
 
@@ -880,19 +810,9 @@
   __ LoadFromOffset(R6, R5, Isolate::top_exit_frame_info_offset(), PP);
   __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset(), PP);
 
-  // Save the old Context pointer. Use R4 as a temporary register.
-  // Note that VisitObjectPointers will find this saved Context pointer during
-  // GC marking, since it traverses any information between SP and
-  // FP - kExitLinkSlotFromEntryFp.
-  // EntryFrame::SavedContext reads the context saved in this frame.
-  __ LoadFromOffset(R4, R5, Isolate::top_context_offset(), PP);
-
-  // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -21);
-  ASSERT(kSavedContextSlotFromEntryFp == -22);
+  ASSERT(kExitLinkSlotFromEntryFp == -20);
   __ Push(R6);
-  __ Push(R4);
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ LoadFromOffset(R4, R1, VMHandles::kOffsetOfRawPtrInHandle, PP);
@@ -928,26 +848,18 @@
   __ LoadPoolPointer(PP);
 
   // Get rid of arguments pushed on the stack.
-  __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize, PP);
+  __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize, PP);
 
-  // Load Isolate pointer into CTX.
-  __ LoadIsolate(CTX, PP);
+  __ LoadIsolate(R28, PP);
 
-  // Restore the current VMTag from the stack.
-  __ ldr(R4, Address(SP, 2 * kWordSize));
-  __ StoreToOffset(R4, CTX, Isolate::vm_tag_offset(), PP);
-
-  // Restore the saved Context pointer into the Isolate structure.
-  // Uses R4 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
   // Uses R6 as a temporary register for this.
-  __ Pop(R4);
   __ Pop(R6);
-  __ StoreToOffset(R4, CTX, Isolate::top_context_offset(), PP);
-  __ StoreToOffset(R6, CTX, Isolate::top_exit_frame_info_offset(), PP);
+  __ StoreToOffset(R6, R28, Isolate::top_exit_frame_info_offset(), PP);
 
-  __ Pop(R3);
+  // Restore the current VMTag from the stack.
   __ Pop(R4);
+  __ StoreToOffset(R4, R28, Isolate::vm_tag_offset(), PP);
 
   // Restore the bottom 64-bits of callee-saved V registers.
   for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 94da954..94e40ab 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -44,9 +44,7 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   __ EnterDartFrame(0);
-  __ LoadObject(CTX, context, PP);
   __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
   __ PushObject(smi1, PP);  // Push argument 1 smi1.
   __ PushObject(smi2, PP);  // Push argument 2 smi2.
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 9cd96ab..986007f 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -44,9 +44,7 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   __ EnterDartFrame(0);
-  __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 5b336a4..763d2e5 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -47,36 +47,17 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(EAX);
+  __ LoadIsolate(ESI);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ movl(Address(EAX, Isolate::top_exit_frame_info_offset()), ESP);
-
-#if defined(DEBUG)
-  if (FLAG_verify_incoming_contexts) {
-    Label ok;
-    // Check that the isolate's saved ctx is null.
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ cmpl(Address(EAX, Isolate::top_context_offset()), raw_null);
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Found non-null incoming top context: call to runtime stub");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Save current Context pointer into Isolate structure.
-  __ movl(Address(EAX, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing runtime code.
-  __ movl(CTX, EAX);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), ESP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ movl(EAX, Address(CTX, Isolate::vm_tag_offset()));
-    __ cmpl(EAX, Immediate(VMTag::kDartTagId));
+    __ cmpl(Address(ESI, Isolate::vm_tag_offset()),
+            Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -84,7 +65,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+  __ movl(Address(ESI, Isolate::vm_tag_offset()), ECX);
 
   // Reserve space for arguments and align frame before entering C++ world.
   __ AddImmediate(ESP, Immediate(-INT32_SIZEOF(NativeArguments)));
@@ -93,7 +74,7 @@
   }
 
   // Pass NativeArguments structure by value and call runtime.
-  __ movl(Address(ESP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movl(Address(ESP, isolate_offset), ESI);  // Set isolate in NativeArgs.
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
   __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
@@ -103,23 +84,12 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
-  // Mark that the isolate is executing Dart code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+  // Mark that the isolate is executing Dart code. ESI is callee saved.
+  __ movl(Address(ESI, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into ECX.
-  __ movl(ECX, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movl(CTX, ECX);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -167,37 +137,17 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(EDI);
+  __ LoadIsolate(ESI);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to dart VM code.
-  __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), ESP);
-
-#if defined(DEBUG)
-  if (FLAG_verify_incoming_contexts) {
-    Label ok;
-    // Check that the isolate's saved ctx is null.
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ cmpl(Address(EDI, Isolate::top_context_offset()), raw_null);
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Found non-null incoming top context: "
-            "call to native c function stub");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Save current Context pointer into Isolate structure.
-  __ movl(Address(EDI, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ movl(CTX, EDI);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), ESP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
-    __ cmpl(EDI, Immediate(VMTag::kDartTagId));
+    __ cmpl(Address(ESI, Isolate::vm_tag_offset()),
+            Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -205,7 +155,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+  __ movl(Address(ESI, Isolate::vm_tag_offset()), ECX);
 
   // Reserve space for the native arguments structure, the outgoing parameters
   // (pointer to the native arguments structure, the C function entry point)
@@ -217,7 +167,7 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movl(Address(ESP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movl(Address(ESP, isolate_offset), ESI);  // Set isolate in NativeArgs.
   __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
   __ movl(Address(ESP, argv_offset), EAX);  // Set argv in NativeArguments.
   __ leal(EAX, Address(EBP, 2 * kWordSize));  // Compute return value addr.
@@ -228,23 +178,12 @@
   __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
   __ call(&NativeEntry::NativeCallWrapperLabel());
 
-  // Mark that the isolate is executing Dart code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+  // Mark that the isolate is executing Dart code. ESI is callee saved.
+  __ movl(Address(ESI, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into EDI.
-  __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movl(CTX, EDI);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -271,37 +210,17 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(EDI);
+  __ LoadIsolate(ESI);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to dart VM code.
-  __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), ESP);
-
-#if defined(DEBUG)
-  if (FLAG_verify_incoming_contexts) {
-    Label ok;
-    // Check that the isolate's saved ctx is null.
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ cmpl(Address(EDI, Isolate::top_context_offset()), raw_null);
-    __ j(EQUAL, &ok, Assembler::kNearJump);
-    __ Stop("Found non-null incoming top context: "
-            "call to bootstrap c function stub");
-    __ Bind(&ok);
-  }
-#endif
-
-  // Save current Context pointer into Isolate structure.
-  __ movl(Address(EDI, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ movl(CTX, EDI);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), ESP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
-    __ cmpl(EDI, Immediate(VMTag::kDartTagId));
+    __ cmpl(Address(ESI, Isolate::vm_tag_offset()),
+            Immediate(VMTag::kDartTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -309,7 +228,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+  __ movl(Address(ESI, Isolate::vm_tag_offset()), ECX);
 
   // Reserve space for the native arguments structure, the outgoing parameter
   // (pointer to the native arguments structure) and align frame before
@@ -320,7 +239,7 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movl(Address(ESP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movl(Address(ESP, isolate_offset), ESI);  // Set isolate in NativeArgs.
   __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
   __ movl(Address(ESP, argv_offset), EAX);  // Set argv in NativeArguments.
   __ leal(EAX, Address(EBP, 2 * kWordSize));  // Compute return value addr.
@@ -329,23 +248,12 @@
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
   __ call(ECX);
 
-  // Mark that the isolate is executing Dart code.
-  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+  // Mark that the isolate is executing Dart code. ESI is callee saved.
+  __ movl(Address(ESI, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into EDI.
-  __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ movl(Address(CTX, Isolate::top_context_offset()), raw_null);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movl(CTX, EDI);
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -779,13 +687,11 @@
 //   ESP + 4 : entrypoint of the dart function to call.
 //   ESP + 8 : arguments descriptor array.
 //   ESP + 12 : arguments array.
-//   ESP + 16 : new context containing the current isolate pointer.
 // Uses EAX, EDX, ECX, EDI as temporary registers.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   const intptr_t kEntryPointOffset = 2 * kWordSize;
   const intptr_t kArgumentsDescOffset = 3 * kWordSize;
   const intptr_t kArgumentsOffset = 4 * kWordSize;
-  const intptr_t kNewContextOffset = 5 * kWordSize;
 
   // Save frame pointer coming in.
   __ EnterFrame(0);
@@ -795,25 +701,14 @@
   __ pushl(ESI);
   __ pushl(EDI);
 
-  // The new Context structure contains a pointer to the current Isolate
-  // structure. Cache the Context pointer in the CTX register so that it is
-  // available in generated code and calls to Isolate::Current() need not be
-  // done. The assumption is that this register will never be clobbered by
-  // compiled or runtime stub code.
-
-  // Cache the new Context pointer into CTX while executing dart code.
-  __ movl(CTX, Address(EBP, kNewContextOffset));
-  __ movl(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
-
-  __ LoadIsolate(EDI);
+  __ LoadIsolate(ESI);
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -4);
-  __ movl(ECX, Address(EDI, Isolate::vm_tag_offset()));
+  __ movl(ECX, Address(ESI, Isolate::vm_tag_offset()));
   __ pushl(ECX);
 
   // Mark that the isolate is executing Dart code.
-  __ movl(Address(EDI, Isolate::vm_tag_offset()),
+  __ movl(Address(ESI, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Save the top exit frame info. Use EDX as a temporary register.
@@ -821,32 +716,9 @@
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
   ASSERT(kExitLinkSlotFromEntryFp == -5);
-  __ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset()));
+  __ movl(EDX, Address(ESI, Isolate::top_exit_frame_info_offset()));
   __ pushl(EDX);
-  __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Save the old Context pointer. Use ECX as a temporary register.
-  // Note that VisitObjectPointers will find this saved Context pointer during
-  // GC marking, since it traverses any information between SP and
-  // FP - kExitLinkSlotFromEntryFp.
-  // EntryFrame::SavedContext reads the context saved in this frame.
-  // The constant kSavedContextSlotFromEntryFp must be kept in sync with
-  // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -6);
-  __ movl(ECX, Address(EDI, Isolate::top_context_offset()));
-  __ pushl(ECX);
-
-  // TODO(turnidge): This code should probably be emitted all the time
-  // on all architectures but I am leaving it under DEBUG/flag for
-  // now.
-#if defined(DEBUG)
-  if (FLAG_verify_incoming_contexts) {
-    // Clear Context pointer in Isolate structure.
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ movl(Address(EDI, Isolate::top_context_offset()), raw_null);
-  }
-#endif
+  __ movl(Address(ESI, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   // Load arguments descriptor array into EDX.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
@@ -887,17 +759,12 @@
   // Get rid of arguments pushed on the stack.
   __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
 
-  // Load Isolate pointer into CTX.
-  __ LoadIsolate(CTX);
-
-  // Restore the saved Context pointer into the Isolate structure.
-  __ popl(Address(CTX, Isolate::top_context_offset()));
-
   // Restore the saved top exit frame info back into the Isolate structure.
-  __ popl(Address(CTX, Isolate::top_exit_frame_info_offset()));
+  __ LoadIsolate(ESI);
+  __ popl(Address(ESI, Isolate::top_exit_frame_info_offset()));
 
   // Restore the current VMTag from the stack.
-  __ popl(Address(CTX, Isolate::vm_tag_offset()));
+  __ popl(Address(ESI, Isolate::vm_tag_offset()));
 
   // Restore C++ ABI callee-saved registers.
   __ popl(EDI);
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 468a607..ce07b83 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -44,9 +44,7 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   __ enter(Immediate(0));
-  __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 9cfd32f..55f533f 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -48,22 +48,17 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  __ LoadIsolate(A0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+  __ LoadIsolate(S6);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
-
-  // Save current Context pointer into Isolate structure.
-  __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
-  // Cache Isolate pointer into CTX while executing runtime code.
-  __ mov(CTX, A0);
+  __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -71,7 +66,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ sw(S5, Address(A0, Isolate::vm_tag_offset()));
+  __ sw(S5, Address(S6, Isolate::vm_tag_offset()));
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -82,7 +77,8 @@
   // Registers A0, A1, A2, and A3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: A0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(A0, S6);
 
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -109,22 +105,10 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
-  __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
-
-  // Load Context pointer from Isolate structure into A2.
-  __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
-  // Load null.
-  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
-  // Reset Context pointer in Isolate structure.
-  __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, A2);
+  __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
 
   __ mov(SP, FP);
   __ lw(RA, Address(SP, 1 * kWordSize));
@@ -173,22 +157,17 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  __ LoadIsolate(A0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+  __ LoadIsolate(S6);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
-
-  // Save current Context pointer into Isolate structure.
-  __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, A0);
+  __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -196,13 +175,14 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ sw(T5, Address(A0, Isolate::vm_tag_offset()));
+  __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
 
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: A0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(A0, S6);
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -242,22 +222,10 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
-  __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
-
-  // Load Context pointer from Isolate structure into A2.
-  __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
-  // Load null.
-  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
-  // Reset Context pointer in Isolate structure.
-  __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, A2);
+  __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
 
   __ mov(SP, FP);
   __ lw(RA, Address(SP, 1 * kWordSize));
@@ -287,22 +255,17 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  __ LoadIsolate(A0);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
+  __ LoadIsolate(S6);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ sw(SP, Address(A0, Isolate::top_exit_frame_info_offset()));
-
-  // Save current Context pointer into Isolate structure.
-  __ sw(CTX, Address(A0, Isolate::top_context_offset()));
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ mov(CTX, A0);
+  __ sw(SP, Address(S6, Isolate::top_exit_frame_info_offset()));
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -310,13 +273,14 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ sw(T5, Address(A0, Isolate::vm_tag_offset()));
+  __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
 
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
   ASSERT(isolate_offset == 0 * kWordSize);
-  // Set isolate in NativeArgs: A0 already contains CTX.
+  // Set isolate in NativeArgs.
+  __ mov(A0, S6);
 
   // There are no native calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
@@ -351,22 +315,10 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
-  __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
-
-  // Load Context pointer from Isolate structure into A2.
-  __ lw(A2, Address(CTX, Isolate::top_context_offset()));
-
-  // Load null.
-  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-
-  // Reset Context pointer in Isolate structure.
-  __ sw(TMP, Address(CTX, Isolate::top_context_offset()));
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ mov(CTX, A2);
+  __ sw(ZR, Address(S6, Isolate::top_exit_frame_info_offset()));
 
   __ mov(SP, FP);
   __ lw(RA, Address(SP, 1 * kWordSize));
@@ -860,7 +812,6 @@
 //   A0 : entrypoint of the Dart function to call.
 //   A1 : arguments descriptor array.
 //   A2 : arguments array.
-//   A3 : new context containing the current isolate pointer.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   // Save frame pointer coming in.
   __ TraceSimMsg("InvokeDartCodeStub");
@@ -868,16 +819,16 @@
 
   // Save new context and C++ ABI callee-saved registers.
 
-  // The new context, saved vm tag, the top exit frame, and the old context.
-  const intptr_t kPreservedContextSlots = 4;
+  // The saved vm tag and the top exit frame.
+  const intptr_t kPreservedSlots = 2;
   const intptr_t kPreservedRegSpace =
       kWordSize * (kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount +
-                   kPreservedContextSlots);
+                   kPreservedSlots);
 
   __ addiu(SP, SP, Immediate(-kPreservedRegSpace));
   for (int i = S0; i <= S7; i++) {
     Register r = static_cast<Register>(i);
-    const intptr_t slot = i - S0 + kPreservedContextSlots;
+    const intptr_t slot = i - S0 + kPreservedSlots;
     __ sw(r, Address(SP, slot * kWordSize));
   }
 
@@ -885,33 +836,21 @@
        i <= kAbiLastPreservedFpuReg; i++) {
     FRegister r = static_cast<FRegister>(i);
     const intptr_t slot =
-        kAbiPreservedCpuRegCount + kPreservedContextSlots + i -
+        kAbiPreservedCpuRegCount + kPreservedSlots + i -
         kAbiFirstPreservedFpuReg;
     __ swc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ sw(A3, Address(SP, 3 * kWordSize));
-
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
   // set up.
   __ LoadPoolPointer();
 
-  // The new Context structure contains a pointer to the current Isolate
-  // structure. Cache the Context pointer in the CTX register so that it is
-  // available in generated code and calls to Isolate::Current() need not be
-  // done. The assumption is that this register will never be clobbered by
-  // compiled or runtime stub code.
-
-  // Cache the new Context pointer into CTX while executing Dart code.
-  __ lw(CTX, Address(A3, VMHandles::kOffsetOfRawPtrInHandle));
-
   __ LoadIsolate(T2);
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -22);
   __ lw(T1, Address(T2, Isolate::vm_tag_offset()));
-  __ sw(T1, Address(SP, 2 * kWordSize));
+  __ sw(T1, Address(SP, 1 * kWordSize));
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(T0, VMTag::kDartTagId);
@@ -922,22 +861,12 @@
   __ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
   __ sw(ZR, Address(T2, Isolate::top_exit_frame_info_offset()));
 
-  // Save the old Context pointer. Use T1 as a temporary register.
-  // Note that VisitObjectPointers will find this saved Context pointer during
-  // GC marking, since it traverses any information between SP and
-  // FP - kExitLinkSlotFromEntryFp.
-  // EntryFrame::SavedContext reads the context saved in this frame.
-  __ lw(T1, Address(T2, Isolate::top_context_offset()));
-
-  // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -23);
-  ASSERT(kSavedContextSlotFromEntryFp == -24);
-  __ sw(T0, Address(SP, 1 * kWordSize));
-  __ sw(T1, Address(SP, 0 * kWordSize));
+  ASSERT(kExitLinkSlotFromEntryFp == -22);
+  __ sw(T0, Address(SP, 0 * kWordSize));
 
   // After the call, The stack pointer is restored to this location.
-  // Pushed A3, S0-7, F20-31, T0, T1 = 23.
+  // Pushed S0-7, F20-31, T0, T1 = 22.
 
   // Load arguments descriptor array into S4, which is passed to Dart code.
   __ lw(S4, Address(A1, VMHandles::kOffsetOfRawPtrInHandle));
@@ -972,28 +901,23 @@
   __ TraceSimMsg("InvokeDartCodeStub return");
 
   // Get rid of arguments pushed on the stack.
-  __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
+  __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer into CTX.
-  __ LoadIsolate(CTX);
+  __ LoadIsolate(S6);
 
   // Restore the current VMTag from the stack.
-  __ lw(T1, Address(SP, 2 * kWordSize));
-  __ sw(T1, Address(CTX, Isolate::vm_tag_offset()));
+  __ lw(T1, Address(SP, 1 * kWordSize));
+  __ sw(T1, Address(S6, Isolate::vm_tag_offset()));
 
-  // Restore the saved Context pointer into the Isolate structure.
-  // Uses T1 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
   // Uses T0 as a temporary register for this.
-  __ lw(T1, Address(SP, 0 * kWordSize));
-  __ lw(T0, Address(SP, 1 * kWordSize));
-  __ sw(T1, Address(CTX, Isolate::top_context_offset()));
-  __ sw(T0, Address(CTX, Isolate::top_exit_frame_info_offset()));
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ sw(T0, Address(S6, Isolate::top_exit_frame_info_offset()));
 
   // Restore C++ ABI callee-saved registers.
   for (int i = S0; i <= S7; i++) {
     Register r = static_cast<Register>(i);
-    const intptr_t slot = i - S0 + kPreservedContextSlots;
+    const intptr_t slot = i - S0 + kPreservedSlots;
     __ lw(r, Address(SP, slot * kWordSize));
   }
 
@@ -1001,12 +925,11 @@
        i <= kAbiLastPreservedFpuReg; i++) {
     FRegister r = static_cast<FRegister>(i);
     const intptr_t slot =
-        kAbiPreservedCpuRegCount + kPreservedContextSlots + i -
+        kAbiPreservedCpuRegCount + kPreservedSlots + i -
         kAbiFirstPreservedFpuReg;
     __ lwc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ lw(A3, Address(SP, 3 * kWordSize));
   __ addiu(SP, SP, Immediate(kPreservedRegSpace));
 
   // Restore the frame pointer and return.
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 5582ec5..7a87baf 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -44,9 +44,7 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   __ EnterDartFrame(0);
-  __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi1);  // Push argument 1 smi1.
   __ PushObject(smi2);  // Push argument 2 smi2.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 7be3f88..c2f69e0 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -36,7 +36,6 @@
 //   R10 : number of arguments to the call.
 // Must preserve callee saved registers R12 and R13.
 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
-  ASSERT((R12 != CTX) && (R13 != CTX));
   const intptr_t isolate_offset = NativeArguments::isolate_offset();
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
@@ -44,23 +43,19 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(RAX);
+  COMPILE_ASSERT(
+      (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0);
+  __ LoadIsolate(R12);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
-  __ movq(Address(RAX, Isolate::top_exit_frame_info_offset()), RSP);
-
-  // Save current Context pointer into Isolate structure.
-  __ movq(Address(RAX, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing runtime code.
-  __ movq(CTX, RAX);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
     __ movq(RAX, Immediate(VMTag::kDartTagId));
-    __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpq(RAX, Address(R12, Isolate::vm_tag_offset()));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -68,7 +63,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX);
+  __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
 
   // Reserve space for arguments and align frame before entering C++ world.
   __ subq(RSP, Immediate(sizeof(NativeArguments)));
@@ -77,7 +72,7 @@
   }
 
   // Pass NativeArguments structure by value and call runtime.
-  __ movq(Address(RSP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movq(Address(RSP, isolate_offset), R12);  // Set isolate in NativeArgs.
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
@@ -92,21 +87,11 @@
   __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+  __ movq(Address(R12, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into RBX.
-  __ movq(RBX, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadObject(R12, Object::null_object(), PP);
-  __ movq(Address(CTX, Isolate::top_context_offset()), R12);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movq(CTX, RBX);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -155,23 +140,19 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(R8);
+  COMPILE_ASSERT(
+      (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0);
+  __ LoadIsolate(R12);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
-
-// Save current Context pointer into Isolate structure.
-  __ movq(Address(R8, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ movq(CTX, R8);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
     __ movq(R8, Immediate(VMTag::kDartTagId));
-    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpq(R8, Address(R12, Isolate::vm_tag_offset()));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -179,7 +160,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX);
+  __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -190,7 +171,7 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movq(Address(RSP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movq(Address(RSP, isolate_offset), R12);  // Set isolate in NativeArgs.
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
@@ -203,21 +184,11 @@
   __ CallCFunction(&NativeEntry::NativeCallWrapperLabel());
 
   // Mark that the isolate is executing Dart code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+  __ movq(Address(R12, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into R8.
-  __ movq(R8, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadObject(R12, Object::null_object(), PP);
-  __ movq(Address(CTX, Isolate::top_context_offset()), R12);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movq(CTX, R8);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -243,23 +214,19 @@
 
   __ EnterFrame(0);
 
-  __ LoadIsolate(R8);
+  COMPILE_ASSERT(
+      (CallingConventions::kCalleeSaveCpuRegisters & (1 << R12)) != 0);
+  __ LoadIsolate(R12);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
-  __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
-
-  // Save current Context pointer into Isolate structure.
-  __ movq(Address(R8, Isolate::top_context_offset()), CTX);
-
-  // Cache Isolate pointer into CTX while executing native code.
-  __ movq(CTX, R8);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), RSP);
 
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
     __ movq(R8, Immediate(VMTag::kDartTagId));
-    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpq(R8, Address(R12, Isolate::vm_tag_offset()));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -267,7 +234,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()), RBX);
+  __ movq(Address(R12, Isolate::vm_tag_offset()), RBX);
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -278,7 +245,7 @@
   }
 
   // Pass NativeArguments structure by value and call native function.
-  __ movq(Address(RSP, isolate_offset), CTX);  // Set isolate in NativeArgs.
+  __ movq(Address(RSP, isolate_offset), R12);  // Set isolate in NativeArgs.
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
@@ -289,21 +256,11 @@
   __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
-  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+  __ movq(Address(R12, Isolate::vm_tag_offset()),
           Immediate(VMTag::kDartTagId));
 
   // Reset exit frame information in Isolate structure.
-  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
-
-  // Load Context pointer from Isolate structure into R8.
-  __ movq(R8, Address(CTX, Isolate::top_context_offset()));
-
-  // Reset Context pointer in Isolate structure.
-  __ LoadObject(R12, Object::null_object(), PP);
-  __ movq(Address(CTX, Isolate::top_context_offset()), R12);
-
-  // Cache Context pointer into CTX while executing Dart code.
-  __ movq(CTX, R8);
+  __ movq(Address(R12, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
   __ LeaveFrame();
   __ ret();
@@ -737,17 +694,15 @@
   const Register kEntryPointReg = CallingConventions::kArg1Reg;
   const Register kArgDescReg    = CallingConventions::kArg2Reg;
   const Register kArgsReg       = CallingConventions::kArg3Reg;
-  const Register kNewContextReg = CallingConventions::kArg4Reg;
 
   // At this point, the stack looks like:
   // | saved RBP                                      | <-- RBP
   // | saved PC (return to DartEntry::InvokeFunction) |
 
   const intptr_t kInitialOffset = 1;
-  // Save arguments descriptor array and new context.
+  // Save arguments descriptor array.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
   __ pushq(kArgDescReg);
-  __ pushq(kNewContextReg);
 
   // Save C++ ABI callee-saved registers.
   __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
@@ -759,36 +714,15 @@
   __ LoadPoolPointer(PP);
 
   // If any additional (or fewer) values are pushed, the offsets in
-  // kExitLinkSlotFromEntryFp and kSavedContextSlotFromEntryFp will need to be
-  // changed.
-
-  // The new Context structure contains a pointer to the current Isolate
-  // structure. Cache the Context pointer in the CTX register so that it is
-  // available in generated code and calls to Isolate::Current() need not be
-  // done. The assumption is that this register will never be clobbered by
-  // compiled or runtime stub code.
-
-  // Cache the new Context pointer into CTX while executing Dart code.
-  __ movq(CTX, Address(kNewContextReg, VMHandles::kOffsetOfRawPtrInHandle));
-
-  const Register kIsolateReg = RBX;
+  // kExitLinkSlotFromEntryFp will need to be changed.
 
   // Load Isolate pointer into kIsolateReg.
+  const Register kIsolateReg = RBX;
   __ LoadIsolate(kIsolateReg);
 
   // Save the current VMTag on the stack.
   __ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset()));
   __ pushq(RAX);
-#if defined(DEBUG)
-  {
-    Label ok;
-    __ leaq(RAX, Address(RBP, kSavedVMTagSlotFromEntryFp * kWordSize));
-    __ cmpq(RAX, RSP);
-    __ j(EQUAL, &ok);
-    __ Stop("kSavedVMTagSlotFromEntryFp mismatch");
-    __ Bind(&ok);
-  }
-#endif
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()),
@@ -814,26 +748,6 @@
   __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()),
           Immediate(0));
 
-  // Save the old Context pointer. Use RAX as a temporary register.
-  // Note that VisitObjectPointers will find this saved Context pointer during
-  // GC marking, since it traverses any information between SP and
-  // FP - kExitLinkSlotFromEntryFp * kWordSize.
-  // EntryFrame::SavedContext reads the context saved in this frame.
-  // The constant kSavedContextSlotFromEntryFp must be kept in sync with
-  // the code below.
-  __ movq(RAX, Address(kIsolateReg, Isolate::top_context_offset()));
-  __ pushq(RAX);
-#if defined(DEBUG)
-  {
-    Label ok;
-    __ leaq(RAX, Address(RBP, kSavedContextSlotFromEntryFp * kWordSize));
-    __ cmpq(RAX, RSP);
-    __ j(EQUAL, &ok);
-    __ Stop("kSavedContextSlotFromEntryFp mismatch");
-    __ Bind(&ok);
-  }
-#endif
-
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
 
@@ -872,11 +786,8 @@
   // Get rid of arguments pushed on the stack.
   __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
 
-  __ LoadIsolate(kIsolateReg);
-  // Restore the saved Context pointer into the Isolate structure.
-  __ popq(Address(kIsolateReg, Isolate::top_context_offset()));
-
   // Restore the saved top exit frame info back into the Isolate structure.
+  __ LoadIsolate(kIsolateReg);
   __ popq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()));
 
   // Restore the current VMTag from the stack.
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index bff9297..348d493 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -44,9 +44,7 @@
   const int argc = 2;
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
-  const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
   __ EnterStubFrame(true);
-  __ LoadObject(CTX, context, PP);
   __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
   __ PushObject(smi1, PP);  // Push argument 1 smi1.
   __ PushObject(smi2, PP);  // Push argument 2 smi2.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 2a013e9..4abe031 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -58,8 +58,7 @@
   V(InterpolateSingle, "_interpolateSingle")                                   \
   V(GetIterator, "iterator")                                                   \
   V(NoSuchMethod, "noSuchMethod")                                              \
-  V(SavedCurrentContextVar, ":saved_current_context_var")                      \
-  V(SavedEntryContextVar, ":saved_entry_context_var")                          \
+  V(CurrentContextVar, ":current_context_var")                                 \
   V(SavedTryContextVar, ":saved_try_context_var")                              \
   V(ExceptionParameter, ":exception")                                          \
   V(StackTraceParameter, ":stack_trace")                                       \
diff --git a/runtime/vm/unibrow-inl.h b/runtime/vm/unibrow-inl.h
new file mode 100644
index 0000000..a7e3b22
--- /dev/null
+++ b/runtime/vm/unibrow-inl.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_UNIBROW_INL_H_
+#define VM_UNIBROW_INL_H_
+
+#include "vm/unibrow.h"
+
+// SNIP
+
+namespace unibrow {
+
+// SNIP
+
+template <class T, int s> int Mapping<T, s>::get(uchar c, uchar n,
+    uchar* result) {
+  CacheEntry entry = entries_[c & kMask];
+  if (entry.code_point_ == c) {
+    if (entry.offset_ == 0) {
+      return 0;
+    } else {
+      result[0] = c + entry.offset_;
+      return 1;
+    }
+  } else {
+    return CalculateValue(c, n, result);
+  }
+}
+
+template <class T, int s> int Mapping<T, s>::CalculateValue(uchar c, uchar n,
+    uchar* result) {
+  bool allow_caching = true;
+  int length = T::Convert(c, n, result, &allow_caching);
+  if (allow_caching) {
+    if (length == 1) {
+      entries_[c & kMask] = CacheEntry(c, result[0] - c);
+      return 1;
+    } else {
+      entries_[c & kMask] = CacheEntry(c, 0);
+      return 0;
+    }
+  } else {
+    return length;
+  }
+}
+
+// SNIP
+
+}  // namespace unibrow
+
+#endif  // VM_UNIBROW_INL_H_
diff --git a/runtime/vm/unibrow.cc b/runtime/vm/unibrow.cc
new file mode 100644
index 0000000..7b4246b
--- /dev/null
+++ b/runtime/vm/unibrow.cc
@@ -0,0 +1,3393 @@
+// Copyright (c) 2014, 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.
+//
+// This file was generated at 2014-10-08 15:25:47.940335 (in v8, copied to dart)
+
+#include "vm/unicode-inl.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+namespace unibrow {
+
+static const int kStartBit = (1 << 30);
+static const int kChunkBits = (1 << 13);
+static const uchar kSentinel = static_cast<uchar>(-1);
+
+/**
+ * \file
+ * Implementations of functions for working with unicode.
+ */
+
+// SNIP
+
+// All access to the character table should go through this function.
+template <int D>
+static inline uchar TableGet(const int32_t* table, int index) {
+  return table[D * index];
+}
+
+
+static inline uchar GetEntry(int32_t entry) {
+  return entry & (kStartBit - 1);
+}
+
+
+static inline bool IsStart(int32_t entry) {
+  return (entry & kStartBit) != 0;
+}
+
+
+/**
+ * Look up a character in the unicode table using a mix of binary and
+ * interpolation search.  For a uniformly distributed array
+ * interpolation search beats binary search by a wide margin.  However,
+ * in this case interpolation search degenerates because of some very
+ * high values in the lower end of the table so this function uses a
+ * combination.  The average number of steps to look up the information
+ * about a character is around 10, slightly higher if there is no
+ * information available about the character.
+ */
+static bool LookupPredicate(const int32_t* table, uint16_t size, uchar chr) {
+  static const int kEntryDist = 1;
+  uint16_t value = chr & (kChunkBits - 1);
+  unsigned int low = 0;
+  unsigned int high = size - 1;
+  while (high != low) {
+    unsigned int mid = low + ((high - low) >> 1);
+    uchar current_value = GetEntry(TableGet<kEntryDist>(table, mid));
+    // If we've found an entry less than or equal to this one, and the
+    // next one is not also less than this one, we've arrived.
+    if ((current_value <= value) &&
+        (mid + 1 == size ||
+         GetEntry(TableGet<kEntryDist>(table, mid + 1)) > value)) {
+      low = mid;
+      break;
+    } else if (current_value < value) {
+      low = mid + 1;
+    } else if (current_value > value) {
+      // If we've just checked the bottom-most value and it's not
+      // the one we're looking for, we're done.
+      if (mid == 0) break;
+      high = mid - 1;
+    }
+  }
+  int32_t field = TableGet<kEntryDist>(table, low);
+  uchar entry = GetEntry(field);
+  bool is_start = IsStart(field);
+  return (entry == value) || (entry < value && is_start);
+}
+
+template <int kW>
+struct MultiCharacterSpecialCase {
+  static const uchar kEndOfEncoding = kSentinel;
+  uchar chars[kW];
+};
+
+
+// Look up the mapping for the given character in the specified table,
+// which is of the specified length and uses the specified special case
+// mapping for multi-char mappings.  The next parameter is the character
+// following the one to map.  The result will be written in to the result
+// buffer and the number of characters written will be returned.  Finally,
+// if the allow_caching_ptr is non-null then false will be stored in
+// it if the result contains multiple characters or depends on the
+// context.
+// If ranges are linear, a match between a start and end point is
+// offset by the distance between the match and the start. Otherwise
+// the result is the same as for the start point on the entire range.
+template <bool ranges_are_linear, int kW>
+static int LookupMapping(const int32_t* table,
+                         uint16_t size,
+                         const MultiCharacterSpecialCase<kW>* multi_chars,
+                         uchar chr,
+                         uchar next,
+                         uchar* result,
+                         bool* allow_caching_ptr) {
+  static const int kEntryDist = 2;
+  uint16_t key = chr & (kChunkBits - 1);
+  uint16_t chunk_start = chr - key;
+  unsigned int low = 0;
+  unsigned int high = size - 1;
+  while (high != low) {
+    unsigned int mid = low + ((high - low) >> 1);
+    uchar current_value = GetEntry(TableGet<kEntryDist>(table, mid));
+    // If we've found an entry less than or equal to this one, and the next one
+    // is not also less than this one, we've arrived.
+    if ((current_value <= key) &&
+        (mid + 1 == size ||
+         GetEntry(TableGet<kEntryDist>(table, mid + 1)) > key)) {
+      low = mid;
+      break;
+    } else if (current_value < key) {
+      low = mid + 1;
+    } else if (current_value > key) {
+      // If we've just checked the bottom-most value and it's not
+      // the one we're looking for, we're done.
+      if (mid == 0) break;
+      high = mid - 1;
+    }
+  }
+  int32_t field = TableGet<kEntryDist>(table, low);
+  uchar entry = GetEntry(field);
+  bool is_start = IsStart(field);
+  bool found = (entry == key) || (entry < key && is_start);
+  if (found) {
+    int32_t value = table[2 * low + 1];
+    if (value == 0) {
+      // 0 means not present
+      return 0;
+    } else if ((value & 3) == 0) {
+      // Low bits 0 means a constant offset from the given character.
+      if (ranges_are_linear) {
+        result[0] = chr + (value >> 2);
+      } else {
+        result[0] = entry + chunk_start + (value >> 2);
+      }
+      return 1;
+    } else if ((value & 3) == 1) {
+      // Low bits 1 means a special case mapping
+      if (allow_caching_ptr) *allow_caching_ptr = false;
+      const MultiCharacterSpecialCase<kW>& mapping = multi_chars[value >> 2];
+      int length = 0;
+      for (length = 0; length < kW; length++) {
+        uchar mapped = mapping.chars[length];
+        if (mapped == MultiCharacterSpecialCase<kW>::kEndOfEncoding) break;
+        if (ranges_are_linear) {
+          result[length] = mapped + (key - entry);
+        } else {
+          result[length] = mapped;
+        }
+      }
+      return length;
+    } else {
+      // Low bits 2 means a really really special case
+      if (allow_caching_ptr) *allow_caching_ptr = false;
+      // The cases of this switch are defined in unicode.py in the
+      // really_special_cases mapping.
+      switch (value >> 2) {
+        case 1:
+          // Really special case 1: upper case sigma.  This letter
+          // converts to two different lower case sigmas depending on
+          // whether or not it occurs at the end of a word.
+          if (next != 0 && Letter::Is(next)) {
+            result[0] = 0x03C3;
+          } else {
+            result[0] = 0x03C2;
+          }
+          return 1;
+        default:
+          return 0;
+      }
+      return -1;
+    }
+  } else {
+    return 0;
+  }
+}
+
+
+uchar Utf8::CalculateValue(const byte* str,
+                           unsigned length,
+                           unsigned* cursor) {
+  // We only get called for non-ASCII characters.
+  if (length == 1) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  byte first = str[0];
+  byte second = str[1] ^ 0x80;
+  if (second & 0xC0) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  if (first < 0xE0) {
+    if (first < 0xC0) {
+      *cursor += 1;
+      return kBadChar;
+    }
+    uchar code_point = ((first << 6) | second) & kMaxTwoByteChar;
+    if (code_point <= kMaxOneByteChar) {
+      *cursor += 1;
+      return kBadChar;
+    }
+    *cursor += 2;
+    return code_point;
+  }
+  if (length == 2) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  byte third = str[2] ^ 0x80;
+  if (third & 0xC0) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  if (first < 0xF0) {
+    uchar code_point = ((((first << 6) | second) << 6) | third)
+        & kMaxThreeByteChar;
+    if (code_point <= kMaxTwoByteChar) {
+      *cursor += 1;
+      return kBadChar;
+    }
+    *cursor += 3;
+    return code_point;
+  }
+  if (length == 3) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  byte fourth = str[3] ^ 0x80;
+  if (fourth & 0xC0) {
+    *cursor += 1;
+    return kBadChar;
+  }
+  if (first < 0xF8) {
+    uchar code_point = (((((first << 6 | second) << 6) | third) << 6) | fourth)
+        & kMaxFourByteChar;
+    if (code_point <= kMaxThreeByteChar) {
+      *cursor += 1;
+      return kBadChar;
+    }
+    *cursor += 4;
+    return code_point;
+  }
+  *cursor += 1;
+  return kBadChar;
+}
+
+
+// Uppercase:            point.category == 'Lu'
+
+static const uint16_t kUppercaseTable0Size = 455;
+static const int32_t kUppercaseTable0[455] = {
+    1073741889, 90,         1073742016, 214,
+    1073742040, 222,        256,        258,  // NOLINT
+    260,        262,        264,        266,
+    268,        270,        272,        274,  // NOLINT
+    276,        278,        280,        282,
+    284,        286,        288,        290,  // NOLINT
+    292,        294,        296,        298,
+    300,        302,        304,        306,  // NOLINT
+    308,        310,        313,        315,
+    317,        319,        321,        323,  // NOLINT
+    325,        327,        330,        332,
+    334,        336,        338,        340,  // NOLINT
+    342,        344,        346,        348,
+    350,        352,        354,        356,  // NOLINT
+    358,        360,        362,        364,
+    366,        368,        370,        372,  // NOLINT
+    374,        1073742200, 377,        379,
+    381,        1073742209, 386,        388,  // NOLINT
+    1073742214, 391,        1073742217, 395,
+    1073742222, 401,        1073742227, 404,  // NOLINT
+    1073742230, 408,        1073742236, 413,
+    1073742239, 416,        418,        420,  // NOLINT
+    1073742246, 423,        425,        428,
+    1073742254, 431,        1073742257, 435,  // NOLINT
+    437,        1073742263, 440,        444,
+    452,        455,        458,        461,  // NOLINT
+    463,        465,        467,        469,
+    471,        473,        475,        478,  // NOLINT
+    480,        482,        484,        486,
+    488,        490,        492,        494,  // NOLINT
+    497,        500,        1073742326, 504,
+    506,        508,        510,        512,  // NOLINT
+    514,        516,        518,        520,
+    522,        524,        526,        528,  // NOLINT
+    530,        532,        534,        536,
+    538,        540,        542,        544,  // NOLINT
+    546,        548,        550,        552,
+    554,        556,        558,        560,  // NOLINT
+    562,        1073742394, 571,        1073742397,
+    574,        577,        1073742403, 582,  // NOLINT
+    584,        586,        588,        590,
+    880,        882,        886,        895,  // NOLINT
+    902,        1073742728, 906,        908,
+    1073742734, 911,        1073742737, 929,  // NOLINT
+    1073742755, 939,        975,        1073742802,
+    980,        984,        986,        988,  // NOLINT
+    990,        992,        994,        996,
+    998,        1000,       1002,       1004,  // NOLINT
+    1006,       1012,       1015,       1073742841,
+    1018,       1073742845, 1071,       1120,  // NOLINT
+    1122,       1124,       1126,       1128,
+    1130,       1132,       1134,       1136,  // NOLINT
+    1138,       1140,       1142,       1144,
+    1146,       1148,       1150,       1152,  // NOLINT
+    1162,       1164,       1166,       1168,
+    1170,       1172,       1174,       1176,  // NOLINT
+    1178,       1180,       1182,       1184,
+    1186,       1188,       1190,       1192,  // NOLINT
+    1194,       1196,       1198,       1200,
+    1202,       1204,       1206,       1208,  // NOLINT
+    1210,       1212,       1214,       1073743040,
+    1217,       1219,       1221,       1223,  // NOLINT
+    1225,       1227,       1229,       1232,
+    1234,       1236,       1238,       1240,  // NOLINT
+    1242,       1244,       1246,       1248,
+    1250,       1252,       1254,       1256,  // NOLINT
+    1258,       1260,       1262,       1264,
+    1266,       1268,       1270,       1272,  // NOLINT
+    1274,       1276,       1278,       1280,
+    1282,       1284,       1286,       1288,  // NOLINT
+    1290,       1292,       1294,       1296,
+    1298,       1300,       1302,       1304,  // NOLINT
+    1306,       1308,       1310,       1312,
+    1314,       1316,       1318,       1320,  // NOLINT
+    1322,       1324,       1326,       1073743153,
+    1366,       1073746080, 4293,       4295,  // NOLINT
+    4301,       7680,       7682,       7684,
+    7686,       7688,       7690,       7692,  // NOLINT
+    7694,       7696,       7698,       7700,
+    7702,       7704,       7706,       7708,  // NOLINT
+    7710,       7712,       7714,       7716,
+    7718,       7720,       7722,       7724,  // NOLINT
+    7726,       7728,       7730,       7732,
+    7734,       7736,       7738,       7740,  // NOLINT
+    7742,       7744,       7746,       7748,
+    7750,       7752,       7754,       7756,  // NOLINT
+    7758,       7760,       7762,       7764,
+    7766,       7768,       7770,       7772,  // NOLINT
+    7774,       7776,       7778,       7780,
+    7782,       7784,       7786,       7788,  // NOLINT
+    7790,       7792,       7794,       7796,
+    7798,       7800,       7802,       7804,  // NOLINT
+    7806,       7808,       7810,       7812,
+    7814,       7816,       7818,       7820,  // NOLINT
+    7822,       7824,       7826,       7828,
+    7838,       7840,       7842,       7844,  // NOLINT
+    7846,       7848,       7850,       7852,
+    7854,       7856,       7858,       7860,  // NOLINT
+    7862,       7864,       7866,       7868,
+    7870,       7872,       7874,       7876,  // NOLINT
+    7878,       7880,       7882,       7884,
+    7886,       7888,       7890,       7892,  // NOLINT
+    7894,       7896,       7898,       7900,
+    7902,       7904,       7906,       7908,  // NOLINT
+    7910,       7912,       7914,       7916,
+    7918,       7920,       7922,       7924,  // NOLINT
+    7926,       7928,       7930,       7932,
+    7934,       1073749768, 7951,       1073749784,  // NOLINT
+    7965,       1073749800, 7983,       1073749816,
+    7999,       1073749832, 8013,       8025,  // NOLINT
+    8027,       8029,       8031,       1073749864,
+    8047,       1073749944, 8123,       1073749960,  // NOLINT
+    8139,       1073749976, 8155,       1073749992,
+    8172,       1073750008, 8187};  // NOLINT
+static const uint16_t kUppercaseTable1Size = 86;
+static const int32_t kUppercaseTable1[86] = {
+  258, 263, 1073742091, 269, 1073742096, 274, 277, 1073742105,  // NOLINT
+  285, 292, 294, 296, 1073742122, 301, 1073742128, 307,  // NOLINT
+  1073742142, 319, 325, 387, 1073744896, 3118, 3168, 1073744994,  // NOLINT
+  3172, 3175, 3177, 3179, 1073745005, 3184, 3186, 3189,  // NOLINT
+  1073745022, 3200, 3202, 3204, 3206, 3208, 3210, 3212,  // NOLINT
+  3214, 3216, 3218, 3220, 3222, 3224, 3226, 3228,  // NOLINT
+  3230, 3232, 3234, 3236, 3238, 3240, 3242, 3244,  // NOLINT
+  3246, 3248, 3250, 3252, 3254, 3256, 3258, 3260,  // NOLINT
+  3262, 3264, 3266, 3268, 3270, 3272, 3274, 3276,  // NOLINT
+  3278, 3280, 3282, 3284, 3286, 3288, 3290, 3292,  // NOLINT
+  3294, 3296, 3298, 3307, 3309, 3314 };  // NOLINT
+static const uint16_t kUppercaseTable5Size = 101;
+static const int32_t kUppercaseTable5[101] = {
+    1600, 1602,       1604, 1606,       1608, 1610,       1612, 1614,  // NOLINT
+    1616, 1618,       1620, 1622,       1624, 1626,       1628, 1630,  // NOLINT
+    1632, 1634,       1636, 1638,       1640, 1642,       1644, 1664,  // NOLINT
+    1666, 1668,       1670, 1672,       1674, 1676,       1678, 1680,  // NOLINT
+    1682, 1684,       1686, 1688,       1690, 1826,       1828, 1830,  // NOLINT
+    1832, 1834,       1836, 1838,       1842, 1844,       1846, 1848,  // NOLINT
+    1850, 1852,       1854, 1856,       1858, 1860,       1862, 1864,  // NOLINT
+    1866, 1868,       1870, 1872,       1874, 1876,       1878, 1880,  // NOLINT
+    1882, 1884,       1886, 1888,       1890, 1892,       1894, 1896,  // NOLINT
+    1898, 1900,       1902, 1913,       1915, 1073743741, 1918, 1920,  // NOLINT
+    1922, 1924,       1926, 1931,       1933, 1936,       1938, 1942,  // NOLINT
+    1944, 1946,       1948, 1950,       1952, 1954,       1956, 1958,  // NOLINT
+    1960, 1073743786, 1965, 1073743792, 1969};                         // NOLINT
+static const uint16_t kUppercaseTable7Size = 2;
+static const int32_t kUppercaseTable7[2] = {
+  1073749793, 7994 };  // NOLINT
+bool Uppercase::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupPredicate(kUppercaseTable0,
+                                       kUppercaseTable0Size,
+                                       c);
+    case 1: return LookupPredicate(kUppercaseTable1,
+                                       kUppercaseTable1Size,
+                                       c);
+    case 5: return LookupPredicate(kUppercaseTable5,
+                                       kUppercaseTable5Size,
+                                       c);
+    case 7: return LookupPredicate(kUppercaseTable7,
+                                       kUppercaseTable7Size,
+                                       c);
+    default: return false;
+  }
+}
+
+
+// Lowercase:            point.category == 'Ll'
+
+static const uint16_t kLowercaseTable0Size = 467;
+static const int32_t kLowercaseTable0[467] = {
+    1073741921, 122,        181,        1073742047,
+    246,        1073742072, 255,        257,  // NOLINT
+    259,        261,        263,        265,
+    267,        269,        271,        273,  // NOLINT
+    275,        277,        279,        281,
+    283,        285,        287,        289,  // NOLINT
+    291,        293,        295,        297,
+    299,        301,        303,        305,  // NOLINT
+    307,        309,        1073742135, 312,
+    314,        316,        318,        320,  // NOLINT
+    322,        324,        326,        1073742152,
+    329,        331,        333,        335,  // NOLINT
+    337,        339,        341,        343,
+    345,        347,        349,        351,  // NOLINT
+    353,        355,        357,        359,
+    361,        363,        365,        367,  // NOLINT
+    369,        371,        373,        375,
+    378,        380,        1073742206, 384,  // NOLINT
+    387,        389,        392,        1073742220,
+    397,        402,        405,        1073742233,  // NOLINT
+    411,        414,        417,        419,
+    421,        424,        1073742250, 427,  // NOLINT
+    429,        432,        436,        438,
+    1073742265, 442,        1073742269, 447,  // NOLINT
+    454,        457,        460,        462,
+    464,        466,        468,        470,  // NOLINT
+    472,        474,        1073742300, 477,
+    479,        481,        483,        485,  // NOLINT
+    487,        489,        491,        493,
+    1073742319, 496,        499,        501,  // NOLINT
+    505,        507,        509,        511,
+    513,        515,        517,        519,  // NOLINT
+    521,        523,        525,        527,
+    529,        531,        533,        535,  // NOLINT
+    537,        539,        541,        543,
+    545,        547,        549,        551,  // NOLINT
+    553,        555,        557,        559,
+    561,        1073742387, 569,        572,  // NOLINT
+    1073742399, 576,        578,        583,
+    585,        587,        589,        1073742415,  // NOLINT
+    659,        1073742485, 687,        881,
+    883,        887,        1073742715, 893,  // NOLINT
+    912,        1073742764, 974,        1073742800,
+    977,        1073742805, 983,        985,  // NOLINT
+    987,        989,        991,        993,
+    995,        997,        999,        1001,  // NOLINT
+    1003,       1005,       1073742831, 1011,
+    1013,       1016,       1073742843, 1020,  // NOLINT
+    1073742896, 1119,       1121,       1123,
+    1125,       1127,       1129,       1131,  // NOLINT
+    1133,       1135,       1137,       1139,
+    1141,       1143,       1145,       1147,  // NOLINT
+    1149,       1151,       1153,       1163,
+    1165,       1167,       1169,       1171,  // NOLINT
+    1173,       1175,       1177,       1179,
+    1181,       1183,       1185,       1187,  // NOLINT
+    1189,       1191,       1193,       1195,
+    1197,       1199,       1201,       1203,  // NOLINT
+    1205,       1207,       1209,       1211,
+    1213,       1215,       1218,       1220,  // NOLINT
+    1222,       1224,       1226,       1228,
+    1073743054, 1231,       1233,       1235,  // NOLINT
+    1237,       1239,       1241,       1243,
+    1245,       1247,       1249,       1251,  // NOLINT
+    1253,       1255,       1257,       1259,
+    1261,       1263,       1265,       1267,  // NOLINT
+    1269,       1271,       1273,       1275,
+    1277,       1279,       1281,       1283,  // NOLINT
+    1285,       1287,       1289,       1291,
+    1293,       1295,       1297,       1299,  // NOLINT
+    1301,       1303,       1305,       1307,
+    1309,       1311,       1313,       1315,  // NOLINT
+    1317,       1319,       1321,       1323,
+    1325,       1327,       1073743201, 1415,  // NOLINT
+    1073749248, 7467,       1073749355, 7543,
+    1073749369, 7578,       7681,       7683,  // NOLINT
+    7685,       7687,       7689,       7691,
+    7693,       7695,       7697,       7699,  // NOLINT
+    7701,       7703,       7705,       7707,
+    7709,       7711,       7713,       7715,  // NOLINT
+    7717,       7719,       7721,       7723,
+    7725,       7727,       7729,       7731,  // NOLINT
+    7733,       7735,       7737,       7739,
+    7741,       7743,       7745,       7747,  // NOLINT
+    7749,       7751,       7753,       7755,
+    7757,       7759,       7761,       7763,  // NOLINT
+    7765,       7767,       7769,       7771,
+    7773,       7775,       7777,       7779,  // NOLINT
+    7781,       7783,       7785,       7787,
+    7789,       7791,       7793,       7795,  // NOLINT
+    7797,       7799,       7801,       7803,
+    7805,       7807,       7809,       7811,  // NOLINT
+    7813,       7815,       7817,       7819,
+    7821,       7823,       7825,       7827,  // NOLINT
+    1073749653, 7837,       7839,       7841,
+    7843,       7845,       7847,       7849,  // NOLINT
+    7851,       7853,       7855,       7857,
+    7859,       7861,       7863,       7865,  // NOLINT
+    7867,       7869,       7871,       7873,
+    7875,       7877,       7879,       7881,  // NOLINT
+    7883,       7885,       7887,       7889,
+    7891,       7893,       7895,       7897,  // NOLINT
+    7899,       7901,       7903,       7905,
+    7907,       7909,       7911,       7913,  // NOLINT
+    7915,       7917,       7919,       7921,
+    7923,       7925,       7927,       7929,  // NOLINT
+    7931,       7933,       1073749759, 7943,
+    1073749776, 7957,       1073749792, 7975,  // NOLINT
+    1073749808, 7991,       1073749824, 8005,
+    1073749840, 8023,       1073749856, 8039,  // NOLINT
+    1073749872, 8061,       1073749888, 8071,
+    1073749904, 8087,       1073749920, 8103,  // NOLINT
+    1073749936, 8116,       1073749942, 8119,
+    8126,       1073749954, 8132,       1073749958,  // NOLINT
+    8135,       1073749968, 8147,       1073749974,
+    8151,       1073749984, 8167,       1073750002,  // NOLINT
+    8180,       1073750006, 8183};                   // NOLINT
+static const uint16_t kLowercaseTable1Size = 84;
+static const int32_t kLowercaseTable1[84] = {
+  266, 1073742094, 271, 275, 303, 308, 313, 1073742140,  // NOLINT
+  317, 1073742150, 329, 334, 388, 1073744944, 3166, 3169,  // NOLINT
+  1073744997, 3174, 3176, 3178, 3180, 3185, 1073745011, 3188,  // NOLINT
+  1073745014, 3195, 3201, 3203, 3205, 3207, 3209, 3211,  // NOLINT
+  3213, 3215, 3217, 3219, 3221, 3223, 3225, 3227,  // NOLINT
+  3229, 3231, 3233, 3235, 3237, 3239, 3241, 3243,  // NOLINT
+  3245, 3247, 3249, 3251, 3253, 3255, 3257, 3259,  // NOLINT
+  3261, 3263, 3265, 3267, 3269, 3271, 3273, 3275,  // NOLINT
+  3277, 3279, 3281, 3283, 3285, 3287, 3289, 3291,  // NOLINT
+  3293, 3295, 3297, 1073745123, 3300, 3308, 3310, 3315,  // NOLINT
+  1073745152, 3365, 3367, 3373 };  // NOLINT
+static const uint16_t kLowercaseTable5Size = 105;
+static const int32_t kLowercaseTable5[105] = {
+    1601,       1603,       1605, 1607,
+    1609,       1611,       1613, 1615,  // NOLINT
+    1617,       1619,       1621, 1623,
+    1625,       1627,       1629, 1631,  // NOLINT
+    1633,       1635,       1637, 1639,
+    1641,       1643,       1645, 1665,  // NOLINT
+    1667,       1669,       1671, 1673,
+    1675,       1677,       1679, 1681,  // NOLINT
+    1683,       1685,       1687, 1689,
+    1691,       1827,       1829, 1831,  // NOLINT
+    1833,       1835,       1837, 1073743663,
+    1841,       1843,       1845, 1847,  // NOLINT
+    1849,       1851,       1853, 1855,
+    1857,       1859,       1861, 1863,  // NOLINT
+    1865,       1867,       1869, 1871,
+    1873,       1875,       1877, 1879,  // NOLINT
+    1881,       1883,       1885, 1887,
+    1889,       1891,       1893, 1895,  // NOLINT
+    1897,       1899,       1901, 1903,
+    1073743729, 1912,       1914, 1916,  // NOLINT
+    1919,       1921,       1923, 1925,
+    1927,       1932,       1934, 1937,  // NOLINT
+    1073743763, 1941,       1943, 1945,
+    1947,       1949,       1951, 1953,  // NOLINT
+    1955,       1957,       1959, 1961,
+    2042,       1073744688, 2906, 1073744740,  // NOLINT
+    2917};                                     // NOLINT
+static const uint16_t kLowercaseTable7Size = 6;
+static const int32_t kLowercaseTable7[6] = {
+  1073748736, 6918, 1073748755, 6935, 1073749825, 8026 };  // NOLINT
+bool Lowercase::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupPredicate(kLowercaseTable0,
+                                       kLowercaseTable0Size,
+                                       c);
+    case 1: return LookupPredicate(kLowercaseTable1,
+                                       kLowercaseTable1Size,
+                                       c);
+    case 5: return LookupPredicate(kLowercaseTable5,
+                                       kLowercaseTable5Size,
+                                       c);
+    case 7: return LookupPredicate(kLowercaseTable7,
+                                       kLowercaseTable7Size,
+                                       c);
+    default: return false;
+  }
+}
+
+
+// Letter:               point.category in ['Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl']
+
+static const uint16_t kLetterTable0Size = 431;
+static const int32_t kLetterTable0[431] = {
+    1073741889, 90,         1073741921, 122,
+    170,        181,        186,        1073742016,  // NOLINT
+    214,        1073742040, 246,        1073742072,
+    705,        1073742534, 721,        1073742560,  // NOLINT
+    740,        748,        750,        1073742704,
+    884,        1073742710, 887,        1073742714,  // NOLINT
+    893,        895,        902,        1073742728,
+    906,        908,        1073742734, 929,  // NOLINT
+    1073742755, 1013,       1073742839, 1153,
+    1073742986, 1327,       1073743153, 1366,  // NOLINT
+    1369,       1073743201, 1415,       1073743312,
+    1514,       1073743344, 1522,       1073743392,  // NOLINT
+    1610,       1073743470, 1647,       1073743473,
+    1747,       1749,       1073743589, 1766,  // NOLINT
+    1073743598, 1775,       1073743610, 1788,
+    1791,       1808,       1073743634, 1839,  // NOLINT
+    1073743693, 1957,       1969,       1073743818,
+    2026,       1073743860, 2037,       2042,  // NOLINT
+    1073743872, 2069,       2074,       2084,
+    2088,       1073743936, 2136,       1073744032,  // NOLINT
+    2226,       1073744132, 2361,       2365,
+    2384,       1073744216, 2401,       1073744241,  // NOLINT
+    2432,       1073744261, 2444,       1073744271,
+    2448,       1073744275, 2472,       1073744298,  // NOLINT
+    2480,       2482,       1073744310, 2489,
+    2493,       2510,       1073744348, 2525,  // NOLINT
+    1073744351, 2529,       1073744368, 2545,
+    1073744389, 2570,       1073744399, 2576,  // NOLINT
+    1073744403, 2600,       1073744426, 2608,
+    1073744434, 2611,       1073744437, 2614,  // NOLINT
+    1073744440, 2617,       1073744473, 2652,
+    2654,       1073744498, 2676,       1073744517,  // NOLINT
+    2701,       1073744527, 2705,       1073744531,
+    2728,       1073744554, 2736,       1073744562,  // NOLINT
+    2739,       1073744565, 2745,       2749,
+    2768,       1073744608, 2785,       1073744645,  // NOLINT
+    2828,       1073744655, 2832,       1073744659,
+    2856,       1073744682, 2864,       1073744690,  // NOLINT
+    2867,       1073744693, 2873,       2877,
+    1073744732, 2909,       1073744735, 2913,  // NOLINT
+    2929,       2947,       1073744773, 2954,
+    1073744782, 2960,       1073744786, 2965,  // NOLINT
+    1073744793, 2970,       2972,       1073744798,
+    2975,       1073744803, 2980,       1073744808,  // NOLINT
+    2986,       1073744814, 3001,       3024,
+    1073744901, 3084,       1073744910, 3088,  // NOLINT
+    1073744914, 3112,       1073744938, 3129,
+    3133,       1073744984, 3161,       1073744992,  // NOLINT
+    3169,       1073745029, 3212,       1073745038,
+    3216,       1073745042, 3240,       1073745066,  // NOLINT
+    3251,       1073745077, 3257,       3261,
+    3294,       1073745120, 3297,       1073745137,  // NOLINT
+    3314,       1073745157, 3340,       1073745166,
+    3344,       1073745170, 3386,       3389,  // NOLINT
+    3406,       1073745248, 3425,       1073745274,
+    3455,       1073745285, 3478,       1073745306,  // NOLINT
+    3505,       1073745331, 3515,       3517,
+    1073745344, 3526,       1073745409, 3632,  // NOLINT
+    1073745458, 3635,       1073745472, 3654,
+    1073745537, 3714,       3716,       1073745543,  // NOLINT
+    3720,       3722,       3725,       1073745556,
+    3735,       1073745561, 3743,       1073745569,  // NOLINT
+    3747,       3749,       3751,       1073745578,
+    3755,       1073745581, 3760,       1073745586,  // NOLINT
+    3763,       3773,       1073745600, 3780,
+    3782,       1073745628, 3807,       3840,  // NOLINT
+    1073745728, 3911,       1073745737, 3948,
+    1073745800, 3980,       1073745920, 4138,  // NOLINT
+    4159,       1073746000, 4181,       1073746010,
+    4189,       4193,       1073746021, 4198,  // NOLINT
+    1073746030, 4208,       1073746037, 4225,
+    4238,       1073746080, 4293,       4295,  // NOLINT
+    4301,       1073746128, 4346,       1073746172,
+    4680,       1073746506, 4685,       1073746512,  // NOLINT
+    4694,       4696,       1073746522, 4701,
+    1073746528, 4744,       1073746570, 4749,  // NOLINT
+    1073746576, 4784,       1073746610, 4789,
+    1073746616, 4798,       4800,       1073746626,  // NOLINT
+    4805,       1073746632, 4822,       1073746648,
+    4880,       1073746706, 4885,       1073746712,  // NOLINT
+    4954,       1073746816, 5007,       1073746848,
+    5108,       1073746945, 5740,       1073747567,  // NOLINT
+    5759,       1073747585, 5786,       1073747616,
+    5866,       1073747694, 5880,       1073747712,  // NOLINT
+    5900,       1073747726, 5905,       1073747744,
+    5937,       1073747776, 5969,       1073747808,  // NOLINT
+    5996,       1073747822, 6000,       1073747840,
+    6067,       6103,       6108,       1073748000,  // NOLINT
+    6263,       1073748096, 6312,       6314,
+    1073748144, 6389,       1073748224, 6430,  // NOLINT
+    1073748304, 6509,       1073748336, 6516,
+    1073748352, 6571,       1073748417, 6599,  // NOLINT
+    1073748480, 6678,       1073748512, 6740,
+    6823,       1073748741, 6963,       1073748805,  // NOLINT
+    6987,       1073748867, 7072,       1073748910,
+    7087,       1073748922, 7141,       1073748992,  // NOLINT
+    7203,       1073749069, 7247,       1073749082,
+    7293,       1073749225, 7404,       1073749230,  // NOLINT
+    7409,       1073749237, 7414,       1073749248,
+    7615,       1073749504, 7957,       1073749784,  // NOLINT
+    7965,       1073749792, 8005,       1073749832,
+    8013,       1073749840, 8023,       8025,  // NOLINT
+    8027,       8029,       1073749855, 8061,
+    1073749888, 8116,       1073749942, 8124,  // NOLINT
+    8126,       1073749954, 8132,       1073749958,
+    8140,       1073749968, 8147,       1073749974,  // NOLINT
+    8155,       1073749984, 8172,       1073750002,
+    8180,       1073750006, 8188};  // NOLINT
+static const uint16_t kLetterTable1Size = 87;
+static const int32_t kLetterTable1[87] = {
+  113, 127, 1073741968, 156, 258, 263, 1073742090, 275,  // NOLINT
+  277, 1073742105, 285, 292, 294, 296, 1073742122, 301,  // NOLINT
+  1073742127, 313, 1073742140, 319, 1073742149, 329, 334, 1073742176,  // NOLINT
+  392, 1073744896, 3118, 1073744944, 3166, 1073744992, 3300, 1073745131,  // NOLINT
+  3310, 1073745138, 3315, 1073745152, 3365, 3367, 3373, 1073745200,  // NOLINT
+  3431, 3439, 1073745280, 3478, 1073745312, 3494, 1073745320, 3502,  // NOLINT
+  1073745328, 3510, 1073745336, 3518, 1073745344, 3526, 1073745352, 3534,  // NOLINT
+  1073745360, 3542, 1073745368, 3550, 3631, 1073745925, 4103, 1073745953,  // NOLINT
+  4137, 1073745969, 4149, 1073745976, 4156, 1073745985, 4246, 1073746077,  // NOLINT
+  4255, 1073746081, 4346, 1073746172, 4351, 1073746181, 4397, 1073746225,  // NOLINT
+  4494, 1073746336, 4538, 1073746416, 4607, 1073746944, 8191 };  // NOLINT
+static const uint16_t kLetterTable2Size = 4;
+static const int32_t kLetterTable2[4] = {
+  1073741824, 3509, 1073745408, 8191 };  // NOLINT
+static const uint16_t kLetterTable3Size = 2;
+static const int32_t kLetterTable3[2] = {
+  1073741824, 8191 };  // NOLINT
+static const uint16_t kLetterTable4Size = 2;
+static const int32_t kLetterTable4[2] = {
+  1073741824, 8140 };  // NOLINT
+static const uint16_t kLetterTable5Size = 100;
+static const int32_t kLetterTable5[100] = {
+    1073741824, 1164,       1073743056, 1277,
+    1073743104, 1548,       1073743376, 1567,  // NOLINT
+    1073743402, 1579,       1073743424, 1646,
+    1073743487, 1693,       1073743520, 1775,  // NOLINT
+    1073743639, 1823,       1073743650, 1928,
+    1073743755, 1934,       1073743760, 1965,  // NOLINT
+    1073743792, 1969,       1073743863, 2049,
+    1073743875, 2053,       1073743879, 2058,  // NOLINT
+    1073743884, 2082,       1073743936, 2163,
+    1073744002, 2227,       1073744114, 2295,  // NOLINT
+    2299,       1073744138, 2341,       1073744176,
+    2374,       1073744224, 2428,       1073744260,  // NOLINT
+    2482,       2511,       1073744352, 2532,
+    1073744358, 2543,       1073744378, 2558,  // NOLINT
+    1073744384, 2600,       1073744448, 2626,
+    1073744452, 2635,       1073744480, 2678,  // NOLINT
+    2682,       1073744510, 2735,       2737,
+    1073744565, 2742,       1073744569, 2749,  // NOLINT
+    2752,       2754,       1073744603, 2781,
+    1073744608, 2794,       1073744626, 2804,  // NOLINT
+    1073744641, 2822,       1073744649, 2830,
+    1073744657, 2838,       1073744672, 2854,  // NOLINT
+    1073744680, 2862,       1073744688, 2906,
+    1073744732, 2911,       1073744740, 2917,   // NOLINT
+    1073744832, 3042,       1073744896, 8191};  // NOLINT
+static const uint16_t kLetterTable6Size = 6;
+static const int32_t kLetterTable6[6] = {
+  1073741824, 6051, 1073747888, 6086, 1073747915, 6139 };  // NOLINT
+static const uint16_t kLetterTable7Size = 48;
+static const int32_t kLetterTable7[48] = {
+  1073748224, 6765, 1073748592, 6873, 1073748736, 6918, 1073748755, 6935,  // NOLINT
+  6941, 1073748767, 6952, 1073748778, 6966, 1073748792, 6972, 6974,  // NOLINT
+  1073748800, 6977, 1073748803, 6980, 1073748806, 7089, 1073748947, 7485,  // NOLINT
+  1073749328, 7567, 1073749394, 7623, 1073749488, 7675, 1073749616, 7796,  // NOLINT
+  1073749622, 7932, 1073749793, 7994, 1073749825, 8026, 1073749862, 8126,  // NOLINT
+  1073749954, 8135, 1073749962, 8143, 1073749970, 8151, 1073749978, 8156 };  // NOLINT
+bool Letter::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupPredicate(kLetterTable0,
+                                       kLetterTable0Size,
+                                       c);
+    case 1: return LookupPredicate(kLetterTable1,
+                                       kLetterTable1Size,
+                                       c);
+    case 2: return LookupPredicate(kLetterTable2,
+                                       kLetterTable2Size,
+                                       c);
+    case 3: return LookupPredicate(kLetterTable3,
+                                       kLetterTable3Size,
+                                       c);
+    case 4: return LookupPredicate(kLetterTable4,
+                                       kLetterTable4Size,
+                                       c);
+    case 5: return LookupPredicate(kLetterTable5,
+                                       kLetterTable5Size,
+                                       c);
+    case 6: return LookupPredicate(kLetterTable6,
+                                       kLetterTable6Size,
+                                       c);
+    case 7: return LookupPredicate(kLetterTable7,
+                                       kLetterTable7Size,
+                                       c);
+    default: return false;
+  }
+}
+
+
+// ID_Start:             ((point.category in ['Lu', 'Ll', 'Lt', 'Lm', 'Lo',
+// 'Nl'] or 'Other_ID_Start' in point.properties) and ('Pattern_Syntax' not in
+// point.properties) and ('Pattern_White_Space' not in point.properties)) or
+// ('JS_ID_Start' in point.properties)
+
+static const uint16_t kID_StartTable0Size = 434;
+static const int32_t kID_StartTable0[434] = {
+    36,         1073741889, 90,         92,
+    95,         1073741921, 122,        170,  // NOLINT
+    181,        186,        1073742016, 214,
+    1073742040, 246,        1073742072, 705,  // NOLINT
+    1073742534, 721,        1073742560, 740,
+    748,        750,        1073742704, 884,  // NOLINT
+    1073742710, 887,        1073742714, 893,
+    895,        902,        1073742728, 906,  // NOLINT
+    908,        1073742734, 929,        1073742755,
+    1013,       1073742839, 1153,       1073742986,  // NOLINT
+    1327,       1073743153, 1366,       1369,
+    1073743201, 1415,       1073743312, 1514,  // NOLINT
+    1073743344, 1522,       1073743392, 1610,
+    1073743470, 1647,       1073743473, 1747,  // NOLINT
+    1749,       1073743589, 1766,       1073743598,
+    1775,       1073743610, 1788,       1791,  // NOLINT
+    1808,       1073743634, 1839,       1073743693,
+    1957,       1969,       1073743818, 2026,  // NOLINT
+    1073743860, 2037,       2042,       1073743872,
+    2069,       2074,       2084,       2088,  // NOLINT
+    1073743936, 2136,       1073744032, 2226,
+    1073744132, 2361,       2365,       2384,  // NOLINT
+    1073744216, 2401,       1073744241, 2432,
+    1073744261, 2444,       1073744271, 2448,  // NOLINT
+    1073744275, 2472,       1073744298, 2480,
+    2482,       1073744310, 2489,       2493,  // NOLINT
+    2510,       1073744348, 2525,       1073744351,
+    2529,       1073744368, 2545,       1073744389,  // NOLINT
+    2570,       1073744399, 2576,       1073744403,
+    2600,       1073744426, 2608,       1073744434,  // NOLINT
+    2611,       1073744437, 2614,       1073744440,
+    2617,       1073744473, 2652,       2654,  // NOLINT
+    1073744498, 2676,       1073744517, 2701,
+    1073744527, 2705,       1073744531, 2728,  // NOLINT
+    1073744554, 2736,       1073744562, 2739,
+    1073744565, 2745,       2749,       2768,  // NOLINT
+    1073744608, 2785,       1073744645, 2828,
+    1073744655, 2832,       1073744659, 2856,  // NOLINT
+    1073744682, 2864,       1073744690, 2867,
+    1073744693, 2873,       2877,       1073744732,  // NOLINT
+    2909,       1073744735, 2913,       2929,
+    2947,       1073744773, 2954,       1073744782,  // NOLINT
+    2960,       1073744786, 2965,       1073744793,
+    2970,       2972,       1073744798, 2975,  // NOLINT
+    1073744803, 2980,       1073744808, 2986,
+    1073744814, 3001,       3024,       1073744901,  // NOLINT
+    3084,       1073744910, 3088,       1073744914,
+    3112,       1073744938, 3129,       3133,  // NOLINT
+    1073744984, 3161,       1073744992, 3169,
+    1073745029, 3212,       1073745038, 3216,  // NOLINT
+    1073745042, 3240,       1073745066, 3251,
+    1073745077, 3257,       3261,       3294,  // NOLINT
+    1073745120, 3297,       1073745137, 3314,
+    1073745157, 3340,       1073745166, 3344,  // NOLINT
+    1073745170, 3386,       3389,       3406,
+    1073745248, 3425,       1073745274, 3455,  // NOLINT
+    1073745285, 3478,       1073745306, 3505,
+    1073745331, 3515,       3517,       1073745344,  // NOLINT
+    3526,       1073745409, 3632,       1073745458,
+    3635,       1073745472, 3654,       1073745537,  // NOLINT
+    3714,       3716,       1073745543, 3720,
+    3722,       3725,       1073745556, 3735,  // NOLINT
+    1073745561, 3743,       1073745569, 3747,
+    3749,       3751,       1073745578, 3755,  // NOLINT
+    1073745581, 3760,       1073745586, 3763,
+    3773,       1073745600, 3780,       3782,  // NOLINT
+    1073745628, 3807,       3840,       1073745728,
+    3911,       1073745737, 3948,       1073745800,  // NOLINT
+    3980,       1073745920, 4138,       4159,
+    1073746000, 4181,       1073746010, 4189,  // NOLINT
+    4193,       1073746021, 4198,       1073746030,
+    4208,       1073746037, 4225,       4238,  // NOLINT
+    1073746080, 4293,       4295,       4301,
+    1073746128, 4346,       1073746172, 4680,  // NOLINT
+    1073746506, 4685,       1073746512, 4694,
+    4696,       1073746522, 4701,       1073746528,  // NOLINT
+    4744,       1073746570, 4749,       1073746576,
+    4784,       1073746610, 4789,       1073746616,  // NOLINT
+    4798,       4800,       1073746626, 4805,
+    1073746632, 4822,       1073746648, 4880,  // NOLINT
+    1073746706, 4885,       1073746712, 4954,
+    1073746816, 5007,       1073746848, 5108,  // NOLINT
+    1073746945, 5740,       1073747567, 5759,
+    1073747585, 5786,       1073747616, 5866,  // NOLINT
+    1073747694, 5880,       1073747712, 5900,
+    1073747726, 5905,       1073747744, 5937,  // NOLINT
+    1073747776, 5969,       1073747808, 5996,
+    1073747822, 6000,       1073747840, 6067,  // NOLINT
+    6103,       6108,       1073748000, 6263,
+    1073748096, 6312,       6314,       1073748144,  // NOLINT
+    6389,       1073748224, 6430,       1073748304,
+    6509,       1073748336, 6516,       1073748352,  // NOLINT
+    6571,       1073748417, 6599,       1073748480,
+    6678,       1073748512, 6740,       6823,  // NOLINT
+    1073748741, 6963,       1073748805, 6987,
+    1073748867, 7072,       1073748910, 7087,  // NOLINT
+    1073748922, 7141,       1073748992, 7203,
+    1073749069, 7247,       1073749082, 7293,  // NOLINT
+    1073749225, 7404,       1073749230, 7409,
+    1073749237, 7414,       1073749248, 7615,  // NOLINT
+    1073749504, 7957,       1073749784, 7965,
+    1073749792, 8005,       1073749832, 8013,  // NOLINT
+    1073749840, 8023,       8025,       8027,
+    8029,       1073749855, 8061,       1073749888,  // NOLINT
+    8116,       1073749942, 8124,       8126,
+    1073749954, 8132,       1073749958, 8140,  // NOLINT
+    1073749968, 8147,       1073749974, 8155,
+    1073749984, 8172,       1073750002, 8180,  // NOLINT
+    1073750006, 8188};                         // NOLINT
+static const uint16_t kID_StartTable1Size = 84;
+static const int32_t kID_StartTable1[84] = {
+    113,        127,        1073741968, 156,
+    258,        263,        1073742090, 275,  // NOLINT
+    277,        1073742104, 285,        292,
+    294,        296,        1073742122, 313,  // NOLINT
+    1073742140, 319,        1073742149, 329,
+    334,        1073742176, 392,        1073744896,  // NOLINT
+    3118,       1073744944, 3166,       1073744992,
+    3300,       1073745131, 3310,       1073745138,  // NOLINT
+    3315,       1073745152, 3365,       3367,
+    3373,       1073745200, 3431,       3439,  // NOLINT
+    1073745280, 3478,       1073745312, 3494,
+    1073745320, 3502,       1073745328, 3510,  // NOLINT
+    1073745336, 3518,       1073745344, 3526,
+    1073745352, 3534,       1073745360, 3542,  // NOLINT
+    1073745368, 3550,       1073745925, 4103,
+    1073745953, 4137,       1073745969, 4149,  // NOLINT
+    1073745976, 4156,       1073745985, 4246,
+    1073746075, 4255,       1073746081, 4346,  // NOLINT
+    1073746172, 4351,       1073746181, 4397,
+    1073746225, 4494,       1073746336, 4538,   // NOLINT
+    1073746416, 4607,       1073746944, 8191};  // NOLINT
+static const uint16_t kID_StartTable2Size = 4;
+static const int32_t kID_StartTable2[4] = {1073741824, 3509, 1073745408,
+                                           8191};  // NOLINT
+static const uint16_t kID_StartTable3Size = 2;
+static const int32_t kID_StartTable3[2] = {1073741824, 8191};  // NOLINT
+static const uint16_t kID_StartTable4Size = 2;
+static const int32_t kID_StartTable4[2] = {1073741824, 8140};  // NOLINT
+static const uint16_t kID_StartTable5Size = 100;
+static const int32_t kID_StartTable5[100] = {
+    1073741824, 1164,       1073743056, 1277,
+    1073743104, 1548,       1073743376, 1567,  // NOLINT
+    1073743402, 1579,       1073743424, 1646,
+    1073743487, 1693,       1073743520, 1775,  // NOLINT
+    1073743639, 1823,       1073743650, 1928,
+    1073743755, 1934,       1073743760, 1965,  // NOLINT
+    1073743792, 1969,       1073743863, 2049,
+    1073743875, 2053,       1073743879, 2058,  // NOLINT
+    1073743884, 2082,       1073743936, 2163,
+    1073744002, 2227,       1073744114, 2295,  // NOLINT
+    2299,       1073744138, 2341,       1073744176,
+    2374,       1073744224, 2428,       1073744260,  // NOLINT
+    2482,       2511,       1073744352, 2532,
+    1073744358, 2543,       1073744378, 2558,  // NOLINT
+    1073744384, 2600,       1073744448, 2626,
+    1073744452, 2635,       1073744480, 2678,  // NOLINT
+    2682,       1073744510, 2735,       2737,
+    1073744565, 2742,       1073744569, 2749,  // NOLINT
+    2752,       2754,       1073744603, 2781,
+    1073744608, 2794,       1073744626, 2804,  // NOLINT
+    1073744641, 2822,       1073744649, 2830,
+    1073744657, 2838,       1073744672, 2854,  // NOLINT
+    1073744680, 2862,       1073744688, 2906,
+    1073744732, 2911,       1073744740, 2917,   // NOLINT
+    1073744832, 3042,       1073744896, 8191};  // NOLINT
+static const uint16_t kID_StartTable6Size = 6;
+static const int32_t kID_StartTable6[6] = {1073741824, 6051, 1073747888, 6086,
+                                           1073747915, 6139};  // NOLINT
+static const uint16_t kID_StartTable7Size = 48;
+static const int32_t kID_StartTable7[48] = {
+    1073748224, 6765,       1073748592, 6873,
+    1073748736, 6918,       1073748755, 6935,  // NOLINT
+    6941,       1073748767, 6952,       1073748778,
+    6966,       1073748792, 6972,       6974,  // NOLINT
+    1073748800, 6977,       1073748803, 6980,
+    1073748806, 7089,       1073748947, 7485,  // NOLINT
+    1073749328, 7567,       1073749394, 7623,
+    1073749488, 7675,       1073749616, 7796,  // NOLINT
+    1073749622, 7932,       1073749793, 7994,
+    1073749825, 8026,       1073749862, 8126,  // NOLINT
+    1073749954, 8135,       1073749962, 8143,
+    1073749970, 8151,       1073749978, 8156};  // NOLINT
+bool ID_Start::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0:
+      return LookupPredicate(kID_StartTable0, kID_StartTable0Size, c);
+    case 1:
+      return LookupPredicate(kID_StartTable1, kID_StartTable1Size, c);
+    case 2:
+      return LookupPredicate(kID_StartTable2, kID_StartTable2Size, c);
+    case 3:
+      return LookupPredicate(kID_StartTable3, kID_StartTable3Size, c);
+    case 4:
+      return LookupPredicate(kID_StartTable4, kID_StartTable4Size, c);
+    case 5:
+      return LookupPredicate(kID_StartTable5, kID_StartTable5Size, c);
+    case 6:
+      return LookupPredicate(kID_StartTable6, kID_StartTable6Size, c);
+    case 7:
+      return LookupPredicate(kID_StartTable7, kID_StartTable7Size, c);
+    default:
+      return false;
+  }
+}
+
+
+// ID_Continue:          point.category in ['Nd', 'Mn', 'Mc', 'Pc'] or
+// 'Other_ID_Continue' in point.properties or 'JS_ID_Continue' in
+// point.properties
+
+static const uint16_t kID_ContinueTable0Size = 315;
+static const int32_t kID_ContinueTable0[315] = {
+    1073741872, 57,         95,         183,
+    1073742592, 879,        903,        1073742979,  // NOLINT
+    1159,       1073743249, 1469,       1471,
+    1073743297, 1474,       1073743300, 1477,  // NOLINT
+    1479,       1073743376, 1562,       1073743435,
+    1641,       1648,       1073743574, 1756,  // NOLINT
+    1073743583, 1764,       1073743591, 1768,
+    1073743594, 1773,       1073743600, 1785,  // NOLINT
+    1809,       1073743664, 1866,       1073743782,
+    1968,       1073743808, 1993,       1073743851,  // NOLINT
+    2035,       1073743894, 2073,       1073743899,
+    2083,       1073743909, 2087,       1073743913,  // NOLINT
+    2093,       1073743961, 2139,       1073744100,
+    2307,       1073744186, 2364,       1073744190,  // NOLINT
+    2383,       1073744209, 2391,       1073744226,
+    2403,       1073744230, 2415,       1073744257,  // NOLINT
+    2435,       2492,       1073744318, 2500,
+    1073744327, 2504,       1073744331, 2509,  // NOLINT
+    2519,       1073744354, 2531,       1073744358,
+    2543,       1073744385, 2563,       2620,  // NOLINT
+    1073744446, 2626,       1073744455, 2632,
+    1073744459, 2637,       2641,       1073744486,  // NOLINT
+    2673,       2677,       1073744513, 2691,
+    2748,       1073744574, 2757,       1073744583,  // NOLINT
+    2761,       1073744587, 2765,       1073744610,
+    2787,       1073744614, 2799,       1073744641,  // NOLINT
+    2819,       2876,       1073744702, 2884,
+    1073744711, 2888,       1073744715, 2893,  // NOLINT
+    1073744726, 2903,       1073744738, 2915,
+    1073744742, 2927,       2946,       1073744830,  // NOLINT
+    3010,       1073744838, 3016,       1073744842,
+    3021,       3031,       1073744870, 3055,  // NOLINT
+    1073744896, 3075,       1073744958, 3140,
+    1073744966, 3144,       1073744970, 3149,  // NOLINT
+    1073744981, 3158,       1073744994, 3171,
+    1073744998, 3183,       1073745025, 3203,  // NOLINT
+    3260,       1073745086, 3268,       1073745094,
+    3272,       1073745098, 3277,       1073745109,  // NOLINT
+    3286,       1073745122, 3299,       1073745126,
+    3311,       1073745153, 3331,       1073745214,  // NOLINT
+    3396,       1073745222, 3400,       1073745226,
+    3405,       3415,       1073745250, 3427,  // NOLINT
+    1073745254, 3439,       1073745282, 3459,
+    3530,       1073745359, 3540,       3542,  // NOLINT
+    1073745368, 3551,       1073745382, 3567,
+    1073745394, 3571,       3633,       1073745460,  // NOLINT
+    3642,       1073745479, 3662,       1073745488,
+    3673,       3761,       1073745588, 3769,  // NOLINT
+    1073745595, 3772,       1073745608, 3789,
+    1073745616, 3801,       1073745688, 3865,  // NOLINT
+    1073745696, 3881,       3893,       3895,
+    3897,       1073745726, 3903,       1073745777,  // NOLINT
+    3972,       1073745798, 3975,       1073745805,
+    3991,       1073745817, 4028,       4038,  // NOLINT
+    1073745963, 4158,       1073745984, 4169,
+    1073746006, 4185,       1073746014, 4192,  // NOLINT
+    1073746018, 4196,       1073746023, 4205,
+    1073746033, 4212,       1073746050, 4237,  // NOLINT
+    1073746063, 4253,       1073746781, 4959,
+    1073746793, 4977,       1073747730, 5908,  // NOLINT
+    1073747762, 5940,       1073747794, 5971,
+    1073747826, 6003,       1073747892, 6099,  // NOLINT
+    6109,       1073747936, 6121,       1073747979,
+    6157,       1073747984, 6169,       6313,  // NOLINT
+    1073748256, 6443,       1073748272, 6459,
+    1073748294, 6479,       1073748400, 6592,  // NOLINT
+    1073748424, 6601,       1073748432, 6618,
+    1073748503, 6683,       1073748565, 6750,  // NOLINT
+    1073748576, 6780,       1073748607, 6793,
+    1073748624, 6809,       1073748656, 6845,  // NOLINT
+    1073748736, 6916,       1073748788, 6980,
+    1073748816, 7001,       1073748843, 7027,  // NOLINT
+    1073748864, 7042,       1073748897, 7085,
+    1073748912, 7097,       1073748966, 7155,  // NOLINT
+    1073749028, 7223,       1073749056, 7241,
+    1073749072, 7257,       1073749200, 7378,  // NOLINT
+    1073749204, 7400,       7405,       1073749234,
+    7412,       1073749240, 7417,       1073749440,  // NOLINT
+    7669,       1073749500, 7679};                   // NOLINT
+static const uint16_t kID_ContinueTable1Size = 19;
+static const int32_t kID_ContinueTable1[19] = {
+    1073741836, 13,         1073741887, 64,
+    84,         1073742032, 220,        225,  // NOLINT
+    1073742053, 240,        1073745135, 3313,
+    3455,       1073745376, 3583,       1073745962,  // NOLINT
+    4143,       1073746073, 4250};                   // NOLINT
+static const uint16_t kID_ContinueTable5Size = 63;
+static const int32_t kID_ContinueTable5[63] = {
+    1073743392, 1577,       1647,       1073743476,
+    1661,       1695,       1073743600, 1777,  // NOLINT
+    2050,       2054,       2059,       1073743907,
+    2087,       1073744000, 2177,       1073744052,  // NOLINT
+    2244,       1073744080, 2265,       1073744096,
+    2289,       1073744128, 2313,       1073744166,  // NOLINT
+    2349,       1073744199, 2387,       1073744256,
+    2435,       1073744307, 2496,       1073744336,  // NOLINT
+    2521,       2533,       1073744368, 2553,
+    1073744425, 2614,       2627,       1073744460,  // NOLINT
+    2637,       1073744464, 2649,       1073744507,
+    2685,       2736,       1073744562, 2740,  // NOLINT
+    1073744567, 2744,       1073744574, 2751,
+    2753,       1073744619, 2799,       1073744629,  // NOLINT
+    2806,       1073744867, 3050,       1073744876,
+    3053,       1073744880, 3065};  // NOLINT
+static const uint16_t kID_ContinueTable7Size = 12;
+static const int32_t kID_ContinueTable7[12] = {
+    6942, 1073749504, 7695, 1073749536,
+    7725, 1073749555, 7732, 1073749581,  // NOLINT
+    7759, 1073749776, 7961, 7999};       // NOLINT
+bool ID_Continue::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0:
+      return LookupPredicate(kID_ContinueTable0, kID_ContinueTable0Size, c);
+    case 1:
+      return LookupPredicate(kID_ContinueTable1, kID_ContinueTable1Size, c);
+    case 5:
+      return LookupPredicate(kID_ContinueTable5, kID_ContinueTable5Size, c);
+    case 7:
+      return LookupPredicate(kID_ContinueTable7, kID_ContinueTable7Size, c);
+    default: return false;
+  }
+}
+
+
+// WhiteSpace:           (point.category == 'Zs') or ('JS_White_Space' in
+// point.properties)
+
+static const uint16_t kWhiteSpaceTable0Size = 7;
+static const int32_t kWhiteSpaceTable0[7] = {9,   1073741835, 12,  32,
+                                             160, 5760,       6158};  // NOLINT
+static const uint16_t kWhiteSpaceTable1Size = 5;
+static const int32_t kWhiteSpaceTable1[5] = {
+  1073741824, 10, 47, 95, 4096 };  // NOLINT
+static const uint16_t kWhiteSpaceTable7Size = 1;
+static const int32_t kWhiteSpaceTable7[1] = {7935};  // NOLINT
+bool WhiteSpace::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupPredicate(kWhiteSpaceTable0,
+                                       kWhiteSpaceTable0Size,
+                                       c);
+    case 1: return LookupPredicate(kWhiteSpaceTable1,
+                                       kWhiteSpaceTable1Size,
+                                       c);
+    case 7:
+      return LookupPredicate(kWhiteSpaceTable7, kWhiteSpaceTable7Size, c);
+    default: return false;
+  }
+}
+
+
+// LineTerminator:       'JS_Line_Terminator' in point.properties
+
+static const uint16_t kLineTerminatorTable0Size = 2;
+static const int32_t kLineTerminatorTable0[2] = {
+  10, 13 };  // NOLINT
+static const uint16_t kLineTerminatorTable1Size = 2;
+static const int32_t kLineTerminatorTable1[2] = {
+  1073741864, 41 };  // NOLINT
+bool LineTerminator::Is(uchar c) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupPredicate(kLineTerminatorTable0,
+                                       kLineTerminatorTable0Size,
+                                       c);
+    case 1: return LookupPredicate(kLineTerminatorTable1,
+                                       kLineTerminatorTable1Size,
+                                       c);
+    default: return false;
+  }
+}
+
+static const MultiCharacterSpecialCase<2> kToLowercaseMultiStrings0[2] = {  // NOLINT
+  {{105, 775}}, {{kSentinel}} }; // NOLINT
+static const uint16_t kToLowercaseTable0Size = 488;  // NOLINT
+static const int32_t kToLowercaseTable0[976] = {
+    1073741889, 128,    90,         128,   1073742016, 128,
+    214,        128,    1073742040, 128,   222,        128,
+    256,        4,      258,        4,  // NOLINT
+    260,        4,      262,        4,     264,        4,
+    266,        4,      268,        4,     270,        4,
+    272,        4,      274,        4,  // NOLINT
+    276,        4,      278,        4,     280,        4,
+    282,        4,      284,        4,     286,        4,
+    288,        4,      290,        4,  // NOLINT
+    292,        4,      294,        4,     296,        4,
+    298,        4,      300,        4,     302,        4,
+    304,        1,      306,        4,  // NOLINT
+    308,        4,      310,        4,     313,        4,
+    315,        4,      317,        4,     319,        4,
+    321,        4,      323,        4,  // NOLINT
+    325,        4,      327,        4,     330,        4,
+    332,        4,      334,        4,     336,        4,
+    338,        4,      340,        4,  // NOLINT
+    342,        4,      344,        4,     346,        4,
+    348,        4,      350,        4,     352,        4,
+    354,        4,      356,        4,  // NOLINT
+    358,        4,      360,        4,     362,        4,
+    364,        4,      366,        4,     368,        4,
+    370,        4,      372,        4,  // NOLINT
+    374,        4,      376,        -484,  377,        4,
+    379,        4,      381,        4,     385,        840,
+    386,        4,      388,        4,  // NOLINT
+    390,        824,    391,        4,     1073742217, 820,
+    394,        820,    395,        4,     398,        316,
+    399,        808,    400,        812,  // NOLINT
+    401,        4,      403,        820,   404,        828,
+    406,        844,    407,        836,   408,        4,
+    412,        844,    413,        852,  // NOLINT
+    415,        856,    416,        4,     418,        4,
+    420,        4,      422,        872,   423,        4,
+    425,        872,    428,        4,  // NOLINT
+    430,        872,    431,        4,     1073742257, 868,
+    434,        868,    435,        4,     437,        4,
+    439,        876,    440,        4,  // NOLINT
+    444,        4,      452,        8,     453,        4,
+    455,        8,      456,        4,     458,        8,
+    459,        4,      461,        4,  // NOLINT
+    463,        4,      465,        4,     467,        4,
+    469,        4,      471,        4,     473,        4,
+    475,        4,      478,        4,  // NOLINT
+    480,        4,      482,        4,     484,        4,
+    486,        4,      488,        4,     490,        4,
+    492,        4,      494,        4,  // NOLINT
+    497,        8,      498,        4,     500,        4,
+    502,        -388,   503,        -224,  504,        4,
+    506,        4,      508,        4,  // NOLINT
+    510,        4,      512,        4,     514,        4,
+    516,        4,      518,        4,     520,        4,
+    522,        4,      524,        4,  // NOLINT
+    526,        4,      528,        4,     530,        4,
+    532,        4,      534,        4,     536,        4,
+    538,        4,      540,        4,  // NOLINT
+    542,        4,      544,        -520,  546,        4,
+    548,        4,      550,        4,     552,        4,
+    554,        4,      556,        4,  // NOLINT
+    558,        4,      560,        4,     562,        4,
+    570,        43180,  571,        4,     573,        -652,
+    574,        43168,  577,        4,  // NOLINT
+    579,        -780,   580,        276,   581,        284,
+    582,        4,      584,        4,     586,        4,
+    588,        4,      590,        4,  // NOLINT
+    880,        4,      882,        4,     886,        4,
+    895,        464,    902,        152,   1073742728, 148,
+    906,        148,    908,        256,  // NOLINT
+    1073742734, 252,    911,        252,   1073742737, 128,
+    929,        128,    931,        6,     1073742756, 128,
+    939,        128,    975,        32,  // NOLINT
+    984,        4,      986,        4,     988,        4,
+    990,        4,      992,        4,     994,        4,
+    996,        4,      998,        4,  // NOLINT
+    1000,       4,      1002,       4,     1004,       4,
+    1006,       4,      1012,       -240,  1015,       4,
+    1017,       -28,    1018,       4,  // NOLINT
+    1073742845, -520,   1023,       -520,  1073742848, 320,
+    1039,       320,    1073742864, 128,   1071,       128,
+    1120,       4,      1122,       4,  // NOLINT
+    1124,       4,      1126,       4,     1128,       4,
+    1130,       4,      1132,       4,     1134,       4,
+    1136,       4,      1138,       4,  // NOLINT
+    1140,       4,      1142,       4,     1144,       4,
+    1146,       4,      1148,       4,     1150,       4,
+    1152,       4,      1162,       4,  // NOLINT
+    1164,       4,      1166,       4,     1168,       4,
+    1170,       4,      1172,       4,     1174,       4,
+    1176,       4,      1178,       4,  // NOLINT
+    1180,       4,      1182,       4,     1184,       4,
+    1186,       4,      1188,       4,     1190,       4,
+    1192,       4,      1194,       4,  // NOLINT
+    1196,       4,      1198,       4,     1200,       4,
+    1202,       4,      1204,       4,     1206,       4,
+    1208,       4,      1210,       4,  // NOLINT
+    1212,       4,      1214,       4,     1216,       60,
+    1217,       4,      1219,       4,     1221,       4,
+    1223,       4,      1225,       4,  // NOLINT
+    1227,       4,      1229,       4,     1232,       4,
+    1234,       4,      1236,       4,     1238,       4,
+    1240,       4,      1242,       4,  // NOLINT
+    1244,       4,      1246,       4,     1248,       4,
+    1250,       4,      1252,       4,     1254,       4,
+    1256,       4,      1258,       4,  // NOLINT
+    1260,       4,      1262,       4,     1264,       4,
+    1266,       4,      1268,       4,     1270,       4,
+    1272,       4,      1274,       4,  // NOLINT
+    1276,       4,      1278,       4,     1280,       4,
+    1282,       4,      1284,       4,     1286,       4,
+    1288,       4,      1290,       4,  // NOLINT
+    1292,       4,      1294,       4,     1296,       4,
+    1298,       4,      1300,       4,     1302,       4,
+    1304,       4,      1306,       4,  // NOLINT
+    1308,       4,      1310,       4,     1312,       4,
+    1314,       4,      1316,       4,     1318,       4,
+    1320,       4,      1322,       4,  // NOLINT
+    1324,       4,      1326,       4,     1073743153, 192,
+    1366,       192,    1073746080, 29056, 4293,       29056,
+    4295,       29056,  4301,       29056,  // NOLINT
+    7680,       4,      7682,       4,     7684,       4,
+    7686,       4,      7688,       4,     7690,       4,
+    7692,       4,      7694,       4,  // NOLINT
+    7696,       4,      7698,       4,     7700,       4,
+    7702,       4,      7704,       4,     7706,       4,
+    7708,       4,      7710,       4,  // NOLINT
+    7712,       4,      7714,       4,     7716,       4,
+    7718,       4,      7720,       4,     7722,       4,
+    7724,       4,      7726,       4,  // NOLINT
+    7728,       4,      7730,       4,     7732,       4,
+    7734,       4,      7736,       4,     7738,       4,
+    7740,       4,      7742,       4,  // NOLINT
+    7744,       4,      7746,       4,     7748,       4,
+    7750,       4,      7752,       4,     7754,       4,
+    7756,       4,      7758,       4,  // NOLINT
+    7760,       4,      7762,       4,     7764,       4,
+    7766,       4,      7768,       4,     7770,       4,
+    7772,       4,      7774,       4,  // NOLINT
+    7776,       4,      7778,       4,     7780,       4,
+    7782,       4,      7784,       4,     7786,       4,
+    7788,       4,      7790,       4,  // NOLINT
+    7792,       4,      7794,       4,     7796,       4,
+    7798,       4,      7800,       4,     7802,       4,
+    7804,       4,      7806,       4,  // NOLINT
+    7808,       4,      7810,       4,     7812,       4,
+    7814,       4,      7816,       4,     7818,       4,
+    7820,       4,      7822,       4,  // NOLINT
+    7824,       4,      7826,       4,     7828,       4,
+    7838,       -30460, 7840,       4,     7842,       4,
+    7844,       4,      7846,       4,  // NOLINT
+    7848,       4,      7850,       4,     7852,       4,
+    7854,       4,      7856,       4,     7858,       4,
+    7860,       4,      7862,       4,  // NOLINT
+    7864,       4,      7866,       4,     7868,       4,
+    7870,       4,      7872,       4,     7874,       4,
+    7876,       4,      7878,       4,  // NOLINT
+    7880,       4,      7882,       4,     7884,       4,
+    7886,       4,      7888,       4,     7890,       4,
+    7892,       4,      7894,       4,  // NOLINT
+    7896,       4,      7898,       4,     7900,       4,
+    7902,       4,      7904,       4,     7906,       4,
+    7908,       4,      7910,       4,  // NOLINT
+    7912,       4,      7914,       4,     7916,       4,
+    7918,       4,      7920,       4,     7922,       4,
+    7924,       4,      7926,       4,  // NOLINT
+    7928,       4,      7930,       4,     7932,       4,
+    7934,       4,      1073749768, -32,   7951,       -32,
+    1073749784, -32,    7965,       -32,  // NOLINT
+    1073749800, -32,    7983,       -32,   1073749816, -32,
+    7999,       -32,    1073749832, -32,   8013,       -32,
+    8025,       -32,    8027,       -32,  // NOLINT
+    8029,       -32,    8031,       -32,   1073749864, -32,
+    8047,       -32,    1073749896, -32,   8079,       -32,
+    1073749912, -32,    8095,       -32,  // NOLINT
+    1073749928, -32,    8111,       -32,   1073749944, -32,
+    8121,       -32,    1073749946, -296,  8123,       -296,
+    8124,       -36,    1073749960, -344,  // NOLINT
+    8139,       -344,   8140,       -36,   1073749976, -32,
+    8153,       -32,    1073749978, -400,  8155,       -400,
+    1073749992, -32,    8169,       -32,  // NOLINT
+    1073749994, -448,   8171,       -448,  8172,       -28,
+    1073750008, -512,   8185,       -512,  1073750010, -504,
+    8187,       -504,   8188,       -36};                 // NOLINT
+static const uint16_t kToLowercaseMultiStrings0Size = 2;  // NOLINT
+static const MultiCharacterSpecialCase<1> kToLowercaseMultiStrings1[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kToLowercaseTable1Size = 79;  // NOLINT
+static const int32_t kToLowercaseTable1[158] = {
+  294, -30068, 298, -33532, 299, -33048, 306, 112, 1073742176, 64, 367, 64, 387, 4, 1073743030, 104,  // NOLINT
+  1231, 104, 1073744896, 192, 3118, 192, 3168, 4, 3170, -42972, 3171, -15256, 3172, -42908, 3175, 4,  // NOLINT
+  3177, 4, 3179, 4, 3181, -43120, 3182, -42996, 3183, -43132, 3184, -43128, 3186, 4, 3189, 4,  // NOLINT
+  1073745022, -43260, 3199, -43260, 3200, 4, 3202, 4, 3204, 4, 3206, 4, 3208, 4, 3210, 4,  // NOLINT
+  3212, 4, 3214, 4, 3216, 4, 3218, 4, 3220, 4, 3222, 4, 3224, 4, 3226, 4,  // NOLINT
+  3228, 4, 3230, 4, 3232, 4, 3234, 4, 3236, 4, 3238, 4, 3240, 4, 3242, 4,  // NOLINT
+  3244, 4, 3246, 4, 3248, 4, 3250, 4, 3252, 4, 3254, 4, 3256, 4, 3258, 4,  // NOLINT
+  3260, 4, 3262, 4, 3264, 4, 3266, 4, 3268, 4, 3270, 4, 3272, 4, 3274, 4,  // NOLINT
+  3276, 4, 3278, 4, 3280, 4, 3282, 4, 3284, 4, 3286, 4, 3288, 4, 3290, 4,  // NOLINT
+  3292, 4, 3294, 4, 3296, 4, 3298, 4, 3307, 4, 3309, 4, 3314, 4 };  // NOLINT
+static const uint16_t kToLowercaseMultiStrings1Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kToLowercaseMultiStrings5[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kToLowercaseTable5Size = 103;  // NOLINT
+static const int32_t kToLowercaseTable5[206] = {
+    1600, 4,       1602, 4,       1604, 4,       1606, 4,
+    1608, 4,       1610, 4,       1612, 4,       1614, 4,  // NOLINT
+    1616, 4,       1618, 4,       1620, 4,       1622, 4,
+    1624, 4,       1626, 4,       1628, 4,       1630, 4,  // NOLINT
+    1632, 4,       1634, 4,       1636, 4,       1638, 4,
+    1640, 4,       1642, 4,       1644, 4,       1664, 4,  // NOLINT
+    1666, 4,       1668, 4,       1670, 4,       1672, 4,
+    1674, 4,       1676, 4,       1678, 4,       1680, 4,  // NOLINT
+    1682, 4,       1684, 4,       1686, 4,       1688, 4,
+    1690, 4,       1826, 4,       1828, 4,       1830, 4,  // NOLINT
+    1832, 4,       1834, 4,       1836, 4,       1838, 4,
+    1842, 4,       1844, 4,       1846, 4,       1848, 4,  // NOLINT
+    1850, 4,       1852, 4,       1854, 4,       1856, 4,
+    1858, 4,       1860, 4,       1862, 4,       1864, 4,  // NOLINT
+    1866, 4,       1868, 4,       1870, 4,       1872, 4,
+    1874, 4,       1876, 4,       1878, 4,       1880, 4,  // NOLINT
+    1882, 4,       1884, 4,       1886, 4,       1888, 4,
+    1890, 4,       1892, 4,       1894, 4,       1896, 4,  // NOLINT
+    1898, 4,       1900, 4,       1902, 4,       1913, 4,
+    1915, 4,       1917, -141328, 1918, 4,       1920, 4,  // NOLINT
+    1922, 4,       1924, 4,       1926, 4,       1931, 4,
+    1933, -169120, 1936, 4,       1938, 4,       1942, 4,  // NOLINT
+    1944, 4,       1946, 4,       1948, 4,       1950, 4,
+    1952, 4,       1954, 4,       1956, 4,       1958, 4,  // NOLINT
+    1960, 4,       1962, -169232, 1963, -169276, 1964, -169260,
+    1965, -169220, 1968, -169032, 1969, -169128};         // NOLINT
+static const uint16_t kToLowercaseMultiStrings5Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kToLowercaseMultiStrings7[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kToLowercaseTable7Size = 2;  // NOLINT
+static const int32_t kToLowercaseTable7[4] = {
+  1073749793, 128, 7994, 128 };  // NOLINT
+static const uint16_t kToLowercaseMultiStrings7Size = 1;  // NOLINT
+int ToLowercase::Convert(uchar c,
+                      uchar n,
+                      uchar* result,
+                      bool* allow_caching_ptr) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupMapping<true>(kToLowercaseTable0,
+                                           kToLowercaseTable0Size,
+                                           kToLowercaseMultiStrings0,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 1: return LookupMapping<true>(kToLowercaseTable1,
+                                           kToLowercaseTable1Size,
+                                           kToLowercaseMultiStrings1,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 5: return LookupMapping<true>(kToLowercaseTable5,
+                                           kToLowercaseTable5Size,
+                                           kToLowercaseMultiStrings5,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 7: return LookupMapping<true>(kToLowercaseTable7,
+                                           kToLowercaseTable7Size,
+                                           kToLowercaseMultiStrings7,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    default: return 0;
+  }
+}
+
+static const MultiCharacterSpecialCase<3> kToUppercaseMultiStrings0[62] = {  // NOLINT
+  {{83, 83, kSentinel}}, {{700, 78, kSentinel}}, {{74, 780, kSentinel}}, {{921, 776, 769}},  // NOLINT
+  {{933, 776, 769}}, {{1333, 1362, kSentinel}}, {{72, 817, kSentinel}}, {{84, 776, kSentinel}},  // NOLINT
+  {{87, 778, kSentinel}}, {{89, 778, kSentinel}}, {{65, 702, kSentinel}}, {{933, 787, kSentinel}},  // NOLINT
+  {{933, 787, 768}}, {{933, 787, 769}}, {{933, 787, 834}}, {{7944, 921, kSentinel}},  // NOLINT
+  {{7945, 921, kSentinel}}, {{7946, 921, kSentinel}}, {{7947, 921, kSentinel}}, {{7948, 921, kSentinel}},  // NOLINT
+  {{7949, 921, kSentinel}}, {{7950, 921, kSentinel}}, {{7951, 921, kSentinel}}, {{7976, 921, kSentinel}},  // NOLINT
+  {{7977, 921, kSentinel}}, {{7978, 921, kSentinel}}, {{7979, 921, kSentinel}}, {{7980, 921, kSentinel}},  // NOLINT
+  {{7981, 921, kSentinel}}, {{7982, 921, kSentinel}}, {{7983, 921, kSentinel}}, {{8040, 921, kSentinel}},  // NOLINT
+  {{8041, 921, kSentinel}}, {{8042, 921, kSentinel}}, {{8043, 921, kSentinel}}, {{8044, 921, kSentinel}},  // NOLINT
+  {{8045, 921, kSentinel}}, {{8046, 921, kSentinel}}, {{8047, 921, kSentinel}}, {{8122, 921, kSentinel}},  // NOLINT
+  {{913, 921, kSentinel}}, {{902, 921, kSentinel}}, {{913, 834, kSentinel}}, {{913, 834, 921}},  // NOLINT
+  {{8138, 921, kSentinel}}, {{919, 921, kSentinel}}, {{905, 921, kSentinel}}, {{919, 834, kSentinel}},  // NOLINT
+  {{919, 834, 921}}, {{921, 776, 768}}, {{921, 834, kSentinel}}, {{921, 776, 834}},  // NOLINT
+  {{933, 776, 768}}, {{929, 787, kSentinel}}, {{933, 834, kSentinel}}, {{933, 776, 834}},  // NOLINT
+  {{8186, 921, kSentinel}}, {{937, 921, kSentinel}}, {{911, 921, kSentinel}}, {{937, 834, kSentinel}},  // NOLINT
+  {{937, 834, 921}}, {{kSentinel}} }; // NOLINT
+static const uint16_t kToUppercaseTable0Size = 590;  // NOLINT
+static const int32_t kToUppercaseTable0[1180] = {
+    1073741921, -128,   122,        -128,   181,        2972,
+    223,        1,      1073742048, -128,   246,        -128,
+    1073742072, -128,   254,        -128,  // NOLINT
+    255,        484,    257,        -4,     259,        -4,
+    261,        -4,     263,        -4,     265,        -4,
+    267,        -4,     269,        -4,  // NOLINT
+    271,        -4,     273,        -4,     275,        -4,
+    277,        -4,     279,        -4,     281,        -4,
+    283,        -4,     285,        -4,  // NOLINT
+    287,        -4,     289,        -4,     291,        -4,
+    293,        -4,     295,        -4,     297,        -4,
+    299,        -4,     301,        -4,  // NOLINT
+    303,        -4,     305,        -928,   307,        -4,
+    309,        -4,     311,        -4,     314,        -4,
+    316,        -4,     318,        -4,  // NOLINT
+    320,        -4,     322,        -4,     324,        -4,
+    326,        -4,     328,        -4,     329,        5,
+    331,        -4,     333,        -4,  // NOLINT
+    335,        -4,     337,        -4,     339,        -4,
+    341,        -4,     343,        -4,     345,        -4,
+    347,        -4,     349,        -4,  // NOLINT
+    351,        -4,     353,        -4,     355,        -4,
+    357,        -4,     359,        -4,     361,        -4,
+    363,        -4,     365,        -4,  // NOLINT
+    367,        -4,     369,        -4,     371,        -4,
+    373,        -4,     375,        -4,     378,        -4,
+    380,        -4,     382,        -4,  // NOLINT
+    383,        -1200,  384,        780,    387,        -4,
+    389,        -4,     392,        -4,     396,        -4,
+    402,        -4,     405,        388,  // NOLINT
+    409,        -4,     410,        652,    414,        520,
+    417,        -4,     419,        -4,     421,        -4,
+    424,        -4,     429,        -4,  // NOLINT
+    432,        -4,     436,        -4,     438,        -4,
+    441,        -4,     445,        -4,     447,        224,
+    453,        -4,     454,        -8,  // NOLINT
+    456,        -4,     457,        -8,     459,        -4,
+    460,        -8,     462,        -4,     464,        -4,
+    466,        -4,     468,        -4,  // NOLINT
+    470,        -4,     472,        -4,     474,        -4,
+    476,        -4,     477,        -316,   479,        -4,
+    481,        -4,     483,        -4,  // NOLINT
+    485,        -4,     487,        -4,     489,        -4,
+    491,        -4,     493,        -4,     495,        -4,
+    496,        9,      498,        -4,  // NOLINT
+    499,        -8,     501,        -4,     505,        -4,
+    507,        -4,     509,        -4,     511,        -4,
+    513,        -4,     515,        -4,  // NOLINT
+    517,        -4,     519,        -4,     521,        -4,
+    523,        -4,     525,        -4,     527,        -4,
+    529,        -4,     531,        -4,  // NOLINT
+    533,        -4,     535,        -4,     537,        -4,
+    539,        -4,     541,        -4,     543,        -4,
+    547,        -4,     549,        -4,  // NOLINT
+    551,        -4,     553,        -4,     555,        -4,
+    557,        -4,     559,        -4,     561,        -4,
+    563,        -4,     572,        -4,  // NOLINT
+    1073742399, 43260,  576,        43260,  578,        -4,
+    583,        -4,     585,        -4,     587,        -4,
+    589,        -4,     591,        -4,  // NOLINT
+    592,        43132,  593,        43120,  594,        43128,
+    595,        -840,   596,        -824,   1073742422, -820,
+    599,        -820,   601,        -808,  // NOLINT
+    603,        -812,   604,        169276, 608,        -820,
+    609,        169260, 611,        -828,   613,        169120,
+    614,        169232, 616,        -836,  // NOLINT
+    617,        -844,   619,        42972,  620,        169220,
+    623,        -844,   625,        42996,  626,        -852,
+    629,        -856,   637,        42908,  // NOLINT
+    640,        -872,   643,        -872,   647,        169128,
+    648,        -872,   649,        -276,   1073742474, -868,
+    651,        -868,   652,        -284,  // NOLINT
+    658,        -876,   670,        169032, 837,        336,
+    881,        -4,     883,        -4,     887,        -4,
+    1073742715, 520,    893,        520,  // NOLINT
+    912,        13,     940,        -152,   1073742765, -148,
+    943,        -148,   944,        17,     1073742769, -128,
+    961,        -128,   962,        -124,  // NOLINT
+    1073742787, -128,   971,        -128,   972,        -256,
+    1073742797, -252,   974,        -252,   976,        -248,
+    977,        -228,   981,        -188,  // NOLINT
+    982,        -216,   983,        -32,    985,        -4,
+    987,        -4,     989,        -4,     991,        -4,
+    993,        -4,     995,        -4,  // NOLINT
+    997,        -4,     999,        -4,     1001,       -4,
+    1003,       -4,     1005,       -4,     1007,       -4,
+    1008,       -344,   1009,       -320,  // NOLINT
+    1010,       28,     1011,       -464,   1013,       -384,
+    1016,       -4,     1019,       -4,     1073742896, -128,
+    1103,       -128,   1073742928, -320,  // NOLINT
+    1119,       -320,   1121,       -4,     1123,       -4,
+    1125,       -4,     1127,       -4,     1129,       -4,
+    1131,       -4,     1133,       -4,  // NOLINT
+    1135,       -4,     1137,       -4,     1139,       -4,
+    1141,       -4,     1143,       -4,     1145,       -4,
+    1147,       -4,     1149,       -4,  // NOLINT
+    1151,       -4,     1153,       -4,     1163,       -4,
+    1165,       -4,     1167,       -4,     1169,       -4,
+    1171,       -4,     1173,       -4,  // NOLINT
+    1175,       -4,     1177,       -4,     1179,       -4,
+    1181,       -4,     1183,       -4,     1185,       -4,
+    1187,       -4,     1189,       -4,  // NOLINT
+    1191,       -4,     1193,       -4,     1195,       -4,
+    1197,       -4,     1199,       -4,     1201,       -4,
+    1203,       -4,     1205,       -4,  // NOLINT
+    1207,       -4,     1209,       -4,     1211,       -4,
+    1213,       -4,     1215,       -4,     1218,       -4,
+    1220,       -4,     1222,       -4,  // NOLINT
+    1224,       -4,     1226,       -4,     1228,       -4,
+    1230,       -4,     1231,       -60,    1233,       -4,
+    1235,       -4,     1237,       -4,  // NOLINT
+    1239,       -4,     1241,       -4,     1243,       -4,
+    1245,       -4,     1247,       -4,     1249,       -4,
+    1251,       -4,     1253,       -4,  // NOLINT
+    1255,       -4,     1257,       -4,     1259,       -4,
+    1261,       -4,     1263,       -4,     1265,       -4,
+    1267,       -4,     1269,       -4,  // NOLINT
+    1271,       -4,     1273,       -4,     1275,       -4,
+    1277,       -4,     1279,       -4,     1281,       -4,
+    1283,       -4,     1285,       -4,  // NOLINT
+    1287,       -4,     1289,       -4,     1291,       -4,
+    1293,       -4,     1295,       -4,     1297,       -4,
+    1299,       -4,     1301,       -4,  // NOLINT
+    1303,       -4,     1305,       -4,     1307,       -4,
+    1309,       -4,     1311,       -4,     1313,       -4,
+    1315,       -4,     1317,       -4,  // NOLINT
+    1319,       -4,     1321,       -4,     1323,       -4,
+    1325,       -4,     1327,       -4,     1073743201, -192,
+    1414,       -192,   1415,       21,  // NOLINT
+    7545,       141328, 7549,       15256,  7681,       -4,
+    7683,       -4,     7685,       -4,     7687,       -4,
+    7689,       -4,     7691,       -4,  // NOLINT
+    7693,       -4,     7695,       -4,     7697,       -4,
+    7699,       -4,     7701,       -4,     7703,       -4,
+    7705,       -4,     7707,       -4,  // NOLINT
+    7709,       -4,     7711,       -4,     7713,       -4,
+    7715,       -4,     7717,       -4,     7719,       -4,
+    7721,       -4,     7723,       -4,  // NOLINT
+    7725,       -4,     7727,       -4,     7729,       -4,
+    7731,       -4,     7733,       -4,     7735,       -4,
+    7737,       -4,     7739,       -4,  // NOLINT
+    7741,       -4,     7743,       -4,     7745,       -4,
+    7747,       -4,     7749,       -4,     7751,       -4,
+    7753,       -4,     7755,       -4,  // NOLINT
+    7757,       -4,     7759,       -4,     7761,       -4,
+    7763,       -4,     7765,       -4,     7767,       -4,
+    7769,       -4,     7771,       -4,  // NOLINT
+    7773,       -4,     7775,       -4,     7777,       -4,
+    7779,       -4,     7781,       -4,     7783,       -4,
+    7785,       -4,     7787,       -4,  // NOLINT
+    7789,       -4,     7791,       -4,     7793,       -4,
+    7795,       -4,     7797,       -4,     7799,       -4,
+    7801,       -4,     7803,       -4,  // NOLINT
+    7805,       -4,     7807,       -4,     7809,       -4,
+    7811,       -4,     7813,       -4,     7815,       -4,
+    7817,       -4,     7819,       -4,  // NOLINT
+    7821,       -4,     7823,       -4,     7825,       -4,
+    7827,       -4,     7829,       -4,     7830,       25,
+    7831,       29,     7832,       33,  // NOLINT
+    7833,       37,     7834,       41,     7835,       -236,
+    7841,       -4,     7843,       -4,     7845,       -4,
+    7847,       -4,     7849,       -4,  // NOLINT
+    7851,       -4,     7853,       -4,     7855,       -4,
+    7857,       -4,     7859,       -4,     7861,       -4,
+    7863,       -4,     7865,       -4,  // NOLINT
+    7867,       -4,     7869,       -4,     7871,       -4,
+    7873,       -4,     7875,       -4,     7877,       -4,
+    7879,       -4,     7881,       -4,  // NOLINT
+    7883,       -4,     7885,       -4,     7887,       -4,
+    7889,       -4,     7891,       -4,     7893,       -4,
+    7895,       -4,     7897,       -4,  // NOLINT
+    7899,       -4,     7901,       -4,     7903,       -4,
+    7905,       -4,     7907,       -4,     7909,       -4,
+    7911,       -4,     7913,       -4,  // NOLINT
+    7915,       -4,     7917,       -4,     7919,       -4,
+    7921,       -4,     7923,       -4,     7925,       -4,
+    7927,       -4,     7929,       -4,  // NOLINT
+    7931,       -4,     7933,       -4,     7935,       -4,
+    1073749760, 32,     7943,       32,     1073749776, 32,
+    7957,       32,     1073749792, 32,  // NOLINT
+    7975,       32,     1073749808, 32,     7991,       32,
+    1073749824, 32,     8005,       32,     8016,       45,
+    8017,       32,     8018,       49,  // NOLINT
+    8019,       32,     8020,       53,     8021,       32,
+    8022,       57,     8023,       32,     1073749856, 32,
+    8039,       32,     1073749872, 296,  // NOLINT
+    8049,       296,    1073749874, 344,    8053,       344,
+    1073749878, 400,    8055,       400,    1073749880, 512,
+    8057,       512,    1073749882, 448,  // NOLINT
+    8059,       448,    1073749884, 504,    8061,       504,
+    8064,       61,     8065,       65,     8066,       69,
+    8067,       73,     8068,       77,  // NOLINT
+    8069,       81,     8070,       85,     8071,       89,
+    8072,       61,     8073,       65,     8074,       69,
+    8075,       73,     8076,       77,  // NOLINT
+    8077,       81,     8078,       85,     8079,       89,
+    8080,       93,     8081,       97,     8082,       101,
+    8083,       105,    8084,       109,  // NOLINT
+    8085,       113,    8086,       117,    8087,       121,
+    8088,       93,     8089,       97,     8090,       101,
+    8091,       105,    8092,       109,  // NOLINT
+    8093,       113,    8094,       117,    8095,       121,
+    8096,       125,    8097,       129,    8098,       133,
+    8099,       137,    8100,       141,  // NOLINT
+    8101,       145,    8102,       149,    8103,       153,
+    8104,       125,    8105,       129,    8106,       133,
+    8107,       137,    8108,       141,  // NOLINT
+    8109,       145,    8110,       149,    8111,       153,
+    1073749936, 32,     8113,       32,     8114,       157,
+    8115,       161,    8116,       165,  // NOLINT
+    8118,       169,    8119,       173,    8124,       161,
+    8126,       -28820, 8130,       177,    8131,       181,
+    8132,       185,    8134,       189,  // NOLINT
+    8135,       193,    8140,       181,    1073749968, 32,
+    8145,       32,     8146,       197,    8147,       13,
+    8150,       201,    8151,       205,  // NOLINT
+    1073749984, 32,     8161,       32,     8162,       209,
+    8163,       17,     8164,       213,    8165,       28,
+    8166,       217,    8167,       221,  // NOLINT
+    8178,       225,    8179,       229,    8180,       233,
+    8182,       237,    8183,       241,    8188,       229};  // NOLINT
+static const uint16_t kToUppercaseMultiStrings0Size = 62;  // NOLINT
+static const MultiCharacterSpecialCase<1> kToUppercaseMultiStrings1[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kToUppercaseTable1Size = 73;  // NOLINT
+static const int32_t kToUppercaseTable1[146] = {
+  334, -112, 1073742192, -64, 383, -64, 388, -4, 1073743056, -104, 1257, -104, 1073744944, -192, 3166, -192,  // NOLINT
+  3169, -4, 3173, -43180, 3174, -43168, 3176, -4, 3178, -4, 3180, -4, 3187, -4, 3190, -4,  // NOLINT
+  3201, -4, 3203, -4, 3205, -4, 3207, -4, 3209, -4, 3211, -4, 3213, -4, 3215, -4,  // NOLINT
+  3217, -4, 3219, -4, 3221, -4, 3223, -4, 3225, -4, 3227, -4, 3229, -4, 3231, -4,  // NOLINT
+  3233, -4, 3235, -4, 3237, -4, 3239, -4, 3241, -4, 3243, -4, 3245, -4, 3247, -4,  // NOLINT
+  3249, -4, 3251, -4, 3253, -4, 3255, -4, 3257, -4, 3259, -4, 3261, -4, 3263, -4,  // NOLINT
+  3265, -4, 3267, -4, 3269, -4, 3271, -4, 3273, -4, 3275, -4, 3277, -4, 3279, -4,  // NOLINT
+  3281, -4, 3283, -4, 3285, -4, 3287, -4, 3289, -4, 3291, -4, 3293, -4, 3295, -4,  // NOLINT
+  3297, -4, 3299, -4, 3308, -4, 3310, -4, 3315, -4, 1073745152, -29056, 3365, -29056, 3367, -29056,  // NOLINT
+  3373, -29056 };  // NOLINT
+static const uint16_t kToUppercaseMultiStrings1Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kToUppercaseMultiStrings5[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kToUppercaseTable5Size = 95;  // NOLINT
+static const int32_t
+    kToUppercaseTable5[190] = {1601, -4, 1603, -4, 1605, -4, 1607, -4, 1609, -4,
+                               1611, -4, 1613, -4, 1615, -4,  // NOLINT
+                               1617, -4, 1619, -4, 1621, -4, 1623, -4, 1625, -4,
+                               1627, -4, 1629, -4, 1631, -4,  // NOLINT
+                               1633, -4, 1635, -4, 1637, -4, 1639, -4, 1641, -4,
+                               1643, -4, 1645, -4, 1665, -4,  // NOLINT
+                               1667, -4, 1669, -4, 1671, -4, 1673, -4, 1675, -4,
+                               1677, -4, 1679, -4, 1681, -4,  // NOLINT
+                               1683, -4, 1685, -4, 1687, -4, 1689, -4, 1691, -4,
+                               1827, -4, 1829, -4, 1831, -4,  // NOLINT
+                               1833, -4, 1835, -4, 1837, -4, 1839, -4, 1843, -4,
+                               1845, -4, 1847, -4, 1849, -4,  // NOLINT
+                               1851, -4, 1853, -4, 1855, -4, 1857, -4, 1859, -4,
+                               1861, -4, 1863, -4, 1865, -4,  // NOLINT
+                               1867, -4, 1869, -4, 1871, -4, 1873, -4, 1875, -4,
+                               1877, -4, 1879, -4, 1881, -4,  // NOLINT
+                               1883, -4, 1885, -4, 1887, -4, 1889, -4, 1891, -4,
+                               1893, -4, 1895, -4, 1897, -4,  // NOLINT
+                               1899, -4, 1901, -4, 1903, -4, 1914, -4, 1916, -4,
+                               1919, -4, 1921, -4, 1923, -4,  // NOLINT
+                               1925, -4, 1927, -4, 1932, -4, 1937, -4, 1939, -4,
+                               1943, -4, 1945, -4, 1947, -4,  // NOLINT
+                               1949, -4, 1951, -4, 1953, -4, 1955, -4, 1957, -4,
+                               1959, -4, 1961, -4};       // NOLINT
+static const uint16_t kToUppercaseMultiStrings5Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<3> kToUppercaseMultiStrings7[12] = {  // NOLINT
+  {{70, 70, kSentinel}}, {{70, 73, kSentinel}}, {{70, 76, kSentinel}}, {{70, 70, 73}},  // NOLINT
+  {{70, 70, 76}}, {{83, 84, kSentinel}}, {{1348, 1350, kSentinel}}, {{1348, 1333, kSentinel}},  // NOLINT
+  {{1348, 1339, kSentinel}}, {{1358, 1350, kSentinel}}, {{1348, 1341, kSentinel}}, {{kSentinel}} }; // NOLINT
+static const uint16_t kToUppercaseTable7Size = 14;  // NOLINT
+static const int32_t kToUppercaseTable7[28] = {
+  6912, 1, 6913, 5, 6914, 9, 6915, 13, 6916, 17, 6917, 21, 6918, 21, 6931, 25,  // NOLINT
+  6932, 29, 6933, 33, 6934, 37, 6935, 41, 1073749825, -128, 8026, -128 };  // NOLINT
+static const uint16_t kToUppercaseMultiStrings7Size = 12;  // NOLINT
+int ToUppercase::Convert(uchar c,
+                      uchar n,
+                      uchar* result,
+                      bool* allow_caching_ptr) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupMapping<true>(kToUppercaseTable0,
+                                           kToUppercaseTable0Size,
+                                           kToUppercaseMultiStrings0,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 1: return LookupMapping<true>(kToUppercaseTable1,
+                                           kToUppercaseTable1Size,
+                                           kToUppercaseMultiStrings1,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 5: return LookupMapping<true>(kToUppercaseTable5,
+                                           kToUppercaseTable5Size,
+                                           kToUppercaseMultiStrings5,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 7: return LookupMapping<true>(kToUppercaseTable7,
+                                           kToUppercaseTable7Size,
+                                           kToUppercaseMultiStrings7,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    default: return 0;
+  }
+}
+
+static const MultiCharacterSpecialCase<1> kEcma262CanonicalizeMultiStrings0[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262CanonicalizeTable0Size = 498;  // NOLINT
+static const int32_t kEcma262CanonicalizeTable0[996] = {
+    1073741921, -128,   122,        -128,   181,        2972,
+    1073742048, -128,   246,        -128,   1073742072, -128,
+    254,        -128,   255,        484,  // NOLINT
+    257,        -4,     259,        -4,     261,        -4,
+    263,        -4,     265,        -4,     267,        -4,
+    269,        -4,     271,        -4,  // NOLINT
+    273,        -4,     275,        -4,     277,        -4,
+    279,        -4,     281,        -4,     283,        -4,
+    285,        -4,     287,        -4,  // NOLINT
+    289,        -4,     291,        -4,     293,        -4,
+    295,        -4,     297,        -4,     299,        -4,
+    301,        -4,     303,        -4,  // NOLINT
+    307,        -4,     309,        -4,     311,        -4,
+    314,        -4,     316,        -4,     318,        -4,
+    320,        -4,     322,        -4,  // NOLINT
+    324,        -4,     326,        -4,     328,        -4,
+    331,        -4,     333,        -4,     335,        -4,
+    337,        -4,     339,        -4,  // NOLINT
+    341,        -4,     343,        -4,     345,        -4,
+    347,        -4,     349,        -4,     351,        -4,
+    353,        -4,     355,        -4,  // NOLINT
+    357,        -4,     359,        -4,     361,        -4,
+    363,        -4,     365,        -4,     367,        -4,
+    369,        -4,     371,        -4,  // NOLINT
+    373,        -4,     375,        -4,     378,        -4,
+    380,        -4,     382,        -4,     384,        780,
+    387,        -4,     389,        -4,  // NOLINT
+    392,        -4,     396,        -4,     402,        -4,
+    405,        388,    409,        -4,     410,        652,
+    414,        520,    417,        -4,  // NOLINT
+    419,        -4,     421,        -4,     424,        -4,
+    429,        -4,     432,        -4,     436,        -4,
+    438,        -4,     441,        -4,  // NOLINT
+    445,        -4,     447,        224,    453,        -4,
+    454,        -8,     456,        -4,     457,        -8,
+    459,        -4,     460,        -8,  // NOLINT
+    462,        -4,     464,        -4,     466,        -4,
+    468,        -4,     470,        -4,     472,        -4,
+    474,        -4,     476,        -4,  // NOLINT
+    477,        -316,   479,        -4,     481,        -4,
+    483,        -4,     485,        -4,     487,        -4,
+    489,        -4,     491,        -4,  // NOLINT
+    493,        -4,     495,        -4,     498,        -4,
+    499,        -8,     501,        -4,     505,        -4,
+    507,        -4,     509,        -4,  // NOLINT
+    511,        -4,     513,        -4,     515,        -4,
+    517,        -4,     519,        -4,     521,        -4,
+    523,        -4,     525,        -4,  // NOLINT
+    527,        -4,     529,        -4,     531,        -4,
+    533,        -4,     535,        -4,     537,        -4,
+    539,        -4,     541,        -4,  // NOLINT
+    543,        -4,     547,        -4,     549,        -4,
+    551,        -4,     553,        -4,     555,        -4,
+    557,        -4,     559,        -4,  // NOLINT
+    561,        -4,     563,        -4,     572,        -4,
+    1073742399, 43260,  576,        43260,  578,        -4,
+    583,        -4,     585,        -4,  // NOLINT
+    587,        -4,     589,        -4,     591,        -4,
+    592,        43132,  593,        43120,  594,        43128,
+    595,        -840,   596,        -824,  // NOLINT
+    1073742422, -820,   599,        -820,   601,        -808,
+    603,        -812,   604,        169276, 608,        -820,
+    609,        169260, 611,        -828,  // NOLINT
+    613,        169120, 614,        169232, 616,        -836,
+    617,        -844,   619,        42972,  620,        169220,
+    623,        -844,   625,        42996,  // NOLINT
+    626,        -852,   629,        -856,   637,        42908,
+    640,        -872,   643,        -872,   647,        169128,
+    648,        -872,   649,        -276,  // NOLINT
+    1073742474, -868,   651,        -868,   652,        -284,
+    658,        -876,   670,        169032, 837,        336,
+    881,        -4,     883,        -4,  // NOLINT
+    887,        -4,     1073742715, 520,    893,        520,
+    940,        -152,   1073742765, -148,   943,        -148,
+    1073742769, -128,   961,        -128,  // NOLINT
+    962,        -124,   1073742787, -128,   971,        -128,
+    972,        -256,   1073742797, -252,   974,        -252,
+    976,        -248,   977,        -228,  // NOLINT
+    981,        -188,   982,        -216,   983,        -32,
+    985,        -4,     987,        -4,     989,        -4,
+    991,        -4,     993,        -4,  // NOLINT
+    995,        -4,     997,        -4,     999,        -4,
+    1001,       -4,     1003,       -4,     1005,       -4,
+    1007,       -4,     1008,       -344,  // NOLINT
+    1009,       -320,   1010,       28,     1011,       -464,
+    1013,       -384,   1016,       -4,     1019,       -4,
+    1073742896, -128,   1103,       -128,  // NOLINT
+    1073742928, -320,   1119,       -320,   1121,       -4,
+    1123,       -4,     1125,       -4,     1127,       -4,
+    1129,       -4,     1131,       -4,  // NOLINT
+    1133,       -4,     1135,       -4,     1137,       -4,
+    1139,       -4,     1141,       -4,     1143,       -4,
+    1145,       -4,     1147,       -4,  // NOLINT
+    1149,       -4,     1151,       -4,     1153,       -4,
+    1163,       -4,     1165,       -4,     1167,       -4,
+    1169,       -4,     1171,       -4,  // NOLINT
+    1173,       -4,     1175,       -4,     1177,       -4,
+    1179,       -4,     1181,       -4,     1183,       -4,
+    1185,       -4,     1187,       -4,  // NOLINT
+    1189,       -4,     1191,       -4,     1193,       -4,
+    1195,       -4,     1197,       -4,     1199,       -4,
+    1201,       -4,     1203,       -4,  // NOLINT
+    1205,       -4,     1207,       -4,     1209,       -4,
+    1211,       -4,     1213,       -4,     1215,       -4,
+    1218,       -4,     1220,       -4,  // NOLINT
+    1222,       -4,     1224,       -4,     1226,       -4,
+    1228,       -4,     1230,       -4,     1231,       -60,
+    1233,       -4,     1235,       -4,  // NOLINT
+    1237,       -4,     1239,       -4,     1241,       -4,
+    1243,       -4,     1245,       -4,     1247,       -4,
+    1249,       -4,     1251,       -4,  // NOLINT
+    1253,       -4,     1255,       -4,     1257,       -4,
+    1259,       -4,     1261,       -4,     1263,       -4,
+    1265,       -4,     1267,       -4,  // NOLINT
+    1269,       -4,     1271,       -4,     1273,       -4,
+    1275,       -4,     1277,       -4,     1279,       -4,
+    1281,       -4,     1283,       -4,  // NOLINT
+    1285,       -4,     1287,       -4,     1289,       -4,
+    1291,       -4,     1293,       -4,     1295,       -4,
+    1297,       -4,     1299,       -4,  // NOLINT
+    1301,       -4,     1303,       -4,     1305,       -4,
+    1307,       -4,     1309,       -4,     1311,       -4,
+    1313,       -4,     1315,       -4,  // NOLINT
+    1317,       -4,     1319,       -4,     1321,       -4,
+    1323,       -4,     1325,       -4,     1327,       -4,
+    1073743201, -192,   1414,       -192,  // NOLINT
+    7545,       141328, 7549,       15256,  7681,       -4,
+    7683,       -4,     7685,       -4,     7687,       -4,
+    7689,       -4,     7691,       -4,  // NOLINT
+    7693,       -4,     7695,       -4,     7697,       -4,
+    7699,       -4,     7701,       -4,     7703,       -4,
+    7705,       -4,     7707,       -4,  // NOLINT
+    7709,       -4,     7711,       -4,     7713,       -4,
+    7715,       -4,     7717,       -4,     7719,       -4,
+    7721,       -4,     7723,       -4,  // NOLINT
+    7725,       -4,     7727,       -4,     7729,       -4,
+    7731,       -4,     7733,       -4,     7735,       -4,
+    7737,       -4,     7739,       -4,  // NOLINT
+    7741,       -4,     7743,       -4,     7745,       -4,
+    7747,       -4,     7749,       -4,     7751,       -4,
+    7753,       -4,     7755,       -4,  // NOLINT
+    7757,       -4,     7759,       -4,     7761,       -4,
+    7763,       -4,     7765,       -4,     7767,       -4,
+    7769,       -4,     7771,       -4,  // NOLINT
+    7773,       -4,     7775,       -4,     7777,       -4,
+    7779,       -4,     7781,       -4,     7783,       -4,
+    7785,       -4,     7787,       -4,  // NOLINT
+    7789,       -4,     7791,       -4,     7793,       -4,
+    7795,       -4,     7797,       -4,     7799,       -4,
+    7801,       -4,     7803,       -4,  // NOLINT
+    7805,       -4,     7807,       -4,     7809,       -4,
+    7811,       -4,     7813,       -4,     7815,       -4,
+    7817,       -4,     7819,       -4,  // NOLINT
+    7821,       -4,     7823,       -4,     7825,       -4,
+    7827,       -4,     7829,       -4,     7835,       -236,
+    7841,       -4,     7843,       -4,  // NOLINT
+    7845,       -4,     7847,       -4,     7849,       -4,
+    7851,       -4,     7853,       -4,     7855,       -4,
+    7857,       -4,     7859,       -4,  // NOLINT
+    7861,       -4,     7863,       -4,     7865,       -4,
+    7867,       -4,     7869,       -4,     7871,       -4,
+    7873,       -4,     7875,       -4,  // NOLINT
+    7877,       -4,     7879,       -4,     7881,       -4,
+    7883,       -4,     7885,       -4,     7887,       -4,
+    7889,       -4,     7891,       -4,  // NOLINT
+    7893,       -4,     7895,       -4,     7897,       -4,
+    7899,       -4,     7901,       -4,     7903,       -4,
+    7905,       -4,     7907,       -4,  // NOLINT
+    7909,       -4,     7911,       -4,     7913,       -4,
+    7915,       -4,     7917,       -4,     7919,       -4,
+    7921,       -4,     7923,       -4,  // NOLINT
+    7925,       -4,     7927,       -4,     7929,       -4,
+    7931,       -4,     7933,       -4,     7935,       -4,
+    1073749760, 32,     7943,       32,  // NOLINT
+    1073749776, 32,     7957,       32,     1073749792, 32,
+    7975,       32,     1073749808, 32,     7991,       32,
+    1073749824, 32,     8005,       32,  // NOLINT
+    8017,       32,     8019,       32,     8021,       32,
+    8023,       32,     1073749856, 32,     8039,       32,
+    1073749872, 296,    8049,       296,  // NOLINT
+    1073749874, 344,    8053,       344,    1073749878, 400,
+    8055,       400,    1073749880, 512,    8057,       512,
+    1073749882, 448,    8059,       448,  // NOLINT
+    1073749884, 504,    8061,       504,    1073749936, 32,
+    8113,       32,     8126,       -28820, 1073749968, 32,
+    8145,       32,     1073749984, 32,                           // NOLINT
+    8161,       32,     8165,       28};                          // NOLINT
+static const uint16_t kEcma262CanonicalizeMultiStrings0Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kEcma262CanonicalizeMultiStrings1[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262CanonicalizeTable1Size = 73;  // NOLINT
+static const int32_t kEcma262CanonicalizeTable1[146] = {
+  334, -112, 1073742192, -64, 383, -64, 388, -4, 1073743056, -104, 1257, -104, 1073744944, -192, 3166, -192,  // NOLINT
+  3169, -4, 3173, -43180, 3174, -43168, 3176, -4, 3178, -4, 3180, -4, 3187, -4, 3190, -4,  // NOLINT
+  3201, -4, 3203, -4, 3205, -4, 3207, -4, 3209, -4, 3211, -4, 3213, -4, 3215, -4,  // NOLINT
+  3217, -4, 3219, -4, 3221, -4, 3223, -4, 3225, -4, 3227, -4, 3229, -4, 3231, -4,  // NOLINT
+  3233, -4, 3235, -4, 3237, -4, 3239, -4, 3241, -4, 3243, -4, 3245, -4, 3247, -4,  // NOLINT
+  3249, -4, 3251, -4, 3253, -4, 3255, -4, 3257, -4, 3259, -4, 3261, -4, 3263, -4,  // NOLINT
+  3265, -4, 3267, -4, 3269, -4, 3271, -4, 3273, -4, 3275, -4, 3277, -4, 3279, -4,  // NOLINT
+  3281, -4, 3283, -4, 3285, -4, 3287, -4, 3289, -4, 3291, -4, 3293, -4, 3295, -4,  // NOLINT
+  3297, -4, 3299, -4, 3308, -4, 3310, -4, 3315, -4, 1073745152, -29056, 3365, -29056, 3367, -29056,  // NOLINT
+  3373, -29056 };  // NOLINT
+static const uint16_t kEcma262CanonicalizeMultiStrings1Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kEcma262CanonicalizeMultiStrings5[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262CanonicalizeTable5Size = 95;  // NOLINT
+static const int32_t kEcma262CanonicalizeTable5
+    [190] = {1601, -4, 1603, -4, 1605, -4, 1607, -4,
+             1609, -4, 1611, -4, 1613, -4, 1615, -4,  // NOLINT
+             1617, -4, 1619, -4, 1621, -4, 1623, -4,
+             1625, -4, 1627, -4, 1629, -4, 1631, -4,  // NOLINT
+             1633, -4, 1635, -4, 1637, -4, 1639, -4,
+             1641, -4, 1643, -4, 1645, -4, 1665, -4,  // NOLINT
+             1667, -4, 1669, -4, 1671, -4, 1673, -4,
+             1675, -4, 1677, -4, 1679, -4, 1681, -4,  // NOLINT
+             1683, -4, 1685, -4, 1687, -4, 1689, -4,
+             1691, -4, 1827, -4, 1829, -4, 1831, -4,  // NOLINT
+             1833, -4, 1835, -4, 1837, -4, 1839, -4,
+             1843, -4, 1845, -4, 1847, -4, 1849, -4,  // NOLINT
+             1851, -4, 1853, -4, 1855, -4, 1857, -4,
+             1859, -4, 1861, -4, 1863, -4, 1865, -4,  // NOLINT
+             1867, -4, 1869, -4, 1871, -4, 1873, -4,
+             1875, -4, 1877, -4, 1879, -4, 1881, -4,  // NOLINT
+             1883, -4, 1885, -4, 1887, -4, 1889, -4,
+             1891, -4, 1893, -4, 1895, -4, 1897, -4,  // NOLINT
+             1899, -4, 1901, -4, 1903, -4, 1914, -4,
+             1916, -4, 1919, -4, 1921, -4, 1923, -4,  // NOLINT
+             1925, -4, 1927, -4, 1932, -4, 1937, -4,
+             1939, -4, 1943, -4, 1945, -4, 1947, -4,  // NOLINT
+             1949, -4, 1951, -4, 1953, -4, 1955, -4,
+             1957, -4, 1959, -4, 1961, -4};                       // NOLINT
+static const uint16_t kEcma262CanonicalizeMultiStrings5Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kEcma262CanonicalizeMultiStrings7[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262CanonicalizeTable7Size = 2;  // NOLINT
+static const int32_t kEcma262CanonicalizeTable7[4] = {
+  1073749825, -128, 8026, -128 };  // NOLINT
+static const uint16_t kEcma262CanonicalizeMultiStrings7Size = 1;  // NOLINT
+int Ecma262Canonicalize::Convert(uchar c,
+                      uchar n,
+                      uchar* result,
+                      bool* allow_caching_ptr) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupMapping<true>(kEcma262CanonicalizeTable0,
+                                           kEcma262CanonicalizeTable0Size,
+                                           kEcma262CanonicalizeMultiStrings0,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 1: return LookupMapping<true>(kEcma262CanonicalizeTable1,
+                                           kEcma262CanonicalizeTable1Size,
+                                           kEcma262CanonicalizeMultiStrings1,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 5: return LookupMapping<true>(kEcma262CanonicalizeTable5,
+                                           kEcma262CanonicalizeTable5Size,
+                                           kEcma262CanonicalizeMultiStrings5,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 7: return LookupMapping<true>(kEcma262CanonicalizeTable7,
+                                           kEcma262CanonicalizeTable7Size,
+                                           kEcma262CanonicalizeMultiStrings7,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    default: return 0;
+  }
+}
+
+static const MultiCharacterSpecialCase<4>
+    kEcma262UnCanonicalizeMultiStrings0[507] = {  // NOLINT
+        {{65, 97, kSentinel}},
+        {{90, 122, kSentinel}},
+        {{181, 924, 956, kSentinel}},
+        {{192, 224, kSentinel}},  // NOLINT
+        {{214, 246, kSentinel}},
+        {{216, 248, kSentinel}},
+        {{222, 254, kSentinel}},
+        {{255, 376, kSentinel}},  // NOLINT
+        {{256, 257, kSentinel}},
+        {{258, 259, kSentinel}},
+        {{260, 261, kSentinel}},
+        {{262, 263, kSentinel}},  // NOLINT
+        {{264, 265, kSentinel}},
+        {{266, 267, kSentinel}},
+        {{268, 269, kSentinel}},
+        {{270, 271, kSentinel}},  // NOLINT
+        {{272, 273, kSentinel}},
+        {{274, 275, kSentinel}},
+        {{276, 277, kSentinel}},
+        {{278, 279, kSentinel}},  // NOLINT
+        {{280, 281, kSentinel}},
+        {{282, 283, kSentinel}},
+        {{284, 285, kSentinel}},
+        {{286, 287, kSentinel}},  // NOLINT
+        {{288, 289, kSentinel}},
+        {{290, 291, kSentinel}},
+        {{292, 293, kSentinel}},
+        {{294, 295, kSentinel}},  // NOLINT
+        {{296, 297, kSentinel}},
+        {{298, 299, kSentinel}},
+        {{300, 301, kSentinel}},
+        {{302, 303, kSentinel}},  // NOLINT
+        {{306, 307, kSentinel}},
+        {{308, 309, kSentinel}},
+        {{310, 311, kSentinel}},
+        {{313, 314, kSentinel}},  // NOLINT
+        {{315, 316, kSentinel}},
+        {{317, 318, kSentinel}},
+        {{319, 320, kSentinel}},
+        {{321, 322, kSentinel}},  // NOLINT
+        {{323, 324, kSentinel}},
+        {{325, 326, kSentinel}},
+        {{327, 328, kSentinel}},
+        {{330, 331, kSentinel}},  // NOLINT
+        {{332, 333, kSentinel}},
+        {{334, 335, kSentinel}},
+        {{336, 337, kSentinel}},
+        {{338, 339, kSentinel}},  // NOLINT
+        {{340, 341, kSentinel}},
+        {{342, 343, kSentinel}},
+        {{344, 345, kSentinel}},
+        {{346, 347, kSentinel}},  // NOLINT
+        {{348, 349, kSentinel}},
+        {{350, 351, kSentinel}},
+        {{352, 353, kSentinel}},
+        {{354, 355, kSentinel}},  // NOLINT
+        {{356, 357, kSentinel}},
+        {{358, 359, kSentinel}},
+        {{360, 361, kSentinel}},
+        {{362, 363, kSentinel}},  // NOLINT
+        {{364, 365, kSentinel}},
+        {{366, 367, kSentinel}},
+        {{368, 369, kSentinel}},
+        {{370, 371, kSentinel}},  // NOLINT
+        {{372, 373, kSentinel}},
+        {{374, 375, kSentinel}},
+        {{377, 378, kSentinel}},
+        {{379, 380, kSentinel}},  // NOLINT
+        {{381, 382, kSentinel}},
+        {{384, 579, kSentinel}},
+        {{385, 595, kSentinel}},
+        {{386, 387, kSentinel}},  // NOLINT
+        {{388, 389, kSentinel}},
+        {{390, 596, kSentinel}},
+        {{391, 392, kSentinel}},
+        {{393, 598, kSentinel}},  // NOLINT
+        {{394, 599, kSentinel}},
+        {{395, 396, kSentinel}},
+        {{398, 477, kSentinel}},
+        {{399, 601, kSentinel}},  // NOLINT
+        {{400, 603, kSentinel}},
+        {{401, 402, kSentinel}},
+        {{403, 608, kSentinel}},
+        {{404, 611, kSentinel}},  // NOLINT
+        {{405, 502, kSentinel}},
+        {{406, 617, kSentinel}},
+        {{407, 616, kSentinel}},
+        {{408, 409, kSentinel}},  // NOLINT
+        {{410, 573, kSentinel}},
+        {{412, 623, kSentinel}},
+        {{413, 626, kSentinel}},
+        {{414, 544, kSentinel}},  // NOLINT
+        {{415, 629, kSentinel}},
+        {{416, 417, kSentinel}},
+        {{418, 419, kSentinel}},
+        {{420, 421, kSentinel}},  // NOLINT
+        {{422, 640, kSentinel}},
+        {{423, 424, kSentinel}},
+        {{425, 643, kSentinel}},
+        {{428, 429, kSentinel}},  // NOLINT
+        {{430, 648, kSentinel}},
+        {{431, 432, kSentinel}},
+        {{433, 650, kSentinel}},
+        {{434, 651, kSentinel}},  // NOLINT
+        {{435, 436, kSentinel}},
+        {{437, 438, kSentinel}},
+        {{439, 658, kSentinel}},
+        {{440, 441, kSentinel}},  // NOLINT
+        {{444, 445, kSentinel}},
+        {{447, 503, kSentinel}},
+        {{452, 453, 454, kSentinel}},
+        {{455, 456, 457, kSentinel}},  // NOLINT
+        {{458, 459, 460, kSentinel}},
+        {{461, 462, kSentinel}},
+        {{463, 464, kSentinel}},
+        {{465, 466, kSentinel}},  // NOLINT
+        {{467, 468, kSentinel}},
+        {{469, 470, kSentinel}},
+        {{471, 472, kSentinel}},
+        {{473, 474, kSentinel}},  // NOLINT
+        {{475, 476, kSentinel}},
+        {{478, 479, kSentinel}},
+        {{480, 481, kSentinel}},
+        {{482, 483, kSentinel}},  // NOLINT
+        {{484, 485, kSentinel}},
+        {{486, 487, kSentinel}},
+        {{488, 489, kSentinel}},
+        {{490, 491, kSentinel}},  // NOLINT
+        {{492, 493, kSentinel}},
+        {{494, 495, kSentinel}},
+        {{497, 498, 499, kSentinel}},
+        {{500, 501, kSentinel}},  // NOLINT
+        {{504, 505, kSentinel}},
+        {{506, 507, kSentinel}},
+        {{508, 509, kSentinel}},
+        {{510, 511, kSentinel}},  // NOLINT
+        {{512, 513, kSentinel}},
+        {{514, 515, kSentinel}},
+        {{516, 517, kSentinel}},
+        {{518, 519, kSentinel}},  // NOLINT
+        {{520, 521, kSentinel}},
+        {{522, 523, kSentinel}},
+        {{524, 525, kSentinel}},
+        {{526, 527, kSentinel}},  // NOLINT
+        {{528, 529, kSentinel}},
+        {{530, 531, kSentinel}},
+        {{532, 533, kSentinel}},
+        {{534, 535, kSentinel}},  // NOLINT
+        {{536, 537, kSentinel}},
+        {{538, 539, kSentinel}},
+        {{540, 541, kSentinel}},
+        {{542, 543, kSentinel}},  // NOLINT
+        {{546, 547, kSentinel}},
+        {{548, 549, kSentinel}},
+        {{550, 551, kSentinel}},
+        {{552, 553, kSentinel}},  // NOLINT
+        {{554, 555, kSentinel}},
+        {{556, 557, kSentinel}},
+        {{558, 559, kSentinel}},
+        {{560, 561, kSentinel}},  // NOLINT
+        {{562, 563, kSentinel}},
+        {{570, 11365, kSentinel}},
+        {{571, 572, kSentinel}},
+        {{574, 11366, kSentinel}},  // NOLINT
+        {{575, 11390, kSentinel}},
+        {{576, 11391, kSentinel}},
+        {{577, 578, kSentinel}},
+        {{580, 649, kSentinel}},  // NOLINT
+        {{581, 652, kSentinel}},
+        {{582, 583, kSentinel}},
+        {{584, 585, kSentinel}},
+        {{586, 587, kSentinel}},  // NOLINT
+        {{588, 589, kSentinel}},
+        {{590, 591, kSentinel}},
+        {{592, 11375, kSentinel}},
+        {{593, 11373, kSentinel}},  // NOLINT
+        {{594, 11376, kSentinel}},
+        {{604, 42923, kSentinel}},
+        {{609, 42924, kSentinel}},
+        {{613, 42893, kSentinel}},  // NOLINT
+        {{614, 42922, kSentinel}},
+        {{619, 11362, kSentinel}},
+        {{620, 42925, kSentinel}},
+        {{625, 11374, kSentinel}},  // NOLINT
+        {{637, 11364, kSentinel}},
+        {{647, 42929, kSentinel}},
+        {{670, 42928, kSentinel}},
+        {{837, 921, 953, 8126}},  // NOLINT
+        {{880, 881, kSentinel}},
+        {{882, 883, kSentinel}},
+        {{886, 887, kSentinel}},
+        {{891, 1021, kSentinel}},  // NOLINT
+        {{893, 1023, kSentinel}},
+        {{895, 1011, kSentinel}},
+        {{902, 940, kSentinel}},
+        {{904, 941, kSentinel}},  // NOLINT
+        {{906, 943, kSentinel}},
+        {{908, 972, kSentinel}},
+        {{910, 973, kSentinel}},
+        {{911, 974, kSentinel}},  // NOLINT
+        {{913, 945, kSentinel}},
+        {{914, 946, 976, kSentinel}},
+        {{915, 947, kSentinel}},
+        {{916, 948, kSentinel}},  // NOLINT
+        {{917, 949, 1013, kSentinel}},
+        {{918, 950, kSentinel}},
+        {{919, 951, kSentinel}},
+        {{920, 952, 977, kSentinel}},  // NOLINT
+        {{922, 954, 1008, kSentinel}},
+        {{923, 955, kSentinel}},
+        {{925, 957, kSentinel}},
+        {{927, 959, kSentinel}},  // NOLINT
+        {{928, 960, 982, kSentinel}},
+        {{929, 961, 1009, kSentinel}},
+        {{931, 962, 963, kSentinel}},
+        {{932, 964, kSentinel}},  // NOLINT
+        {{933, 965, kSentinel}},
+        {{934, 966, 981, kSentinel}},
+        {{935, 967, kSentinel}},
+        {{939, 971, kSentinel}},  // NOLINT
+        {{975, 983, kSentinel}},
+        {{984, 985, kSentinel}},
+        {{986, 987, kSentinel}},
+        {{988, 989, kSentinel}},  // NOLINT
+        {{990, 991, kSentinel}},
+        {{992, 993, kSentinel}},
+        {{994, 995, kSentinel}},
+        {{996, 997, kSentinel}},  // NOLINT
+        {{998, 999, kSentinel}},
+        {{1000, 1001, kSentinel}},
+        {{1002, 1003, kSentinel}},
+        {{1004, 1005, kSentinel}},  // NOLINT
+        {{1006, 1007, kSentinel}},
+        {{1010, 1017, kSentinel}},
+        {{1015, 1016, kSentinel}},
+        {{1018, 1019, kSentinel}},  // NOLINT
+        {{1024, 1104, kSentinel}},
+        {{1039, 1119, kSentinel}},
+        {{1040, 1072, kSentinel}},
+        {{1071, 1103, kSentinel}},  // NOLINT
+        {{1120, 1121, kSentinel}},
+        {{1122, 1123, kSentinel}},
+        {{1124, 1125, kSentinel}},
+        {{1126, 1127, kSentinel}},  // NOLINT
+        {{1128, 1129, kSentinel}},
+        {{1130, 1131, kSentinel}},
+        {{1132, 1133, kSentinel}},
+        {{1134, 1135, kSentinel}},  // NOLINT
+        {{1136, 1137, kSentinel}},
+        {{1138, 1139, kSentinel}},
+        {{1140, 1141, kSentinel}},
+        {{1142, 1143, kSentinel}},  // NOLINT
+        {{1144, 1145, kSentinel}},
+        {{1146, 1147, kSentinel}},
+        {{1148, 1149, kSentinel}},
+        {{1150, 1151, kSentinel}},  // NOLINT
+        {{1152, 1153, kSentinel}},
+        {{1162, 1163, kSentinel}},
+        {{1164, 1165, kSentinel}},
+        {{1166, 1167, kSentinel}},  // NOLINT
+        {{1168, 1169, kSentinel}},
+        {{1170, 1171, kSentinel}},
+        {{1172, 1173, kSentinel}},
+        {{1174, 1175, kSentinel}},  // NOLINT
+        {{1176, 1177, kSentinel}},
+        {{1178, 1179, kSentinel}},
+        {{1180, 1181, kSentinel}},
+        {{1182, 1183, kSentinel}},  // NOLINT
+        {{1184, 1185, kSentinel}},
+        {{1186, 1187, kSentinel}},
+        {{1188, 1189, kSentinel}},
+        {{1190, 1191, kSentinel}},  // NOLINT
+        {{1192, 1193, kSentinel}},
+        {{1194, 1195, kSentinel}},
+        {{1196, 1197, kSentinel}},
+        {{1198, 1199, kSentinel}},  // NOLINT
+        {{1200, 1201, kSentinel}},
+        {{1202, 1203, kSentinel}},
+        {{1204, 1205, kSentinel}},
+        {{1206, 1207, kSentinel}},  // NOLINT
+        {{1208, 1209, kSentinel}},
+        {{1210, 1211, kSentinel}},
+        {{1212, 1213, kSentinel}},
+        {{1214, 1215, kSentinel}},  // NOLINT
+        {{1216, 1231, kSentinel}},
+        {{1217, 1218, kSentinel}},
+        {{1219, 1220, kSentinel}},
+        {{1221, 1222, kSentinel}},  // NOLINT
+        {{1223, 1224, kSentinel}},
+        {{1225, 1226, kSentinel}},
+        {{1227, 1228, kSentinel}},
+        {{1229, 1230, kSentinel}},  // NOLINT
+        {{1232, 1233, kSentinel}},
+        {{1234, 1235, kSentinel}},
+        {{1236, 1237, kSentinel}},
+        {{1238, 1239, kSentinel}},  // NOLINT
+        {{1240, 1241, kSentinel}},
+        {{1242, 1243, kSentinel}},
+        {{1244, 1245, kSentinel}},
+        {{1246, 1247, kSentinel}},  // NOLINT
+        {{1248, 1249, kSentinel}},
+        {{1250, 1251, kSentinel}},
+        {{1252, 1253, kSentinel}},
+        {{1254, 1255, kSentinel}},  // NOLINT
+        {{1256, 1257, kSentinel}},
+        {{1258, 1259, kSentinel}},
+        {{1260, 1261, kSentinel}},
+        {{1262, 1263, kSentinel}},  // NOLINT
+        {{1264, 1265, kSentinel}},
+        {{1266, 1267, kSentinel}},
+        {{1268, 1269, kSentinel}},
+        {{1270, 1271, kSentinel}},  // NOLINT
+        {{1272, 1273, kSentinel}},
+        {{1274, 1275, kSentinel}},
+        {{1276, 1277, kSentinel}},
+        {{1278, 1279, kSentinel}},  // NOLINT
+        {{1280, 1281, kSentinel}},
+        {{1282, 1283, kSentinel}},
+        {{1284, 1285, kSentinel}},
+        {{1286, 1287, kSentinel}},  // NOLINT
+        {{1288, 1289, kSentinel}},
+        {{1290, 1291, kSentinel}},
+        {{1292, 1293, kSentinel}},
+        {{1294, 1295, kSentinel}},  // NOLINT
+        {{1296, 1297, kSentinel}},
+        {{1298, 1299, kSentinel}},
+        {{1300, 1301, kSentinel}},
+        {{1302, 1303, kSentinel}},  // NOLINT
+        {{1304, 1305, kSentinel}},
+        {{1306, 1307, kSentinel}},
+        {{1308, 1309, kSentinel}},
+        {{1310, 1311, kSentinel}},  // NOLINT
+        {{1312, 1313, kSentinel}},
+        {{1314, 1315, kSentinel}},
+        {{1316, 1317, kSentinel}},
+        {{1318, 1319, kSentinel}},  // NOLINT
+        {{1320, 1321, kSentinel}},
+        {{1322, 1323, kSentinel}},
+        {{1324, 1325, kSentinel}},
+        {{1326, 1327, kSentinel}},  // NOLINT
+        {{1329, 1377, kSentinel}},
+        {{1366, 1414, kSentinel}},
+        {{4256, 11520, kSentinel}},
+        {{4293, 11557, kSentinel}},  // NOLINT
+        {{4295, 11559, kSentinel}},
+        {{4301, 11565, kSentinel}},
+        {{7545, 42877, kSentinel}},
+        {{7549, 11363, kSentinel}},  // NOLINT
+        {{7680, 7681, kSentinel}},
+        {{7682, 7683, kSentinel}},
+        {{7684, 7685, kSentinel}},
+        {{7686, 7687, kSentinel}},  // NOLINT
+        {{7688, 7689, kSentinel}},
+        {{7690, 7691, kSentinel}},
+        {{7692, 7693, kSentinel}},
+        {{7694, 7695, kSentinel}},  // NOLINT
+        {{7696, 7697, kSentinel}},
+        {{7698, 7699, kSentinel}},
+        {{7700, 7701, kSentinel}},
+        {{7702, 7703, kSentinel}},  // NOLINT
+        {{7704, 7705, kSentinel}},
+        {{7706, 7707, kSentinel}},
+        {{7708, 7709, kSentinel}},
+        {{7710, 7711, kSentinel}},  // NOLINT
+        {{7712, 7713, kSentinel}},
+        {{7714, 7715, kSentinel}},
+        {{7716, 7717, kSentinel}},
+        {{7718, 7719, kSentinel}},  // NOLINT
+        {{7720, 7721, kSentinel}},
+        {{7722, 7723, kSentinel}},
+        {{7724, 7725, kSentinel}},
+        {{7726, 7727, kSentinel}},  // NOLINT
+        {{7728, 7729, kSentinel}},
+        {{7730, 7731, kSentinel}},
+        {{7732, 7733, kSentinel}},
+        {{7734, 7735, kSentinel}},  // NOLINT
+        {{7736, 7737, kSentinel}},
+        {{7738, 7739, kSentinel}},
+        {{7740, 7741, kSentinel}},
+        {{7742, 7743, kSentinel}},  // NOLINT
+        {{7744, 7745, kSentinel}},
+        {{7746, 7747, kSentinel}},
+        {{7748, 7749, kSentinel}},
+        {{7750, 7751, kSentinel}},  // NOLINT
+        {{7752, 7753, kSentinel}},
+        {{7754, 7755, kSentinel}},
+        {{7756, 7757, kSentinel}},
+        {{7758, 7759, kSentinel}},  // NOLINT
+        {{7760, 7761, kSentinel}},
+        {{7762, 7763, kSentinel}},
+        {{7764, 7765, kSentinel}},
+        {{7766, 7767, kSentinel}},  // NOLINT
+        {{7768, 7769, kSentinel}},
+        {{7770, 7771, kSentinel}},
+        {{7772, 7773, kSentinel}},
+        {{7774, 7775, kSentinel}},  // NOLINT
+        {{7776, 7777, 7835, kSentinel}},
+        {{7778, 7779, kSentinel}},
+        {{7780, 7781, kSentinel}},
+        {{7782, 7783, kSentinel}},  // NOLINT
+        {{7784, 7785, kSentinel}},
+        {{7786, 7787, kSentinel}},
+        {{7788, 7789, kSentinel}},
+        {{7790, 7791, kSentinel}},  // NOLINT
+        {{7792, 7793, kSentinel}},
+        {{7794, 7795, kSentinel}},
+        {{7796, 7797, kSentinel}},
+        {{7798, 7799, kSentinel}},  // NOLINT
+        {{7800, 7801, kSentinel}},
+        {{7802, 7803, kSentinel}},
+        {{7804, 7805, kSentinel}},
+        {{7806, 7807, kSentinel}},  // NOLINT
+        {{7808, 7809, kSentinel}},
+        {{7810, 7811, kSentinel}},
+        {{7812, 7813, kSentinel}},
+        {{7814, 7815, kSentinel}},  // NOLINT
+        {{7816, 7817, kSentinel}},
+        {{7818, 7819, kSentinel}},
+        {{7820, 7821, kSentinel}},
+        {{7822, 7823, kSentinel}},  // NOLINT
+        {{7824, 7825, kSentinel}},
+        {{7826, 7827, kSentinel}},
+        {{7828, 7829, kSentinel}},
+        {{7840, 7841, kSentinel}},  // NOLINT
+        {{7842, 7843, kSentinel}},
+        {{7844, 7845, kSentinel}},
+        {{7846, 7847, kSentinel}},
+        {{7848, 7849, kSentinel}},  // NOLINT
+        {{7850, 7851, kSentinel}},
+        {{7852, 7853, kSentinel}},
+        {{7854, 7855, kSentinel}},
+        {{7856, 7857, kSentinel}},  // NOLINT
+        {{7858, 7859, kSentinel}},
+        {{7860, 7861, kSentinel}},
+        {{7862, 7863, kSentinel}},
+        {{7864, 7865, kSentinel}},  // NOLINT
+        {{7866, 7867, kSentinel}},
+        {{7868, 7869, kSentinel}},
+        {{7870, 7871, kSentinel}},
+        {{7872, 7873, kSentinel}},  // NOLINT
+        {{7874, 7875, kSentinel}},
+        {{7876, 7877, kSentinel}},
+        {{7878, 7879, kSentinel}},
+        {{7880, 7881, kSentinel}},  // NOLINT
+        {{7882, 7883, kSentinel}},
+        {{7884, 7885, kSentinel}},
+        {{7886, 7887, kSentinel}},
+        {{7888, 7889, kSentinel}},  // NOLINT
+        {{7890, 7891, kSentinel}},
+        {{7892, 7893, kSentinel}},
+        {{7894, 7895, kSentinel}},
+        {{7896, 7897, kSentinel}},  // NOLINT
+        {{7898, 7899, kSentinel}},
+        {{7900, 7901, kSentinel}},
+        {{7902, 7903, kSentinel}},
+        {{7904, 7905, kSentinel}},  // NOLINT
+        {{7906, 7907, kSentinel}},
+        {{7908, 7909, kSentinel}},
+        {{7910, 7911, kSentinel}},
+        {{7912, 7913, kSentinel}},  // NOLINT
+        {{7914, 7915, kSentinel}},
+        {{7916, 7917, kSentinel}},
+        {{7918, 7919, kSentinel}},
+        {{7920, 7921, kSentinel}},  // NOLINT
+        {{7922, 7923, kSentinel}},
+        {{7924, 7925, kSentinel}},
+        {{7926, 7927, kSentinel}},
+        {{7928, 7929, kSentinel}},  // NOLINT
+        {{7930, 7931, kSentinel}},
+        {{7932, 7933, kSentinel}},
+        {{7934, 7935, kSentinel}},
+        {{7936, 7944, kSentinel}},  // NOLINT
+        {{7943, 7951, kSentinel}},
+        {{7952, 7960, kSentinel}},
+        {{7957, 7965, kSentinel}},
+        {{7968, 7976, kSentinel}},  // NOLINT
+        {{7975, 7983, kSentinel}},
+        {{7984, 7992, kSentinel}},
+        {{7991, 7999, kSentinel}},
+        {{8000, 8008, kSentinel}},  // NOLINT
+        {{8005, 8013, kSentinel}},
+        {{8017, 8025, kSentinel}},
+        {{8019, 8027, kSentinel}},
+        {{8021, 8029, kSentinel}},  // NOLINT
+        {{8023, 8031, kSentinel}},
+        {{8032, 8040, kSentinel}},
+        {{8039, 8047, kSentinel}},
+        {{8048, 8122, kSentinel}},  // NOLINT
+        {{8049, 8123, kSentinel}},
+        {{8050, 8136, kSentinel}},
+        {{8053, 8139, kSentinel}},
+        {{8054, 8154, kSentinel}},  // NOLINT
+        {{8055, 8155, kSentinel}},
+        {{8056, 8184, kSentinel}},
+        {{8057, 8185, kSentinel}},
+        {{8058, 8170, kSentinel}},  // NOLINT
+        {{8059, 8171, kSentinel}},
+        {{8060, 8186, kSentinel}},
+        {{8061, 8187, kSentinel}},
+        {{8112, 8120, kSentinel}},  // NOLINT
+        {{8113, 8121, kSentinel}},
+        {{8144, 8152, kSentinel}},
+        {{8145, 8153, kSentinel}},
+        {{8160, 8168, kSentinel}},  // NOLINT
+        {{8161, 8169, kSentinel}},
+        {{8165, 8172, kSentinel}},
+        {{kSentinel}}};                                         // NOLINT
+static const uint16_t kEcma262UnCanonicalizeTable0Size = 1005;  // NOLINT
+static const int32_t kEcma262UnCanonicalizeTable0[2010] = {
+    1073741889, 1,    90,         5,    1073741921, 1,
+    122,        5,    181,        9,    1073742016, 13,
+    214,        17,   1073742040, 21,  // NOLINT
+    222,        25,   1073742048, 13,   246,        17,
+    1073742072, 21,   254,        25,   255,        29,
+    256,        33,   257,        33,  // NOLINT
+    258,        37,   259,        37,   260,        41,
+    261,        41,   262,        45,   263,        45,
+    264,        49,   265,        49,  // NOLINT
+    266,        53,   267,        53,   268,        57,
+    269,        57,   270,        61,   271,        61,
+    272,        65,   273,        65,  // NOLINT
+    274,        69,   275,        69,   276,        73,
+    277,        73,   278,        77,   279,        77,
+    280,        81,   281,        81,  // NOLINT
+    282,        85,   283,        85,   284,        89,
+    285,        89,   286,        93,   287,        93,
+    288,        97,   289,        97,  // NOLINT
+    290,        101,  291,        101,  292,        105,
+    293,        105,  294,        109,  295,        109,
+    296,        113,  297,        113,  // NOLINT
+    298,        117,  299,        117,  300,        121,
+    301,        121,  302,        125,  303,        125,
+    306,        129,  307,        129,  // NOLINT
+    308,        133,  309,        133,  310,        137,
+    311,        137,  313,        141,  314,        141,
+    315,        145,  316,        145,  // NOLINT
+    317,        149,  318,        149,  319,        153,
+    320,        153,  321,        157,  322,        157,
+    323,        161,  324,        161,  // NOLINT
+    325,        165,  326,        165,  327,        169,
+    328,        169,  330,        173,  331,        173,
+    332,        177,  333,        177,  // NOLINT
+    334,        181,  335,        181,  336,        185,
+    337,        185,  338,        189,  339,        189,
+    340,        193,  341,        193,  // NOLINT
+    342,        197,  343,        197,  344,        201,
+    345,        201,  346,        205,  347,        205,
+    348,        209,  349,        209,  // NOLINT
+    350,        213,  351,        213,  352,        217,
+    353,        217,  354,        221,  355,        221,
+    356,        225,  357,        225,  // NOLINT
+    358,        229,  359,        229,  360,        233,
+    361,        233,  362,        237,  363,        237,
+    364,        241,  365,        241,  // NOLINT
+    366,        245,  367,        245,  368,        249,
+    369,        249,  370,        253,  371,        253,
+    372,        257,  373,        257,  // NOLINT
+    374,        261,  375,        261,  376,        29,
+    377,        265,  378,        265,  379,        269,
+    380,        269,  381,        273,  // NOLINT
+    382,        273,  384,        277,  385,        281,
+    386,        285,  387,        285,  388,        289,
+    389,        289,  390,        293,  // NOLINT
+    391,        297,  392,        297,  1073742217, 301,
+    394,        305,  395,        309,  396,        309,
+    398,        313,  399,        317,  // NOLINT
+    400,        321,  401,        325,  402,        325,
+    403,        329,  404,        333,  405,        337,
+    406,        341,  407,        345,  // NOLINT
+    408,        349,  409,        349,  410,        353,
+    412,        357,  413,        361,  414,        365,
+    415,        369,  416,        373,  // NOLINT
+    417,        373,  418,        377,  419,        377,
+    420,        381,  421,        381,  422,        385,
+    423,        389,  424,        389,  // NOLINT
+    425,        393,  428,        397,  429,        397,
+    430,        401,  431,        405,  432,        405,
+    1073742257, 409,  434,        413,  // NOLINT
+    435,        417,  436,        417,  437,        421,
+    438,        421,  439,        425,  440,        429,
+    441,        429,  444,        433,  // NOLINT
+    445,        433,  447,        437,  452,        441,
+    453,        441,  454,        441,  455,        445,
+    456,        445,  457,        445,  // NOLINT
+    458,        449,  459,        449,  460,        449,
+    461,        453,  462,        453,  463,        457,
+    464,        457,  465,        461,  // NOLINT
+    466,        461,  467,        465,  468,        465,
+    469,        469,  470,        469,  471,        473,
+    472,        473,  473,        477,  // NOLINT
+    474,        477,  475,        481,  476,        481,
+    477,        313,  478,        485,  479,        485,
+    480,        489,  481,        489,  // NOLINT
+    482,        493,  483,        493,  484,        497,
+    485,        497,  486,        501,  487,        501,
+    488,        505,  489,        505,  // NOLINT
+    490,        509,  491,        509,  492,        513,
+    493,        513,  494,        517,  495,        517,
+    497,        521,  498,        521,  // NOLINT
+    499,        521,  500,        525,  501,        525,
+    502,        337,  503,        437,  504,        529,
+    505,        529,  506,        533,  // NOLINT
+    507,        533,  508,        537,  509,        537,
+    510,        541,  511,        541,  512,        545,
+    513,        545,  514,        549,  // NOLINT
+    515,        549,  516,        553,  517,        553,
+    518,        557,  519,        557,  520,        561,
+    521,        561,  522,        565,  // NOLINT
+    523,        565,  524,        569,  525,        569,
+    526,        573,  527,        573,  528,        577,
+    529,        577,  530,        581,  // NOLINT
+    531,        581,  532,        585,  533,        585,
+    534,        589,  535,        589,  536,        593,
+    537,        593,  538,        597,  // NOLINT
+    539,        597,  540,        601,  541,        601,
+    542,        605,  543,        605,  544,        365,
+    546,        609,  547,        609,  // NOLINT
+    548,        613,  549,        613,  550,        617,
+    551,        617,  552,        621,  553,        621,
+    554,        625,  555,        625,  // NOLINT
+    556,        629,  557,        629,  558,        633,
+    559,        633,  560,        637,  561,        637,
+    562,        641,  563,        641,  // NOLINT
+    570,        645,  571,        649,  572,        649,
+    573,        353,  574,        653,  1073742399, 657,
+    576,        661,  577,        665,  // NOLINT
+    578,        665,  579,        277,  580,        669,
+    581,        673,  582,        677,  583,        677,
+    584,        681,  585,        681,  // NOLINT
+    586,        685,  587,        685,  588,        689,
+    589,        689,  590,        693,  591,        693,
+    592,        697,  593,        701,  // NOLINT
+    594,        705,  595,        281,  596,        293,
+    1073742422, 301,  599,        305,  601,        317,
+    603,        321,  604,        709,  // NOLINT
+    608,        329,  609,        713,  611,        333,
+    613,        717,  614,        721,  616,        345,
+    617,        341,  619,        725,  // NOLINT
+    620,        729,  623,        357,  625,        733,
+    626,        361,  629,        369,  637,        737,
+    640,        385,  643,        393,  // NOLINT
+    647,        741,  648,        401,  649,        669,
+    1073742474, 409,  651,        413,  652,        673,
+    658,        425,  670,        745,  // NOLINT
+    837,        749,  880,        753,  881,        753,
+    882,        757,  883,        757,  886,        761,
+    887,        761,  1073742715, 765,  // NOLINT
+    893,        769,  895,        773,  902,        777,
+    1073742728, 781,  906,        785,  908,        789,
+    1073742734, 793,  911,        797,  // NOLINT
+    913,        801,  914,        805,  1073742739, 809,
+    916,        813,  917,        817,  1073742742, 821,
+    919,        825,  920,        829,  // NOLINT
+    921,        749,  922,        833,  923,        837,
+    924,        9,    1073742749, 841,  927,        845,
+    928,        849,  929,        853,  // NOLINT
+    931,        857,  1073742756, 861,  933,        865,
+    934,        869,  1073742759, 873,  939,        877,
+    940,        777,  1073742765, 781,  // NOLINT
+    943,        785,  945,        801,  946,        805,
+    1073742771, 809,  948,        813,  949,        817,
+    1073742774, 821,  951,        825,  // NOLINT
+    952,        829,  953,        749,  954,        833,
+    955,        837,  956,        9,    1073742781, 841,
+    959,        845,  960,        849,  // NOLINT
+    961,        853,  962,        857,  963,        857,
+    1073742788, 861,  965,        865,  966,        869,
+    1073742791, 873,  971,        877,  // NOLINT
+    972,        789,  1073742797, 793,  974,        797,
+    975,        881,  976,        805,  977,        829,
+    981,        869,  982,        849,  // NOLINT
+    983,        881,  984,        885,  985,        885,
+    986,        889,  987,        889,  988,        893,
+    989,        893,  990,        897,  // NOLINT
+    991,        897,  992,        901,  993,        901,
+    994,        905,  995,        905,  996,        909,
+    997,        909,  998,        913,  // NOLINT
+    999,        913,  1000,       917,  1001,       917,
+    1002,       921,  1003,       921,  1004,       925,
+    1005,       925,  1006,       929,  // NOLINT
+    1007,       929,  1008,       833,  1009,       853,
+    1010,       933,  1011,       773,  1013,       817,
+    1015,       937,  1016,       937,  // NOLINT
+    1017,       933,  1018,       941,  1019,       941,
+    1073742845, 765,  1023,       769,  1073742848, 945,
+    1039,       949,  1073742864, 953,  // NOLINT
+    1071,       957,  1073742896, 953,  1103,       957,
+    1073742928, 945,  1119,       949,  1120,       961,
+    1121,       961,  1122,       965,  // NOLINT
+    1123,       965,  1124,       969,  1125,       969,
+    1126,       973,  1127,       973,  1128,       977,
+    1129,       977,  1130,       981,  // NOLINT
+    1131,       981,  1132,       985,  1133,       985,
+    1134,       989,  1135,       989,  1136,       993,
+    1137,       993,  1138,       997,  // NOLINT
+    1139,       997,  1140,       1001, 1141,       1001,
+    1142,       1005, 1143,       1005, 1144,       1009,
+    1145,       1009, 1146,       1013,  // NOLINT
+    1147,       1013, 1148,       1017, 1149,       1017,
+    1150,       1021, 1151,       1021, 1152,       1025,
+    1153,       1025, 1162,       1029,  // NOLINT
+    1163,       1029, 1164,       1033, 1165,       1033,
+    1166,       1037, 1167,       1037, 1168,       1041,
+    1169,       1041, 1170,       1045,  // NOLINT
+    1171,       1045, 1172,       1049, 1173,       1049,
+    1174,       1053, 1175,       1053, 1176,       1057,
+    1177,       1057, 1178,       1061,  // NOLINT
+    1179,       1061, 1180,       1065, 1181,       1065,
+    1182,       1069, 1183,       1069, 1184,       1073,
+    1185,       1073, 1186,       1077,  // NOLINT
+    1187,       1077, 1188,       1081, 1189,       1081,
+    1190,       1085, 1191,       1085, 1192,       1089,
+    1193,       1089, 1194,       1093,  // NOLINT
+    1195,       1093, 1196,       1097, 1197,       1097,
+    1198,       1101, 1199,       1101, 1200,       1105,
+    1201,       1105, 1202,       1109,  // NOLINT
+    1203,       1109, 1204,       1113, 1205,       1113,
+    1206,       1117, 1207,       1117, 1208,       1121,
+    1209,       1121, 1210,       1125,  // NOLINT
+    1211,       1125, 1212,       1129, 1213,       1129,
+    1214,       1133, 1215,       1133, 1216,       1137,
+    1217,       1141, 1218,       1141,  // NOLINT
+    1219,       1145, 1220,       1145, 1221,       1149,
+    1222,       1149, 1223,       1153, 1224,       1153,
+    1225,       1157, 1226,       1157,  // NOLINT
+    1227,       1161, 1228,       1161, 1229,       1165,
+    1230,       1165, 1231,       1137, 1232,       1169,
+    1233,       1169, 1234,       1173,  // NOLINT
+    1235,       1173, 1236,       1177, 1237,       1177,
+    1238,       1181, 1239,       1181, 1240,       1185,
+    1241,       1185, 1242,       1189,  // NOLINT
+    1243,       1189, 1244,       1193, 1245,       1193,
+    1246,       1197, 1247,       1197, 1248,       1201,
+    1249,       1201, 1250,       1205,  // NOLINT
+    1251,       1205, 1252,       1209, 1253,       1209,
+    1254,       1213, 1255,       1213, 1256,       1217,
+    1257,       1217, 1258,       1221,  // NOLINT
+    1259,       1221, 1260,       1225, 1261,       1225,
+    1262,       1229, 1263,       1229, 1264,       1233,
+    1265,       1233, 1266,       1237,  // NOLINT
+    1267,       1237, 1268,       1241, 1269,       1241,
+    1270,       1245, 1271,       1245, 1272,       1249,
+    1273,       1249, 1274,       1253,  // NOLINT
+    1275,       1253, 1276,       1257, 1277,       1257,
+    1278,       1261, 1279,       1261, 1280,       1265,
+    1281,       1265, 1282,       1269,  // NOLINT
+    1283,       1269, 1284,       1273, 1285,       1273,
+    1286,       1277, 1287,       1277, 1288,       1281,
+    1289,       1281, 1290,       1285,  // NOLINT
+    1291,       1285, 1292,       1289, 1293,       1289,
+    1294,       1293, 1295,       1293, 1296,       1297,
+    1297,       1297, 1298,       1301,  // NOLINT
+    1299,       1301, 1300,       1305, 1301,       1305,
+    1302,       1309, 1303,       1309, 1304,       1313,
+    1305,       1313, 1306,       1317,  // NOLINT
+    1307,       1317, 1308,       1321, 1309,       1321,
+    1310,       1325, 1311,       1325, 1312,       1329,
+    1313,       1329, 1314,       1333,  // NOLINT
+    1315,       1333, 1316,       1337, 1317,       1337,
+    1318,       1341, 1319,       1341, 1320,       1345,
+    1321,       1345, 1322,       1349,  // NOLINT
+    1323,       1349, 1324,       1353, 1325,       1353,
+    1326,       1357, 1327,       1357, 1073743153, 1361,
+    1366,       1365, 1073743201, 1361,  // NOLINT
+    1414,       1365, 1073746080, 1369, 4293,       1373,
+    4295,       1377, 4301,       1381, 7545,       1385,
+    7549,       1389, 7680,       1393,  // NOLINT
+    7681,       1393, 7682,       1397, 7683,       1397,
+    7684,       1401, 7685,       1401, 7686,       1405,
+    7687,       1405, 7688,       1409,  // NOLINT
+    7689,       1409, 7690,       1413, 7691,       1413,
+    7692,       1417, 7693,       1417, 7694,       1421,
+    7695,       1421, 7696,       1425,  // NOLINT
+    7697,       1425, 7698,       1429, 7699,       1429,
+    7700,       1433, 7701,       1433, 7702,       1437,
+    7703,       1437, 7704,       1441,  // NOLINT
+    7705,       1441, 7706,       1445, 7707,       1445,
+    7708,       1449, 7709,       1449, 7710,       1453,
+    7711,       1453, 7712,       1457,  // NOLINT
+    7713,       1457, 7714,       1461, 7715,       1461,
+    7716,       1465, 7717,       1465, 7718,       1469,
+    7719,       1469, 7720,       1473,  // NOLINT
+    7721,       1473, 7722,       1477, 7723,       1477,
+    7724,       1481, 7725,       1481, 7726,       1485,
+    7727,       1485, 7728,       1489,  // NOLINT
+    7729,       1489, 7730,       1493, 7731,       1493,
+    7732,       1497, 7733,       1497, 7734,       1501,
+    7735,       1501, 7736,       1505,  // NOLINT
+    7737,       1505, 7738,       1509, 7739,       1509,
+    7740,       1513, 7741,       1513, 7742,       1517,
+    7743,       1517, 7744,       1521,  // NOLINT
+    7745,       1521, 7746,       1525, 7747,       1525,
+    7748,       1529, 7749,       1529, 7750,       1533,
+    7751,       1533, 7752,       1537,  // NOLINT
+    7753,       1537, 7754,       1541, 7755,       1541,
+    7756,       1545, 7757,       1545, 7758,       1549,
+    7759,       1549, 7760,       1553,  // NOLINT
+    7761,       1553, 7762,       1557, 7763,       1557,
+    7764,       1561, 7765,       1561, 7766,       1565,
+    7767,       1565, 7768,       1569,  // NOLINT
+    7769,       1569, 7770,       1573, 7771,       1573,
+    7772,       1577, 7773,       1577, 7774,       1581,
+    7775,       1581, 7776,       1585,  // NOLINT
+    7777,       1585, 7778,       1589, 7779,       1589,
+    7780,       1593, 7781,       1593, 7782,       1597,
+    7783,       1597, 7784,       1601,  // NOLINT
+    7785,       1601, 7786,       1605, 7787,       1605,
+    7788,       1609, 7789,       1609, 7790,       1613,
+    7791,       1613, 7792,       1617,  // NOLINT
+    7793,       1617, 7794,       1621, 7795,       1621,
+    7796,       1625, 7797,       1625, 7798,       1629,
+    7799,       1629, 7800,       1633,  // NOLINT
+    7801,       1633, 7802,       1637, 7803,       1637,
+    7804,       1641, 7805,       1641, 7806,       1645,
+    7807,       1645, 7808,       1649,  // NOLINT
+    7809,       1649, 7810,       1653, 7811,       1653,
+    7812,       1657, 7813,       1657, 7814,       1661,
+    7815,       1661, 7816,       1665,  // NOLINT
+    7817,       1665, 7818,       1669, 7819,       1669,
+    7820,       1673, 7821,       1673, 7822,       1677,
+    7823,       1677, 7824,       1681,  // NOLINT
+    7825,       1681, 7826,       1685, 7827,       1685,
+    7828,       1689, 7829,       1689, 7835,       1585,
+    7840,       1693, 7841,       1693,  // NOLINT
+    7842,       1697, 7843,       1697, 7844,       1701,
+    7845,       1701, 7846,       1705, 7847,       1705,
+    7848,       1709, 7849,       1709,  // NOLINT
+    7850,       1713, 7851,       1713, 7852,       1717,
+    7853,       1717, 7854,       1721, 7855,       1721,
+    7856,       1725, 7857,       1725,  // NOLINT
+    7858,       1729, 7859,       1729, 7860,       1733,
+    7861,       1733, 7862,       1737, 7863,       1737,
+    7864,       1741, 7865,       1741,  // NOLINT
+    7866,       1745, 7867,       1745, 7868,       1749,
+    7869,       1749, 7870,       1753, 7871,       1753,
+    7872,       1757, 7873,       1757,  // NOLINT
+    7874,       1761, 7875,       1761, 7876,       1765,
+    7877,       1765, 7878,       1769, 7879,       1769,
+    7880,       1773, 7881,       1773,  // NOLINT
+    7882,       1777, 7883,       1777, 7884,       1781,
+    7885,       1781, 7886,       1785, 7887,       1785,
+    7888,       1789, 7889,       1789,  // NOLINT
+    7890,       1793, 7891,       1793, 7892,       1797,
+    7893,       1797, 7894,       1801, 7895,       1801,
+    7896,       1805, 7897,       1805,  // NOLINT
+    7898,       1809, 7899,       1809, 7900,       1813,
+    7901,       1813, 7902,       1817, 7903,       1817,
+    7904,       1821, 7905,       1821,  // NOLINT
+    7906,       1825, 7907,       1825, 7908,       1829,
+    7909,       1829, 7910,       1833, 7911,       1833,
+    7912,       1837, 7913,       1837,  // NOLINT
+    7914,       1841, 7915,       1841, 7916,       1845,
+    7917,       1845, 7918,       1849, 7919,       1849,
+    7920,       1853, 7921,       1853,  // NOLINT
+    7922,       1857, 7923,       1857, 7924,       1861,
+    7925,       1861, 7926,       1865, 7927,       1865,
+    7928,       1869, 7929,       1869,  // NOLINT
+    7930,       1873, 7931,       1873, 7932,       1877,
+    7933,       1877, 7934,       1881, 7935,       1881,
+    1073749760, 1885, 7943,       1889,  // NOLINT
+    1073749768, 1885, 7951,       1889, 1073749776, 1893,
+    7957,       1897, 1073749784, 1893, 7965,       1897,
+    1073749792, 1901, 7975,       1905,  // NOLINT
+    1073749800, 1901, 7983,       1905, 1073749808, 1909,
+    7991,       1913, 1073749816, 1909, 7999,       1913,
+    1073749824, 1917, 8005,       1921,  // NOLINT
+    1073749832, 1917, 8013,       1921, 8017,       1925,
+    8019,       1929, 8021,       1933, 8023,       1937,
+    8025,       1925, 8027,       1929,  // NOLINT
+    8029,       1933, 8031,       1937, 1073749856, 1941,
+    8039,       1945, 1073749864, 1941, 8047,       1945,
+    1073749872, 1949, 8049,       1953,  // NOLINT
+    1073749874, 1957, 8053,       1961, 1073749878, 1965,
+    8055,       1969, 1073749880, 1973, 8057,       1977,
+    1073749882, 1981, 8059,       1985,  // NOLINT
+    1073749884, 1989, 8061,       1993, 1073749936, 1997,
+    8113,       2001, 1073749944, 1997, 8121,       2001,
+    1073749946, 1949, 8123,       1953,  // NOLINT
+    8126,       749,  1073749960, 1957, 8139,       1961,
+    1073749968, 2005, 8145,       2009, 1073749976, 2005,
+    8153,       2009, 1073749978, 1965,  // NOLINT
+    8155,       1969, 1073749984, 2013, 8161,       2017,
+    8165,       2021, 1073749992, 2013, 8169,       2017,
+    1073749994, 1981, 8171,       1985,  // NOLINT
+    8172,       2021, 1073750008, 1973, 8185,       1977,
+    1073750010, 1989, 8187,       1993};                              // NOLINT
+static const uint16_t kEcma262UnCanonicalizeMultiStrings0Size = 507;  // NOLINT
+static const MultiCharacterSpecialCase<2> kEcma262UnCanonicalizeMultiStrings1[83] = {  // NOLINT
+  {{8498, 8526}}, {{8544, 8560}}, {{8559, 8575}}, {{8579, 8580}},  // NOLINT
+  {{9398, 9424}}, {{9423, 9449}}, {{11264, 11312}}, {{11310, 11358}},  // NOLINT
+  {{11360, 11361}}, {{619, 11362}}, {{7549, 11363}}, {{637, 11364}},  // NOLINT
+  {{570, 11365}}, {{574, 11366}}, {{11367, 11368}}, {{11369, 11370}},  // NOLINT
+  {{11371, 11372}}, {{593, 11373}}, {{625, 11374}}, {{592, 11375}},  // NOLINT
+  {{594, 11376}}, {{11378, 11379}}, {{11381, 11382}}, {{575, 11390}},  // NOLINT
+  {{576, 11391}}, {{11392, 11393}}, {{11394, 11395}}, {{11396, 11397}},  // NOLINT
+  {{11398, 11399}}, {{11400, 11401}}, {{11402, 11403}}, {{11404, 11405}},  // NOLINT
+  {{11406, 11407}}, {{11408, 11409}}, {{11410, 11411}}, {{11412, 11413}},  // NOLINT
+  {{11414, 11415}}, {{11416, 11417}}, {{11418, 11419}}, {{11420, 11421}},  // NOLINT
+  {{11422, 11423}}, {{11424, 11425}}, {{11426, 11427}}, {{11428, 11429}},  // NOLINT
+  {{11430, 11431}}, {{11432, 11433}}, {{11434, 11435}}, {{11436, 11437}},  // NOLINT
+  {{11438, 11439}}, {{11440, 11441}}, {{11442, 11443}}, {{11444, 11445}},  // NOLINT
+  {{11446, 11447}}, {{11448, 11449}}, {{11450, 11451}}, {{11452, 11453}},  // NOLINT
+  {{11454, 11455}}, {{11456, 11457}}, {{11458, 11459}}, {{11460, 11461}},  // NOLINT
+  {{11462, 11463}}, {{11464, 11465}}, {{11466, 11467}}, {{11468, 11469}},  // NOLINT
+  {{11470, 11471}}, {{11472, 11473}}, {{11474, 11475}}, {{11476, 11477}},  // NOLINT
+  {{11478, 11479}}, {{11480, 11481}}, {{11482, 11483}}, {{11484, 11485}},  // NOLINT
+  {{11486, 11487}}, {{11488, 11489}}, {{11490, 11491}}, {{11499, 11500}},  // NOLINT
+  {{11501, 11502}}, {{11506, 11507}}, {{4256, 11520}}, {{4293, 11557}},  // NOLINT
+  {{4295, 11559}}, {{4301, 11565}}, {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262UnCanonicalizeTable1Size = 149;  // NOLINT
+static const int32_t kEcma262UnCanonicalizeTable1[298] = {
+  306, 1, 334, 1, 1073742176, 5, 367, 9, 1073742192, 5, 383, 9, 387, 13, 388, 13,  // NOLINT
+  1073743030, 17, 1231, 21, 1073743056, 17, 1257, 21, 1073744896, 25, 3118, 29, 1073744944, 25, 3166, 29,  // NOLINT
+  3168, 33, 3169, 33, 3170, 37, 3171, 41, 3172, 45, 3173, 49, 3174, 53, 3175, 57,  // NOLINT
+  3176, 57, 3177, 61, 3178, 61, 3179, 65, 3180, 65, 3181, 69, 3182, 73, 3183, 77,  // NOLINT
+  3184, 81, 3186, 85, 3187, 85, 3189, 89, 3190, 89, 1073745022, 93, 3199, 97, 3200, 101,  // NOLINT
+  3201, 101, 3202, 105, 3203, 105, 3204, 109, 3205, 109, 3206, 113, 3207, 113, 3208, 117,  // NOLINT
+  3209, 117, 3210, 121, 3211, 121, 3212, 125, 3213, 125, 3214, 129, 3215, 129, 3216, 133,  // NOLINT
+  3217, 133, 3218, 137, 3219, 137, 3220, 141, 3221, 141, 3222, 145, 3223, 145, 3224, 149,  // NOLINT
+  3225, 149, 3226, 153, 3227, 153, 3228, 157, 3229, 157, 3230, 161, 3231, 161, 3232, 165,  // NOLINT
+  3233, 165, 3234, 169, 3235, 169, 3236, 173, 3237, 173, 3238, 177, 3239, 177, 3240, 181,  // NOLINT
+  3241, 181, 3242, 185, 3243, 185, 3244, 189, 3245, 189, 3246, 193, 3247, 193, 3248, 197,  // NOLINT
+  3249, 197, 3250, 201, 3251, 201, 3252, 205, 3253, 205, 3254, 209, 3255, 209, 3256, 213,  // NOLINT
+  3257, 213, 3258, 217, 3259, 217, 3260, 221, 3261, 221, 3262, 225, 3263, 225, 3264, 229,  // NOLINT
+  3265, 229, 3266, 233, 3267, 233, 3268, 237, 3269, 237, 3270, 241, 3271, 241, 3272, 245,  // NOLINT
+  3273, 245, 3274, 249, 3275, 249, 3276, 253, 3277, 253, 3278, 257, 3279, 257, 3280, 261,  // NOLINT
+  3281, 261, 3282, 265, 3283, 265, 3284, 269, 3285, 269, 3286, 273, 3287, 273, 3288, 277,  // NOLINT
+  3289, 277, 3290, 281, 3291, 281, 3292, 285, 3293, 285, 3294, 289, 3295, 289, 3296, 293,  // NOLINT
+  3297, 293, 3298, 297, 3299, 297, 3307, 301, 3308, 301, 3309, 305, 3310, 305, 3314, 309,  // NOLINT
+  3315, 309, 1073745152, 313, 3365, 317, 3367, 321, 3373, 325 };  // NOLINT
+static const uint16_t kEcma262UnCanonicalizeMultiStrings1Size = 83;  // NOLINT
+static const MultiCharacterSpecialCase<2>
+    kEcma262UnCanonicalizeMultiStrings5[104] = {  // NOLINT
+        {{42560, 42561}},
+        {{42562, 42563}},
+        {{42564, 42565}},
+        {{42566, 42567}},  // NOLINT
+        {{42568, 42569}},
+        {{42570, 42571}},
+        {{42572, 42573}},
+        {{42574, 42575}},  // NOLINT
+        {{42576, 42577}},
+        {{42578, 42579}},
+        {{42580, 42581}},
+        {{42582, 42583}},  // NOLINT
+        {{42584, 42585}},
+        {{42586, 42587}},
+        {{42588, 42589}},
+        {{42590, 42591}},  // NOLINT
+        {{42592, 42593}},
+        {{42594, 42595}},
+        {{42596, 42597}},
+        {{42598, 42599}},  // NOLINT
+        {{42600, 42601}},
+        {{42602, 42603}},
+        {{42604, 42605}},
+        {{42624, 42625}},  // NOLINT
+        {{42626, 42627}},
+        {{42628, 42629}},
+        {{42630, 42631}},
+        {{42632, 42633}},  // NOLINT
+        {{42634, 42635}},
+        {{42636, 42637}},
+        {{42638, 42639}},
+        {{42640, 42641}},  // NOLINT
+        {{42642, 42643}},
+        {{42644, 42645}},
+        {{42646, 42647}},
+        {{42648, 42649}},  // NOLINT
+        {{42650, 42651}},
+        {{42786, 42787}},
+        {{42788, 42789}},
+        {{42790, 42791}},  // NOLINT
+        {{42792, 42793}},
+        {{42794, 42795}},
+        {{42796, 42797}},
+        {{42798, 42799}},  // NOLINT
+        {{42802, 42803}},
+        {{42804, 42805}},
+        {{42806, 42807}},
+        {{42808, 42809}},  // NOLINT
+        {{42810, 42811}},
+        {{42812, 42813}},
+        {{42814, 42815}},
+        {{42816, 42817}},  // NOLINT
+        {{42818, 42819}},
+        {{42820, 42821}},
+        {{42822, 42823}},
+        {{42824, 42825}},  // NOLINT
+        {{42826, 42827}},
+        {{42828, 42829}},
+        {{42830, 42831}},
+        {{42832, 42833}},  // NOLINT
+        {{42834, 42835}},
+        {{42836, 42837}},
+        {{42838, 42839}},
+        {{42840, 42841}},  // NOLINT
+        {{42842, 42843}},
+        {{42844, 42845}},
+        {{42846, 42847}},
+        {{42848, 42849}},  // NOLINT
+        {{42850, 42851}},
+        {{42852, 42853}},
+        {{42854, 42855}},
+        {{42856, 42857}},  // NOLINT
+        {{42858, 42859}},
+        {{42860, 42861}},
+        {{42862, 42863}},
+        {{42873, 42874}},  // NOLINT
+        {{42875, 42876}},
+        {{7545, 42877}},
+        {{42878, 42879}},
+        {{42880, 42881}},  // NOLINT
+        {{42882, 42883}},
+        {{42884, 42885}},
+        {{42886, 42887}},
+        {{42891, 42892}},  // NOLINT
+        {{613, 42893}},
+        {{42896, 42897}},
+        {{42898, 42899}},
+        {{42902, 42903}},  // NOLINT
+        {{42904, 42905}},
+        {{42906, 42907}},
+        {{42908, 42909}},
+        {{42910, 42911}},  // NOLINT
+        {{42912, 42913}},
+        {{42914, 42915}},
+        {{42916, 42917}},
+        {{42918, 42919}},  // NOLINT
+        {{42920, 42921}},
+        {{614, 42922}},
+        {{604, 42923}},
+        {{609, 42924}},  // NOLINT
+        {{620, 42925}},
+        {{670, 42928}},
+        {{647, 42929}},
+        {{kSentinel}}};                                        // NOLINT
+static const uint16_t kEcma262UnCanonicalizeTable5Size = 198;  // NOLINT
+static const int32_t kEcma262UnCanonicalizeTable5
+    [396] = {1600, 1,   1601, 1,   1602, 5,   1603, 5,
+             1604, 9,   1605, 9,   1606, 13,  1607, 13,  // NOLINT
+             1608, 17,  1609, 17,  1610, 21,  1611, 21,
+             1612, 25,  1613, 25,  1614, 29,  1615, 29,  // NOLINT
+             1616, 33,  1617, 33,  1618, 37,  1619, 37,
+             1620, 41,  1621, 41,  1622, 45,  1623, 45,  // NOLINT
+             1624, 49,  1625, 49,  1626, 53,  1627, 53,
+             1628, 57,  1629, 57,  1630, 61,  1631, 61,  // NOLINT
+             1632, 65,  1633, 65,  1634, 69,  1635, 69,
+             1636, 73,  1637, 73,  1638, 77,  1639, 77,  // NOLINT
+             1640, 81,  1641, 81,  1642, 85,  1643, 85,
+             1644, 89,  1645, 89,  1664, 93,  1665, 93,  // NOLINT
+             1666, 97,  1667, 97,  1668, 101, 1669, 101,
+             1670, 105, 1671, 105, 1672, 109, 1673, 109,  // NOLINT
+             1674, 113, 1675, 113, 1676, 117, 1677, 117,
+             1678, 121, 1679, 121, 1680, 125, 1681, 125,  // NOLINT
+             1682, 129, 1683, 129, 1684, 133, 1685, 133,
+             1686, 137, 1687, 137, 1688, 141, 1689, 141,  // NOLINT
+             1690, 145, 1691, 145, 1826, 149, 1827, 149,
+             1828, 153, 1829, 153, 1830, 157, 1831, 157,  // NOLINT
+             1832, 161, 1833, 161, 1834, 165, 1835, 165,
+             1836, 169, 1837, 169, 1838, 173, 1839, 173,  // NOLINT
+             1842, 177, 1843, 177, 1844, 181, 1845, 181,
+             1846, 185, 1847, 185, 1848, 189, 1849, 189,  // NOLINT
+             1850, 193, 1851, 193, 1852, 197, 1853, 197,
+             1854, 201, 1855, 201, 1856, 205, 1857, 205,  // NOLINT
+             1858, 209, 1859, 209, 1860, 213, 1861, 213,
+             1862, 217, 1863, 217, 1864, 221, 1865, 221,  // NOLINT
+             1866, 225, 1867, 225, 1868, 229, 1869, 229,
+             1870, 233, 1871, 233, 1872, 237, 1873, 237,  // NOLINT
+             1874, 241, 1875, 241, 1876, 245, 1877, 245,
+             1878, 249, 1879, 249, 1880, 253, 1881, 253,  // NOLINT
+             1882, 257, 1883, 257, 1884, 261, 1885, 261,
+             1886, 265, 1887, 265, 1888, 269, 1889, 269,  // NOLINT
+             1890, 273, 1891, 273, 1892, 277, 1893, 277,
+             1894, 281, 1895, 281, 1896, 285, 1897, 285,  // NOLINT
+             1898, 289, 1899, 289, 1900, 293, 1901, 293,
+             1902, 297, 1903, 297, 1913, 301, 1914, 301,  // NOLINT
+             1915, 305, 1916, 305, 1917, 309, 1918, 313,
+             1919, 313, 1920, 317, 1921, 317, 1922, 321,  // NOLINT
+             1923, 321, 1924, 325, 1925, 325, 1926, 329,
+             1927, 329, 1931, 333, 1932, 333, 1933, 337,  // NOLINT
+             1936, 341, 1937, 341, 1938, 345, 1939, 345,
+             1942, 349, 1943, 349, 1944, 353, 1945, 353,  // NOLINT
+             1946, 357, 1947, 357, 1948, 361, 1949, 361,
+             1950, 365, 1951, 365, 1952, 369, 1953, 369,  // NOLINT
+             1954, 373, 1955, 373, 1956, 377, 1957, 377,
+             1958, 381, 1959, 381, 1960, 385, 1961, 385,  // NOLINT
+             1962, 389, 1963, 393, 1964, 397, 1965, 401,
+             1968, 405, 1969, 409};                                   // NOLINT
+static const uint16_t kEcma262UnCanonicalizeMultiStrings5Size = 104;  // NOLINT
+static const MultiCharacterSpecialCase<2> kEcma262UnCanonicalizeMultiStrings7[3] = {  // NOLINT
+  {{65313, 65345}}, {{65338, 65370}}, {{kSentinel}} }; // NOLINT
+static const uint16_t kEcma262UnCanonicalizeTable7Size = 4;  // NOLINT
+static const int32_t kEcma262UnCanonicalizeTable7[8] = {
+  1073749793, 1, 7994, 5, 1073749825, 1, 8026, 5 };  // NOLINT
+static const uint16_t kEcma262UnCanonicalizeMultiStrings7Size = 3;  // NOLINT
+int Ecma262UnCanonicalize::Convert(uchar c,
+                      uchar n,
+                      uchar* result,
+                      bool* allow_caching_ptr) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupMapping<true>(kEcma262UnCanonicalizeTable0,
+                                           kEcma262UnCanonicalizeTable0Size,
+                                           kEcma262UnCanonicalizeMultiStrings0,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 1: return LookupMapping<true>(kEcma262UnCanonicalizeTable1,
+                                           kEcma262UnCanonicalizeTable1Size,
+                                           kEcma262UnCanonicalizeMultiStrings1,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 5: return LookupMapping<true>(kEcma262UnCanonicalizeTable5,
+                                           kEcma262UnCanonicalizeTable5Size,
+                                           kEcma262UnCanonicalizeMultiStrings5,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 7: return LookupMapping<true>(kEcma262UnCanonicalizeTable7,
+                                           kEcma262UnCanonicalizeTable7Size,
+                                           kEcma262UnCanonicalizeMultiStrings7,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    default: return 0;
+  }
+}
+
+static const MultiCharacterSpecialCase<1> kCanonicalizationRangeMultiStrings0[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kCanonicalizationRangeTable0Size = 70;  // NOLINT
+static const int32_t kCanonicalizationRangeTable0[140] = {
+  1073741889, 100, 90, 0, 1073741921, 100, 122, 0, 1073742016, 88, 214, 0, 1073742040, 24, 222, 0,  // NOLINT
+  1073742048, 88, 246, 0, 1073742072, 24, 254, 0, 1073742715, 8, 893, 0, 1073742728, 8, 906, 0,  // NOLINT
+  1073742749, 8, 927, 0, 1073742759, 16, 939, 0, 1073742765, 8, 943, 0, 1073742781, 8, 959, 0,  // NOLINT
+  1073742791, 16, 971, 0, 1073742845, 8, 1023, 0, 1073742848, 60, 1039, 0, 1073742864, 124, 1071, 0,  // NOLINT
+  1073742896, 124, 1103, 0, 1073742928, 60, 1119, 0, 1073743153, 148, 1366, 0, 1073743201, 148, 1414, 0,  // NOLINT
+  1073746080, 148, 4293, 0, 1073749760, 28, 7943, 0, 1073749768, 28, 7951, 0, 1073749776, 20, 7957, 0,  // NOLINT
+  1073749784, 20, 7965, 0, 1073749792, 28, 7975, 0, 1073749800, 28, 7983, 0, 1073749808, 28, 7991, 0,  // NOLINT
+  1073749816, 28, 7999, 0, 1073749824, 20, 8005, 0, 1073749832, 20, 8013, 0, 1073749856, 28, 8039, 0,  // NOLINT
+  1073749864, 28, 8047, 0, 1073749874, 12, 8053, 0, 1073749960, 12, 8139, 0 };  // NOLINT
+static const uint16_t kCanonicalizationRangeMultiStrings0Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kCanonicalizationRangeMultiStrings1[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kCanonicalizationRangeTable1Size = 14;  // NOLINT
+static const int32_t kCanonicalizationRangeTable1[28] = {
+  1073742176, 60, 367, 0, 1073742192, 60, 383, 0, 1073743030, 100, 1231, 0, 1073743056, 100, 1257, 0,  // NOLINT
+  1073744896, 184, 3118, 0, 1073744944, 184, 3166, 0, 1073745152, 148, 3365, 0 };  // NOLINT
+static const uint16_t kCanonicalizationRangeMultiStrings1Size = 1;  // NOLINT
+static const MultiCharacterSpecialCase<1> kCanonicalizationRangeMultiStrings7[1] = {  // NOLINT
+  {{kSentinel}} }; // NOLINT
+static const uint16_t kCanonicalizationRangeTable7Size = 4;  // NOLINT
+static const int32_t kCanonicalizationRangeTable7[8] = {
+  1073749793, 100, 7994, 0, 1073749825, 100, 8026, 0 };  // NOLINT
+static const uint16_t kCanonicalizationRangeMultiStrings7Size = 1;  // NOLINT
+int CanonicalizationRange::Convert(uchar c,
+                      uchar n,
+                      uchar* result,
+                      bool* allow_caching_ptr) {
+  int chunk_index = c >> 13;
+  switch (chunk_index) {
+    case 0: return LookupMapping<false>(kCanonicalizationRangeTable0,
+                                           kCanonicalizationRangeTable0Size,
+                                           kCanonicalizationRangeMultiStrings0,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 1: return LookupMapping<false>(kCanonicalizationRangeTable1,
+                                           kCanonicalizationRangeTable1Size,
+                                           kCanonicalizationRangeMultiStrings1,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    case 7: return LookupMapping<false>(kCanonicalizationRangeTable7,
+                                           kCanonicalizationRangeTable7Size,
+                                           kCanonicalizationRangeMultiStrings7,
+                                           c,
+                                           n,
+                                           result,
+                                           allow_caching_ptr);
+    default: return 0;
+  }
+}
+
+
+const uchar UnicodeData::kMaxCodePoint = 65533;
+
+int UnicodeData::GetByteCount() {
+  return kUppercaseTable0Size * sizeof(int32_t)         // NOLINT
+         + kUppercaseTable1Size * sizeof(int32_t)       // NOLINT
+         + kUppercaseTable5Size * sizeof(int32_t)       // NOLINT
+         + kUppercaseTable7Size * sizeof(int32_t)       // NOLINT
+         + kLowercaseTable0Size * sizeof(int32_t)       // NOLINT
+         + kLowercaseTable1Size * sizeof(int32_t)       // NOLINT
+         + kLowercaseTable5Size * sizeof(int32_t)       // NOLINT
+         + kLowercaseTable7Size * sizeof(int32_t)       // NOLINT
+         + kLetterTable0Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable1Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable2Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable3Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable4Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable5Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable6Size * sizeof(int32_t)          // NOLINT
+         + kLetterTable7Size * sizeof(int32_t)          // NOLINT
+         + kID_StartTable0Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable1Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable2Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable3Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable4Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable5Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable6Size * sizeof(int32_t)        // NOLINT
+         + kID_StartTable7Size * sizeof(int32_t)        // NOLINT
+         + kID_ContinueTable0Size * sizeof(int32_t)     // NOLINT
+         + kID_ContinueTable1Size * sizeof(int32_t)     // NOLINT
+         + kID_ContinueTable5Size * sizeof(int32_t)     // NOLINT
+         + kID_ContinueTable7Size * sizeof(int32_t)     // NOLINT
+         + kWhiteSpaceTable0Size * sizeof(int32_t)      // NOLINT
+         + kWhiteSpaceTable1Size * sizeof(int32_t)      // NOLINT
+         + kWhiteSpaceTable7Size * sizeof(int32_t)      // NOLINT
+         + kLineTerminatorTable0Size * sizeof(int32_t)  // NOLINT
+         + kLineTerminatorTable1Size * sizeof(int32_t)  // NOLINT
+         +
+         kToLowercaseMultiStrings0Size *
+             sizeof(MultiCharacterSpecialCase<2>)  // NOLINT
+         +
+         kToLowercaseMultiStrings1Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kToLowercaseMultiStrings5Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kToLowercaseMultiStrings7Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kToUppercaseMultiStrings0Size *
+             sizeof(MultiCharacterSpecialCase<3>)  // NOLINT
+         +
+         kToUppercaseMultiStrings1Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kToUppercaseMultiStrings5Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kToUppercaseMultiStrings7Size *
+             sizeof(MultiCharacterSpecialCase<3>)  // NOLINT
+         +
+         kEcma262CanonicalizeMultiStrings0Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kEcma262CanonicalizeMultiStrings1Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kEcma262CanonicalizeMultiStrings5Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kEcma262CanonicalizeMultiStrings7Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kEcma262UnCanonicalizeMultiStrings0Size *
+             sizeof(MultiCharacterSpecialCase<4>)  // NOLINT
+         +
+         kEcma262UnCanonicalizeMultiStrings1Size *
+             sizeof(MultiCharacterSpecialCase<2>)  // NOLINT
+         +
+         kEcma262UnCanonicalizeMultiStrings5Size *
+             sizeof(MultiCharacterSpecialCase<2>)  // NOLINT
+         +
+         kEcma262UnCanonicalizeMultiStrings7Size *
+             sizeof(MultiCharacterSpecialCase<2>)  // NOLINT
+         +
+         kCanonicalizationRangeMultiStrings0Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kCanonicalizationRangeMultiStrings1Size *
+             sizeof(MultiCharacterSpecialCase<1>)  // NOLINT
+         +
+         kCanonicalizationRangeMultiStrings7Size *
+             sizeof(MultiCharacterSpecialCase<1>);  // NOLINT
+}
+
+}  // namespace unibrow
diff --git a/runtime/vm/unibrow.h b/runtime/vm/unibrow.h
new file mode 100644
index 0000000..d1f287d
--- /dev/null
+++ b/runtime/vm/unibrow.h
@@ -0,0 +1,76 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_UNIBROW_H_
+#define VM_UNIBROW_H_
+
+#include <sys/types.h>
+
+// SNIP
+
+/**
+ * \file
+ * Definitions and convenience functions for working with unicode.
+ */
+
+namespace unibrow {
+
+// SNIP
+
+// A cache used in case conversion.  It caches the value for characters
+// that either have no mapping or map to a single character independent
+// of context.  Characters that map to more than one character or that
+// map differently depending on context are always looked up.
+template <class T, int size = 256>
+class Mapping {
+ public:
+  inline Mapping() { }
+  inline int get(uchar c, uchar n, uchar* result);
+ private:
+  friend class Test;
+  int CalculateValue(uchar c, uchar n, uchar* result);
+  struct CacheEntry {
+    inline CacheEntry() : code_point_(kNoChar), offset_(0) { }
+    inline CacheEntry(uchar code_point, signed offset)
+      : code_point_(code_point),
+        offset_(offset) { }
+    uchar code_point_;
+    signed offset_;
+    static const int kNoChar = (1 << 21) - 1;
+  };
+  static const int kSize = size;
+  static const int kMask = kSize - 1;
+  CacheEntry entries_[kSize];
+};
+
+// SNIP
+
+struct Letter {
+  static bool Is(uchar c);
+};
+struct Ecma262Canonicalize {
+  static const int kMaxWidth = 1;
+  static int Convert(uchar c,
+                     uchar n,
+                     uchar* result,
+                     bool* allow_caching_ptr);
+};
+struct Ecma262UnCanonicalize {
+  static const int kMaxWidth = 4;
+  static int Convert(uchar c,
+                     uchar n,
+                     uchar* result,
+                     bool* allow_caching_ptr);
+};
+struct CanonicalizationRange {
+  static const int kMaxWidth = 1;
+  static int Convert(uchar c,
+                     uchar n,
+                     uchar* result,
+                     bool* allow_caching_ptr);
+};
+
+}  // namespace unibrow
+
+#endif  // VM_UNIBROW_H_
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 6518b3a..1cb7ccf 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -217,11 +217,14 @@
 
 
 void CodeGenTest::Compile() {
+  if (function_.HasCode()) return;
   ParsedFunction* parsed_function =
       new ParsedFunction(Isolate::Current(), function_);
   parsed_function->SetNodeSequence(node_sequence_);
   parsed_function->set_instantiator(NULL);
   parsed_function->set_default_parameter_values(default_parameter_values_);
+  node_sequence_->scope()->AddVariable(
+      parsed_function->current_context_var());
   parsed_function->EnsureExpressionTemp();
   node_sequence_->scope()->AddVariable(parsed_function->expression_temp_var());
   parsed_function->AllocateVariables();
@@ -231,19 +234,6 @@
 }
 
 
-LocalVariable* CodeGenTest::CreateTempConstVariable(const char* name_part) {
-  char name[64];
-  OS::SNPrint(name, 64, ":%s", name_part);
-  LocalVariable* temp =
-      new LocalVariable(0,
-                        String::ZoneHandle(Symbols::New(name)),
-                        Type::ZoneHandle(Type::DynamicType()));
-  temp->set_is_final();
-  node_sequence_->scope()->AddVariable(temp);
-  return temp;
-}
-
-
 bool CompilerTest::TestCompileScript(const Library& library,
                                      const Script& script) {
   Isolate* isolate = Isolate::Current();
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 39dfe59..ea4bdd7 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -349,8 +349,6 @@
   // Compile test and set code in function.
   void Compile();
 
-  LocalVariable* CreateTempConstVariable(const char* name_part);
-
  private:
   Function& function_;
   SequenceNode* node_sequence_;
diff --git a/runtime/vm/verified_memory.cc b/runtime/vm/verified_memory.cc
new file mode 100644
index 0000000..a3a3d9e
--- /dev/null
+++ b/runtime/vm/verified_memory.cc
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, 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.
+
+#include "vm/verified_memory.h"
+
+namespace dart {
+
+#if defined(DEBUG)
+
+DEFINE_FLAG(bool, verified_mem, false,
+            "Enable write-barrier verification mode (slow, DEBUG only).");
+DEFINE_FLAG(int, verified_mem_max_reserve_mb, (kWordSize <= 4) ? 16 : 32,
+            "When verified_mem is true, largest supported reservation (MB).");
+
+
+VirtualMemory* VerifiedMemory::ReserveInternal(intptr_t size) {
+  if (size > offset()) {
+    FATAL1("Requested reservation of %" Pd " bytes exceeds the limit. "
+           "Use --verified_mem_max_reserve_mb to increase it.", size);
+  }
+  VirtualMemory* result = VirtualMemory::Reserve(size + offset());
+  if (result != NULL) {
+    // Commit the offset part of the reservation (writable, not executable).
+    result->Commit(result->start() + offset(), size, /* executable = */ false);
+    // Truncate without unmapping, so that the returned object looks like
+    // a normal 'size' bytes reservation (but VirtualMemory will correctly
+    // unmap the entire original reservation on destruction).
+    result->Truncate(size, /* try_unmap = */ false);
+  }
+  return result;
+}
+
+#endif  // DEBUG
+
+}  // namespace dart
diff --git a/runtime/vm/verified_memory.h b/runtime/vm/verified_memory.h
new file mode 100644
index 0000000..45c50e4
--- /dev/null
+++ b/runtime/vm/verified_memory.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014, 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.
+
+#ifndef VM_VERIFIED_MEMORY_H_
+#define VM_VERIFIED_MEMORY_H_
+
+#include "vm/allocation.h"
+#include "vm/flags.h"
+#include "vm/virtual_memory.h"
+
+namespace dart {
+
+#if defined(DEBUG)
+DECLARE_FLAG(bool, verified_mem);
+DECLARE_FLAG(int, verified_mem_max_reserve_mb);
+#endif
+
+
+// A wrapper around VirtualMemory for verifying that a particular class of
+// memory writes are only performed through a particular interface.
+//
+// The main use case is verifying that storing pointers into objects is only
+// performed by code aware of the GC write barrier.
+//
+// NOTE: Verification is enabled only if 'verified_mem' is true, and this flag
+// only exists in DEBUG builds.
+class VerifiedMemory : public AllStatic {
+ public:
+  // Reserves a block of memory for which all methods in this class may
+  // be called. Returns NULL if out of memory.
+  static VirtualMemory* Reserve(intptr_t size) {
+    return enabled() ? ReserveInternal(size) : VirtualMemory::Reserve(size);
+  }
+
+  // Verifies that [start, start + size) has only been mutated through
+  // methods in this class (or explicitly accepted by calling Accept).
+  static void Verify(uword start, intptr_t size) {
+    if (!enabled()) return;
+    ASSERT(size <= offset());
+    ASSERT(memcmp(reinterpret_cast<void*>(start + offset()),
+                  reinterpret_cast<void*>(start),
+                  size) == 0);
+  }
+
+  // Assigns value to *ptr after verifying previous content at that location.
+  template<typename T>
+  static void Write(T* ptr, const T& value) {
+    if (enabled()) {
+      uword addr = reinterpret_cast<uword>(ptr);
+      Verify(addr, sizeof(T));
+      T* offset_ptr = reinterpret_cast<T*>(addr + offset());
+      *offset_ptr = value;
+    }
+    *ptr = value;
+  }
+
+  // Accepts the current state of [start, start + size), even if it has been
+  // mutated by other means.
+  static void Accept(uword start, intptr_t size) {
+    if (!enabled()) return;
+    ASSERT(size <= offset());
+    memmove(reinterpret_cast<void*>(start + offset()),
+            reinterpret_cast<void*>(start),
+            size);
+  }
+
+ private:
+#if defined(DEBUG)
+  static bool enabled() { return FLAG_verified_mem; }
+  static intptr_t offset() { return FLAG_verified_mem_max_reserve_mb * MB; }
+  static VirtualMemory* ReserveInternal(intptr_t size);
+#else
+  // In release mode, most code in this class is optimized away.
+  static bool enabled() { return false; }
+  static intptr_t offset() { UNREACHABLE(); return -1; }
+  static VirtualMemory* ReserveInternal(intptr_t size) {
+    UNREACHABLE();
+    return NULL;
+  }
+#endif
+
+  friend class Assembler;  // To use enabled/offset when generating code.
+};
+
+}  // namespace dart
+
+#endif  // VM_VERIFIED_MEMORY_H_
diff --git a/runtime/vm/verified_memory_test.cc b/runtime/vm/verified_memory_test.cc
new file mode 100644
index 0000000..681228d
--- /dev/null
+++ b/runtime/vm/verified_memory_test.cc
@@ -0,0 +1,85 @@
+// Copyright (c) 2014, 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.
+
+#include "platform/assert.h"
+#include "vm/unit_test.h"
+#include "vm/verified_memory.h"
+
+namespace dart {
+
+void Init() {
+#if defined(DEBUG)
+  FLAG_verified_mem = true;
+#endif
+}
+
+
+UNIT_TEST_CASE(VerifiedMemoryBasic) {
+  Init();
+  const intptr_t kReservationSize = 64 * KB;
+  VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize);
+  EXPECT_EQ(kReservationSize, vm->size());
+  vm->Commit(false);
+  double* addr = reinterpret_cast<double*>(vm->address());
+  VerifiedMemory::Write(&addr[0], 0.5);
+  EXPECT_EQ(0.5, addr[0]);
+  VerifiedMemory::Write(&addr[1], 1.5);
+  VerifiedMemory::Write(&addr[2], 2.5);
+  VerifiedMemory::Write(&addr[0], 0.25);
+  static const double kNaN = NAN;
+  VerifiedMemory::Write(&addr[0], kNaN);  // Bitwise comparison should be used.
+  VerifiedMemory::Write(&addr[0], 0.5);
+  int64_t* unverified = reinterpret_cast<int64_t*>(&addr[3]);
+  *unverified = 123;
+  VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double));
+}
+
+
+UNIT_TEST_CASE(VerifiedMemoryAccept) {
+  Init();
+  const intptr_t kReservationSize = 64 * KB;
+  VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize);
+  EXPECT_EQ(kReservationSize, vm->size());
+  vm->Commit(false);
+  double* addr = reinterpret_cast<double*>(vm->address());
+  VerifiedMemory::Write(&addr[0], 0.5);
+  VerifiedMemory::Write(&addr[1], 1.5);
+  VerifiedMemory::Write(&addr[2], 2.5);
+  VerifiedMemory::Write(&addr[0], 0.25);
+  // Unverified write followed by Accept ("I know what I'm doing").
+  memset(addr, 0xf3, 2 * sizeof(double));
+  VerifiedMemory::Accept(reinterpret_cast<uword>(addr), 2 * sizeof(double));
+  VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double));
+}
+
+
+// Negative tests below.
+
+UNIT_TEST_CASE(VerifyImplicit_Crash) {
+  Init();
+  const intptr_t kReservationSize = 64 * KB;
+  VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize);
+  EXPECT_EQ(kReservationSize, vm->size());
+  vm->Commit(false);
+  double* addr = reinterpret_cast<double*>(vm->address());
+  addr[0] = 0.5;  // Forget to use Write.
+  VerifiedMemory::Write(&addr[0], 1.5);
+}
+
+
+UNIT_TEST_CASE(VerifyExplicit_Crash) {
+  Init();
+  const intptr_t kReservationSize = 64 * KB;
+  VirtualMemory* vm = VerifiedMemory::Reserve(kReservationSize);
+  EXPECT_EQ(kReservationSize, vm->size());
+  vm->Commit(false);
+  double* addr = reinterpret_cast<double*>(vm->address());
+  VerifiedMemory::Write(&addr[0], 0.5);
+  VerifiedMemory::Write(&addr[1], 1.5);
+  addr[1] = 3.5;  // Forget to use Write.
+  VerifiedMemory::Write(&addr[2], 2.5);
+  VerifiedMemory::Verify(reinterpret_cast<uword>(addr), 3 * sizeof(double));
+}
+
+}  // namespace dart
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 4f39c80..7909a6e 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -60,9 +60,14 @@
 
   static bool InSamePage(uword address0, uword address1);
 
-  // Truncate this virtual memory segment.
+  // Truncate this virtual memory segment. If try_unmap is false, the
+  // memory beyond the new end is still accessible, but will be returned
+  // upon destruction.
   void Truncate(intptr_t new_size, bool try_unmap = true);
 
+  // Commit a reserved memory area, so that the memory can be accessed.
+  bool Commit(uword addr, intptr_t size, bool is_executable);
+
  private:
   static VirtualMemory* ReserveInternal(intptr_t size);
 
@@ -76,9 +81,6 @@
       region_(region.pointer(), region.size()),
       reserved_size_(region.size()) { }
 
-  // Commit a reserved memory area, so that the memory can be accessed.
-  bool Commit(uword addr, intptr_t size, bool is_executable);
-
   MemoryRegion region_;
 
   // The size of the underlying reservation not yet given back to the OS.
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index a490cdd..241b95e 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -436,6 +436,9 @@
     'unit_test.cc',
     'unit_test.h',
     'utils_test.cc',
+    'verified_memory.cc',
+    'verified_memory.h',
+    'verified_memory_test.cc',
     'verifier.cc',
     'verifier.h',
     'virtual_memory.cc',
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 5670d49..fdabf68 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -77,7 +77,8 @@
             hasIncrementalSupport:
                 forceIncrementalSupport ||
                 hasOption(options, '--incremental-support'),
-            suppressWarnings: hasOption(options, '--suppress-warnings')) {
+            suppressWarnings: hasOption(options, '--suppress-warnings'),
+            enableAsyncAwait: hasOption(options, '--enable-async')) {
     tasks.addAll([
         userHandlerTask = new leg.GenericTask('Diagnostic handler', this),
         userProviderTask = new leg.GenericTask('Input provider', this),
@@ -88,6 +89,10 @@
     if (packageRoot != null && !packageRoot.path.endsWith("/")) {
       throw new ArgumentError("packageRoot must end with a /");
     }
+    if (enableAsyncAwait && !analyzeOnly) {
+      throw new ArgumentError(
+          "--enable-async is currently only supported with --analyze-only");
+    }
   }
 
   static String extractStringOption(List<String> options,
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 589baba..fad4298 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -718,6 +718,9 @@
 
   final bool suppressWarnings;
 
+  /// `true` if async/await features are supported.
+  final bool enableAsyncAwait;
+
   /// If `true`, some values are cached for reuse in incremental compilation.
   /// Incremental compilation is basically calling [run] more than once.
   final bool hasIncrementalSupport;
@@ -761,6 +764,9 @@
   ClassElement symbolClass;
   ClassElement stackTraceClass;
   ClassElement typedDataClass;
+  ClassElement futureClass;
+  ClassElement iterableClass;
+  ClassElement streamClass;
 
   /// The constant for the [proxy] variable defined in dart:core.
   ConstantValue proxyConstant;
@@ -958,6 +964,7 @@
             this.useContentSecurityPolicy: false,
             this.suppressWarnings: false,
             bool hasIncrementalSupport: false,
+            this.enableAsyncAwait: false,
             api.CompilerOutputProvider outputProvider,
             List<String> strips: const []})
       : this.disableTypeInferenceFlag =
@@ -1075,6 +1082,8 @@
       return node;
     } else if (node is Node) {
       return spanFromNode(node);
+    } else if (node is TokenPair) {
+      return spanFromTokens(node.begin, node.end);
     } else if (node is Token) {
       return spanFromTokens(node, node);
     } else if (node is HInstruction) {
@@ -1190,6 +1199,8 @@
       mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed');
     } else if (uri == DART_ASYNC) {
       deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary');
+      futureClass = findRequiredElement(library, 'Future');
+      streamClass = findRequiredElement(library, 'Stream');
     } else if (uri == DART_NATIVE_TYPED_DATA) {
       typedDataClass = findRequiredElement(library, 'NativeTypedData');
     } else if (uri == js_backend.JavaScriptBackend.DART_JS_HELPER) {
@@ -1286,6 +1297,7 @@
     mapClass = lookupCoreClass('Map');
     nullClass = lookupCoreClass('Null');
     stackTraceClass = lookupCoreClass('StackTrace');
+    iterableClass = lookupCoreClass('Iterable');
     symbolClass = lookupCoreClass('Symbol');
     if (!missingCoreClasses.isEmpty) {
       internalError(coreLibrary,
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart
index 7944c03..985cd27 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart
@@ -492,7 +492,7 @@
       setValue(returnValue, updateValue);
     }
 
-    if (node.operator != "is") {
+    if (node.isTypeCast) {
       // TODO(jgruber): Add support for `as` casts.
       setValues(_ConstnessLattice.NonConst);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 5a006dc..d1605c8 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -127,6 +127,9 @@
   }
 }
 
+/// Function for building a node in the context of the current builder.
+typedef ir.Node BuildFunction(node);
+
 /// Function for building nodes in the context of the provided [builder].
 typedef ir.Node SubbuildFunction(IrBuilder builder);
 
@@ -340,7 +343,7 @@
     }
   }
 
-  ir.Primitive continueWithExpression(ir.Expression build(ir.Continuation k)) {
+  ir.Primitive _continueWithExpression(ir.Expression build(ir.Continuation k)) {
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression expression = build(k);
@@ -348,6 +351,30 @@
     return v;
   }
 
+  ir.Primitive _buildInvokeStatic(Element element,
+                                  Selector selector,
+                                  List<ir.Definition> arguments) {
+    assert(isOpen);
+    return _continueWithExpression(
+        (k) => new ir.InvokeStatic(element, selector, k, arguments));
+  }
+
+  ir.Primitive _buildInvokeSuper(Selector selector,
+                                 List<ir.Definition> arguments) {
+    assert(isOpen);
+    return _continueWithExpression(
+        (k) => new ir.InvokeSuperMethod(selector, k, arguments));
+  }
+
+  ir.Primitive _buildInvokeDynamic(ir.Primitive receiver,
+                                   Selector selector,
+                                   List<ir.Definition> arguments) {
+    assert(isOpen);
+    return _continueWithExpression(
+        (k) => new ir.InvokeMethod(receiver, selector, k, arguments));
+  }
+
+
   /// Create a constant literal from [constant].
   ir.Constant buildConstantLiteral(ConstantExpression constant) {
     assert(isOpen);
@@ -387,6 +414,36 @@
         state.constantSystem.createString(new ast.DartString.literal(value)));
   }
 
+  /// Creates a non-constant list literal of the provided [type] and with the
+  /// provided [values].
+  ir.Primitive buildListLiteral(InterfaceType type,
+                                Iterable<ir.Primitive> values) {
+    assert(isOpen);
+    ir.Primitive result = new ir.LiteralList(type, values);
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
+  /// Creates a non-constant map literal of the provided [type] and with the
+  /// entries build from the [keys] and [values] using [build].
+  ir.Primitive buildMapLiteral(InterfaceType type,
+                               Iterable keys,
+                               Iterable values,
+                               BuildFunction build) {
+    assert(isOpen);
+    List<ir.LiteralMapEntry> entries = <ir.LiteralMapEntry>[];
+    Iterator key = keys.iterator;
+    Iterator value = values.iterator;
+    while (key.moveNext() && value.moveNext()) {
+      entries.add(new ir.LiteralMapEntry(
+          build(key.current), build(value.current)));
+    }
+    assert(!key.moveNext() && !value.moveNext());
+    ir.Primitive result = new ir.LiteralMap(type, entries);
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
   /// Creates a conditional expression with the provided [condition] where the
   /// then and else expression are created through the [buildThenExpression] and
   /// [buildElseExpression] functions, respectively.
@@ -437,55 +494,12 @@
 
   }
 
-  /// Create a read access of [local].
-  ir.Primitive buildLocalGet(LocalElement local) {
-    assert(isOpen);
-    if (isClosureVariable(local)) {
-      ir.Primitive result = new ir.GetClosureVariable(local);
-      add(new ir.LetPrim(result));
-      return result;
-    } else {
-      return environment.lookup(local);
-    }
-  }
-
-  /// Create a write access to [local].
-  ir.Primitive buildLocalSet(LocalElement local, ir.Primitive valueToStore) {
-    assert(isOpen);
-    if (isClosureVariable(local)) {
-      add(new ir.SetClosureVariable(local, valueToStore));
-    } else {
-      valueToStore.useElementAsHint(local);
-      environment.update(local, valueToStore);
-    }
-    return valueToStore;
-  }
-
-  /// Create a get access of the static [element].
-  ir.Primitive buildStaticGet(Element element, Selector selector) {
-    assert(isOpen);
-    assert(selector.isGetter);
-    return continueWithExpression(
-        (k) => new ir.InvokeStatic(
-            element, selector, k, const <ir.Definition>[]));
-  }
-
-  /// Create a dynamic get access on [receiver] where the property is defined
-  /// by the getter [selector].
-  ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector) {
-    assert(isOpen);
-    assert(selector.isGetter);
-    return continueWithExpression(
-        (k) => new ir.InvokeMethod(
-            receiver, selector, k, const <ir.Definition>[]));
-  }
-
   /**
    * Add an explicit `return null` for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
    * such as `foo(){ }`.
    */
-  void ensureReturn() {
+  void _ensureReturn() {
     if (!isOpen) return;
     ir.Constant constant = buildNullLiteral();
     add(new ir.InvokeContinuation(state.returnContinuation, [constant]));
@@ -500,7 +514,7 @@
       FunctionElement element,
       List<ConstantExpression> defaults) {
     if (!element.isAbstract) {
-      ensureReturn();
+      _ensureReturn();
       return new ir.FunctionDefinition(
           element, state.returnContinuation, _parameters, _root,
           state.localConstants, defaults);
@@ -516,48 +530,141 @@
   }
 
 
-  /// Create a super invocation with method name and arguments structure defined
-  /// by [selector] and argument values defined by [arguments].
+  /// Create a super invocation where the method name and the argument structure
+  /// are defined by [selector] and the argument values are defined by
+  /// [arguments].
   ir.Primitive buildSuperInvocation(Selector selector,
                                     List<ir.Definition> arguments) {
-    assert(isOpen);
-    return continueWithExpression(
-        (k) => new ir.InvokeSuperMethod(selector, k, arguments));
-
+    return _buildInvokeSuper(selector, arguments);
   }
 
-  /// Create a dynamic invocation on [receiver] with method name and argument
-  /// structure defined by [selector] and argument values defined by
-  /// [arguments].
+  /// Create a getter invocation on the super class where the getter name is
+  /// defined by [selector].
+  ir.Primitive buildSuperGet(Selector selector) {
+    assert(selector.isGetter);
+    return _buildInvokeSuper(selector, const <ir.Definition>[]);
+  }
+
+  /// Create a setter invocation on the super class where the setter name and
+  /// argument are defined by [selector] and [value], respectively.
+  ir.Primitive buildSuperSet(Selector selector, ir.Primitive value) {
+    assert(selector.isSetter);
+    _buildInvokeSuper(selector, <ir.Definition>[value]);
+    return value;
+  }
+
+  /// Create an index set invocation on the super class with the provided
+  /// [index] and [value].
+  ir.Primitive buildSuperIndexSet(ir.Primitive index,
+                                  ir.Primitive value) {
+    _buildInvokeSuper(new Selector.indexSet(), <ir.Definition>[index, value]);
+    return value;
+  }
+
+  /// Create a dynamic invocation on [receiver] where the method name and
+  /// argument structure are defined by [selector] and the argument values are
+  /// defined by [arguments].
   ir.Primitive buildDynamicInvocation(ir.Definition receiver,
                                       Selector selector,
                                       List<ir.Definition> arguments) {
-    assert(isOpen);
-    return continueWithExpression(
-        (k) => new ir.InvokeMethod(receiver, selector, k, arguments));
+    return _buildInvokeDynamic(receiver, selector, arguments);
   }
 
-  /// Create a static invocation of [element] with argument structure defined
-  /// by [selector] and argument values defined by [arguments].
+  /// Create a dynamic getter invocation on [receiver] where the getter name is
+  /// defined by [selector].
+  ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector) {
+    assert(selector.isGetter);
+    return _buildInvokeDynamic(receiver, selector, const <ir.Definition>[]);
+  }
+
+  /// Create a dynamic setter invocation on [receiver] where the setter name and
+  /// argument are defined by [selector] and [value], respectively.
+  ir.Primitive buildDynamicSet(ir.Primitive receiver,
+                               Selector selector,
+                               ir.Primitive value) {
+    assert(selector.isSetter);
+    _buildInvokeDynamic(receiver, selector, <ir.Definition>[value]);
+    return value;
+  }
+
+  /// Create a dynamic index set invocation on [receiver] with the provided
+  /// [index] and [value].
+  ir.Primitive  buildDynamicIndexSet(ir.Primitive receiver,
+                                     ir.Primitive index,
+                                     ir.Primitive value) {
+    _buildInvokeDynamic(
+        receiver, new Selector.indexSet(), <ir.Definition>[index, value]);
+    return value;
+  }
+
+  /// Create a static invocation of [element] where argument structure is
+  /// defined by [selector] and the argument values are defined by [arguments].
   ir.Primitive buildStaticInvocation(Element element,
                                      Selector selector,
                                      List<ir.Definition> arguments) {
-    return continueWithExpression(
-        (k) => new ir.InvokeStatic(element, selector, k, arguments));
+    return _buildInvokeStatic(element, selector, arguments);
   }
 
-  /// Create a constructor invocation of [element] on [type] with argument
-  /// structure defined by [selector] and argument values defined by
-  /// [arguments].
+  /// Create a static getter invocation of [element] where the getter name is
+  /// defined by [selector].
+  ir.Primitive buildStaticGet(Element element, Selector selector) {
+    assert(selector.isGetter);
+    return _buildInvokeStatic(element, selector, const <ir.Definition>[]);
+  }
+
+  /// Create a static setter invocation of [element] where the setter name and
+  /// argument are defined by [selector] and [value], respectively.
+  ir.Primitive buildStaticSet(Element element,
+                              Selector selector,
+                              ir.Primitive value) {
+    assert(selector.isSetter);
+    _buildInvokeStatic(element, selector, <ir.Definition>[value]);
+    return value;
+  }
+
+  /// Create a constructor invocation of [element] on [type] where the
+  /// constructor name and argument structure are defined by [selector] and the
+  /// argument values are defined by [arguments].
   ir.Primitive buildConstructorInvocation(FunctionElement element,
-                                         Selector selector,
-                                         DartType type,
-                                         List<ir.Definition> arguments) {
+                                          Selector selector,
+                                          DartType type,
+                                          List<ir.Definition> arguments) {
     assert(isOpen);
-    return continueWithExpression(
+    return _continueWithExpression(
         (k) => new ir.InvokeConstructor(type, element, selector, k, arguments));
   }
 
+  /// Create a string concatenation of the [arguments].
+  ir.Primitive buildStringConcatenation(List<ir.Definition> arguments) {
+    assert(isOpen);
+    return _continueWithExpression(
+        (k) => new ir.ConcatenateStrings(k, arguments));
+  }
+
+  /// Create a read access of [local].
+  ir.Primitive buildLocalGet(LocalElement local) {
+    assert(isOpen);
+    if (isClosureVariable(local)) {
+      ir.Primitive result = new ir.GetClosureVariable(local);
+      add(new ir.LetPrim(result));
+      return result;
+    } else {
+      return environment.lookup(local);
+    }
+  }
+
+  /// Create a write access to [local] with the provided [value].
+  ir.Primitive buildLocalSet(LocalElement local, ir.Primitive value) {
+    assert(isOpen);
+    if (isClosureVariable(local)) {
+      add(new ir.SetClosureVariable(local, value));
+    } else {
+      value.useElementAsHint(local);
+      environment.update(local, value);
+    }
+    return value;
+  }
+
   /// Creates an if-then-else statement with the provided [condition] where the
   /// then and else branches are created through the [buildThenPart] and
   /// [buildElsePart] functions, respectively.
@@ -777,6 +884,217 @@
     }
   }
 
+  /// Creates a for-in loop, `for (v in e) b`.
+  ///
+  /// [buildExpression] creates the expression, `e`. The variable, `v`, can
+  /// take one of three forms:
+  ///     1) `v` can be declared within the for-in statement, like in
+  ///        `for (var v in e)`, in which case, [buildVariableDeclaration]
+  ///        creates its declaration and [variableElement] is the element for
+  ///        the declared variable,
+  ///     2) `v` is predeclared statically known variable, that is top-level,
+  ///        static, or local variable, in which case [variableElement] is the
+  ///        variable element, and [variableSelector] defines its write access,
+  ///     3) `v` is an instance variable in which case [variableSelector]
+  ///        defines its write access.
+  /// [buildBody] creates the body, `b`, of the loop. The jump [target] is used
+  /// to identify which `break` and `continue` statements that have this for-in
+  /// statement as their target.
+  void buildForIn({SubbuildFunction buildExpression,
+                   SubbuildFunction buildVariableDeclaration,
+                   Element variableElement,
+                   Selector variableSelector,
+                   SubbuildFunction buildBody,
+                   JumpTarget target}) {
+    // The for-in loop
+    //
+    // for (a in e) s;
+    //
+    // Is compiled analogously to:
+    //
+    // a = e.iterator;
+    // while (a.moveNext()) {
+    //   var n0 = a.current;
+    //   s;
+    // }
+
+    // The condition and body are delimited.
+    IrBuilder condBuilder = new IrBuilder.recursive(this);
+
+    ir.Primitive expressionReceiver = buildExpression(this);
+    List<ir.Primitive> emptyArguments = new List<ir.Primitive>();
+
+    ir.Parameter iterator = new ir.Parameter(null);
+    ir.Continuation iteratorInvoked = new ir.Continuation([iterator]);
+    add(new ir.LetCont(iteratorInvoked,
+        new ir.InvokeMethod(expressionReceiver,
+            new Selector.getter("iterator", null), iteratorInvoked,
+            emptyArguments)));
+
+    ir.Parameter condition = new ir.Parameter(null);
+    ir.Continuation moveNextInvoked = new ir.Continuation([condition]);
+    condBuilder.add(new ir.LetCont(moveNextInvoked,
+        new ir.InvokeMethod(iterator,
+            new Selector.call("moveNext", null, 0),
+            moveNextInvoked, emptyArguments)));
+
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    state.breakCollectors.add(breakCollector);
+    state.continueCollectors.add(continueCollector);
+
+    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    if (buildVariableDeclaration != null) {
+      buildVariableDeclaration(bodyBuilder);
+    }
+
+    ir.Parameter currentValue = new ir.Parameter(null);
+    ir.Continuation currentInvoked = new ir.Continuation([currentValue]);
+    bodyBuilder.add(new ir.LetCont(currentInvoked,
+        new ir.InvokeMethod(iterator, new Selector.getter("current", null),
+            currentInvoked, emptyArguments)));
+    if (Elements.isLocal(variableElement)) {
+      bodyBuilder.buildLocalSet(variableElement, currentValue);
+    } else if (Elements.isStaticOrTopLevel(variableElement)) {
+      bodyBuilder.buildStaticSet(
+          variableElement, variableSelector, currentValue);
+    } else {
+      ir.Primitive receiver = bodyBuilder.buildThis();
+      bodyBuilder.buildDynamicSet(receiver, variableSelector, currentValue);
+    }
+
+    buildBody(bodyBuilder);
+    assert(state.breakCollectors.last == breakCollector);
+    assert(state.continueCollectors.last == continueCollector);
+    state.breakCollectors.removeLast();
+    state.continueCollectors.removeLast();
+
+    // Create body entry and loop exit continuations and a branch to them.
+    ir.Continuation bodyContinuation = new ir.Continuation([]);
+    ir.Continuation exitContinuation = new ir.Continuation([]);
+    ir.LetCont branch =
+        new ir.LetCont(exitContinuation,
+            new ir.LetCont(bodyContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              bodyContinuation,
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder._current = branch;
+    } else {
+      condBuilder.add(branch);
+    }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder._parameters);
+    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+    invokeFullJoin(
+        loopContinuation, continueCollector, recursive: true);
+    bodyContinuation.body = bodyBuilder._root;
+
+    loopContinuation.body = condBuilder._root;
+    add(new ir.LetCont(loopContinuation,
+            new ir.InvokeContinuation(loopContinuation,
+                                      environment.index2value)));
+    if (hasBreaks) {
+      _current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      _current = letJoin;
+    } else {
+      _current = condBuilder._current;
+      environment = condBuilder.environment;
+    }
+  }
+
+  /// Creates a while loop in which the condition and body are created by
+  /// [buildCondition] and [buildBody], respectively.
+  ///
+  /// The jump [target] is used to identify which `break` and `continue`
+  /// statements that have this `while` statement as their target.
+  void buildWhile({SubbuildFunction buildCondition,
+                   SubbuildFunction buildBody,
+                   JumpTarget target}) {
+    assert(isOpen);
+    // While loops use four named continuations: the entry to the body, the
+    // loop exit, the loop back edge (continue), and the loop exit (break).
+    // The CPS translation of [[while (condition) body; successor]] is:
+    //
+    // let cont continue(x, ...) =
+    //     let prim cond = [[condition]] in
+    //     let cont break() = [[successor]] in
+    //     let cont exit() = break(v, ...) in
+    //     let cont body() = [[body]]; continue(v, ...) in
+    //     branch cond (body, exit) in
+    // continue(v, ...)
+    //
+    // If there are no breaks in the body, the break continuation is inlined
+    // in the exit continuation (i.e., the translation of the successor
+    // statement occurs in the exit continuation).
+
+    // The condition and body are delimited.
+    IrBuilder condBuilder = new IrBuilder.recursive(this);
+    ir.Primitive condition = buildCondition(condBuilder);
+
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    state.breakCollectors.add(breakCollector);
+    state.continueCollectors.add(continueCollector);
+
+    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    buildBody(bodyBuilder);
+    assert(state.breakCollectors.last == breakCollector);
+    assert(state.continueCollectors.last == continueCollector);
+    state.breakCollectors.removeLast();
+    state.continueCollectors.removeLast();
+
+    // Create body entry and loop exit continuations and a branch to them.
+    ir.Continuation bodyContinuation = new ir.Continuation([]);
+    ir.Continuation exitContinuation = new ir.Continuation([]);
+    ir.LetCont branch =
+        new ir.LetCont(exitContinuation,
+            new ir.LetCont(bodyContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              bodyContinuation,
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder._current = branch;
+    } else {
+      condBuilder.add(branch);
+    }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder._parameters);
+    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+    invokeFullJoin(loopContinuation, continueCollector, recursive: true);
+    bodyContinuation.body = bodyBuilder._root;
+
+    loopContinuation.body = condBuilder._root;
+    add(new ir.LetCont(loopContinuation,
+            new ir.InvokeContinuation(loopContinuation,
+                                      environment.index2value)));
+    if (hasBreaks) {
+      _current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      _current = letJoin;
+    } else {
+      _current = condBuilder._current;
+      environment = condBuilder.environment;
+    }
+  }
+
   /// Create a return statement `return value;` or `return;` if [value] is
   /// null.
   void buildReturn([ir.Primitive value]) {
@@ -796,7 +1114,7 @@
   /// statements. The first statement is assumed to be reachable.
   // TODO(johnniwinther): Type [statements] as `Iterable` when `NodeList` uses
   // `List` instead of `Link`.
-  void buildBlock(var statements, build(statement)) {
+  void buildBlock(var statements, BuildFunction build) {
     // Build(Block(stamements), C) = C'
     //   where C' = statements.fold(Build, C)
     assert(isOpen);
@@ -808,7 +1126,7 @@
   /// The first node in the sequence does not need to be reachable.
   // TODO(johnniwinther): Type [nodes] as `Iterable` when `NodeList` uses
   // `List` instead of `Link`.
-  void buildSequence(var nodes, build(node)) {
+  void buildSequence(var nodes, BuildFunction build) {
     for (var node in nodes) {
       if (!isOpen) return;
       build(node);
@@ -877,6 +1195,23 @@
     return resultParameter;
   }
 
+  /// Creates a type test or type cast of [receiver] against [type].
+  ///
+  /// Set [isTypeTest] to `true` to create a type test and furthermore set
+  /// [isNotCheck] to `true` to create a negated type test.
+  ir.Primitive buildTypeOperator(ir.Primitive receiver,
+                                 DartType type,
+                                 {bool isTypeTest: false,
+                                  bool isNotCheck: false}) {
+    assert(isOpen);
+    assert(isTypeTest != null);
+    assert(!isNotCheck || isTypeTest);
+    ir.Primitive check = _continueWithExpression(
+        (k) => new ir.TypeOperator(receiver, type, k, isTypeTest: isTypeTest));
+    return isNotCheck ? buildNegation(check) : check;
+
+  }
+
   /// Create a lazy and/or expression. [leftValue] is the value of the left
   /// operand and [buildRightValue] is called to process the value of the right
   /// operand in the context of its own [IrBuilder].
@@ -962,6 +1297,14 @@
     return joinContinuation.parameters.last;
   }
 
+  /// Creates an access to `this`.
+  ir.Primitive buildThis() {
+    assert(isOpen);
+    ir.Primitive result = new ir.This();
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
   /// Create a non-recursive join-point continuation.
   ///
   /// Given the environment length at the join point and a list of
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
index 085a1c6..162c38a 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
@@ -245,206 +245,30 @@
         : giveup(node, 'labeled statement');
   }
 
-  ir.Primitive visitWhile(ast.While node) {
-    assert(irBuilder.isOpen);
-    // While loops use four named continuations: the entry to the body, the
-    // loop exit, the loop back edge (continue), and the loop exit (break).
-    // The CPS translation of [[while (condition) body; successor]] is:
-    //
-    // let cont continue(x, ...) =
-    //     let prim cond = [[condition]] in
-    //     let cont break() = [[successor]] in
-    //     let cont exit() = break(v, ...) in
-    //     let cont body() = [[body]]; continue(v, ...) in
-    //     branch cond (body, exit) in
-    // continue(v, ...)
-    //
-    // If there are no breaks in the body, the break continuation is inlined
-    // in the exit continuation (i.e., the translation of the successor
-    // statement occurs in the exit continuation).
-
-    // The condition and body are delimited.
-    IrBuilder condBuilder = new IrBuilder.recursive(irBuilder);
-    ir.Primitive condition =
-        withBuilder(condBuilder, () => visit(node.condition));
-
-    JumpTarget target = elements.getTargetDefinition(node);
-    JumpCollector breakCollector = new JumpCollector(target);
-    JumpCollector continueCollector = new JumpCollector(target);
-    irBuilder.state.breakCollectors.add(breakCollector);
-    irBuilder.state.continueCollectors.add(continueCollector);
-
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
-    withBuilder(bodyBuilder, () => visit(node.body));
-    assert(irBuilder.state.breakCollectors.last == breakCollector);
-    assert(irBuilder.state.continueCollectors.last == continueCollector);
-    irBuilder.state.breakCollectors.removeLast();
-    irBuilder.state.continueCollectors.removeLast();
-
-    // Create body entry and loop exit continuations and a branch to them.
-    ir.Continuation bodyContinuation = new ir.Continuation([]);
-    ir.Continuation exitContinuation = new ir.Continuation([]);
-    ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
-    // If there are breaks in the body, then there must be a join-point
-    // continuation for the normal exit and the breaks.
-    bool hasBreaks = !breakCollector.isEmpty;
-    ir.LetCont letJoin;
-    if (hasBreaks) {
-      letJoin = new ir.LetCont(null, branch);
-      condBuilder.add(letJoin);
-      condBuilder._current = branch;
-    } else {
-      condBuilder.add(branch);
-    }
-    ir.Continuation loopContinuation =
-        new ir.Continuation(condBuilder._parameters);
-    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
-    irBuilder.invokeFullJoin(
-        loopContinuation, continueCollector, recursive: true);
-    bodyContinuation.body = bodyBuilder._root;
-
-    loopContinuation.body = condBuilder._root;
-    irBuilder.add(new ir.LetCont(loopContinuation,
-            new ir.InvokeContinuation(loopContinuation,
-                                      irBuilder.environment.index2value)));
-    if (hasBreaks) {
-      irBuilder._current = branch;
-      irBuilder.environment = condBuilder.environment;
-      breakCollector.addJump(irBuilder);
-      letJoin.continuation =
-          irBuilder.createJoin(irBuilder.environment.length, breakCollector);
-      irBuilder._current = letJoin;
-    } else {
-      irBuilder._current = condBuilder._current;
-      irBuilder.environment = condBuilder.environment;
-    }
-    return null;
+  visitWhile(ast.While node) {
+    irBuilder.buildWhile(
+        buildCondition: subbuild(node.condition),
+        buildBody: subbuild(node.body),
+        target: elements.getTargetDefinition(node));
   }
 
-  ir.Primitive visitForIn(ast.ForIn node) {
-    // The for-in loop
-    //
-    // for (a in e) s;
-    //
-    // Is compiled analogously to:
-    //
-    // a = e.iterator;
-    // while (a.moveNext()) {
-    //   var n0 = a.current;
-    //   s;
-    // }
-
-    // The condition and body are delimited.
-    IrBuilder condBuilder = new IrBuilder.recursive(irBuilder);
-
-    ir.Primitive expressionReceiver = visit(node.expression);
-    List<ir.Primitive> emptyArguments = new List<ir.Primitive>();
-
-    ir.Parameter iterator = new ir.Parameter(null);
-    ir.Continuation iteratorInvoked = new ir.Continuation([iterator]);
-    irBuilder.add(new ir.LetCont(iteratorInvoked,
-        new ir.InvokeMethod(expressionReceiver,
-            new Selector.getter("iterator", null), iteratorInvoked,
-            emptyArguments)));
-
-    ir.Parameter condition = new ir.Parameter(null);
-    ir.Continuation moveNextInvoked = new ir.Continuation([condition]);
-    condBuilder.add(new ir.LetCont(moveNextInvoked,
-        new ir.InvokeMethod(iterator,
-            new Selector.call("moveNext", null, 0),
-            moveNextInvoked, emptyArguments)));
-
-    JumpTarget target = elements.getTargetDefinition(node);
-    JumpCollector breakCollector = new JumpCollector(target);
-    JumpCollector continueCollector = new JumpCollector(target);
-    irBuilder.state.breakCollectors.add(breakCollector);
-    irBuilder.state.continueCollectors.add(continueCollector);
-
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+  visitForIn(ast.ForIn node) {
+    // [node.declaredIdentifier] can be either an [ast.VariableDefinitions]
+    // (defining a new local variable) or a send designating some existing
+    // variable.
     ast.Node identifier = node.declaredIdentifier;
+    ast.VariableDefinitions variableDeclaration =
+        identifier.asVariableDefinitions();
     Element variableElement = elements.getForInVariable(node);
     Selector selector = elements.getSelector(identifier);
 
-    // node.declaredIdentifier can be either an ast.VariableDefinitions
-    // (defining a new local variable) or a send designating some existing
-    // variable.
-    ast.Node declaredIdentifier = node.declaredIdentifier;
-
-    if (declaredIdentifier is ast.VariableDefinitions) {
-      withBuilder(bodyBuilder, () => visit(declaredIdentifier));
-    }
-
-    ir.Parameter currentValue = new ir.Parameter(null);
-    ir.Continuation currentInvoked = new ir.Continuation([currentValue]);
-    bodyBuilder.add(new ir.LetCont(currentInvoked,
-        new ir.InvokeMethod(iterator, new Selector.getter("current", null),
-            currentInvoked, emptyArguments)));
-    if (Elements.isLocal(variableElement)) {
-      bodyBuilder.buildLocalSet(variableElement, currentValue);
-    } else if (Elements.isStaticOrTopLevel(variableElement)) {
-      withBuilder(bodyBuilder,
-          () => setStatic(variableElement, selector, currentValue));
-    } else {
-      ir.Primitive receiver =
-          withBuilder(bodyBuilder, () => lookupThis());
-      withBuilder(bodyBuilder,
-          () => setDynamic(null, receiver, selector, currentValue));
-    }
-
-    withBuilder(bodyBuilder, () => visit(node.body));
-    assert(irBuilder.state.breakCollectors.last == breakCollector);
-    assert(irBuilder.state.continueCollectors.last == continueCollector);
-    irBuilder.state.breakCollectors.removeLast();
-    irBuilder.state.continueCollectors.removeLast();
-
-    // Create body entry and loop exit continuations and a branch to them.
-    ir.Continuation bodyContinuation = new ir.Continuation([]);
-    ir.Continuation exitContinuation = new ir.Continuation([]);
-    ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
-    // If there are breaks in the body, then there must be a join-point
-    // continuation for the normal exit and the breaks.
-    bool hasBreaks = !breakCollector.isEmpty;
-    ir.LetCont letJoin;
-    if (hasBreaks) {
-      letJoin = new ir.LetCont(null, branch);
-      condBuilder.add(letJoin);
-      condBuilder._current = branch;
-    } else {
-      condBuilder.add(branch);
-    }
-    ir.Continuation loopContinuation =
-        new ir.Continuation(condBuilder._parameters);
-    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
-    irBuilder.invokeFullJoin(
-        loopContinuation, continueCollector, recursive: true);
-    bodyContinuation.body = bodyBuilder._root;
-
-    loopContinuation.body = condBuilder._root;
-    irBuilder.add(new ir.LetCont(loopContinuation,
-            new ir.InvokeContinuation(loopContinuation,
-                                      irBuilder.environment.index2value)));
-    if (hasBreaks) {
-      irBuilder._current = branch;
-      irBuilder.environment = condBuilder.environment;
-      breakCollector.addJump(irBuilder);
-      letJoin.continuation =
-          irBuilder.createJoin(irBuilder.environment.length, breakCollector);
-      irBuilder._current = letJoin;
-    } else {
-      irBuilder._current = condBuilder._current;
-      irBuilder.environment = condBuilder.environment;
-    }
-    return null;
+    irBuilder.buildForIn(
+        buildExpression: subbuild(node.expression),
+        buildVariableDeclaration: subbuild(variableDeclaration),
+        variableElement: variableElement,
+        variableSelector: selector,
+        buildBody: subbuild(node.body),
+        target: elements.getTargetDefinition(node));
   }
 
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
@@ -539,32 +363,24 @@
   }
 
   ir.Primitive visitLiteralList(ast.LiteralList node) {
-    assert(irBuilder.isOpen);
     if (node.isConst) {
       return translateConstant(node);
     }
     List<ir.Primitive> values = node.elements.nodes.mapToList(visit);
-    GenericType type = elements.getType(node);
-    ir.Primitive result = new ir.LiteralList(type, values);
-    irBuilder.add(new ir.LetPrim(result));
-    return result;
+    InterfaceType type = elements.getType(node);
+    return irBuilder.buildListLiteral(type, values);
   }
 
   ir.Primitive visitLiteralMap(ast.LiteralMap node) {
-    assert(irBuilder.isOpen);
     if (node.isConst) {
       return translateConstant(node);
     }
-    List<ir.Primitive> keys = new List<ir.Primitive>();
-    List<ir.Primitive> values = new List<ir.Primitive>();
-    node.entries.nodes.forEach((ast.LiteralMapEntry node) {
-      keys.add(visit(node.key));
-      values.add(visit(node.value));
-    });
-    GenericType type = elements.getType(node);
-    ir.Primitive result = new ir.LiteralMap(type, keys, values);
-    irBuilder.add(new ir.LetPrim(result));
-    return result;
+    InterfaceType type = elements.getType(node);
+    return irBuilder.buildMapLiteral(
+        type,
+        node.entries.nodes.map((e) => e.key),
+        node.entries.nodes.map((e) => e.value),
+        build);
   }
 
   ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) {
@@ -573,10 +389,9 @@
   }
 
   ir.Primitive visitIdentifier(ast.Identifier node) {
-    assert(irBuilder.isOpen);
     // "this" is the only identifier that should be met by the visitor.
     assert(node.isThis());
-    return lookupThis();
+    return irBuilder.buildThis();
   }
 
   ir.Primitive visitParenthesizedExpression(
@@ -605,12 +420,6 @@
     return receiver;
   }
 
-  ir.Primitive lookupThis() {
-    ir.Primitive result = new ir.This();
-    irBuilder.add(new ir.LetPrim(result));
-    return result;
-  }
-
   // ==== Sends ====
   ir.Primitive visitAssert(ast.Send node) {
     assert(irBuilder.isOpen);
@@ -631,8 +440,7 @@
                      closureSelector.argumentCount,
                      closureSelector.namedArguments);
     List<ir.Primitive> args = arguments.nodes.mapToList(visit, growable:false);
-    return irBuilder.continueWithExpression(
-        (k) => new ir.InvokeMethod(receiver, namedCallSelector, k, args));
+    return irBuilder.buildDynamicInvocation(receiver, namedCallSelector, args);
   }
 
   ir.Primitive visitClosureSend(ast.Send node) {
@@ -658,21 +466,15 @@
   /// If [node] is super, returns null (for special handling)
   /// Otherwise visits [node] and returns the result.
   ir.Primitive visitReceiver(ast.Expression node) {
-    if (node == null) return lookupThis();
+    if (node == null) return irBuilder.buildThis();
     if (node.isSuper()) return null;
     return visit(node);
   }
 
-  /// Makes an [InvokeMethod] unless [node.receiver.isSuper()], in that case
-  /// makes an [InvokeSuperMethod] ignoring [receiver].
-  ir.Expression createDynamicInvoke(ast.Send node,
-                                    Selector selector,
-                                    ir.Definition receiver,
-                                    ir.Continuation k,
-                                    List<ir.Definition> arguments) {
-    return node != null && node.receiver != null && node.receiver.isSuper()
-        ? new ir.InvokeSuperMethod(selector, k, arguments)
-        : new ir.InvokeMethod(receiver, selector, k, arguments);
+  /// Returns `true` if [node] is a super call.
+  // TODO(johnniwinther): Remove the need for this.
+  bool isSuperCall(ast.Send node) {
+    return node != null && node.receiver != null && node.receiver.isSuper();
   }
 
   ir.Primitive visitDynamicSend(ast.Send node) {
@@ -718,8 +520,12 @@
 
       assert(selector.kind == SelectorKind.GETTER ||
              selector.kind == SelectorKind.INDEX);
-      result = irBuilder.continueWithExpression(
-          (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+      if (isSuperCall(node)) {
+        result = irBuilder.buildSuperInvocation(selector, arguments);
+      } else {
+        result =
+            irBuilder.buildDynamicInvocation(receiver, selector, arguments);
+      }
     } else if (element.isField || element.isGetter || element.isErroneous ||
                element.isSetter) {
       // TODO(johnniwinther): Change handling of setter selectors.
@@ -785,9 +591,10 @@
            message: "unexpected operator $op"));
     DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
     ir.Primitive receiver = visit(node.receiver);
-    ir.Primitive check = irBuilder.continueWithExpression(
-        (k) => new ir.TypeOperator(op.source, receiver, type, k));
-    return node.isIsNotCheck ? irBuilder.buildNegation(check) : check;
+    return irBuilder.buildTypeOperator(
+        receiver, type,
+        isTypeTest: op.source == "is",
+        isNotCheck: node.isIsNotCheck);
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
@@ -809,7 +616,6 @@
     return irBuilder.buildStaticInvocation(element, selector, arguments);
   }
 
-
   ir.Primitive visitSuperSend(ast.Send node) {
     assert(irBuilder.isOpen);
     if (node.isPropertyAccess) {
@@ -847,32 +653,6 @@
     }
   }
 
-  void setStatic(Element element,
-                 Selector selector,
-                 ir.Primitive valueToStore) {
-    assert(element.isErroneous || element.isField || element.isSetter);
-    irBuilder.continueWithExpression(
-        (k) => new ir.InvokeStatic(element, selector, k, [valueToStore]));
-  }
-
-  void setDynamic(ast.Node node,
-                  ir.Primitive receiver, Selector selector,
-                  ir.Primitive valueToStore) {
-    List<ir.Definition> arguments = [valueToStore];
-    irBuilder.continueWithExpression(
-        (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
-  }
-
-  void setIndex(ast.Node node,
-                ir.Primitive receiver,
-                Selector selector,
-                ir.Primitive index,
-                ir.Primitive valueToStore) {
-    List<ir.Definition> arguments = [index, valueToStore];
-    irBuilder.continueWithExpression(
-        (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
-  }
-
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(irBuilder.isOpen);
     Element element = elements[node];
@@ -940,16 +720,25 @@
       irBuilder.buildLocalSet(element, valueToStore);
     } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
                 Elements.isStaticOrTopLevel(element)) {
-      setStatic(element, elements.getSelector(node), valueToStore);
+      irBuilder.buildStaticSet(
+          element, elements.getSelector(node), valueToStore);
     } else {
       // Setter or index-setter invocation
       Selector selector = elements.getSelector(node);
       assert(selector.kind == SelectorKind.SETTER ||
           selector.kind == SelectorKind.INDEX);
       if (selector.isIndexSet) {
-        setIndex(node, receiver, selector, index, valueToStore);
+        if (isSuperCall(node)) {
+          irBuilder.buildSuperIndexSet(index, valueToStore);
+        } else {
+          irBuilder.buildDynamicIndexSet(receiver, index, valueToStore);
+        }
       } else {
-        setDynamic(node, receiver, selector, valueToStore);
+        if (isSuperCall(node)) {
+          irBuilder.buildSuperSet(selector, valueToStore);
+        } else {
+          irBuilder.buildDynamicSet(receiver, selector, valueToStore);
+        }
       }
     }
 
@@ -973,15 +762,13 @@
         node.send.arguments.mapToList(visit, growable:false);
     return irBuilder.buildConstructorInvocation(
         element, selector, type, arguments);
-
   }
 
   ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
     assert(irBuilder.isOpen);
     ir.Primitive first = visit(node.first);
     ir.Primitive second = visit(node.second);
-    return irBuilder.continueWithExpression(
-        (k) => new ir.ConcatenateStrings(k, [first, second]));
+    return irBuilder.buildStringConcatenation([first, second]);
   }
 
   ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
@@ -994,8 +781,7 @@
       arguments.add(visit(part.expression));
       arguments.add(visitLiteralString(part.string));
     }
-    return irBuilder.continueWithExpression(
-        (k) => new ir.ConcatenateStrings(k, arguments));
+    return irBuilder.buildStringConcatenation(arguments);
   }
 
   ir.Primitive translateConstant(ast.Node node, [ConstantExpression constant]) {
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
index 5cf7f04..4ea9beb 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
@@ -283,17 +283,20 @@
   final Reference receiver;
   final DartType type;
   final Reference continuation;
-  final String operator;
+  // TODO(johnniwinther): Use `Operator` class to encapsule the operator type.
+  final bool isTypeTest;
 
-  TypeOperator(this.operator,
-                Primitive receiver,
-                this.type,
-                Continuation cont)
+  TypeOperator(Primitive receiver,
+               this.type,
+               Continuation cont,
+               {bool this.isTypeTest})
       : this.receiver = new Reference(receiver),
         this.continuation = new Reference(cont) {
-    assert(operator == "is" || operator == "as");
+    assert(isTypeTest != null);
   }
 
+  bool get isTypeCast => !isTypeTest;
+
   accept(Visitor visitor) => visitor.visitTypeOperator(this);
 }
 
@@ -481,20 +484,26 @@
   final GenericType type;
   final List<Reference> values;
 
-  LiteralList(this.type, List<Primitive> values)
+  LiteralList(this.type, Iterable<Primitive> values)
       : this.values = _referenceList(values);
 
   accept(Visitor visitor) => visitor.visitLiteralList(this);
 }
 
+class LiteralMapEntry {
+  final Reference key;
+  final Reference value;
+
+  LiteralMapEntry(Primitive key, Primitive value)
+      : this.key = new Reference(key),
+        this.value = new Reference(value);
+}
+
 class LiteralMap extends Primitive {
   final GenericType type;
-  final List<Reference> keys;
-  final List<Reference> values;
+  final List<LiteralMapEntry> entries;
 
-  LiteralMap(this.type, List<Primitive> keys, List<Primitive> values)
-      : this.keys = _referenceList(keys),
-        this.values = _referenceList(values);
+  LiteralMap(this.type, this.entries);
 
   accept(Visitor visitor) => visitor.visitLiteralMap(this);
 }
@@ -566,7 +575,7 @@
   bool get isAbstract => body == null;
 }
 
-List<Reference> _referenceList(List<Definition> definitions) {
+List<Reference> _referenceList(Iterable<Definition> definitions) {
   return definitions.map((e) => new Reference(e)).toList();
 }
 
@@ -731,9 +740,9 @@
   processLiteralMap(LiteralMap node) {}
   visitLiteralMap(LiteralMap node) {
     processLiteralMap(node);
-    for (int i = 0; i < node.keys.length; i++) {
-      processReference(node.keys[i]);
-      processReference(node.values[i]);
+    for (LiteralMapEntry entry in node.entries) {
+      processReference(entry.key);
+      processReference(entry.value);
     }
   }
 
@@ -886,9 +895,9 @@
   }
 
   void visitLiteralMap(LiteralMap node) {
-    for (int i = 0; i < node.keys.length; ++i) {
-      visitReference(node.keys[i]);
-      visitReference(node.values[i]);
+    for (LiteralMapEntry entry in node.entries) {
+      visitReference(entry.key);
+      visitReference(entry.value);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart
index 2b17918..c4621cb 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart
@@ -28,8 +28,8 @@
         })
         .join(' ');
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(FunctionDefinition $name ($parameters return)\n' +
-                 '$body)';
+    return '$indentation(FunctionDefinition $name ($parameters return)\n'
+           '$body)';
   }
 
   String visitLetPrim(LetPrim node) {
@@ -53,8 +53,8 @@
     String contBody = indentBlock(() => visit(node.continuation.body));
     String body = visit(node.body);
     String op = node.continuation.isRecursive ? 'LetCont*' : 'LetCont';
-    return '$indentation($op ($cont$parameters)\n' +
-               '$contBody)\n' +
+    return '$indentation($op ($cont$parameters)\n'
+           '$contBody)\n'
            '$body';
   }
 
@@ -160,15 +160,15 @@
   String visitSetClosureVariable(SetClosureVariable node) {
     String value = names[node.value.definition];
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(SetClosureVariable ${node.variable.name} $value\n' +
-                '$body)';
+    return '$indentation(SetClosureVariable ${node.variable.name} $value\n'
+           '$body)';
   }
 
   String visitTypeOperator(TypeOperator node) {
     String receiver = names[node.receiver.definition];
     String cont = names[node.continuation.definition];
-    return '$indentation(TypeOperator ${node.operator} $receiver ' +
-                        '${node.type} $cont)';
+    String operator = node.isTypeTest ? 'is' : 'as';
+    return '$indentation(TypeOperator $operator $receiver ${node.type} $cont)';
   }
 
   String visitLiteralList(LiteralList node) {
@@ -177,17 +177,18 @@
   }
 
   String visitLiteralMap(LiteralMap node) {
-    String keys = node.keys.map((v) => names[v.definition]).join(' ');
-    String values = node.values.map((v) => names[v.definition]).join(' ');
+    String keys = node.entries.map((e) => names[e.key.definition]).join(' ');
+    String values =
+        node.entries.map((e) => names[e.value.definition]).join(' ');
     return '(LiteralMap ($keys) ($values))';
   }
 
   String visitDeclareFunction(DeclareFunction node) {
     String function = indentBlock(() => visit(node.definition));
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(DeclareFunction ${node.variable.name} =\n' +
-                '$function in\n' +
-                '$body)';
+    return '$indentation(DeclareFunction ${node.variable.name} =\n'
+           '$function in\n'
+           '$body)';
   }
 
   String visitIsTrue(IsTrue node) {
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
index a588bc9..5c69e59 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
@@ -156,9 +156,9 @@
   visitLiteralMap(cps_ir.LiteralMap node) {
     String dummy = names.name(node);
     List<String> entries = new List<String>();
-    for (int i = 0; i < node.values.length; ++i) {
-      String key = formatReference(node.keys[i]);
-      String value = formatReference(node.values[i]);
+    for (cps_ir.LiteralMapEntry entry in node.entries) {
+      String key = formatReference(entry.key);
+      String value = formatReference(entry.value);
       entries.add("$key: $value");
     }
     printStmt(dummy, "LiteralMap (${entries.join(', ')})");
@@ -166,7 +166,7 @@
 
   visitTypeOperator(cps_ir.TypeOperator node) {
     String dummy = names.name(node);
-    String operator = node.operator;
+    String operator = node.isTypeTest ? 'is' : 'as';
     List<String> entries = new List<String>();
     String receiver = formatReference(node.receiver);
     printStmt(dummy, "TypeOperator ($operator $receiver ${node.type})");
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/shrinking_reductions.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/shrinking_reductions.dart
index 82aead1..f14ece5 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/shrinking_reductions.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/shrinking_reductions.dart
@@ -371,8 +371,10 @@
   }
 
   processLiteralMap(LiteralMap node) {
-    node.values.forEach((Reference ref) => ref.parent = node);
-    node.keys.forEach((Reference ref) => ref.parent = node);
+    node.entries.forEach((LiteralMapEntry entry) {
+      entry.key.parent = node;
+      entry.value.parent = node;
+    });
   }
 
   processCreateFunction(CreateFunction node) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 99c6754..2359ad2 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async'
     show Future, EventSink;
+import 'dart:convert' show UTF8, LineSplitter;
 import 'dart:io'
     show exit, File, FileMode, Platform, RandomAccessFile, FileSystemException,
          stdin, stderr;
@@ -113,6 +114,7 @@
   bool stripArgumentSet = false;
   bool analyzeOnly = false;
   bool analyzeAll = false;
+  bool enableAsyncAwait = false;
   bool trustTypeAnnotations = false;
   bool checkedMode = false;
   // List of provided options that imply that output is expected.
@@ -188,6 +190,11 @@
     passThrough(argument);
   }
 
+  setEnableAsync(String argument) {
+    enableAsyncAwait = true;
+    passThrough(argument);
+  }
+
   setVerbose(_) {
     diagnosticHandler.verbose = true;
     passThrough('--verbose');
@@ -316,6 +323,7 @@
                       (_) => hasDisallowUnsafeEval = true),
     new OptionHandler('--show-package-warnings', passThrough),
     new OptionHandler('--csp', passThrough),
+    new OptionHandler('--enable-async', setEnableAsync),
     new OptionHandler('-D.+=.*', addInEnvironment),
 
     // The following two options must come last.
@@ -376,6 +384,10 @@
         api.Diagnostic.INFO);
   }
   if (analyzeAll) analyzeOnly = true;
+  if (enableAsyncAwait && !analyzeOnly) {
+    helpAndFail("Option '--enable-async' is currently only supported in "
+                "combination with the '--analyze-only' option.");
+  }
 
   diagnosticHandler.info('Package root is $packageRoot');
 
@@ -635,7 +647,6 @@
 
 void batchMain(List<String> batchArguments) {
   int exitCode;
-
   exitFunc = (errorCode) {
     // Since we only throw another part of the compiler might intercept our
     // exception and try to exit with a different code.
@@ -645,24 +656,24 @@
     throw _EXIT_SIGNAL;
   };
 
-  runJob() {
+  var stream = stdin.transform(UTF8.decoder).transform(new LineSplitter());
+  var subscription;
+  subscription = stream.listen((line) {
     new Future.sync(() {
+      subscription.pause();
       exitCode = 0;
-      String line = stdin.readLineSync();
       if (line == null) exit(0);
       List<String> args = <String>[];
       args.addAll(batchArguments);
       args.addAll(splitLine(line, windows: Platform.isWindows));
       return internalMain(args);
-    })
-    .catchError((exception, trace) {
+    }).catchError((exception, trace) {
       if (!identical(exception, _EXIT_SIGNAL)) {
         exitCode = 253;
       }
-    })
-    .whenComplete(() {
-      // The testing framework waits for a status line on stdout and stderr
-      // before moving to the next test.
+    }).whenComplete(() {
+      // The testing framework waits for a status line on stdout and
+      // stderr before moving to the next test.
       if (exitCode == 0){
         print(">>> TEST OK");
       } else if (exitCode == 253) {
@@ -671,9 +682,7 @@
         print(">>> TEST FAIL");
       }
       stderr.writeln(">>> EOF STDERR");
-      runJob();
+      subscription.resume();
     });
-  }
-
-  runJob();
+  });
 }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
index 86632ad..7ceefa6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
@@ -331,7 +331,7 @@
     // Synthesize an element for the variable
     if (variable.element == null || name != variable.element.name) {
       // TODO(johnniwinther): Replace by synthetic [Entity].
-      variable.element = new modelx.LocalVariableElementX.synthetic(
+      variable.element = new _SyntheticLocalVariableElement(
           name,
           functionElement,
           variableList);
@@ -514,12 +514,13 @@
 
   Expression visitLiteralMap(tree.LiteralMap exp) {
     List<LiteralMapEntry> entries = new List<LiteralMapEntry>.generate(
-        exp.values.length,
-        (i) => new LiteralMapEntry(visitExpression(exp.keys[i]),
-                                   visitExpression(exp.values[i])));
+        exp.entries.length,
+        (i) => new LiteralMapEntry(visitExpression(exp.entries[i].key),
+                                   visitExpression(exp.entries[i].value)));
     List<TypeAnnotation> typeArguments = exp.type.treatAsRaw
         ? null
-        : exp.type.typeArguments.map(createTypeAnnotation).toList(growable: false);
+        : exp.type.typeArguments.map(createTypeAnnotation)
+             .toList(growable: false);
     return new LiteralMap(entries, typeArguments: typeArguments);
   }
 
@@ -897,3 +898,22 @@
   }
 
 }
+
+// TODO(johnniwinther): Remove this when the dart `backend_ast` does not need
+// [Element] for entities.
+class _SyntheticLocalVariableElement extends modelx.VariableElementX
+    implements LocalVariableElement {
+
+  _SyntheticLocalVariableElement(String name,
+                                 ExecutableElement enclosingElement,
+                                 modelx.VariableList variables)
+      : super(name, ElementKind.VARIABLE, enclosingElement, variables, null);
+
+  ExecutableElement get executableContext => enclosingElement;
+
+  ExecutableElement get memberContext => executableContext.memberContext;
+
+  bool get isLocal => true;
+
+  LibraryElement get implementationLibrary => enclosingElement.library;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
index 2004237..d314f54 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
@@ -23,7 +23,8 @@
 /// If true, the unparser will insert a coment in front of every function
 /// it emits. This helps indicate which functions were translated by the new
 /// backend.
-bool INSERT_NEW_BACKEND_COMMENT = false;
+bool INSERT_NEW_BACKEND_COMMENT =
+    const bool.fromEnvironment('USE_NEW_BACKEND', defaultValue: false);
 
 /// Converts backend ASTs to frontend ASTs.
 class TreePrinter {
@@ -92,6 +93,7 @@
   final Token whileToken = makeIdToken('while');
   final Token ifToken = makeIdToken('if');
   final Token elseToken = makeIdToken('else');
+  final Token awaitToken = makeIdToken('await');
   final Token forToken = makeIdToken('for');
   final Token inToken = makeIdToken('in');
   final Token returnToken = makeIdToken('return');
@@ -415,7 +417,8 @@
             : makeType(exp.returnType),
           makeFunctionModifiers(exp),
           null,  // initializers
-          getOrSet);
+          getOrSet,  // get/set
+          null); // async modifier
       setElement(result, exp.element, exp);
     } else if (exp is Identifier) {
       precedence = CALLEE;
@@ -701,6 +704,7 @@
           left,
           makeExpression(stmt.expression),
           makeStatement(stmt.body, shortIf: shortIf),
+          awaitToken,
           forToken,
           inToken);
     } else if (stmt is FunctionDeclaration) {
@@ -711,7 +715,8 @@
           stmt.returnType != null ? makeType(stmt.returnType) : null,
           makeEmptyModifiers(),
           null,  // initializers
-          null);  // get/set
+          null,  // get/set
+          null); // async modifier
       setElement(function, stmt.function.element, stmt);
       return new tree.FunctionDeclaration(function);
     } else if (stmt is If) {
@@ -885,8 +890,9 @@
           null, // body
           param.type == null ? null : makeType(param.type),
           makeEmptyModifiers(), // TODO: Function parameter modifiers?
-          null, // initializers
-          null); // get/set
+          null,  // initializers
+          null,  // get/set
+          null); // async modifier
       if (param.element != null) {
         setElement(definition, param.element, param);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart
index aa463f4..8689aaa 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart
@@ -197,8 +197,10 @@
   }
 
   Expression visitLiteralMap(LiteralMap node) {
-    _rewriteList(node.keys);
-    _rewriteList(node.values);
+    node.entries.forEach((LiteralMapEntry entry) {
+      entry.key = visitExpression(entry.key);
+      entry.value = visitExpression(entry.value);
+    });
     return node;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart
index 4151d2d..8733f93 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart
@@ -357,9 +357,9 @@
 
   Expression visitLiteralMap(LiteralMap node) {
     // Process arguments right-to-left, the opposite of evaluation order.
-    for (int i = node.values.length - 1; i >= 0; --i) {
-      node.values[i] = visitExpression(node.values[i]);
-      node.keys[i] = visitExpression(node.keys[i]);
+    for (LiteralMapEntry entry in node.entries.reversed) {
+      entry.value = visitExpression(entry.value);
+      entry.key = visitExpression(entry.key);
     }
     return node;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
index 14c9fd2..d4ba56e 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
@@ -346,7 +346,8 @@
 
   Statement visitTypeOperator(cps_ir.TypeOperator node) {
     Expression receiver = getVariableReference(node.receiver);
-    Expression concat = new TypeOperator(receiver, node.type, node.operator);
+    Expression concat =
+        new TypeOperator(receiver, node.type, isTypeTest: node.isTypeTest);
     return continueWithExpression(node.continuation, concat);
   }
 
@@ -430,8 +431,12 @@
   Expression visitLiteralMap(cps_ir.LiteralMap node) {
     return new LiteralMap(
         node.type,
-        translateArguments(node.keys),
-        translateArguments(node.values));
+        new List<LiteralMapEntry>.generate(node.entries.length, (int index) {
+          return new LiteralMapEntry(
+              getVariableReference(node.entries[index].key),
+              getVariableReference(node.entries[index].value));
+        })
+    );
   }
 
   FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
index 07866a0..c076940 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
@@ -223,12 +223,18 @@
   accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
 }
 
+class LiteralMapEntry {
+  Expression key;
+  Expression value;
+
+  LiteralMapEntry(this.key, this.value);
+}
+
 class LiteralMap extends Expression {
   final GenericType type;
-  final List<Expression> keys;
-  final List<Expression> values;
+  final List<LiteralMapEntry> entries;
 
-  LiteralMap(this.type, this.keys, this.values);
+  LiteralMap(this.type, this.entries);
 
   accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
 }
@@ -236,11 +242,13 @@
 class TypeOperator extends Expression {
   Expression receiver;
   final DartType type;
-  final String operator;
+  final bool isTypeTest;
 
-  TypeOperator(this.receiver, this.type, this.operator) ;
+  TypeOperator(this.receiver, this.type, {bool this.isTypeTest});
 
   accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
+
+  String get operator => isTypeTest ? 'is' : 'as';
 }
 
 /// A conditional expression.
@@ -595,10 +603,10 @@
   }
 
   visitLiteralMap(LiteralMap node) {
-    for (int i=0; i<node.keys.length; i++) {
-      visitExpression(node.keys[i]);
-      visitExpression(node.values[i]);
-    }
+    node.entries.forEach((LiteralMapEntry entry) {
+      visitExpression(entry.key);
+      visitExpression(entry.value);
+    });
   }
 
   visitTypeOperator(TypeOperator node) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
index 2310733..bcd02f5 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
@@ -330,11 +330,11 @@
 
   String visitLiteralMap(LiteralMap node) {
     List<String> entries = new List<String>();
-    for (int i = 0; i < node.values.length; ++i) {
-      String key = visitExpression(node.keys[i]);
-      String value = visitExpression(node.values[i]);
+    node.entries.forEach((LiteralMapEntry entry) {
+      String key = visitExpression(entry.key);
+      String value = visitExpression(entry.value);
       entries.add("$key: $value");
-    }
+    });
     return "map [${entries.join(', ')}]";
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 9f6dcfc..442e12b 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -1137,6 +1137,39 @@
 
   /// The type of this function.
   FunctionType get type;
+
+  /// The synchronous/asynchronous marker on this function.
+  AsyncMarker get asyncMarker;
+}
+
+/// Enum for the synchronous/asynchronous function body modifiers.
+class AsyncMarker {
+  /// The default function body marker.
+  static AsyncMarker SYNC = const AsyncMarker._();
+
+  /// The `sync*` function body marker.
+  static AsyncMarker SYNC_STAR = const AsyncMarker._(isYielding: true);
+
+  /// The `async` function body marker.
+  static AsyncMarker ASYNC = const AsyncMarker._(isAsync: true);
+
+  /// The `async*` function body marker.
+  static AsyncMarker ASYNC_STAR =
+      const AsyncMarker._(isAsync: true, isYielding: true);
+
+  /// Is `true` if this marker defines the function body to have an
+  /// asynchronous result, that is, either a [Future] or a [Stream].
+  final bool isAsync;
+
+  /// Is `true` if this marker defines the function body to have a plural
+  /// result, that is, either an [Iterable] or a [Stream].
+  final bool isYielding;
+
+  const AsyncMarker._({this.isAsync: false, this.isYielding: false});
+
+  String toString() {
+    return '${isAsync ? 'async' : 'sync'}${isYielding ? '*' : ''}';
+  }
 }
 
 /// A top level, static or instance function.
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index df1d98f..d435f4a 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -287,6 +287,7 @@
     throw 'unsupported operation on erroneous element';
   }
 
+  get asyncMarker => AsyncMarker.SYNC;
   Link<MetadataAnnotation> get metadata => unsupported();
   bool get hasNode => false;
   get node => unsupported();
@@ -1231,13 +1232,6 @@
     createDefinitions(variables.definitions);
   }
 
-  // TODO(johnniwinther): Remove this when the dart `backend_ast` does not need
-  // [Element] for entities.
-  LocalVariableElementX.synthetic(String name,
-                                  ExecutableElement enclosingElement,
-                                  VariableList variables)
-      : super(name, ElementKind.VARIABLE, enclosingElement, variables, null);
-
   ExecutableElement get executableContext => enclosingElement;
 
   ExecutableElement get memberContext => executableContext.memberContext;
@@ -1547,6 +1541,8 @@
 
   AbstractFieldElement abstractField;
 
+  AsyncMarker asyncMarker = AsyncMarker.SYNC;
+
   BaseFunctionElementX(String name,
                        ElementKind kind,
                        Modifiers this.modifiers,
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 4d9a704..129f49c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -475,6 +475,12 @@
   }
 
   @override
+  ConcreteType allocateLoopPhi(Node node, Local variable,
+                               ConcreteType inputType) {
+    return inputType;
+  }
+
+  @override
   ConcreteType computeLUB(ConcreteType firstType, ConcreteType secondType) {
     if (firstType == null) {
       return secondType;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index 1e603a9..65ea6bc 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -79,6 +79,16 @@
    */
   T allocatePhi(Node node, Local variable, T inputType);
 
+
+  /**
+   * Returns a new type for holding the potential types of [element].
+   * [inputType] is the first incoming type of the phi. [allocateLoopPhi]
+   * only differs from [allocatePhi] in that it allows the underlying
+   * implementation of [TypeSystem] to differentiate Phi nodes due to loops
+   * from other merging uses.
+   */
+  T allocateLoopPhi(Node node, Local variable, T inputType);
+
   /**
    * Simplies the phi representing [element] and of the type
    * [phiType]. For example, if this phi has one incoming input, an
@@ -605,7 +615,7 @@
 
   void startLoop(Node loop) {
     locals.forEachLocal((Local variable, T type) {
-      T newType = types.allocatePhi(loop, variable, type);
+      T newType = types.allocateLoopPhi(loop, variable, type);
       if (newType != type) {
         locals[variable] = newType;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 5ba65f1..f06b1cc 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -137,6 +137,12 @@
     return inputType;
   }
 
+  TypeMask allocateLoopPhi(ast.Node node,
+                           Local variable,
+                           TypeMask inputType) {
+    return inputType;
+  }
+
   TypeMask simplifyPhi(ast.Node node,
                        Local variable,
                        TypeMask phiType) {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index 53107a1..ae3427a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -26,7 +26,8 @@
 import '../native/native.dart' as native;
 import '../tree/tree.dart' as ast
     show DartString,
-         Node;
+         Node,
+         TryStatement;
 import '../types/types.dart'
     show ContainerTypeMask,
          DictionaryTypeMask,
@@ -439,6 +440,17 @@
     return result;
   }
 
+  PhiElementTypeInformation _addPhi(ast.Node node,
+                                    Local variable,
+                                    inputType,
+                                    bool isLoop) {
+    PhiElementTypeInformation result =
+        new PhiElementTypeInformation(currentMember, node, isLoop, variable);
+    allocatedTypes.add(result);
+    result.addAssignment(inputType);
+    return result;
+  }
+
   PhiElementTypeInformation allocatePhi(ast.Node node,
                                         Local variable,
                                         inputType) {
@@ -446,19 +458,23 @@
     // the try/catch block [node]. If it is, no need to allocate a new
     // phi.
     if (inputType is PhiElementTypeInformation &&
-        inputType.branchNode == node) {
+        inputType.branchNode == node &&
+        inputType.branchNode is ast.TryStatement) {
       return inputType;
     }
-    PhiElementTypeInformation result =
-        new PhiElementTypeInformation(currentMember, node, true, variable);
-    allocatedTypes.add(result);
-    result.addAssignment(inputType);
-    return result;
+    return _addPhi(node, variable, inputType, false);
+  }
+
+  PhiElementTypeInformation allocateLoopPhi(ast.Node node,
+                                            Local variable,
+                                            inputType) {
+    return _addPhi(node, variable, inputType, true);
   }
 
   TypeInformation simplifyPhi(ast.Node node,
                               Local variable,
                               PhiElementTypeInformation phiType) {
+    assert(phiType.branchNode == node);
     if (phiType.assignments.length == 1) return phiType.assignments.first;
     return phiType;
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js/template.dart b/sdk/lib/_internal/compiler/implementation/js/template.dart
index 1c56d37..5b574d0 100644
--- a/sdk/lib/_internal/compiler/implementation/js/template.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/template.dart
@@ -10,11 +10,6 @@
 
   TemplateManager();
 
-  // TODO(18886): Remove this function once the memory-leak in the VM is fixed.
-  void clear() {
-    expressionTemplates.clear();
-    statementTemplates.clear();
-  }
 
   Template lookupExpressionTemplate(String source) {
     return expressionTemplates[source];
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 2ae131f..de0592b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -54,9 +54,6 @@
         : oldEmitter;
     nativeEmitter = new NativeEmitter(this);
     typeTestEmitter.emitter = this.oldEmitter;
-    // TODO(18886): Remove this call (and the show in the import) once the
-    // memory-leak in the VM is fixed.
-    templateManager.clear();
   }
 
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
index dedd083..825eaa0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
@@ -33,7 +33,7 @@
 
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show
-    js, templateManager;
+    js;
 
 import '../js_backend/js_backend.dart' show
     CheckedModeHelper,
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart b/sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart
index fe10b0f..4ba7616 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart
@@ -38,6 +38,7 @@
   options.add('--analyze-signatures-only');
   options.add('--analyze-all');
   options.add('--categories=Client,Server');
+  options.add('--enable-async');
 
   bool compilationFailed = false;
   void internalDiagnosticHandler(Uri uri, int begin, int end,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 4c5a6a9..937d308 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -616,6 +616,44 @@
     }
   }
 
+  static void processAsyncMarker(Compiler compiler,
+                                 BaseFunctionElementX element) {
+    FunctionExpression functionExpression = element.node;
+    AsyncModifier asyncModifier = functionExpression.asyncModifier;
+    if (asyncModifier != null) {
+      if (!compiler.enableAsyncAwait) {
+        compiler.reportError(asyncModifier,
+            MessageKind.EXPERIMENTAL_ASYNC_AWAIT,
+            {'modifier': element.asyncMarker});
+      } else if (!compiler.analyzeOnly) {
+        compiler.reportError(asyncModifier,
+            MessageKind.EXPERIMENTAL_ASYNC_AWAIT,
+            {'modifier': element.asyncMarker});
+      }
+
+      if (asyncModifier.isAsynchronous) {
+        element.asyncMarker = asyncModifier.isYielding
+            ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC;
+      } else {
+        element.asyncMarker = AsyncMarker.SYNC_STAR;
+      }
+      if (element.isAbstract) {
+        compiler.reportError(asyncModifier,
+            MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD,
+            {'modifier': element.asyncMarker});
+      } else if (element.isConstructor) {
+        compiler.reportError(asyncModifier,
+            MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR,
+            {'modifier': element.asyncMarker});
+      } else if (functionExpression.body.asReturn() != null &&
+                 element.asyncMarker.isYielding) {
+        compiler.reportError(asyncModifier,
+            MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY,
+            {'modifier': element.asyncMarker});
+      }
+    }
+  }
+
   TreeElements resolveMethodElement(FunctionElementX element) {
     assert(invariant(element, element.isDeclaration));
     return compiler.withCurrentElement(element, () {
@@ -651,6 +689,7 @@
       }
       element.parseNode(compiler);
       element.computeType(compiler);
+      processAsyncMarker(compiler, element);
       if (element.isPatched) {
         FunctionElementX patch = element.patch;
         compiler.withCurrentElement(patch, () {
@@ -659,6 +698,7 @@
         });
         checkMatchingPatchSignatures(element, patch);
         element = patch;
+        processAsyncMarker(compiler, element);
       }
       return compiler.withCurrentElement(element, () {
         FunctionExpression tree = element.node;
@@ -2104,6 +2144,8 @@
       : typeResolver = new TypeResolver(compiler),
         super(compiler);
 
+  AsyncMarker get currentAsyncMarker => AsyncMarker.SYNC;
+
   /// Add [element] to the current scope and check for duplicate definitions.
   void addToScope(Element element) {
     Element existing = scope.add(element);
@@ -2112,9 +2154,23 @@
     }
   }
 
+  void checkLocalDefinitionName(Node node, Element element) {
+    if (currentAsyncMarker != AsyncMarker.SYNC) {
+      if (element.name == 'yield' ||
+          element.name == 'async' ||
+          element.name == 'await') {
+        compiler.reportError(
+            node, MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER,
+            {'keyword': element.name,
+             'modifier': currentAsyncMarker});
+      }
+    }
+  }
+
   /// Register [node] as the definition of [element].
   void defineLocalVariable(Node node, LocalVariableElement element) {
     invariant(node, element != null);
+    checkLocalDefinitionName(node, element);
     registry.defineElement(node, element);
   }
 
@@ -2223,6 +2279,14 @@
       inCatchBlock = false,
       super(compiler, registry);
 
+  AsyncMarker get currentAsyncMarker {
+    if (enclosingElement is FunctionElement) {
+      FunctionElement function = enclosingElement;
+      return function.asyncMarker;
+    }
+    return AsyncMarker.SYNC;
+  }
+
   Element reportLookupErrorIfAny(Element result, Node node, String name) {
     if (!Elements.isUnresolved(result)) {
       if (!inInstanceContext && result.isInstanceMember) {
@@ -2518,6 +2582,8 @@
     function.functionSignatureCache =
         SignatureResolver.analyze(compiler, node.parameters, node.returnType,
             function, registry, createRealParameters: true);
+    ResolverTask.processAsyncMarker(compiler, function);
+    checkLocalDefinitionName(node, function);
     registry.defineFunction(node, function);
     if (doAddToScope) {
       addToScope(function);
@@ -3143,6 +3209,12 @@
     visit(node.expression);
   }
 
+  visitYield(Yield node) {
+    compiler.streamClass.ensureResolved(compiler);
+    compiler.iterableClass.ensureResolved(compiler);
+    visit(node.expression);
+  }
+
   visitRedirectingFactoryBody(RedirectingFactoryBody node) {
     final isSymbolConstructor = enclosingElement == compiler.symbolConstructor;
     if (!enclosingElement.isFactoryConstructor) {
@@ -3213,6 +3285,11 @@
     visit(node.expression);
   }
 
+  visitAwait(Await node) {
+    compiler.futureClass.ensureResolved(compiler);
+    visit(node.expression);
+  }
+
   visitVariableDefinitions(VariableDefinitions node) {
     DartType type;
     if (node.type != null) {
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index bafa0b9..217b3eb 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -15,6 +15,7 @@
 import '../elements/elements.dart';
 import '../elements/modelx.dart'
     show BaseClassElementX,
+         BaseFunctionElementX,
          ConstructorElementX,
          ErroneousElementX,
          FieldElementX,
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
index 4bf9695..1e01efb 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/keyword.dart
@@ -67,7 +67,11 @@
       const Keyword("on", isPseudo: true),
       const Keyword("show", isPseudo: true),
       const Keyword("source", isPseudo: true),
-      const Keyword("deferred", isPseudo: true)];
+      const Keyword("deferred", isPseudo: true),
+      const Keyword("async", isPseudo: true),
+      const Keyword("sync", isPseudo: true),
+      const Keyword("await", isPseudo: true),
+      const Keyword("yield", isPseudo: true)];
 
   final String syntax;
   final bool isPseudo;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 2b69193..89f20d4 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -20,6 +20,16 @@
   void endArguments(int count, Token beginToken, Token endToken) {
   }
 
+  /// Handle async modifiers `async`, `async*`, `sync`.
+  void handleAsyncModifier(Token asyncToken, Token startToken) {
+  }
+
+  void beginAwaitExpression(Token token) {
+  }
+
+  void endAwaitExpression(Token beginToken, Token endToken) {
+  }
+
   void beginBlock(Token token) {
   }
 
@@ -115,7 +125,8 @@
                        Token beginToken, Token endToken) {
   }
 
-  void endForIn(Token beginToken, Token inKeyword, Token endToken) {
+  void endForIn(Token awaitToken, Token forToken,
+                Token inKeyword, Token endToken) {
   }
 
   void beginFunction(Token token) {
@@ -393,10 +404,10 @@
   void endTypeVariables(int count, Token beginToken, Token endToken) {
   }
 
-  void beginUnamedFunction(Token token) {
+  void beginUnnamedFunction(Token token) {
   }
 
-  void endUnamedFunction(Token token) {
+  void endUnnamedFunction(Token token) {
   }
 
   void beginVariablesDeclaration(Token token) {
@@ -546,6 +557,12 @@
   void handleVoidKeyword(Token token) {
   }
 
+  void beginYieldStatement(Token token) {
+  }
+
+  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
+  }
+
   Token expected(String string, Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
@@ -1623,6 +1640,11 @@
     pushNode(new Return(beginToken, endToken, expression));
   }
 
+  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
+    Expression expression = popNode();
+    pushNode(new Yield(yieldToken, starToken, expression, endToken));
+  }
+
   void endExpressionStatement(Token token) {
     pushNode(new ExpressionStatement(popNode(), token));
   }
@@ -1770,6 +1792,14 @@
     }
   }
 
+  void handleAsyncModifier(Token asyncToken, Token starToken) {
+    if (asyncToken != null) {
+      pushNode(new AsyncModifier(asyncToken, starToken));
+    } else {
+      pushNode(null);
+    }
+  }
+
   void skippedFunctionBody(Token token) {
     pushNode(new Block(new NodeList.empty()));
   }
@@ -1780,6 +1810,7 @@
 
   void endFunction(Token getOrSet, Token endToken) {
     Statement body = popNode();
+    AsyncModifier asyncModifier = popNode();
     NodeList initializers = popNode();
     NodeList formals = popNode();
     // The name can be an identifier or a send in case of named constructors.
@@ -1787,7 +1818,8 @@
     TypeAnnotation type = popNode();
     Modifiers modifiers = popNode();
     pushNode(new FunctionExpression(name, formals, body, type,
-                                    modifiers, initializers, getOrSet));
+                                    modifiers, initializers, getOrSet,
+                                    asyncModifier));
   }
 
   void endFunctionDeclaration(Token endToken) {
@@ -1854,6 +1886,11 @@
     pushNode(new Throw(expression, throwToken, endToken));
   }
 
+  void endAwaitExpression(Token awaitToken, Token endToken) {
+    Expression expression = popNode();
+    pushNode(new Await(awaitToken, expression));
+  }
+
   void endRethrowStatement(Token throwToken, Token endToken) {
     pushNode(new Rethrow(throwToken, endToken));
     if (identical(throwToken.stringValue, 'throw')) {
@@ -1920,13 +1957,15 @@
 
   void endMethod(Token getOrSet, Token beginToken, Token endToken) {
     Statement body = popNode();
+    AsyncModifier asyncModifier = popNode();
     NodeList initializers = popNode();
     NodeList formalParameters = popNode();
     Expression name = popNode();
     TypeAnnotation returnType = popNode();
     Modifiers modifiers = popNode();
     pushNode(new FunctionExpression(name, formalParameters, body, returnType,
-                                    modifiers, initializers, getOrSet));
+                                    modifiers, initializers, getOrSet,
+                                    asyncModifier));
   }
 
   void handleLiteralMap(int count, Token beginToken, Token constKeyword,
@@ -1996,7 +2035,7 @@
     TypeAnnotation returnType = popNode();
     pushNode(null); // Signal "no type" to endFormalParameter.
     pushNode(new FunctionExpression(name, formals, null, returnType,
-                                    Modifiers.EMPTY, null, null));
+                                    Modifiers.EMPTY, null, null, null));
   }
 
   void handleValuedFormalParameter(Token equals, Token token) {
@@ -2079,6 +2118,7 @@
   void endFactoryMethod(Token beginToken, Token endToken) {
     super.endFactoryMethod(beginToken, endToken);
     Statement body = popNode();
+    AsyncModifier asyncModifier = popNode();
     NodeList formals = popNode();
     Node name = popNode();
 
@@ -2102,15 +2142,16 @@
     Modifiers modifiers = popNode();
 
     pushNode(new FunctionExpression(name, formals, body, null,
-                                    modifiers, null, null));
+                                    modifiers, null, null, asyncModifier));
   }
 
-  void endForIn(Token beginToken, Token inKeyword, Token endToken) {
+  void endForIn(Token awaitToken, Token forToken,
+                Token inKeyword, Token endToken) {
     Statement body = popNode();
     Expression expression = popNode();
     Node declaredIdentifier = popNode();
     pushNode(new ForIn(declaredIdentifier, expression, body,
-                                beginToken, inKeyword));
+                       awaitToken, forToken, inKeyword));
   }
 
   void endMetadataStar(int count, bool forParameter) {
@@ -2169,11 +2210,13 @@
     pushNode(new ExpressionStatement(send, semicolonToken));
   }
 
-  void endUnamedFunction(Token token) {
+  void endUnnamedFunction(Token token) {
     Statement body = popNode();
+    AsyncModifier asyncModifier = popNode();
     NodeList formals = popNode();
     pushNode(new FunctionExpression(null, formals, body, null,
-                                    Modifiers.EMPTY, null, null));
+                                    Modifiers.EMPTY, null, null,
+                                    asyncModifier));
   }
 
   void handleIsOperator(Token operathor, Token not, Token endToken) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 33fbfeb..b13a7b5 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -41,6 +41,8 @@
 class Parser {
   final Listener listener;
   bool mayParseFunctionExpressions = true;
+  bool yieldIsKeyword = false;
+  bool awaitIsKeyword = false;
 
   Parser(this.listener);
 
@@ -864,7 +866,12 @@
     Token token = parseIdentifier(name);
 
     token = parseFormalParametersOpt(token);
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     token = parseFunctionBody(token, false, externalModifier != null);
+    yieldIsKeyword = previousYieldIsKeyword;
+    awaitIsKeyword = previousAwaitIsKeyword;
     listener.endTopLevelMethod(start, getOrSet, token);
     return token.next;
   }
@@ -1206,12 +1213,17 @@
     token = parseQualifiedRestOpt(token);
     token = parseFormalParametersOpt(token);
     token = parseInitializersOpt(token);
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
       token = parseFunctionBody(
           token, false, staticModifier == null || externalModifier != null);
     }
+    yieldIsKeyword = previousYieldIsKeyword;
+    awaitIsKeyword = previousAwaitIsKeyword;
     listener.endMethod(getOrSet, start, token);
     return token.next;
   }
@@ -1234,6 +1246,9 @@
     token = token.next; // Skip 'factory'.
     token = parseConstructorReference(token);
     token = parseFormalParameters(token);
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
@@ -1277,21 +1292,31 @@
     listener.endFunctionName(token);
     token = parseFormalParametersOpt(token);
     token = parseInitializersOpt(token);
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
       token = parseFunctionBody(token, false, true);
     }
+    yieldIsKeyword = previousYieldIsKeyword;
+    awaitIsKeyword = previousAwaitIsKeyword;
     listener.endFunction(getOrSet, token);
     return token.next;
   }
 
-  Token parseUnamedFunction(Token token) {
-    listener.beginUnamedFunction(token);
+  Token parseUnnamedFunction(Token token) {
+    listener.beginUnnamedFunction(token);
     token = parseFormalParameters(token);
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     bool isBlock = optional('{', token);
     token = parseFunctionBody(token, true, false);
-    listener.endUnamedFunction(token);
+    yieldIsKeyword = previousYieldIsKeyword;
+    awaitIsKeyword = previousAwaitIsKeyword;
+    listener.endUnnamedFunction(token);
     return isBlock ? token.next : token;
   }
 
@@ -1311,8 +1336,13 @@
     listener.endFunctionName(token);
     token = parseFormalParameters(token);
     listener.handleNoInitializers();
+    bool previousYieldIsKeyword = yieldIsKeyword;
+    bool previousAwaitIsKeyword = awaitIsKeyword;
+    token = parseAsyncModifier(token);
     bool isBlock = optional('{', token);
     token = parseFunctionBody(token, true, false);
+    yieldIsKeyword = previousYieldIsKeyword;
+    awaitIsKeyword = previousAwaitIsKeyword;
     listener.endFunction(null, token);
     return isBlock ? token.next : token;
   }
@@ -1378,6 +1408,48 @@
     return token;
   }
 
+  /// `async*` and `sync*` are parsed a two tokens, [token] and [star]. This
+  /// method checks that there is no whitespace between [token] and [star].
+  void checkStarredModifier(Token token, Token star, String name) {
+    if (star.charOffset > token.charOffset + token.charCount) {
+      listener.reportError(new TokenPair(token, star),
+          MessageKind.INVALID_STARRED_KEYWORD, {'keyword': name});
+    }
+  }
+
+  Token parseAsyncModifier(Token token) {
+    Token async;
+    Token star;
+    awaitIsKeyword = false;
+    yieldIsKeyword = false;
+    if (optional('async', token)) {
+      awaitIsKeyword = true;
+      async = token;
+      token = token.next;
+      if (optional('*', token)) {
+        yieldIsKeyword = true;
+        star = token;
+        token = token.next;
+        checkStarredModifier(async, star, 'async*');
+      }
+    } else if (optional('sync', token)) {
+      async = token;
+      token = token.next;
+      if (optional('*', token)) {
+        yieldIsKeyword = true;
+        star = token;
+        token = token.next;
+
+        checkStarredModifier(async, star, 'sync*');
+      } else {
+        listener.reportError(async,
+            MessageKind.INVALID_SYNC_MODIFIER);
+      }
+    }
+    listener.handleAsyncModifier(async, star);
+    return token;
+  }
+
   Token parseStatement(Token token) {
     final value = token.stringValue;
     if (identical(token.kind, IDENTIFIER_TOKEN)) {
@@ -1390,8 +1462,14 @@
       return parseVariablesDeclaration(token);
     } else if (identical(value, 'if')) {
       return parseIfStatement(token);
+    } else if (awaitIsKeyword && identical(value, 'await')) {
+      if (identical(token.next.stringValue, 'for')) {
+        return parseForStatement(token, token.next);
+      } else {
+        return parseExpressionStatement(token);
+      }
     } else if (identical(value, 'for')) {
-      return parseForStatement(token);
+      return parseForStatement(null, token);
     } else if (identical(value, 'rethrow')) {
       return parseRethrowStatement(token);
     } else if (identical(value, 'throw') && optional(';', token.next)) {
@@ -1415,6 +1493,8 @@
       return parseAssertStatement(token);
     } else if (identical(value, ';')) {
       return parseEmptyStatement(token);
+    } else if (yieldIsKeyword && identical(value, 'yield')) {
+      return parseYieldStatement(token);
     } else if (identical(value, 'const')) {
       return parseExpressionStatementOrConstDeclaration(token);
     } else if (token.isIdentifier()) {
@@ -1424,6 +1504,23 @@
     }
   }
 
+  Token parseYieldStatement(Token token) {
+    Token begin = token;
+    listener.beginYieldStatement(begin);
+    assert(identical('yield', token.stringValue));
+    token = token.next;
+    Token starToken;
+    if (optional('*', token)) {
+      starToken = token;
+      token = token.next;
+      checkStarredModifier(begin, starToken, 'yield*');
+    }
+    token = parseExpression(token);
+    listener.endYieldStatement(begin, starToken, token);
+    return expectSemicolon(token);
+  }
+
+
   Token parseReturnStatement(Token token) {
     Token begin = token;
     listener.beginReturnStatement(begin);
@@ -1478,7 +1575,10 @@
         BeginGroupToken beginParen = afterId;
         Token endParen = beginParen.endGroup;
         Token afterParens = endParen.next;
-        if (optional('{', afterParens) || optional('=>', afterParens)) {
+        if (optional('{', afterParens) ||
+            optional('=>', afterParens) ||
+            optional('async', afterParens) ||
+            optional('sync', afterParens)) {
           // We are looking at "type identifier '(' ... ')'" followed
           // by '=>' or '{'.
           return parseFunctionDeclaration(token);
@@ -1491,7 +1591,10 @@
       } else if (optional('(', token.next)) {
         BeginGroupToken begin = token.next;
         String afterParens = begin.endGroup.next.stringValue;
-        if (identical(afterParens, '{') || identical(afterParens, '=>')) {
+        if (identical(afterParens, '{') ||
+            identical(afterParens, '=>') ||
+            identical(afterParens, 'async') ||
+            identical(afterParens, 'sync')) {
           return parseFunctionDeclaration(token);
         }
       }
@@ -1672,7 +1775,9 @@
   Token parseUnaryExpression(Token token, bool allowCascades) {
     String value = token.stringValue;
     // Prefix:
-    if (identical(value, '+')) {
+    if (awaitIsKeyword && optional('await', token)) {
+      return parseAwaitExpression(token, allowCascades);
+    } else if (identical(value, '+')) {
       // Dart no longer allows prefix-plus.
       listener.reportError(token, MessageKind.UNSUPPORTED_PREFIX_PLUS);
       return parseUnaryExpression(token.next, allowCascades);
@@ -1767,11 +1872,14 @@
 
   Token parseParenthesizedExpressionOrFunctionLiteral(Token token) {
     BeginGroupToken beginGroup = token;
-    int kind = beginGroup.endGroup.next.kind;
+    Token nextToken = beginGroup.endGroup.next;
+    int kind = nextToken.kind;
     if (mayParseFunctionExpressions &&
-        (identical(kind, FUNCTION_TOKEN)
-            || identical(kind, OPEN_CURLY_BRACKET_TOKEN))) {
-      return parseUnamedFunction(token);
+        (identical(kind, FUNCTION_TOKEN) ||
+         identical(kind, OPEN_CURLY_BRACKET_TOKEN) ||
+         (identical(kind, KEYWORD_TOKEN) &&
+             (nextToken.value == 'async' || nextToken.value == 'sync')))) {
+      return parseUnnamedFunction(token);
     } else {
       bool old = mayParseFunctionExpressions;
       mayParseFunctionExpressions = true;
@@ -1893,7 +2001,10 @@
     if (optional('(', token)) {
       BeginGroupToken begin = token;
       String afterParens = begin.endGroup.next.stringValue;
-      if (identical(afterParens, '{') || identical(afterParens, '=>')) {
+      if (identical(afterParens, '{') ||
+          identical(afterParens, '=>') ||
+          identical(afterParens, 'async') ||
+          identical(afterParens, 'sync')) {
         return true;
       }
     }
@@ -2151,15 +2262,18 @@
     return token;
   }
 
-  Token parseForStatement(Token token) {
+  Token parseForStatement(Token awaitToken, Token token) {
     Token forToken = token;
     listener.beginForStatement(forToken);
     token = expect('for', token);
     token = expect('(', token);
     token = parseVariablesDeclarationOrExpressionOpt(token);
     if (optional('in', token)) {
-      return parseForInRest(forToken, token);
+      return parseForInRest(awaitToken, forToken, token);
     } else {
+      if (awaitToken != null) {
+        listener.reportError(awaitToken, MessageKind.INVALID_AWAIT_FOR);
+      }
       return parseForRest(forToken, token);
     }
   }
@@ -2206,13 +2320,13 @@
     return token;
   }
 
-  Token parseForInRest(Token forToken, Token token) {
+  Token parseForInRest(Token awaitToken, Token forToken, Token token) {
     assert(optional('in', token));
     Token inKeyword = token;
     token = parseExpression(token.next);
     token = expect(')', token);
     token = parseStatement(token);
-    listener.endForIn(forToken, inKeyword, token);
+    listener.endForIn(awaitToken, forToken, inKeyword, token);
     return token;
   }
 
@@ -2251,6 +2365,15 @@
     return expect('}', token);
   }
 
+  Token parseAwaitExpression(Token token, bool allowCascades) {
+    Token awaitToken = token;
+    listener.beginAwaitExpression(awaitToken);
+    token = expect('await', token);
+    token = parseUnaryExpression(token, allowCascades);
+    listener.endAwaitExpression(awaitToken, token);
+    return token;
+  }
+
   Token parseThrowExpression(Token token, bool allowCascades) {
     Token throwToken = token;
     listener.beginThrowExpression(throwToken);
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index 98fc1ab..c6ccbf4 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -103,8 +103,29 @@
     return endGroup;
   }
 
+  Token skipAsyncModifier(Token token) {
+    String value = token.stringValue;
+    if (identical(value, 'async')) {
+      token = token.next;
+      value = token.stringValue;
+
+      if (identical(value, '*')) {
+        token = token.next;
+      }
+    } else if (identical(value, 'sync')) {
+      token = token.next;
+      value = token.stringValue;
+
+      if (identical(value, '*')) {
+        token = token.next;
+      }
+    }
+    return token;
+  }
+
   Token parseFunctionBody(Token token, bool isExpression, bool allowAbstract) {
     assert(!isExpression);
+    token = skipAsyncModifier(token);
     String value = token.stringValue;
     if (identical(value, ';')) {
       if (!allowAbstract) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/token.dart b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
index 0b474d4..483eda9 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/token.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/token.dart
@@ -169,6 +169,15 @@
   int get hashCode => computeHashCode(charOffset, info, value);
 }
 
+/// A pair of tokens marking the beginning and the end of a span. Use for error
+/// reporting.
+class TokenPair implements Spannable {
+  final Token begin;
+  final Token end;
+
+  TokenPair(this.begin, this.end);
+}
+
 /**
  * A [SymbolToken] represents the symbol in its precendence info.
  * Also used for end of file with EOF_INFO.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 923b6e5..abd5e29 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -5058,6 +5058,17 @@
     }
   }
 
+  visitYield(ast.Yield node) {
+    // Dummy implementation.
+    visit(node.expression);
+    pop();
+  }
+
+  visitAwait(ast.Await node) {
+    // Dummy implementation.
+    visit(node.expression);
+  }
+
   visitTypeAnnotation(ast.TypeAnnotation node) {
     compiler.internalError(node,
         'Visiting type annotation in SSA builder.');
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index b247730..3f17758 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -167,8 +167,24 @@
   bool visitInterceptor(HInterceptor node) {
     if (node.isConstant()) return false;
 
-    // If the interceptor is used by multiple instructions, specialize
-    // it with a set of classes it intercepts.
+    // Specialize the interceptor with set of classes it intercepts, considering
+    // all uses.  (The specialized interceptor has a shorter dispatch chain).
+    // This operation applies only where the interceptor is used to dispatch a
+    // method.  Other uses, e.g. as an ordinary argument or a HIs check use the
+    // most general interceptor.
+    //
+    // TODO(sra): Take into account the receiver type at each call.  e.g:
+    //
+    //     (a) => a.length + a.hashCode
+    //
+    // Currently we use the most general interceptor since all intercepted types
+    // implement `hashCode`. But in this example, `a.hashCode` is only reached
+    // if `a.length` succeeds, which is indicated by the hashCode receiver being
+    // a HTypeKnown instruction.
+
+    int useCount(HInstruction user, HInstruction used) =>
+        user.inputs.where((input) => input == used).length;
+
     Set<ClassElement> interceptedClasses;
     JavaScriptBackend backend = compiler.backend;
     HInstruction dominator = findDominator(node.usedBy);
@@ -176,7 +192,8 @@
     // selector of that instruction.
     if (dominator is HInvokeDynamic &&
         dominator.isCallOnInterceptor(compiler) &&
-        node == dominator.receiver) {
+        node == dominator.receiver &&
+        useCount(dominator, node) == 1) {
       interceptedClasses =
             backend.getInterceptedClassesOn(dominator.selector.name);
 
@@ -202,7 +219,14 @@
       for (HInstruction user in node.usedBy) {
         if (user is HInvokeDynamic &&
             user.isCallOnInterceptor(compiler) &&
-            node == user.receiver) {
+            node == user.receiver &&
+            useCount(user, node) == 1) {
+          interceptedClasses.addAll(
+              backend.getInterceptedClassesOn(user.selector.name));
+        } else if (user is HInvokeSuper &&
+                   user.isCallOnInterceptor(compiler) &&
+                   node == user.receiver &&
+                   useCount(user, node) == 1) {
           interceptedClasses.addAll(
               backend.getInterceptedClassesOn(user.selector.name));
         } else {
@@ -215,6 +239,7 @@
     }
 
     HInstruction receiver = node.receiver;
+
     if (canUseSelfForInterceptor(receiver, interceptedClasses)) {
       return rewriteToUseSelfAsInterceptor(node, receiver);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 172de7f..2973145 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1498,7 +1498,20 @@
                type,
                {this.isSetter})
       : super(element, inputs, type);
-  toString() => 'invoke super: ${element.name}';
+
+  HInstruction get receiver => inputs[0];
+  HInstruction getDartReceiver(Compiler compiler) {
+    return isCallOnInterceptor(compiler) ? inputs[1] : inputs[0];
+  }
+
+  /**
+   * Returns whether this call is on an interceptor object.
+   */
+  bool isCallOnInterceptor(Compiler compiler) {
+    return isInterceptedCall && receiver.isInterceptor(compiler);
+  }
+
+  toString() => 'invoke super: $element';
   accept(HVisitor visitor) => visitor.visitInvokeSuper(this);
 
   HInstruction get value {
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 5bb147e..1e4b75d 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -9,6 +9,8 @@
 
   R visitNode(Node node);
 
+  R visitAsyncModifier(AsyncModifier node) => visitNode(node);
+  R visitAwait(Await node) => visitExpression(node);
   R visitBlock(Block node) => visitStatement(node);
   R visitBreakStatement(BreakStatement node) => visitGotoStatement(node);
   R visitCascade(Cascade node) => visitExpression(node);
@@ -88,6 +90,7 @@
   R visitTypeVariable(TypeVariable node) => visitNode(node);
   R visitVariableDefinitions(VariableDefinitions node) => visitStatement(node);
   R visitWhile(While node) => visitLoop(node);
+  R visitYield(Yield node) => visitStatement(node);
 }
 
 Token firstBeginToken(Node first, Node second) {
@@ -141,6 +144,8 @@
 
   Token getEndToken();
 
+  AsyncModifier asAsyncModifier() => null;
+  Await asAwait() => null;
   Block asBlock() => null;
   BreakStatement asBreakStatement() => null;
   Cascade asCascade() => null;
@@ -207,6 +212,7 @@
   Typedef asTypedef() => null;
   VariableDefinitions asVariableDefinitions() => null;
   While asWhile() => null;
+  Yield asYield() => null;
 
   bool isValidBreakTarget() => false;
   bool isValidContinueTarget() => false;
@@ -707,6 +713,34 @@
   Token getEndToken() => function.getEndToken();
 }
 
+/// Node representing the method implementation modifiers `sync*`, `async`, and
+/// `async*` or the invalid modifier `sync`.
+class AsyncModifier extends Node {
+  /// The `async` or `sync` token.
+  final Token asyncToken;
+
+  /// The `*` token.
+  final Token starToken;
+
+  AsyncModifier(this.asyncToken, this.starToken);
+
+  AsyncModifier asAsyncModifier() => this;
+
+  accept(Visitor visitor) => visitor.visitAsyncModifier(this);
+
+  visitChildren(Visitor visitor) {}
+
+  Token getBeginToken() => asyncToken;
+
+  Token getEndToken() => starToken != null ? starToken : asyncToken;
+
+  /// Is `true` if this modifier is either `async` or `async*`.
+  bool get isAsynchronous => asyncToken.value == 'async';
+
+  /// Is `true` if this modifier is either `sync*` or `async*`.
+  bool get isYielding => starToken != null;
+}
+
 class FunctionExpression extends Expression with StoredTreeElementMixin {
   final Node name;
 
@@ -723,9 +757,11 @@
   final NodeList initializers;
 
   final Token getOrSet;
+  final AsyncModifier asyncModifier;
 
   FunctionExpression(this.name, this.parameters, this.body, this.returnType,
-                     this.modifiers, this.initializers, this.getOrSet) {
+                     this.modifiers, this.initializers, this.getOrSet,
+                     this.asyncModifier) {
     assert(modifiers != null);
   }
 
@@ -743,6 +779,7 @@
     if (name != null) name.accept(visitor);
     if (parameters != null) parameters.accept(visitor);
     if (initializers != null) initializers.accept(visitor);
+    if (asyncModifier != null) asyncModifier.accept(visitor);
     if (body != null) body.accept(visitor);
   }
 
@@ -1041,6 +1078,29 @@
   }
 }
 
+class Yield extends Statement {
+  final Node expression;
+  final Token yieldToken;
+  final Token starToken;
+  final Token endToken;
+
+  Yield(this.yieldToken, this.starToken, this.expression, this.endToken);
+
+  Yield asYield() => this;
+
+  bool get hasStar => starToken != null;
+
+  accept(Visitor visitor) => visitor.visitYield(this);
+
+  visitChildren(Visitor visitor) {
+    expression.accept(visitor);
+  }
+
+  Token getBeginToken() => yieldToken;
+
+  Token getEndToken() => endToken;
+}
+
 class RedirectingFactoryBody extends Statement with StoredTreeElementMixin {
   final Node constructorReference;
   final Token beginToken;
@@ -1102,6 +1162,26 @@
   Token getEndToken() => endToken;
 }
 
+class Await extends Expression {
+  final Expression expression;
+
+  final Token awaitToken;
+
+  Await(this.awaitToken, this.expression);
+
+  Await asAwait() => this;
+
+  accept(Visitor visitor) => visitor.visitAwait(this);
+
+  visitChildren(Visitor visitor) {
+    expression.accept(visitor);
+  }
+
+  Token getBeginToken() => awaitToken;
+
+  Token getEndToken() => expression.getEndToken();
+}
+
 class Rethrow extends Statement {
   final Token throwToken;
   final Token endToken;
@@ -1694,11 +1774,15 @@
   final Node declaredIdentifier;
   final Expression expression;
 
+  final Token awaitToken;
   final Token forToken;
   final Token inToken;
 
   ForIn(this.declaredIdentifier, this.expression,
-        Statement body, this.forToken, this.inToken) : super(body);
+        Statement body, this.awaitToken, this.forToken, this.inToken)
+      : super(body);
+
+  bool get isAsync => awaitToken != null;
 
   Expression get condition => null;
 
@@ -1712,7 +1796,7 @@
     body.accept(visitor);
   }
 
-  Token getBeginToken() => forToken;
+  Token getBeginToken() => awaitToken != null ? awaitToken : forToken;
 
   Token getEndToken() => body.getEndToken();
 }
@@ -2168,6 +2252,7 @@
   bool get isErroneous => true;
 
   // FunctionExpression.
+  get asyncModifier => null;
   get parameters => null;
   get body => null;
   get returnType => null;
diff --git a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
index 93a3212..b0b1de1 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
@@ -121,6 +121,12 @@
     closeNode();
   }
 
+  visitAsyncModifier(AsyncModifier node) {
+    openAndCloseNode(node, "AsyncModifier",
+        {'asyncToken': node.asyncToken,
+         'starToken': node.starToken});
+  }
+
   visitBlock(Block node) {
     visitNodeWithChildren(node, "Block");
   }
@@ -181,7 +187,9 @@
   }
 
   visitForIn(ForIn node) {
-    visitNodeWithChildren(node, "ForIn");
+    openNode(node, "ForIn", {'await': node.awaitToken});
+    node.visitChildren(this);
+    closeNode();
   }
 
   visitFunctionDeclaration(FunctionDeclaration node) {
@@ -318,6 +326,12 @@
     closeNode();
   }
 
+  visitYield(Yield node) {
+    openNode(node, "Yield", {'star': node.starToken});
+    visitChildNode(node.expression, "expression");
+    closeNode();
+  }
+
   visitChildNode(Node node, String fieldName) {
     if (node == null) return;
     addCurrentIndent();
@@ -381,6 +395,10 @@
     visitNodeWithChildren(node, "Throw");
   }
 
+  visitAwait(Await node) {
+    visitNodeWithChildren(node, "Await");
+  }
+
   visitTryStatement(TryStatement node) {
     visitNodeWithChildren(node, "TryStatement");
   }
diff --git a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
index 288b31a..b4ce89d 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/unparser.dart
@@ -217,6 +217,13 @@
     }
   }
 
+  visitAsyncModifier(AsyncModifier node) {
+    write(node.asyncToken.value);
+    if (node.starToken != null) {
+      write(node.starToken.value);
+    }
+  }
+
   visitFunctionExpression(FunctionExpression node) {
     if (!node.modifiers.nodes.isEmpty) {
       visit(node.modifiers);
@@ -239,6 +246,7 @@
       unparseNodeListFrom(node.initializers, node.initializers.nodes,
           spaces: true);
     }
+    visit(node.asyncModifier);
     if (node.body != null && node.body is! EmptyStatement) space();
     visit(node.body);
   }
@@ -378,6 +386,15 @@
     if (node.endToken != null) write(node.endToken.value);
   }
 
+  visitYield(Yield node) {
+    write(node.yieldToken);
+    write(node.starToken);
+    space();
+    visit(node.expression);
+    write(node.endToken);
+  }
+
+
   unparseSendReceiver(Send node, {bool spacesNeeded: false}) {
     if (node.receiver == null) return;
     visit(node.receiver);
@@ -488,6 +505,12 @@
     visit(node.expression);
   }
 
+  visitAwait(Await node) {
+    write(node.awaitToken.value);
+    write(' ');
+    visit(node.expression);
+  }
+
   visitTypeAnnotation(TypeAnnotation node) {
     visit(node.typeName);
     visit(node.typeArguments);
@@ -582,6 +605,10 @@
   }
 
   visitForIn(ForIn node) {
+    if (node.awaitToken != null) {
+      write(node.awaitToken.value);
+      write(' ');
+    }
     write(node.forToken.value);
     space();
     write('(');
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index 7cef548..b1fb8cd 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -250,6 +250,7 @@
 
   Node lastSeenNode;
   DartType expectedReturnType;
+  AsyncMarker currentAsyncMarker = AsyncMarker.SYNC;
 
   final ClassElement currentClass;
 
@@ -604,10 +605,13 @@
       returnType = functionType.returnType;
       type = functionType;
     }
-    DartType previous = expectedReturnType;
+    DartType previousReturnType = expectedReturnType;
     expectedReturnType = returnType;
+    AsyncMarker previousAsyncMarker = currentAsyncMarker;
+    currentAsyncMarker = element.asyncMarker;
     analyze(node.body);
-    expectedReturnType = previous;
+    expectedReturnType = previousReturnType;
+    currentAsyncMarker = previousAsyncMarker;
     return type;
   }
 
@@ -1589,6 +1593,36 @@
     return const DynamicType();
   }
 
+  DartType visitAwait(Await node) {
+    DartType expressionType = analyze(node.expression);
+    DartType resultType = expressionType;
+    if (expressionType is InterfaceType) {
+      InterfaceType futureType =
+          expressionType.asInstanceOf(compiler.futureClass);
+      if (futureType != null) {
+        resultType = futureType.typeArguments.first;
+      }
+    }
+    return resultType;
+  }
+
+  DartType visitYield(Yield node) {
+    DartType resultType = analyze(node.expression);
+    if (!node.hasStar) {
+      if (currentAsyncMarker.isAsync) {
+        resultType =
+            compiler.streamClass.thisType.createInstantiation(
+                <DartType>[resultType]);
+      } else {
+        resultType =
+            compiler.iterableClass.thisType.createInstantiation(
+                 <DartType>[resultType]);
+      }
+    }
+    checkAssignable(node, resultType, expectedReturnType);
+    return const StatementType();
+  }
+
   DartType visitTypeAnnotation(TypeAnnotation node) {
     return elements.getType(node);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 354d710..a381aaa 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -72,6 +72,8 @@
 
 void useNode(tree.Node node) {
   node
+    ..asAsyncModifier()
+    ..asAwait()
     ..asBreakStatement()
     ..asCascade()
     ..asCatchBlock()
@@ -110,7 +112,8 @@
     ..asTypeAnnotation()
     ..asTypeVariable()
     ..asTypedef()
-    ..asWhile();
+    ..asWhile()
+    ..asYield();
 }
 
 void useUtil(util.Link link) {
@@ -233,7 +236,8 @@
     ..buildBooleanLiteral(null)
     ..buildNullLiteral()
     ..buildStringLiteral(null)
-    ..buildDynamicGet(null, null);
+    ..buildDynamicGet(null, null)
+    ..buildSuperGet(null);
 }
 
 useCompiler(dart2jslib.Compiler compiler) {
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 42da42c3..d6945d2 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -82,7 +82,13 @@
    */
   final List examples;
 
-  const MessageKind(this.template, {this.howToFix, this.examples});
+  /// Additional options needed for the examples to work.
+  final List<String> options;
+
+  const MessageKind(this.template,
+                    {this.howToFix,
+                     this.examples,
+                     this.options: const <String>[]});
 
   /// Do not use this. It is here for legacy and debugging. It violates item 4
   /// above.
@@ -1976,6 +1982,105 @@
     " require a preamble file located in:\n"
     "  <sdk>/lib/_internal/compiler/js_lib/preambles.");
 
+
+  static const MessageKind EXPERIMENTAL_ASYNC_AWAIT = const MessageKind(
+      "Experimental language feature 'async/await' is not supported.");
+
+  static const MessageKind INVALID_STARRED_KEYWORD = const MessageKind(
+      "Invalid '#{keyword}' keyword.",
+      options: const ['--enable-async'],
+      howToFix: "Try removing whitespace between '#{keyword}' and '*'.",
+      examples: const [
+        "main() async * {}",
+        "main() sync * {}",
+        "main() async* { yield * 0; }"
+      ]);
+
+  static const MessageKind INVALID_SYNC_MODIFIER = const MessageKind(
+      "Invalid modifier 'sync'.",
+      options: const ['--enable-async'],
+      howToFix: "Try replacing 'sync' with 'sync*'.",
+      examples: const [
+        "main() sync {}"
+      ]);
+
+  static const MessageKind INVALID_AWAIT_FOR = const MessageKind(
+      "'await' is only supported on for-in loops.",
+      options: const ['--enable-async'],
+      howToFix: "Try rewriting the loop as a for-in loop or removing the "
+                "'await' keyword.",
+      examples: const ["""
+main() async* {
+  await for (int i = 0; i < 10; i++) {}
+}
+"""]);
+
+  static const MessageKind ASYNC_MODIFIER_ON_ABSTRACT_METHOD =
+      const MessageKind(
+          "The modifier '#{modifier}' is not allowed on an abstract method.",
+          options: const ['--enable-async'],
+          howToFix: "Try removing the '#{modifier}' modifier or adding a "
+                    "body to the method.",
+          examples: const ["""
+abstract class A {
+  method() async;
+}
+class B extends A {
+  method() {}
+}
+main() {
+  A a = new B();
+  a.method();
+}
+"""]);
+
+  static const MessageKind ASYNC_MODIFIER_ON_CONSTRUCTOR =
+      const MessageKind(
+          "The modifier '#{modifier}' is not allowed on constructors.",
+          options: const ['--enable-async'],
+          howToFix: "Try removing the '#{modifier}' modifier.",
+          examples: const ["""
+class A {
+  A() async;
+}
+main() => new A();""",
+
+"""
+class A {
+  A();
+  factory A.a() async* => new A();
+}
+main() => new A.a();"""]);
+
+  static const MessageKind YIELDING_MODIFIER_ON_ARROW_BODY =
+      const MessageKind(
+          "The modifier '#{modifier}' is not allowed on methods implemented "
+          "using '=>'.",
+          options: const ['--enable-async'],
+          howToFix: "Try removing the '#{modifier}' modifier or implementing "
+                    "the method body using a block: '{ ... }'.",
+          examples: const ["main() sync* => null;", "main() async* => null;"]);
+
+  // TODO(johnniwinther): Check for 'async' as identifier.
+  static const MessageKind ASYNC_KEYWORD_AS_IDENTIFIER = const MessageKind(
+      "'#{keyword}' cannot be used as an identifier in a function body marked "
+      "with '#{modifier}'.",
+      options: const ['--enable-async'],
+      howToFix: "Try removing the '#{modifier}' modifier or renaming the "
+                "identifier.",
+      examples: const ["""
+main() async {
+ var await;
+}""",
+"""
+main() async* {
+ var yield;
+}""",
+"""
+main() sync* {
+ var yield;
+}"""]);
+
   //////////////////////////////////////////////////////////////////////////////
   // Patch errors start.
   //////////////////////////////////////////////////////////////////////////////
diff --git a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
index 2686ca6..bd8816f 100644
--- a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
@@ -369,3 +369,10 @@
     _sink.close();
   }
 }
+
+@patch class Utf8Decoder {
+  @patch
+  Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next) {
+    return super.fuse(next);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index 4343536..035dbe6 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -70,8 +70,8 @@
     if (hostname == null) hostname = "localhost";
     if (basePort == null) basePort = 0;
 
-    return entrypoint.loadPackageGraph().then((graph) {
-      log.fine("Loaded package graph.");
+    return log.progress("Loading asset environment", () async {
+      var graph = await entrypoint.loadPackageGraph();
       graph = _adjustPackageGraph(graph, mode, packages);
       var barback = new Barback(new PubPackageProvider(graph));
       barback.log.listen(_log);
@@ -79,9 +79,9 @@
       var environment = new AssetEnvironment._(graph, barback, mode,
           watcherType, hostname, basePort);
 
-      return environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS)
-          .then((_) => environment);
-    });
+      await environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS);
+      return environment;
+    }, fine: true);
   }
 
   /// Return a version of [graph] that's restricted to [packages] (if passed)
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
index e6f9912..c6906dd 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
@@ -4,6 +4,7 @@
 
 library pub.barback.transformer_config;
 
+import 'package:glob/glob.dart';
 import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
@@ -38,7 +39,7 @@
   /// This is processed before [excludes]. If a transformer has both includes
   /// and excludes, then the set of included assets is determined and assets
   /// are excluded from that resulting set.
-  final Set<String> includes;
+  final Set<Glob> includes;
 
   /// The primary input exclusions.
   ///
@@ -48,7 +49,7 @@
   /// This is processed after [includes]. If a transformer has both includes
   /// and excludes, then the set of included assets is determined and assets
   /// are excluded from that resulting set.
-  final Set<String> excludes;
+  final Set<Glob> excludes;
 
   /// Returns whether this config excludes certain asset ids from being
   /// processed.
@@ -58,8 +59,17 @@
   /// the package's dependers.
   bool get canTransformPublicFiles {
     if (includes == null) return true;
-    return includes.any((path) =>
-        p.url.isWithin('lib', path) || p.url.isWithin('bin', path));
+    return includes.any((glob) {
+      // Check whether the first path component of the glob is "lib", "bin", or
+      // contains wildcards that may cause it to match "lib" or "bin".
+      var first = p.posix.split(glob.toString()).first;
+      if (first.contains('{') || first.contains('*') || first.contains('[') ||
+          first.contains('?')) {
+        return true;
+      }
+
+      return first == 'lib' || first == 'bin';
+    });
   }
 
   /// Parses [identifier] as a [TransformerId] with [configuration].
@@ -76,20 +86,23 @@
       var fieldNode = configurationNode.nodes[key];
       var field = fieldNode.value;
 
-      if (field is String) return new Set.from([field]);
+      if (field is String) {
+        return new Set.from([new Glob(field, context: p.url, recursive: true)]);
+      }
 
-      if (field is List) {
-        for (var node in field.nodes) {
-          if (node.value is String) continue;
-          throw new SourceSpanFormatException(
-              '"$key" field may contain only strings.', node.span);
-        }
-
-        return new Set.from(field);
-      } else {
+      if (field is! List) {
         throw new SourceSpanFormatException(
             '"$key" field must be a string or list.', fieldNode.span);
       }
+
+      return new Set.from(field.nodes.map((node) {
+        if (node.value is String) {
+          return new Glob(node.value, context: p.url, recursive: true);
+        }
+
+        throw new SourceSpanFormatException(
+            '"$key" field may contain only strings.', node.span);
+      }));
     }
 
     var includes = null;
@@ -133,13 +146,15 @@
   /// [pathWithinPackage] must be a URL-style path relative to the containing
   /// package's root directory.
   bool canTransform(String pathWithinPackage) {
-    // TODO(rnystrom): Support globs in addition to paths. See #17093.
     if (excludes != null) {
       // If there are any excludes, it must not match any of them.
-      if (excludes.contains(pathWithinPackage)) return false;
+      for (var exclude in excludes) {
+        if (exclude.matches(pathWithinPackage)) return false;
+      }
     }
 
     // If there are any includes, it must match one of them.
-    return includes == null || includes.contains(pathWithinPackage);
+    return includes == null ||
+        includes.any((include) => include.matches(pathWithinPackage));
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 32c42af..940efab 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -432,35 +432,34 @@
   /// If [result] is passed, this loads the graph from it without re-parsing the
   /// lockfile or any pubspecs. Otherwise, before loading, this makes sure the
   /// lockfile and dependencies are installed and up to date.
-  Future<PackageGraph> loadPackageGraph([SolveResult result]) {
-    if (_packageGraph != null) return new Future.value(_packageGraph);
+  Future<PackageGraph> loadPackageGraph([SolveResult result]) async {
+    if (_packageGraph != null) return _packageGraph;
 
-    return new Future.sync(() {
+    var graph = await log.progress("Loading package graph", () async {
       if (result != null) {
-        return Future.wait(result.packages.map((id) {
-          return cache.sources[id.source].getDirectory(id)
-              .then((dir) => new Package(result.pubspecs[id.name], dir));
-        })).then((packages) {
-          return new PackageGraph(this, new LockFile(result.packages),
-              new Map.fromIterable(packages, key: (package) => package.name));
-        });
-      } else {
-        return ensureLockFileIsUpToDate().then((_) {
-          return Future.wait(lockFile.packages.values.map((id) {
-            var source = cache.sources[id.source];
-            return source.getDirectory(id)
-                .then((dir) => new Package.load(id.name, dir, cache.sources));
-          })).then((packages) {
-            var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
-            packageMap[root.name] = root;
-            return new PackageGraph(this, lockFile, packageMap);
-          });
-        });
+        var packages = await Future.wait(result.packages.map((id) async {
+          var dir = await cache.sources[id.source].getDirectory(id);
+          return new Package(result.pubspecs[id.name], dir);
+        }));
+
+        return new PackageGraph(this, new LockFile(result.packages),
+            new Map.fromIterable(packages, key: (package) => package.name));
       }
-    }).then((graph) {
-      _packageGraph = graph;
-      return graph;
-    });
+
+      await ensureLockFileIsUpToDate();
+      var packages = await Future.wait(lockFile.packages.values.map((id) async {
+        var source = cache.sources[id.source];
+        var dir = await source.getDirectory(id);
+        return new Package.load(id.name, dir, cache.sources);
+      }));
+
+      var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
+      packageMap[root.name] = root;
+      return new PackageGraph(this, lockFile, packageMap);
+    }, fine: true);
+
+    _packageGraph = graph;
+    return graph;
   }
 
   /// Saves a list of concrete package versions to the `pubspec.lock` file.
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index aea0401..4daec90 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -163,6 +163,16 @@
   return result.toString();
 }
 
+/// Pads [source] to [length] by adding [char]s at the beginning.
+///
+/// If [char] is `null`, it defaults to a space.
+String padLeft(String source, int length, [String char]) {
+  if (char == null) char = ' ';
+  if (source.length >= length) return source;
+
+  return char * (length - source.length) + source;
+}
+
 /// Returns a labelled sentence fragment starting with [name] listing the
 /// elements [iter].
 ///
@@ -707,8 +717,17 @@
   var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
 
   var s = duration.inSeconds % 59;
-  var ms = (duration.inMilliseconds % 1000) ~/ 100;
-  return result + "$s.${ms}s";
+  var ms = duration.inMilliseconds % 1000;
+
+  // If we're using verbose logging, be more verbose but more accurate when
+  // reporting timing information.
+  if (log.verbosity.isLevelVisible(log.Level.FINE)) {
+    ms = padLeft(ms.toString(), 3, '0');
+  } else {
+    ms ~/= 100;
+  }
+
+  return "$result$s.${ms}s";
 }
 
 /// Decodes a URL-encoded string.
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_glob_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_glob_test.dart
new file mode 100644
index 0000000..812e7b4
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_glob_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a glob to exclude", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$exclude": "**/foo.txt"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShould404("foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      requestShould404("sub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_prefix_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_prefix_test.dart
new file mode 100644
index 0000000..6e2cfac
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/exclude_asset_prefix_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a directory prefix to exclude", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$exclude": "web/sub"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ]),
+          d.dir("subbub", [
+            d.file("foo.txt", "foo"),
+          ])
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      requestShouldSucceed("subbub/foo.out", "foo.out");
+      requestShould404("sub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_glob_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_glob_test.dart
new file mode 100644
index 0000000..f153420
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_glob_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a glob to include", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$include": "**/foo.txt"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ])
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShould404("bar.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_prefix_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_prefix_test.dart
new file mode 100644
index 0000000..6434b64
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/include_asset_prefix_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a directory prefix to include", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp/src/transformer": {
+                "\$include": "web/sub"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar"),
+          d.dir("sub", [
+            d.file("foo.txt", "foo"),
+          ]),
+          d.dir("subbub", [
+            d.file("foo.txt", "foo"),
+          ])
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShould404("foo.out");
+      requestShould404("bar.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      requestShould404("subbub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
index 27c2593..5a6000b 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
@@ -70,19 +70,38 @@
     if (hostname == null) hostname = "localhost";
     if (basePort == null) basePort = 0;
 
-    return entrypoint.loadPackageGraph().then((graph) {
-      log.fine("Loaded package graph.");
-      graph = _adjustPackageGraph(graph, mode, packages);
-      var barback = new Barback(new PubPackageProvider(graph));
-      barback.log.listen(_log);
-
-      var environment =
-          new AssetEnvironment._(graph, barback, mode, watcherType, hostname, basePort);
-
-      return environment._load(
-          entrypoints: entrypoints,
-          useDart2JS: useDart2JS).then((_) => environment);
-    });
+    return log.progress("Loading asset environment", () {
+      final completer0 = new Completer();
+      scheduleMicrotask(() {
+        try {
+          entrypoint.loadPackageGraph().then((x0) {
+            try {
+              var graph = x0;
+              graph = _adjustPackageGraph(graph, mode, packages);
+              var barback = new Barback(new PubPackageProvider(graph));
+              barback.log.listen(_log);
+              var environment =
+                  new AssetEnvironment._(graph, barback, mode, watcherType, hostname, basePort);
+              environment._load(
+                  entrypoints: entrypoints,
+                  useDart2JS: useDart2JS).then((x1) {
+                try {
+                  x1;
+                  completer0.complete(environment);
+                } catch (e0, s0) {
+                  completer0.completeError(e0, s0);
+                }
+              }, onError: completer0.completeError);
+            } catch (e1, s1) {
+              completer0.completeError(e1, s1);
+            }
+          }, onError: completer0.completeError);
+        } catch (e, s) {
+          completer0.completeError(e, s);
+        }
+      });
+      return completer0.future;
+    }, fine: true);
   }
 
   /// Return a version of [graph] that's restricted to [packages] (if passed)
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_config.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_config.dart
index 1d2b52b..11d9594 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_config.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_config.dart
@@ -4,6 +4,7 @@
 
 library pub.barback.transformer_config;
 
+import 'package:glob/glob.dart';
 import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
@@ -38,7 +39,7 @@
   /// This is processed before [excludes]. If a transformer has both includes
   /// and excludes, then the set of included assets is determined and assets
   /// are excluded from that resulting set.
-  final Set<String> includes;
+  final Set<Glob> includes;
 
   /// The primary input exclusions.
   ///
@@ -48,7 +49,7 @@
   /// This is processed after [includes]. If a transformer has both includes
   /// and excludes, then the set of included assets is determined and assets
   /// are excluded from that resulting set.
-  final Set<String> excludes;
+  final Set<Glob> excludes;
 
   /// Returns whether this config excludes certain asset ids from being
   /// processed.
@@ -58,8 +59,19 @@
   /// the package's dependers.
   bool get canTransformPublicFiles {
     if (includes == null) return true;
-    return includes.any(
-        (path) => p.url.isWithin('lib', path) || p.url.isWithin('bin', path));
+    return includes.any((glob) {
+      // Check whether the first path component of the glob is "lib", "bin", or
+      // contains wildcards that may cause it to match "lib" or "bin".
+      var first = p.posix.split(glob.toString()).first;
+      if (first.contains('{') ||
+          first.contains('*') ||
+          first.contains('[') ||
+          first.contains('?')) {
+        return true;
+      }
+
+      return first == 'lib' || first == 'bin';
+    });
   }
 
   /// Parses [identifier] as a [TransformerId] with [configuration].
@@ -77,22 +89,25 @@
       var fieldNode = configurationNode.nodes[key];
       var field = fieldNode.value;
 
-      if (field is String) return new Set.from([field]);
+      if (field is String) {
+        return new Set.from([new Glob(field, context: p.url, recursive: true)]);
+      }
 
-      if (field is List) {
-        for (var node in field.nodes) {
-          if (node.value is String) continue;
-          throw new SourceSpanFormatException(
-              '"$key" field may contain only strings.',
-              node.span);
-        }
-
-        return new Set.from(field);
-      } else {
+      if (field is! List) {
         throw new SourceSpanFormatException(
             '"$key" field must be a string or list.',
             fieldNode.span);
       }
+
+      return new Set.from(field.nodes.map((node) {
+        if (node.value is String) {
+          return new Glob(node.value, context: p.url, recursive: true);
+        }
+
+        throw new SourceSpanFormatException(
+            '"$key" field may contain only strings.',
+            node.span);
+      }));
     }
 
     var includes = null;
@@ -137,13 +152,15 @@
   /// [pathWithinPackage] must be a URL-style path relative to the containing
   /// package's root directory.
   bool canTransform(String pathWithinPackage) {
-    // TODO(rnystrom): Support globs in addition to paths. See #17093.
     if (excludes != null) {
       // If there are any excludes, it must not match any of them.
-      if (excludes.contains(pathWithinPackage)) return false;
+      for (var exclude in excludes) {
+        if (exclude.matches(pathWithinPackage)) return false;
+      }
     }
 
     // If there are any includes, it must match one of them.
-    return includes == null || includes.contains(pathWithinPackage);
+    return includes == null ||
+        includes.any((include) => include.matches(pathWithinPackage));
   }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index c020d15..ee16741 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -646,36 +646,117 @@
   /// lockfile or any pubspecs. Otherwise, before loading, this makes sure the
   /// lockfile and dependencies are installed and up to date.
   Future<PackageGraph> loadPackageGraph([SolveResult result]) {
-    if (_packageGraph != null) return new Future.value(_packageGraph);
-
-    return new Future.sync(() {
-      if (result != null) {
-        return Future.wait(result.packages.map((id) {
-          return cache.sources[id.source].getDirectory(
-              id).then((dir) => new Package(result.pubspecs[id.name], dir));
-        })).then((packages) {
-          return new PackageGraph(
-              this,
-              new LockFile(result.packages),
-              new Map.fromIterable(packages, key: (package) => package.name));
-        });
-      } else {
-        return ensureLockFileIsUpToDate().then((_) {
-          return Future.wait(lockFile.packages.values.map((id) {
-            var source = cache.sources[id.source];
-            return source.getDirectory(
-                id).then((dir) => new Package.load(id.name, dir, cache.sources));
-          })).then((packages) {
-            var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
-            packageMap[root.name] = root;
-            return new PackageGraph(this, lockFile, packageMap);
-          });
-        });
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          log.progress("Loading package graph", (() {
+            final completer0 = new Completer();
+            scheduleMicrotask(() {
+              try {
+                join0() {
+                  ensureLockFileIsUpToDate().then((x0) {
+                    try {
+                      x0;
+                      Future.wait(lockFile.packages.values.map(((id) {
+                        final completer0 = new Completer();
+                        scheduleMicrotask(() {
+                          try {
+                            var source = cache.sources[id.source];
+                            source.getDirectory(id).then((x0) {
+                              try {
+                                var dir = x0;
+                                completer0.complete(
+                                    new Package.load(id.name, dir, cache.sources));
+                              } catch (e0, s0) {
+                                completer0.completeError(e0, s0);
+                              }
+                            }, onError: completer0.completeError);
+                          } catch (e, s) {
+                            completer0.completeError(e, s);
+                          }
+                        });
+                        return completer0.future;
+                      }))).then((x1) {
+                        try {
+                          var packages = x1;
+                          var packageMap =
+                              new Map.fromIterable(packages, key: ((p) {
+                            return p.name;
+                          }));
+                          packageMap[root.name] = root;
+                          completer0.complete(
+                              new PackageGraph(this, lockFile, packageMap));
+                        } catch (e0, s0) {
+                          completer0.completeError(e0, s0);
+                        }
+                      }, onError: completer0.completeError);
+                    } catch (e1, s1) {
+                      completer0.completeError(e1, s1);
+                    }
+                  }, onError: completer0.completeError);
+                }
+                if (result != null) {
+                  Future.wait(result.packages.map(((id) {
+                    final completer0 = new Completer();
+                    scheduleMicrotask(() {
+                      try {
+                        cache.sources[id.source].getDirectory(id).then((x0) {
+                          try {
+                            var dir = x0;
+                            completer0.complete(
+                                new Package(result.pubspecs[id.name], dir));
+                          } catch (e0, s0) {
+                            completer0.completeError(e0, s0);
+                          }
+                        }, onError: completer0.completeError);
+                      } catch (e, s) {
+                        completer0.completeError(e, s);
+                      }
+                    });
+                    return completer0.future;
+                  }))).then((x2) {
+                    try {
+                      var packages = x2;
+                      completer0.complete(
+                          new PackageGraph(
+                              this,
+                              new LockFile(result.packages),
+                              new Map.fromIterable(packages, key: ((package) {
+                        return package.name;
+                      }))));
+                    } catch (e2, s2) {
+                      completer0.completeError(e2, s2);
+                    }
+                  }, onError: completer0.completeError);
+                } else {
+                  join0();
+                }
+              } catch (e, s) {
+                completer0.completeError(e, s);
+              }
+            });
+            return completer0.future;
+          }), fine: true).then((x0) {
+            try {
+              var graph = x0;
+              _packageGraph = graph;
+              completer0.complete(graph);
+            } catch (e0, s0) {
+              completer0.completeError(e0, s0);
+            }
+          }, onError: completer0.completeError);
+        }
+        if (_packageGraph != null) {
+          completer0.complete(_packageGraph);
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
       }
-    }).then((graph) {
-      _packageGraph = graph;
-      return graph;
     });
+    return completer0.future;
   }
 
   /// Saves a list of concrete package versions to the `pubspec.lock` file.
diff --git a/sdk/lib/_internal/pub_generated/lib/src/utils.dart b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
index 1558dac..3804e13 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
@@ -163,6 +163,16 @@
   return result.toString();
 }
 
+/// Pads [source] to [length] by adding [char]s at the beginning.
+///
+/// If [char] is `null`, it defaults to a space.
+String padLeft(String source, int length, [String char]) {
+  if (char == null) char = ' ';
+  if (source.length >= length) return source;
+
+  return char * (length - source.length) + source;
+}
+
 /// Returns a labelled sentence fragment starting with [name] listing the
 /// elements [iter].
 ///
@@ -708,8 +718,17 @@
   var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
 
   var s = duration.inSeconds % 59;
-  var ms = (duration.inMilliseconds % 1000) ~/ 100;
-  return result + "$s.${ms}s";
+  var ms = duration.inMilliseconds % 1000;
+
+  // If we're using verbose logging, be more verbose but more accurate when
+  // reporting timing information.
+  if (log.verbosity.isLevelVisible(log.Level.FINE)) {
+    ms = padLeft(ms.toString(), 3, '0');
+  } else {
+    ms ~/= 100;
+  }
+
+  return "$result$s.${ms}s";
 }
 
 /// Decodes a URL-encoded string.
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_glob_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_glob_test.dart
new file mode 100644
index 0000000..9bf9100
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_glob_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a glob to exclude", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [{
+              "myapp/src/transformer": {
+                "\$exclude": "**/foo.txt"
+              }
+            }]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir(
+                "web",
+                [
+                    d.file("foo.txt", "foo"),
+                    d.file("bar.txt", "bar"),
+                    d.dir("sub", [d.file("foo.txt", "foo"),])])]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShould404("foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      requestShould404("sub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_prefix_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_prefix_test.dart
new file mode 100644
index 0000000..12bbfd2c
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/exclude_asset_prefix_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a directory prefix to exclude", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [{
+              "myapp/src/transformer": {
+                "\$exclude": "web/sub"
+              }
+            }]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir(
+                "web",
+                [
+                    d.file("foo.txt", "foo"),
+                    d.file("bar.txt", "bar"),
+                    d.dir("sub", [d.file("foo.txt", "foo"),]),
+                    d.dir("subbub", [d.file("foo.txt", "foo"),])])]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShouldSucceed("bar.out", "bar.out");
+      requestShouldSucceed("subbub/foo.out", "foo.out");
+      requestShould404("sub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_glob_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_glob_test.dart
new file mode 100644
index 0000000..07a4702a
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_glob_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a glob to include", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [{
+              "myapp/src/transformer": {
+                "\$include": "**/foo.txt"
+              }
+            }]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir(
+                "web",
+                [
+                    d.file("foo.txt", "foo"),
+                    d.file("bar.txt", "bar"),
+                    d.dir("sub", [d.file("foo.txt", "foo"),])])]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      requestShould404("bar.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_prefix_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_prefix_test.dart
new file mode 100644
index 0000000..22f2c7e
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/exclusion/include_asset_prefix_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.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.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("allows a directory prefix to include", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [{
+              "myapp/src/transformer": {
+                "\$include": "web/sub"
+              }
+            }]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir(
+                "web",
+                [
+                    d.file("foo.txt", "foo"),
+                    d.file("bar.txt", "bar"),
+                    d.dir("sub", [d.file("foo.txt", "foo"),]),
+                    d.dir("subbub", [d.file("foo.txt", "foo"),])])]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShould404("foo.out");
+      requestShould404("bar.out");
+      requestShouldSucceed("sub/foo.out", "foo.out");
+      requestShould404("subbub/foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index 72c4e95..9e8580d 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -587,7 +587,7 @@
    */
   static int _nextPowerOf2(int number) {
     assert(number > 0);
-    number = (number << 2) - 1;
+    number = (number << 1) - 1;
     for(;;) {
       int nextNumber = number & (number - 1);
       if (nextNumber == 0) return number;
@@ -678,6 +678,10 @@
   /** Grows the table even if it is not full. */
   void _preGrow(int newElementCount) {
     assert(newElementCount >= length);
+
+    // Add some extra room to ensure that there's room for more elements after
+    // expansion.
+    newElementCount += newElementCount >> 1;
     int newCapacity = _nextPowerOf2(newElementCount);
     List<E> newTable = new List<E>(newCapacity);
     _tail = _writeToList(newTable);
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 4b7817f..fa0886d 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -167,7 +167,11 @@
    */
   final String indent;
 
-  final _toEncodableFunction;
+  /**
+   * Function called on non-encodable objects to return a replacement
+   * encodable object that will be encoded in the orignal's place.
+   */
+  final Function _toEncodable;
 
   /**
    * Creates a JSON encoder.
@@ -183,7 +187,7 @@
    */
   const JsonEncoder([Object toEncodable(Object nonSerializable)])
       : this.indent = null,
-        this._toEncodableFunction = toEncodable;
+        this._toEncodable = toEncodable;
 
   /**
    * Creates a JSON encoder that creates multi-line JSON.
@@ -205,7 +209,7 @@
    */
   const JsonEncoder.withIndent(this.indent,
       [Object toEncodable(Object nonSerializable)])
-      : this._toEncodableFunction = toEncodable;
+      : this._toEncodable = toEncodable;
 
   /**
    * Converts [object] to a JSON [String].
@@ -236,7 +240,7 @@
    * first serialized, the new values may not be reflected in the result.
    */
   String convert(Object object) =>
-      _JsonStringifier.stringify(object, _toEncodableFunction, indent);
+      _JsonStringStringifier.stringify(object, _toEncodable, indent);
 
   /**
    * Starts a chunked conversion.
@@ -250,12 +254,146 @@
   ChunkedConversionSink<Object> startChunkedConversion(Sink<String> sink) {
     if (sink is! StringConversionSink) {
       sink = new StringConversionSink.from(sink);
+    } else if (sink is _Utf8EncoderSink) {
+      return new _JsonUtf8EncoderSink(sink._sink, _toEncodable,
+                                      JsonUtf8Encoder._utf8Encode(indent),
+                                      JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
     }
-    return new _JsonEncoderSink(sink, _toEncodableFunction, indent);
+    return new _JsonEncoderSink(sink, _toEncodable, indent);
   }
 
   // Override the base-classes bind, to provide a better type.
   Stream<String> bind(Stream<Object> stream) => super.bind(stream);
+
+  Converter<Object, dynamic> fuse(Converter<String, dynamic> other) {
+    if (other is Utf8Encoder) {
+      return new JsonUtf8Encoder(indent, _toEncodable);
+    }
+    return super.fuse(other);
+  }
+}
+
+/**
+ * Encoder that encodes a single object as a UTF-8 encoded JSON string.
+ *
+ * This encoder works equivalently to first converting the object to
+ * a JSON string, and then UTF-8 encoding the string, but without
+ * creating an intermediate string.
+ */
+class JsonUtf8Encoder extends Converter<Object, List<int>> {
+  /** Default buffer size used by the JSON-to-UTF-8 encoder. */
+  static const int DEFAULT_BUFFER_SIZE = 256;
+  /** Indentation used in pretty-print mode, `null` if not pretty. */
+  final List<int> _indent;
+  /** Function called with each un-encodable object encountered. */
+  final Function _toEncodable;
+  /** UTF-8 buffer size. */
+  final int _bufferSize;
+
+  /**
+   * Create converter.
+   *
+   * If [indent] is non-`null`, the converter attempts to "pretty-print" the
+   * JSON, and uses `indent` as the indentation. Otherwise the result has no
+   * whitespace outside of string literals.
+   * If `indent` contains characters that are not valid JSON whitespace
+   * characters, the result will not be valid JSON. JSON whitespace characters
+   * are space (U+0020), tab (U+0009), line feed (U+000a) and carriage return
+   * (U+000d) (ECMA 404).
+   *
+   * The [bufferSize] is the size of the internal buffers used to collect
+   * UTF-8 code units.
+   * If using [startChunkedConversion], it will be the size of the chunks.
+   *
+   * The JSON encoder handles numbers, strings, booleans, null, lists and
+   * maps directly.
+   *
+   * Any other object is attempted converted by [toEncodable] to an
+   * object that is of one of the convertible types.
+   *
+   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
+   * the object.
+   */
+  JsonUtf8Encoder([String indent,
+                   toEncodable(Object object),
+                   int bufferSize = DEFAULT_BUFFER_SIZE])
+      : _indent = _utf8Encode(indent),
+        _toEncodable = toEncodable,
+        _bufferSize = bufferSize;
+
+  static List<int> _utf8Encode(String string) {
+    if (string == null) return null;
+    if (string.isEmpty) return new Uint8List(0);
+    checkAscii: {
+      for (int i = 0; i < string.length; i++) {
+        if (string.codeUnitAt(i) >= 0x80) break checkAscii;
+      }
+      return string.codeUnits;
+    }
+    return UTF8.encode(string);
+  }
+
+  /** Convert [object] into UTF-8 encoded JSON. */
+  List<int> convert(Object object) {
+    List<List<int>> bytes = [];
+    // The `stringify` function always converts into chunks.
+    // Collect the chunks into the `bytes` list, then combine them afterwards.
+    void addChunk(Uint8List chunk, int start, int end) {
+      if (start > 0 || end < chunk.length) {
+        int length = end - start;
+        chunk = new Uint8List.view(chunk.buffer,
+                                   chunk.offsetInBytes + start,
+                                   length);
+      }
+      bytes.add(chunk);
+    }
+    _JsonUtf8Stringifier.stringify(object,
+                                   _indent,
+                                   _toEncodable,
+                                   _bufferSize,
+                                   addChunk);
+    if (bytes.length == 1) return bytes[0];
+    int length = 0;
+    for (int i = 0; i < bytes.length; i++) {
+      length += bytes[i].length;
+    }
+    Uint8List result = new Uint8List(length);
+    for (int i = 0, offset = 0; i < bytes.length; i++) {
+      var byteList = bytes[i];
+      int end = offset + byteList.length;
+      result.setRange(offset, end, byteList);
+      offset = end;
+    }
+    return result;
+  }
+
+  /**
+   * Start a chunked conversion.
+   *
+   * Only one object can be passed into the returned sink.
+   *
+   * The argument [sink] will receive byte lists in sizes depending on the
+   * `bufferSize` passed to the constructor when creating this encoder.
+   */
+  ChunkedConversionSink<Object> startChunkedConversion(Sink<List<int>> sink) {
+    ByteConversionSink byteSink;
+    if (sink is ByteConversionSink) {
+      byteSink = sink;
+    } else {
+      byteSink = new ByteConversionSink.from(sink);
+    }
+    return new _JsonUtf8EncoderSink(byteSink, _toEncodable,
+                                    _indent, _bufferSize);
+  }
+
+  // Override the base-classes bind, to provide a better type.
+  Stream<List<int>> bind(Stream<Object> stream) {
+    return super.bind(stream);
+  }
+
+  Converter<Object, dynamic> fuse(Converter<List<int>, dynamic> other) {
+    return super.fuse(other);
+  }
 }
 
 /**
@@ -265,11 +403,11 @@
  */
 class _JsonEncoderSink extends ChunkedConversionSink<Object> {
   final String _indent;
-  final Function _toEncodableFunction;
+  final Function _toEncodable;
   final StringConversionSink _sink;
   bool _isDone = false;
 
-  _JsonEncoderSink(this._sink, this._toEncodableFunction, this._indent);
+  _JsonEncoderSink(this._sink, this._toEncodable, this._indent);
 
   /**
    * Encodes the given object [o].
@@ -284,7 +422,7 @@
     }
     _isDone = true;
     ClosableStringSink stringSink = _sink.asStringSink();
-    _JsonStringifier.printOn(o, stringSink, _toEncodableFunction, _indent);
+    _JsonStringStringifier.printOn(o, stringSink, _toEncodable, _indent);
     stringSink.close();
   }
 
@@ -292,6 +430,43 @@
 }
 
 /**
+ * Sink returned when starting a chunked conversion from object to bytes.
+ */
+class _JsonUtf8EncoderSink extends ChunkedConversionSink<Object> {
+  /** The byte sink receiveing the encoded chunks. */
+  final ByteConversionSink _sink;
+  final List<int> _indent;
+  final Function _toEncodable;
+  final int _bufferSize;
+  bool _isDone = false;
+  _JsonUtf8EncoderSink(this._sink, this._toEncodable, this._indent,
+                       this._bufferSize);
+
+  /** Callback called for each slice of result bytes. */
+  void _addChunk(Uint8List chunk, int start, int end) {
+    _sink.addSlice(chunk, start, end, false);
+  }
+
+  void add(Object object) {
+    if (_isDone) {
+      throw new StateError("Only one call to add allowed");
+    }
+    _isDone = true;
+    _JsonUtf8Stringifier.stringify(object, _indent, _toEncodable,
+                                   _bufferSize,
+                                   _addChunk);
+    _sink.close();
+  }
+
+  void close() {
+    if (!_isDone) {
+      _isDone = true;
+      _sink.close();
+    }
+  }
+}
+
+/**
  * This class parses JSON strings and builds the corresponding objects.
  */
 class JsonDecoder extends Converter<String, Object> {
@@ -340,7 +515,13 @@
 
 Object _defaultToEncodable(object) => object.toJson();
 
-class _JsonStringifier {
+/**
+ * JSON encoder that traverses an object structure and writes JSON source.
+ *
+ * This is an abstract implementation that doesn't decide on the output
+ * format, but writes the JSON through abstract methods like [writeString].
+ */
+abstract class _JsonStringifier {
   // Character code constants.
   static const int BACKSPACE       = 0x08;
   static const int TAB             = 0x09;
@@ -357,87 +538,86 @@
   static const int CHAR_t          = 0x74;
   static const int CHAR_u          = 0x75;
 
+  /** List of objects currently being traversed. Used to detect cycles. */
+  final List _seen = new List();
+  /** Function called for each un-encodable object encountered. */
   final Function _toEncodable;
-  final StringSink _sink;
-  final List _seen;
 
-  factory _JsonStringifier(StringSink sink, Function toEncodable,
-      String indent) {
-    if (indent == null) return new _JsonStringifier._(sink, toEncodable);
-    return new _JsonStringifierPretty(sink, toEncodable, indent);
-  }
+  _JsonStringifier(Object _toEncodable(Object o))
+      : _toEncodable = (_toEncodable != null) ? _toEncodable
+                                              : _defaultToEncodable;
 
-  _JsonStringifier._(this._sink, this._toEncodable)
-      : this._seen = new List();
-
-  static String stringify(object, toEncodable(object), String indent) {
-    if (toEncodable == null) toEncodable = _defaultToEncodable;
-    StringBuffer output = new StringBuffer();
-    printOn(object, output, toEncodable, indent);
-    return output.toString();
-  }
-
-  static void printOn(object, StringSink output, toEncodable(object),
-      String indent) {
-    new _JsonStringifier(output, toEncodable, indent).stringifyValue(object);
-  }
-
-  static String numberToString(num x) {
-    return x.toString();
-  }
+  /** Append a string to the JSON output. */
+  void writeString(String characters);
+  /** Append part of a string to the JSON output. */
+  void writeStringSlice(String characters, int start, int end);
+  /** Append a single character, given by its code point, to the JSON output. */
+  void writeCharCode(int charCode);
+  /** Write a number to the JSON output. */
+  void writeNumber(num number);
 
   // ('0' + x) or ('a' + x - 10)
   static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
 
-  void escape(String s) {
+  /**
+   * Write, and suitably escape, a string's content as a JSON string literal.
+   */
+  void writeStringContent(String s) {
     int offset = 0;
     final int length = s.length;
     for (int i = 0; i < length; i++) {
       int charCode = s.codeUnitAt(i);
       if (charCode > BACKSLASH) continue;
       if (charCode < 32) {
-        if (i > offset) _sink.write(s.substring(offset, i));
+        if (i > offset) writeStringSlice(s, offset, i);
         offset = i + 1;
-        _sink.writeCharCode(BACKSLASH);
+        writeCharCode(BACKSLASH);
         switch (charCode) {
         case BACKSPACE:
-          _sink.writeCharCode(CHAR_b);
+          writeCharCode(CHAR_b);
           break;
         case TAB:
-          _sink.writeCharCode(CHAR_t);
+          writeCharCode(CHAR_t);
           break;
         case NEWLINE:
-          _sink.writeCharCode(CHAR_n);
+          writeCharCode(CHAR_n);
           break;
         case FORM_FEED:
-          _sink.writeCharCode(CHAR_f);
+          writeCharCode(CHAR_f);
           break;
         case CARRIAGE_RETURN:
-          _sink.writeCharCode(CHAR_r);
+          writeCharCode(CHAR_r);
           break;
         default:
-          _sink.writeCharCode(CHAR_u);
-          _sink.writeCharCode(CHAR_0);
-          _sink.writeCharCode(CHAR_0);
-          _sink.writeCharCode(hexDigit((charCode >> 4) & 0xf));
-          _sink.writeCharCode(hexDigit(charCode & 0xf));
+          writeCharCode(CHAR_u);
+          writeCharCode(CHAR_0);
+          writeCharCode(CHAR_0);
+          writeCharCode(hexDigit((charCode >> 4) & 0xf));
+          writeCharCode(hexDigit(charCode & 0xf));
           break;
         }
       } else if (charCode == QUOTE || charCode == BACKSLASH) {
-        if (i > offset) _sink.write(s.substring(offset, i));
+        if (i > offset) writeStringSlice(s, offset, i);
         offset = i + 1;
-        _sink.writeCharCode(BACKSLASH);
-        _sink.writeCharCode(charCode);
+        writeCharCode(BACKSLASH);
+        writeCharCode(charCode);
       }
     }
     if (offset == 0) {
-      _sink.write(s);
+      writeString(s);
     } else if (offset < length) {
-      _sink.write(s.substring(offset, length));
+      writeStringSlice(s, offset, length);
     }
   }
 
-  void checkCycle(object) {
+  /**
+   * Check if an encountered object is already being traversed.
+   *
+   * Records the object if it isn't already seen.
+   * Should have a matching call to [_removeSeen] when the object
+   * is no longer being traversed.
+   */
+  void _checkCycle(object) {
     for (int i = 0; i < _seen.length; i++) {
       if (identical(object, _seen[i])) {
         throw new JsonCyclicError(object);
@@ -446,21 +626,38 @@
     _seen.add(object);
   }
 
-  void stringifyValue(object) {
+  /**
+   * Removes object from the list of currently traversed objects.
+   *
+   * Should be called in the opposite order of the matching [_checkCycle]
+   * calls.
+   */
+  void _removeSeen(object) {
+    assert(!_seen.isEmpty);
+    assert(identical(_seen.last, object));
+    _seen.removeLast();
+  }
+
+  /**
+   * Writes an object.
+   *
+   * If the object isn't directly encodable, the [_toEncodable] function
+   * gets one chance to return a replacement which is encodable.
+   */
+  void writeObject(object) {
     // Tries stringifying object directly. If it's not a simple value, List or
     // Map, call toJson() to get a custom representation and try serializing
     // that.
-    if (!stringifyJsonValue(object)) {
-      checkCycle(object);
-      try {
-        var customJson = _toEncodable(object);
-        if (!stringifyJsonValue(customJson)) {
-          throw new JsonUnsupportedObjectError(object);
-        }
-        _removeSeen(object);
-      } catch (e) {
-        throw new JsonUnsupportedObjectError(object, cause: e);
+    if (writeJsonValue(object)) return;
+    _checkCycle(object);
+    try {
+      var customJson = _toEncodable(object);
+      if (!writeJsonValue(customJson)) {
+        throw new JsonUnsupportedObjectError(object);
       }
+      _removeSeen(object);
+    } catch (e) {
+      throw new JsonUnsupportedObjectError(object, cause: e);
     }
   }
 
@@ -470,52 +667,33 @@
    * Returns true if the value is one of these types, and false if not.
    * If a value is both a [List] and a [Map], it's serialized as a [List].
    */
-  bool stringifyJsonValue(object) {
+  bool writeJsonValue(object) {
     if (object is num) {
       if (!object.isFinite) return false;
-      _sink.write(numberToString(object));
+      writeNumber(object);
       return true;
     } else if (identical(object, true)) {
-      _sink.write('true');
+      writeString('true');
       return true;
     } else if (identical(object, false)) {
-      _sink.write('false');
+      writeString('false');
        return true;
     } else if (object == null) {
-      _sink.write('null');
+      writeString('null');
       return true;
     } else if (object is String) {
-      _sink.write('"');
-      escape(object);
-      _sink.write('"');
+      writeString('"');
+      writeStringContent(object);
+      writeString('"');
       return true;
     } else if (object is List) {
-      checkCycle(object);
-      List a = object;
-      _sink.write('[');
-      if (a.length > 0) {
-        stringifyValue(a[0]);
-        for (int i = 1; i < a.length; i++) {
-          _sink.write(',');
-          stringifyValue(a[i]);
-        }
-      }
-      _sink.write(']');
+      _checkCycle(object);
+      writeList(object);
       _removeSeen(object);
       return true;
     } else if (object is Map) {
-      checkCycle(object);
-      Map<String, Object> m = object;
-      _sink.write('{');
-      String separator = '"';
-      m.forEach((String key, value) {
-        _sink.write(separator);
-        separator = ',"';
-        escape(key);
-        _sink.write('":');
-        stringifyValue(value);
-      });
-      _sink.write('}');
+      _checkCycle(object);
+      writeMap(object);
       _removeSeen(object);
       return true;
     } else {
@@ -523,85 +701,338 @@
     }
   }
 
-  void _removeSeen(object) {
-    assert(!_seen.isEmpty);
-    assert(identical(_seen.last, object));
-    _seen.removeLast();
+  /** Serializes a [List]. */
+  void writeList(List list) {
+    writeString('[');
+    if (list.length > 0) {
+      writeObject(list[0]);
+      for (int i = 1; i < list.length; i++) {
+        writeString(',');
+        writeObject(list[i]);
+      }
+    }
+    writeString(']');
+  }
+
+  /** Serializes a [Map]. */
+  void writeMap(Map<String, Object> map) {
+    writeString('{');
+    String separator = '"';
+    map.forEach((String key, value) {
+      writeString(separator);
+      separator = ',"';
+      writeStringContent(key);
+      writeString('":');
+      writeObject(value);
+    });
+    writeString('}');
   }
 }
 
 /**
- * A subclass of [_JsonStringifier] which indents the contents of [List] and
+ * A modification of [_JsonStringifier] which indents the contents of [List] and
  * [Map] objects using the specified indent value.
+ *
+ * Subclasses should implement [writeIndentation].
  */
-class _JsonStringifierPretty extends _JsonStringifier {
-  final String _indent;
-
+abstract class _JsonPrettyPrintMixin implements _JsonStringifier {
   int _indentLevel = 0;
 
-  _JsonStringifierPretty(_sink, _toEncodable, this._indent)
-      : super._(_sink, _toEncodable);
+  /**
+   * Add [indentLevel] indentations to the JSON output.
+   */
+  void writeIndentation(indentLevel);
 
-  void _write([String value = '']) {
-    _sink.write(_indent * _indentLevel);
-    _sink.write(value);
+  void writeList(List list) {
+    if (list.isEmpty) {
+      writeString('[]');
+    } else {
+      writeString('[\n');
+      _indentLevel++;
+      writeIndentation(_indentLevel);
+      writeObject(list[0]);
+      for (int i = 1; i < list.length; i++) {
+        writeString(',\n');
+        writeIndentation(_indentLevel);
+        writeObject(list[i]);
+      }
+      writeString('\n');
+      _indentLevel--;
+      writeIndentation(_indentLevel);
+      writeString(']');
+    }
+  }
+
+  void writeMap(Map map) {
+    if (map.isEmpty) {
+      writeString('{}');
+    } else {
+      writeString('{\n');
+      _indentLevel++;
+      bool first = true;
+      map.forEach((String key, Object value) {
+        if (!first) {
+          writeString(",\n");
+        }
+        writeIndentation(_indentLevel);
+        writeString('"');
+        writeStringContent(key);
+        writeString('": ');
+        writeObject(value);
+        first = false;
+      });
+      writeString('\n');
+      _indentLevel--;
+      writeIndentation(_indentLevel);
+      writeString('}');
+    }
+  }
+}
+
+/**
+ * A specialziation of [_JsonStringifier] that writes its JSON to a string.
+ */
+class _JsonStringStringifier extends _JsonStringifier {
+  final StringSink _sink;
+
+  _JsonStringStringifier(this._sink, _toEncodable) : super(_toEncodable);
+
+  /**
+   * Convert object to a string.
+   *
+   * The [toEncodable] function is used to convert non-encodable objects
+   * to encodable ones.
+   *
+   * If [indent] is not `null`, the resulting JSON will be "pretty-printed"
+   * with newlines and indentation. The `indent` string is added as indentation
+   * for each indentation level. It should only contain valid JSON whitespace
+   * characters (space, tab, carriage return or line feed).
+   */
+  static String stringify(object, toEncodable(object), String indent) {
+    StringBuffer output = new StringBuffer();
+    printOn(object, output, toEncodable, indent);
+    return output.toString();
   }
 
   /**
-   * Serializes a [num], [String], [bool], [Null], [List] or [Map] value.
+   * Convert object to a string, and write the result to the [output] sink.
    *
-   * Returns true if the value is one of these types, and false if not.
-   * If a value is both a [List] and a [Map], it's serialized as a [List].
+   * The result is written piecemally to the sink.
    */
-  bool stringifyJsonValue(final object) {
-    if (object is List) {
-      checkCycle(object);
-      List a = object;
-      if (a.isEmpty) {
-        _sink.write('[]');
-      } else {
-        _sink.writeln('[');
-        _indentLevel++;
-        _write();
-        stringifyValue(a[0]);
-        for (int i = 1; i < a.length; i++) {
-          _sink.writeln(',');
-          _write();
-          stringifyValue(a[i]);
-        }
-        _sink.writeln();
-        _indentLevel--;
-        _write(']');
-      }
-      _seen.remove(object);
-      return true;
-    } else if (object is Map) {
-      checkCycle(object);
-      Map<String, Object> m = object;
-      if (m.isEmpty) {
-        _sink.write('{}');
-      } else {
-        _sink.write('{');
-        _sink.writeln();
-        _indentLevel++;
-        bool first = true;
-        m.forEach((String key, Object value) {
-          if (!first) {
-            _sink.writeln(',');
-          }
-          _write('"');
-          escape(key);
-          _sink.write('": ');
-          stringifyValue(value);
-          first = false;
-        });
-        _sink.writeln();
-        _indentLevel--;
-        _write('}');
-      }
-      _seen.remove(object);
-      return true;
+  static void printOn(object, StringSink output, toEncodable(object),
+                      String indent) {
+    var stringifier;
+    if (indent == null) {
+      stringifier = new _JsonStringStringifier(output, toEncodable);
+    } else {
+      stringifier =
+          new _JsonStringStringifierPretty(output, toEncodable, indent);
     }
-    return super.stringifyJsonValue(object);
+    stringifier.writeObject(object);
+  }
+
+  void writeNumber(num number) {
+    _sink.write(number.toString());
+  }
+  void writeString(String string) {
+    _sink.write(string);
+  }
+  void writeStringSlice(String string, int start, int end) {
+    _sink.write(string.substring(start, end));
+  }
+  void writeCharCode(int charCode) {
+    _sink.writeCharCode(charCode);
+  }
+}
+
+class _JsonStringStringifierPretty extends _JsonStringStringifier
+                                   with _JsonPrettyPrintMixin {
+  final String _indent;
+
+  _JsonStringStringifierPretty(StringSink sink, Function toEncodable,
+                               this._indent)
+      : super(sink, toEncodable);
+
+  void writeIndentation(int count) {
+    for (int i = 0; i < count; i++) writeString(_indent);
+  }
+}
+
+/**
+ * Specialization of [_JsonStringifier] that writes the JSON as UTF-8.
+ *
+ * The JSON text is UTF-8 encoded and written to [Uint8List] buffers.
+ * The buffers are then passed back to a user provided callback method.
+ */
+class _JsonUtf8Stringifier extends _JsonStringifier {
+  final int bufferSize;
+  final Function addChunk;
+  Uint8List buffer;
+  int index = 0;
+
+  _JsonUtf8Stringifier(toEncodable, int bufferSize, this.addChunk)
+      : super(toEncodable),
+        this.bufferSize = bufferSize,
+        buffer = new Uint8List(bufferSize);
+
+  /**
+   * Convert [object] to UTF-8 encoded JSON.
+   *
+   * Calls [addChunk] with slices of UTF-8 code units.
+   * These will typically have size [bufferSize], but may be shorter.
+   * The buffers are not reused, so the [addChunk] call may keep and reuse
+   * the chunks.
+   *
+   * If [indent] is non-`null`, the result will be "pretty-printed" with
+   * extra newlines and indentation, using [indent] as the indentation.
+   */
+  static void stringify(Object object,
+                        List<int> indent,
+                        toEncodableFunction(Object o),
+                        int bufferSize,
+                        void addChunk(Uint8List chunk, int start, int end)) {
+    _JsonUtf8Stringifier stringifier;
+    if (indent != null) {
+      stringifier = new _JsonUtf8StringifierPretty(toEncodableFunction, indent,
+                                                   bufferSize, addChunk);
+    } else {
+      stringifier = new _JsonUtf8Stringifier(toEncodableFunction,
+                                             bufferSize, addChunk);
+    }
+    stringifier.writeObject(object);
+    stringifier.flush();
+  }
+
+  /**
+   * Must be called at the end to push the last chunk to the [addChunk]
+   * callback.
+   */
+  void flush() {
+    if (index > 0) {
+      addChunk(buffer, 0, index);
+    }
+    buffer = null;
+    index = 0;
+  }
+
+  void writeNumber(num number) {
+    writeAsciiString(number.toString());
+  }
+
+  /** Write a string that is known to not have non-ASCII characters. */
+  void writeAsciiString(String string) {
+    // TODO(lrn): Optimize by copying directly into buffer instead of going
+    // through writeCharCode;
+    for (int i = 0; i < string.length; i++) {
+      int char = string.codeUnitAt(i);
+      assert(char <= 0x7f);
+      writeByte(char);
+    }
+  }
+
+  void writeString(String string) {
+    writeStringSlice(string, 0, string.length);
+  }
+
+  void writeStringSlice(String string, int start, int end) {
+    // TODO(lrn): Optimize by copying directly into buffer instead of going
+    // through writeCharCode/writeByte. Assumption is the most characters
+    // in starings are plain ASCII.
+    for (int i = start; i < end; i++) {
+      int char = string.codeUnitAt(i);
+      if (char <= 0x7f) {
+        writeByte(char);
+      } else {
+        if ((char & 0xFC00) == 0xD800 && i + 1 < end) {
+          // Lead surrogate.
+          int nextChar = string.codeUnitAt(i + 1);
+          if ((nextChar & 0xFC00) == 0xDC00) {
+            // Tail surrogate.
+            char = 0x10000 + ((char & 0x3ff) << 10) + (nextChar & 0x3ff);
+            writeFourByteCharCode(char);
+            i++;
+            continue;
+          }
+        }
+        writeMultiByteCharCode(char);
+      }
+    }
+  }
+
+  void writeCharCode(int charCode) {
+    if (charCode <= 0x7f) {
+      writeByte(charCode);
+      return;
+    }
+    writeMultiByteCharCode(charCode);
+  }
+
+  void writeMultiByteCharCode(int charCode) {
+    if (charCode <= 0x7ff) {
+      writeByte(0xC0 | (charCode >> 6));
+      writeByte(0x80 | (charCode & 0x3f));
+      return;
+    }
+    if (charCode <= 0xffff) {
+      writeByte(0xE0 | (charCode >> 12));
+      writeByte(0x80 | ((charCode >> 6) & 0x3f));
+      writeByte(0x80 | (charCode & 0x3f));
+      return;
+    }
+    writeFourByteCharCode(charCode);
+  }
+
+  void writeFourByteCharCode(int charCode) {
+    assert(charCode <= 0x10ffff);
+    writeByte(0xF0 | (charCode >> 18));
+    writeByte(0x80 | ((charCode >> 12) & 0x3f));
+    writeByte(0x80 | ((charCode >> 6) & 0x3f));
+    writeByte(0x80 | (charCode & 0x3f));
+  }
+
+  void writeByte(int byte) {
+    assert(byte <= 0xff);
+    if (index == buffer.length) {
+      addChunk(buffer, 0, index);
+      buffer = new Uint8List(bufferSize);
+      index = 0;
+    }
+    buffer[index++] = byte;
+  }
+}
+
+/**
+ * Pretty-printing version of [_JsonUtf8Stringifier].
+ */
+class _JsonUtf8StringifierPretty extends _JsonUtf8Stringifier
+                                 with _JsonPrettyPrintMixin {
+  final List<int> indent;
+  _JsonUtf8StringifierPretty(toEncodableFunction, this.indent,
+                             bufferSize, addChunk)
+      : super(toEncodableFunction, bufferSize, addChunk);
+
+  void writeIndentation(int count) {
+    List<int> indent = this.indent;
+    int indentLength = indent.length;
+    if (indentLength == 1) {
+      int char = indent[0];
+      while (count > 0) {
+        writeByte(char);
+        count -= 1;
+      }
+      return;
+    }
+    while (count > 0) {
+      count--;
+      int end = index + indentLength;
+      if (end <= buffer.length) {
+        buffer.setRange(index, end, indent);
+        index = end;
+      } else {
+        for (int i = 0; i < indentLength; i++) {
+          writeByte(indent[i]);
+        }
+      }
+    }
   }
 }
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index df7551a..2fcb915 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -342,6 +342,8 @@
 
   // Override the base-classes bind, to provide a better type.
   Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
+
+  external Converter<List<int>,dynamic> fuse(Converter<String, dynamic> next);
 }
 
 // UTF-8 constants.
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index cd1ad33..61ed003 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -176,6 +176,11 @@
     _openFuture = _file.open(mode: mode);
   }
 
+  _FileStreamConsumer.fromStdio(int fd) {
+    assert(1 <= fd && fd <= 2);
+    _openFuture = new Future.value(_File._openStdioSync(fd));
+  }
+
   Future<File> addStream(Stream<List<int>> stream) {
     Completer<File> completer = new Completer<File>.sync();
     _openFuture
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index d908338..d00f629 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -750,8 +750,9 @@
    * sub type. The charset and additional parameters can also be set
    * using [charset] and [parameters]. If charset is passed and
    * [parameters] contains charset as well the passed [charset] will
-   * override the value in parameters. Keys and values passed in
-   * parameters will be converted to lower case.
+   * override the value in parameters. Keys passed in parameters will be
+   * converted to lower case. The `charset` entry, whether passed as `charset`
+   * or in `parameters`, will have its value converted to lower-case.
    */
   factory ContentType(String primaryType,
                       String subType,
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 5ecddca..4700128 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -747,6 +747,10 @@
         expect("=");
         skipWS();
         String value = parseParameterValue();
+        if (name == 'charset' && this is _ContentType) {
+          // Charset parameter of ContentTypes are always lower-case.
+          value = value.toLowerCase();
+        }
         parameters[name] = value;
         skipWS();
         if (done()) return;
@@ -779,7 +783,11 @@
     if (parameters != null) {
       _ensureParameters();
       parameters.forEach((String key, String value) {
-        this._parameters[key.toLowerCase()] = value.toLowerCase();
+        String lowerCaseKey = key.toLowerCase();
+        if (lowerCaseKey == "charset") {
+          value = value.toLowerCase();
+        }
+        this._parameters[lowerCaseKey] = value;
       });
     }
     if (charset != null) {
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index f36dd83..e4bdf01 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -191,36 +191,6 @@
 }
 
 
-class _StdConsumer implements StreamConsumer<List<int>> {
-  final _file;
-
-  _StdConsumer(int fd) : _file = _File._openStdioSync(fd);
-
-  Future addStream(Stream<List<int>> stream) {
-    var completer = new Completer();
-    var sub;
-    sub = stream.listen(
-        (data) {
-          try {
-            _file.writeFromSync(data);
-          } catch (e, s) {
-            sub.cancel();
-            completer.completeError(e, s);
-          }
-        },
-        onError: completer.completeError,
-        onDone: completer.complete,
-        cancelOnError: true);
-    return completer.future;
-  }
-
-  Future close() {
-    _file.closeSync();
-    return new Future.value();
-  }
-}
-
-
 class _StdSink implements IOSink {
   final IOSink _sink;
 
diff --git a/tests/_chrome/sample_test.dart b/tests/_chrome/sample_test.dart
index 85448ff..b25a94b 100644
--- a/tests/_chrome/sample_test.dart
+++ b/tests/_chrome/sample_test.dart
@@ -17,7 +17,7 @@
   test('fails from browser', () {
     // APIs should not work in standard browser apps.
     expect(() {
-      _chrome.app.window.create('foo.html');
+      _chrome.app.window.create('IntentionallyMissingFile.html');
     }, throws);
   });
 }
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 2da9167..4b68427 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -35,17 +35,12 @@
 LibTest/html/Window/document_A01_t01: RuntimeError # Issue 20146
 LibTest/html/Window/postMessage_A01_t02: RuntimeError # Issue 20146
 LibTest/html/Window/moveBy_A01_t01: RuntimeError # Issue 20146
-LayoutTests/fast/dom: Skip # Unknown tests are breaking the test infrastructure. Issue 18558
-LayoutTests/fast/filesystem: Skip # Unknown tests are breaking the test infrastructure. Issue 18558
-LayoutTests/fast/css-generated-content/malformed-url_t01.dart: Skip # Breaks the test infrastructure. Issue 18558.
-LayoutTests/fast/css-generated-content/bug91547_t01.dart: Skip # Breaks the test infrastructure. Issue 18558.
-LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Breaks the test infrastructure. Issue 18558
-LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Breaks the test infrastructure. Issue 18558.
-# Only one of the next two causes the problem - not sure which.
-LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: Skip # Breaks the test infrastructure. Issue 18558.
-LayoutTests/fast/dom/Range/bug-19527_t01: Skip # Breaks the test infrastructure. Issue 18558.
-LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: Skip # Breaks the test infrastructure. Issue 18558.
-LayoutTests/fast/filesystem/file-after-reload-crash_t01.dart: Skip # Breaks the test infrastructure. Issue 18558.
+LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/filesystem/file-after-reload-crash_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/cssTarget-crash_t01: Skip # Test reloads itself. Issue 18558.
+LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Test reloads itself. Issue 18558.
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Issue 13719: Please triage this failure.
@@ -157,7 +152,7 @@
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: Pass, RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -237,13 +232,8 @@
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -251,10 +241,6 @@
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -267,7 +253,6 @@
 LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -414,9 +399,7 @@
 LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/importNode-null_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/location-hash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -616,6 +599,7 @@
 # co19-roll r786
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css/font-face-insert-link_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
@@ -798,6 +782,20 @@
 LayoutTests/fast/xsl/default-html_t01: RuntimeError # co19-roll r786: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # co19-roll r786: Please triage this failure.
 WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/dom/52776_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/text-api-arguments_t01: RuntimeError # Re-enable fast/dom tests: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 # New Dartium checked failures on new co19 browser tests in co19 revision 706.
@@ -866,6 +864,8 @@
 LayoutTests/fast/url/trivial_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
@@ -896,6 +896,11 @@
 LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/text-autosizing/text-removal_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/transforms/scrollIntoView-transformed_t01: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: Pass, RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Reenable fast/dom tests: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, RuntimeError # Reenable fast/dom tests: Please triage this failure.
 
 [ $compiler == none && $runtime == dartium && ($mode != debug || $system != macos) ]
 LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/compiler/dart2js/async_await_syntax.dart b/tests/compiler/dart2js/async_await_syntax.dart
new file mode 100644
index 0000000..8c461cf
--- /dev/null
+++ b/tests/compiler/dart2js/async_await_syntax.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2014, 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.
+
+// Test async/await syntax.
+
+var yield = 0;
+var await = 0;
+
+a01a() async => null;                        /// a01a: ok
+a01b() async* => null;                       /// a01b: compile-time error
+a01c() sync* => null;                        /// a01c: compile-time error
+a02a() async {}                              /// a02a: ok
+a03a() async* {}                             /// a03a: ok
+a03b() async * {}                            /// a03b: compile-time error
+a04a() sync* {}                              /// a04a: ok
+a04b() sync {}                               /// a04b: compile-time error
+a04c() sync * {}                             /// a04c: compile-time error
+a05a() async { await 0; }                    /// a05a: ok
+a05b() async {                               /// a05b: ok
+  await(a) {};                               /// a05b: continued
+  await(0);                                  /// a05b: continued
+}                                            /// a05b: continued
+a05c() {                                     /// a05c: ok
+  await(a) {};                               /// a05c: continued
+  await(0);                                  /// a05c: continued
+}                                            /// a05c: continued
+a05d() async {                               /// a05d: compile-time error
+  await(a) {}                                /// a05d: continued
+  await(0);                                  /// a05d: continued
+}                                            /// a05d: continued
+a05e() {                                     /// a05e: ok
+  await(a) {}                                /// a05e: continued
+  await(0);                                  /// a05e: continued
+}                                            /// a05e: continued
+a05f() async {                               /// a05f: compile-time error
+  var await = (a) {};                        /// a05f: continued
+  await(0);                                  /// a05f: continued
+}                                            /// a05f: continued
+a06a() async { await for (var o in []) {} }  /// a06a: ok
+a06b() sync* { await for (var o in []) {} }  /// a06b: compile-time error
+a07a() sync* { yield 0; }                    /// a07a: ok
+a07b() sync { yield 0; }                     /// a07b: compile-time error
+a08a() sync* { yield* []; }                  /// a08a: ok
+a08b() sync { yield 0; }                     /// a08b: compile-time error
+a09a() async* { yield 0; }                   /// a09a: ok
+a10a() async* { yield* []; }                 /// a10a: ok
+
+abstract class B {
+  b00a() async;   /// b00a: compile-time error
+  b00b() async*;  /// b00b: compile-time error
+  b00c() sync*;   /// b00c: compile-time error
+  b00d() sync;    /// b00d: compile-time error
+}
+
+class C extends B {
+  C();
+
+  factory C.e1() async { return null; }   /// e1: compile-time error
+  factory C.e2() async* { return null; }  /// e2: compile-time error
+  factory C.e3() sync* { return null; }   /// e3: compile-time error
+  factory C.e4() async = C;               /// e4: compile-time error
+  factory C.e5() async* = C;              /// e5: compile-time error
+  factory C.e6() sync* = C;               /// e6: compile-time error
+  C.e7() async {}                         /// e7: compile-time error
+  C.e8() async* {}                        /// e8: compile-time error
+  C.e9() sync* {}                         /// e9: compile-time error
+
+  b00a() {}   /// b00a: continued
+  b00b() {}   /// b00b: continued
+  b00c() {}   /// b00c: continued
+  b00d() {}   /// b00d: continued
+
+  b01a() async => null;                        /// b01a: ok
+  b01b() async* => null;                       /// b01b: compile-time error
+  b01c() sync* => null;                        /// b01c: compile-time error
+  b02a() async {}                              /// b02a: ok
+  b03a() async* {}                             /// b03a: ok
+  b04a() sync* {}                              /// b04a: ok
+  b04b() sync {}                               /// b04b: compile-time error
+  b05a() async { await 0; }                    /// b05a: ok
+  b06a() async { await for (var o in []) {} }  /// b06a: ok
+  b06b() async { await for ( ; ; ) {} }        /// b06b: compile-time error
+  b07a() sync* { yield 0; }                    /// b07a: ok
+  b08a() sync* { yield* []; }                  /// b08a: ok
+  b09a() async* { yield 0; }                   /// b09a: ok
+  b10a() async* { yield* []; }                 /// b10a: ok
+}
+
+method1() {
+  c01a() async => null; c01a();                        /// c01a: ok
+  c01b() async* => null; c01b();                       /// c01b: compile-time error
+  c01c() sync* => null; c01c();                        /// c01c: compile-time error
+  c02a() async {} c02a();                              /// c02a: ok
+  c03a() async* {} c03a();                             /// c03a: ok
+  c04a() sync* {} c04a();                              /// c04a: ok
+  c04b() sync {} c04b();                               /// c04b: compile-time error
+  c05a() async { await 0; } c05a();                    /// c05a: ok
+  c06a() async { await for (var o in []) {} } c06a();  /// c06a: ok
+  c07a() sync* { yield 0; } c07a();                    /// c07a: ok
+  c08a() sync* { yield* []; } c08a();                  /// c08a: ok
+  c09a() async* { yield 0; } c09a();                   /// c09a: ok
+  c10a() async* { yield* []; } c10a();                 /// c10a: ok
+}
+
+method2() {
+  var d01a = () async => null; d01a();                         /// d01a: ok
+  var d01b = () async* => null; d01b();                        /// d01b: compile-time error
+  var d01c = () sync* => null; d01c();                         /// d01c: compile-time error
+  var d02a = () async {}; d02a();                              /// d02a: ok
+  var d03a = () async* {}; d03a();                             /// d03a: ok
+  var d04a = () sync* {}; d04a();                              /// d04a: ok
+  var d04b = () sync {}; d04b();                               /// d04b: compile-time error
+  var d05a = () async { await 0; }; d05a();                    /// d05a: ok
+  var d06a = () async { await for (var o in []) {} }; d06a();  /// d06a: ok
+  var d07a = () sync* { yield 0; }; d07a();                    /// d07a: ok
+  var d08a = () sync* { yield* []; }; d08a();                  /// d08a: ok
+  var d08b = () sync* { yield*0+1; }; d08b();                  /// d08b: ok
+  var d08c = () { yield*0+1; }; d08c();                        /// d08c: ok
+  var d09a = () async* { yield 0; }; d09a();                   /// d09a: ok
+  var d10a = () async* { yield* []; }; d10a();                 /// d10a: ok
+}
+
+
+void main() {
+  var c = new C();
+  c = new C.e1(); /// e1: continued
+  c = new C.e2(); /// e2: continued
+  c = new C.e3(); /// e3: continued
+  c = new C.e4(); /// e4: continued
+  c = new C.e5(); /// e5: continued
+  c = new C.e6(); /// e6: continued
+  c = new C.e7(); /// e7: continued
+  c = new C.e8(); /// e8: continued
+  c = new C.e9(); /// e9: continued
+
+  a01a();     /// a01a: continued
+  a01b();     /// a01b: continued
+  a01c();     /// a01c: continued
+  a02a();     /// a02a: continued
+  a03a();     /// a03a: continued
+  a03b();     /// a03b: continued
+  a04a();     /// a04a: continued
+  a04b();     /// a04b: continued
+  a04c();     /// a04c: continued
+  a05a();     /// a05a: continued
+  a05b();     /// a05b: continued
+  a05c();     /// a05c: continued
+  a05d();     /// a05d: continued
+  a05e();     /// a05e: continued
+  a05f();     /// a05f: continued
+  a06a();     /// a06a: continued
+  a06b();     /// a06b: continued
+  a07a();     /// a07a: continued
+  a07b();     /// a07b: continued
+  a08a();     /// a08a: continued
+  a08b();     /// a08b: continued
+  a09a();     /// a09a: continued
+  a10a();     /// a10a: continued
+
+  c.b00a();   /// b00a: continued
+  c.b00b();   /// b00b: continued
+  c.b00c();   /// b00c: continued
+  c.b00d();   /// b00d: continued
+  c.b01a();   /// b01a: continued
+  c.b01b();   /// b01b: continued
+  c.b01c();   /// b01c: continued
+  c.b02a();   /// b02a: continued
+  c.b03a();   /// b03a: continued
+  c.b04a();   /// b04a: continued
+  c.b04b();   /// b04b: continued
+  c.b05a();   /// b05a: continued
+  c.b06a();   /// b06a: continued
+  c.b06b();   /// b06b: continued
+  c.b07a();   /// b07a: continued
+  c.b08a();   /// b08a: continued
+  c.b09a();   /// b09a: continued
+  c.b10a();   /// b10a: continued
+
+  method1();
+  method2();
+}
diff --git a/tests/compiler/dart2js/async_await_syntax_test.dart b/tests/compiler/dart2js/async_await_syntax_test.dart
new file mode 100644
index 0000000..e42bda0
--- /dev/null
+++ b/tests/compiler/dart2js/async_await_syntax_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, 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.
+
+// Test that dart2js produces the expected static type warnings and
+// compile-time errors for these tests.
+
+import 'frontend_checker.dart';
+
+const List<String> TESTS = const <String>[
+  'compiler/dart2js/async_await_syntax.dart',
+];
+
+void main(List<String> arguments) {
+  check(TESTS, arguments: arguments, options: ['--enable-async']);
+}
diff --git a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
index 180870f..f278080 100644
--- a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
@@ -417,11 +417,13 @@
   handleNoFormalParameters(tok) {
     push(new Parameters([]));
   }
-  endUnamedFunction(t) {
+
+  endUnnamedFunction(t) {
     Statement body = pop();
     Parameters parameters = pop();
     push(new FunctionExpression(parameters, body));
   }
+
   handleNoType(Token token) {
     push(null);
   }
@@ -572,7 +574,7 @@
     push(null);
   }
 
-  endForIn(Token begin, Token inKeyword, Token end) {
+  endForIn(Token await, Token begin, Token inKeyword, Token end) {
     Statement body = pop();
     Expression exp = pop();
     Node declaredIdentifier = pop();
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
index f0954c6..8ba1a38 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
@@ -502,7 +502,7 @@
     assert(cont != null);
 
     tokens.consumeEnd();
-    return new TypeOperator(operator, recv, type, cont);
+    return new TypeOperator(recv, type, cont, isTypeTest: operator == 'is');
   }
 
   /// (LetPrim name (primitive)) body
@@ -659,8 +659,13 @@
     List<Primitive> keys   = parsePrimitiveList();
     List<Primitive> values = parsePrimitiveList();
 
+    List<LiteralMapEntry> entries = <LiteralMapEntry>[];
+    for (int i = 0; i < keys.length; i++) {
+      entries.add(new LiteralMapEntry(keys[i], values[i]));
+    }
+
     tokens.consumeEnd();
-    return new LiteralMap(null, keys, values);
+    return new LiteralMap(null, entries);
   }
 
   /// (ReifyTypeVar type)
diff --git a/tests/compiler/dart2js/frontend_checker.dart b/tests/compiler/dart2js/frontend_checker.dart
new file mode 100644
index 0000000..c3fc633
--- /dev/null
+++ b/tests/compiler/dart2js/frontend_checker.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, 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.
+
+// Checks that dart2js produces the expected static type warnings and
+// compile-time errors for the provided multitests.
+
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+import 'memory_compiler.dart';
+
+import '../../../tools/testing/dart/multitest.dart'
+    show ExtractTestsFromMultitest;
+import '../../../tools/testing/dart/utils.dart'
+    show Path;
+
+void check(List<String> testFiles,
+           {List<String> arguments: const <String>[],
+            List<String> options: const <String>[]}) {
+  bool outcomeMismatch = false;
+  bool verbose = arguments.contains('-v');
+  var cachedCompiler;
+  asyncTest(() => Future.forEach(testFiles, (String testFile) {
+    Map<String, String> testSources = {};
+    Map<String, Set<String>> testOutcomes = {};
+    String fileName = 'tests/$testFile';
+    ExtractTestsFromMultitest(new Path(fileName), testSources, testOutcomes);
+    return Future.forEach(testSources.keys, (String testName) {
+      String testFileName = '$fileName/$testName';
+      Set<String> expectedOutcome = testOutcomes[testName];
+      DiagnosticCollector collector = new DiagnosticCollector();
+      var compiler = compilerFor(
+           {testFileName: testSources[testName]},
+           diagnosticHandler: collector,
+           options: ['--analyze-only']..addAll(options),
+           showDiagnostics: verbose,
+           cachedCompiler: cachedCompiler);
+      return compiler.run(Uri.parse('memory:$testFileName')).then((_) {
+        if (expectedOutcome.contains('compile-time error')) {
+          if (collector.errors.isEmpty) {
+            print('$testFileName: Missing compile-time error.');
+            outcomeMismatch = true;
+          }
+        } else if (expectedOutcome.contains('static type warning')) {
+          if (collector.warnings.isEmpty) {
+            print('$testFileName: Missing static type warning.');
+            outcomeMismatch = true;
+          }
+        } else {
+          // Expect ok.
+          if (!collector.errors.isEmpty ||
+              !collector.warnings.isEmpty) {
+            collector.errors.forEach((message) {
+              print('$testFileName: Unexpected error: ${message.message}');
+            });
+            collector.warnings.forEach((message) {
+              print('$testFileName: Unexpected warning: ${message.message}');
+            });
+            outcomeMismatch = true;
+          }
+        }
+        cachedCompiler = compiler;
+      });
+    });
+  }).then((_) {
+    Expect.isFalse(outcomeMismatch, 'Outcome mismatch');
+  }));
+}
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index dfadfb2..e6b3129 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -83,7 +83,7 @@
     Compiler compiler = compilerFor(
         example,
         diagnosticHandler: collect,
-        options: ['--analyze-only'],
+        options: ['--analyze-only']..addAll(kind.options),
         cachedCompiler: cachedCompiler);
 
     return compiler.run(Uri.parse('memory:main.dart')).then((_) {
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index 6482f53..9f68cb3 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -13,7 +13,7 @@
 
 import 'dart:mirrors';
 
-main() {
+main(List<String> arguments) {
   ClassMirror cls = reflectClass(MessageKind);
   Map<String, MessageKind> kinds = <String, MessageKind>{};
   cls.declarations.forEach((Symbol name, DeclarationMirror declaration) {
@@ -31,6 +31,7 @@
   List<String> names = kinds.keys.toList()..sort();
   List<String> examples = <String>[];
   for (String name in names) {
+    if (!arguments.isEmpty && !arguments.contains(name)) continue;
     MessageKind kind = kinds[name];
     if (name == 'GENERIC' // Shouldn't be used.
         // We can't provoke a crash.
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index dbc5087..703fada 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -107,6 +107,8 @@
                    buildLibrarySource(DEFAULT_ISOLATE_HELPER_LIBRARY));
     registerSource(Compiler.DART_MIRRORS,
                    buildLibrarySource(DEFAULT_MIRRORS_LIBRARY));
+    registerSource(Compiler.DART_ASYNC,
+                   buildLibrarySource(DEFAULT_ASYNC_LIBRARY));
   }
 
   /// Initialize the mock compiler with an empty main library.
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 5f5cc74..f0d2b72 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -42,6 +42,7 @@
   'Function': 'class Function {}',
   'identical': 'bool identical(Object a, Object b) { return true; }',
   'int': 'abstract class int extends num { }',
+  'Iterable': 'abstract class Iterable {}',
   'LinkedHashMap': r'''
       class LinkedHashMap {
         factory LinkedHashMap._empty() => null;
@@ -357,6 +358,11 @@
   '_WorkerBase': 'class _WorkerBase {}',
 };
 
+const Map<String, String> DEFAULT_ASYNC_LIBRARY = const <String, String>{
+  'Future': 'class Future<T> {}',
+  'Stream': 'class Stream<T> {}',
+};
+
 const Map<String, String> DEFAULT_MIRRORS_LIBRARY = const <String, String>{
   'Comment': 'class Comment {}',
   'MirrorSystem': 'class MirrorSystem {}',
diff --git a/tests/compiler/dart2js_extra/21351_test.dart b/tests/compiler/dart2js_extra/21351_test.dart
new file mode 100644
index 0000000..3f1d00e
--- /dev/null
+++ b/tests/compiler/dart2js_extra/21351_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, 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.
+
+class A {
+  bool _flag = false;
+  bool get flag => _flag;
+}
+
+main () {
+  var value1, value2; 
+  var count = 0;
+
+  for (var x = 0; x < 10; x++) {
+    var otherThing = new A();
+    for (var dummy = 0; dummy < x; dummy++) {
+      otherThing._flag = !otherThing._flag;
+    }
+
+    value1 = value2;
+    value2 = otherThing;
+
+    if (value1 == null) continue;
+
+    if (value1.flag) count++;
+  }
+
+  if (count == 0) throw "FAIL";
+}
+
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 831c989..743832b 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -124,10 +124,12 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
+string_split_test: RuntimeError # Issue 21431
+
 [ $compiler == dart2js && (($runtime == safari && $builder_tag == mac10_7) || $runtime == safarimobilesim) ]
 list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
 string_trimlr_test/none: Fail
-string_split_test: RuntimeError # Issue 21431
 
 [ $compiler == dart2js && $runtime == ie10 ]
 string_case_test/01: Fail, OK  # Bug in IE.
@@ -218,3 +220,8 @@
 
 [ $system == windows && $arch == x64 ]
 stopwatch_test: Skip  # Flaky test due to expected performance behaviour.
+
+[ $runtime != d8 ]
+# JSCRE does not pass all of the tests ported for irregexp.
+# Ignore all of the tests until irregexp is fully ported.
+regexp/*: Skip
diff --git a/tests/corelib/regexp/UC16_test.dart b/tests/corelib/regexp/UC16_test.dart
new file mode 100644
index 0000000..c8a16de
--- /dev/null
+++ b/tests/corelib/regexp/UC16_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // UC16
+  // Characters used:
+  // "\u03a3\u03c2\u03c3\u039b\u03bb" - Sigma, final sigma, sigma, Lambda, lamda
+  shouldBe(new RegExp(r"x(.)\1x", caseSensitive: false).firstMatch("x\u03a3\u03c3x"),
+      ["x\u03a3\u03c3x", "\u03a3"], "backref-UC16");
+  assertFalse(new RegExp(r"x(...)\1", caseSensitive: false).hasMatch("x\u03a3\u03c2\u03c3\u03c2\u03c3"),
+              "\1 ASCII, string short");
+  assertTrue(new RegExp(r"\u03a3((?:))\1\1x", caseSensitive: false).hasMatch("\u03c2x"), "backref-UC16-empty");
+  assertTrue(new RegExp(r"x(?:...|(...))\1x", caseSensitive: false).hasMatch("x\u03a3\u03c2\u03c3x"),
+            "backref-UC16-uncaptured");
+  assertTrue(new RegExp(r"x(?:...|(...))\1x", caseSensitive: false).hasMatch("x\u03c2\u03c3\u039b\u03a3\u03c2\u03bbx"),
+            "backref-UC16-backtrack");
+  var longUC16String = "x\u03a3\u03c2\u039b\u03c2\u03c3\u03bb\u03c3\u03a3\u03bb";
+  shouldBe(new RegExp(r"x(...)\1\1", caseSensitive: false).firstMatch(longUC16String),
+          [longUC16String, longUC16String.substring(1,4)],
+          "backref-UC16-twice");
+
+  assertFalse(new RegExp(r"\xc1", caseSensitive: false).hasMatch('fooA'), "quickcheck-uc16-pattern-ascii-subject");
+  assertFalse(new RegExp(r"[\xe9]").hasMatch('i'), "charclass-uc16-pattern-ascii-subject");
+  assertFalse(new RegExp(r"\u5e74|\u6708").hasMatch('t'), "alternation-uc16-pattern-ascii-subject");
+}
diff --git a/tests/corelib/regexp/alternative-length-miscalculation_test.dart b/tests/corelib/regexp/alternative-length-miscalculation_test.dart
new file mode 100644
index 0000000..33ec7b2
--- /dev/null
+++ b/tests/corelib/regexp/alternative-length-miscalculation_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests for length miscalculations in regular expression processing."
+  );
+
+  var re = new RegExp(r"b|[^b]");
+  assertEquals('a'.indexOf(re, 1), -1);
+
+  var re2 = new RegExp(r"[^a]|ab");
+  shouldBeFalse(re2.hasMatch(''));
+}
diff --git a/tests/corelib/regexp/alternatives_test.dart b/tests/corelib/regexp/alternatives_test.dart
new file mode 100644
index 0000000..9d2cc4a
--- /dev/null
+++ b/tests/corelib/regexp/alternatives_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test regular expression processing with alternatives.'
+  );
+
+  var s1 = "<p>content</p>";
+  shouldBe(firstMatch(s1, new RegExp(r"<((\\/([^>]+)>)|(([^>]+)>))")), ["<p>","p>",null,null,"p>","p"]);
+  shouldBe(firstMatch(s1, new RegExp(r"<((ABC>)|(\\/([^>]+)>)|(([^>]+)>))")), ["<p>","p>",null,null,null,"p>","p"]);
+  shouldBe(firstMatch(s1, new RegExp(r"<(a|\\/p|.+?)>")), ["<p>","p"]);
+
+  // Force YARR to use Interpreter by using iterative parentheses
+  shouldBe(firstMatch(s1, new RegExp(r"<((\\/([^>]+)>)|((([^>])+)>))")), ["<p>","p>",null,null,"p>","p","p"]);
+  shouldBe(firstMatch(s1, new RegExp(r"<((ABC>)|(\\/([^>]+)>)|((([^>])+)>))")), ["<p>","p>",null,null,null,"p>","p","p"]);
+  shouldBe(firstMatch(s1, new RegExp(r"<(a|\\/p|(.)+?)>")), ["<p>","p","p"]);
+
+  // Force YARR to use Interpreter by using backreference
+  var s2 = "<p>p</p>";
+  shouldBe(firstMatch(s2, new RegExp(r"<((\\/([^>]+)>)|(([^>]+)>))\5")), ["<p>p","p>",null,null,"p>","p"]);
+  shouldBe(firstMatch(s2, new RegExp(r"<((ABC>)|(\\/([^>]+)>)|(([^>]+)>))\6")), ["<p>p","p>",null,null,null,"p>","p"]);
+  shouldBe(firstMatch(s2, new RegExp(r"<(a|\\/p|.+?)>\1")), ["<p>p","p"]);
+}
diff --git a/tests/corelib/regexp/ascii-regexp-subject_test.dart b/tests/corelib/regexp/ascii-regexp-subject_test.dart
new file mode 100644
index 0000000..67ff607
--- /dev/null
+++ b/tests/corelib/regexp/ascii-regexp-subject_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/**
+* @fileoverview Check that an initial ^ will result in a faster match fail.
+*/
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  var s = "foo";
+  var i;
+
+  for (i = 0; i < 18; i++) {
+    s = s + s;
+  }
+
+  dynamic repeatRegexp(re) {
+    for (i = 0; i < 1000; i++) {
+      re.hasMatch(s);
+    }
+  }
+
+  repeatRegexp(new RegExp(r"^bar"));
+  repeatRegexp(new RegExp(r"^foo|^bar|^baz"));
+  repeatRegexp(new RegExp(r"(^bar)"));
+  repeatRegexp(new RegExp(r"(?=^bar)\w+"));
+}
diff --git a/tests/corelib/regexp/assertion_test.dart b/tests/corelib/regexp/assertion_test.dart
new file mode 100644
index 0000000..9899a85
--- /dev/null
+++ b/tests/corelib/regexp/assertion_test.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("This page tests handling of parenthetical assertions.");
+
+  var regex1 = new RegExp(r"(x)(?=\1)x");
+  shouldBe(regex1.firstMatch('xx'), ['xx','x']);
+
+  var regex2 = new RegExp(r"(.*?)a(?!(a+)b\2c)\2(.*)");
+  shouldBe(regex2.firstMatch('baaabaac'), ['baaabaac','ba',null,'abaac']);
+
+  var regex3 = new RegExp(r"(?=(a+?))(\1ab)");
+  shouldBe(regex3.firstMatch('aaab'), ['aab','a','aab']);
+
+  var regex4 = new RegExp(r"(?=(a+?))(\1ab)");
+  shouldBe(regex4.firstMatch('aaab'), ['aab','a','aab']);
+
+  var regex5 = new RegExp(r"^P([1-6])(?=\1)([1-6])$");
+  shouldBe(regex5.firstMatch('P11'), ['P11','1','1']);
+
+  var regex6 = new RegExp(r"(([a-c])b*?\2)*");
+  shouldBe(regex6.firstMatch('ababbbcbc'), ['ababb','bb','b']);
+
+  var regex7 = new RegExp(r"(x)(?=x)x");
+  shouldBe(regex7.firstMatch('xx'), ['xx','x']);
+
+  var regex8 = new RegExp(r"(x)(\1)");
+  shouldBe(regex8.firstMatch('xx'), ['xx','x','x']);
+
+  var regex9 = new RegExp(r"(x)(?=\1)x");
+  shouldBeNull(regex9.firstMatch('xy'));
+
+  var regex10 = new RegExp(r"(x)(?=x)x");
+  shouldBeNull(regex10.firstMatch('xy'));
+
+  var regex11 = new RegExp(r"(x)(\1)");
+  shouldBeNull(regex11.firstMatch('xy'));
+
+  var regex12 = new RegExp(r"(x)(?=\1)x");
+  shouldBeNull(regex12.firstMatch('x'));
+  shouldBe(regex12.firstMatch('xx'), ['xx','x']);
+  shouldBe(regex12.firstMatch('xxy'), ['xx','x']);
+
+  var regex13 = new RegExp(r"(x)zzz(?=\1)x");
+  shouldBe(regex13.firstMatch('xzzzx'), ['xzzzx','x']);
+  shouldBe(regex13.firstMatch('xzzzxy'), ['xzzzx','x']);
+
+  var regex14 = new RegExp(r"(a)\1(?=(b*c))bc");
+  shouldBe(regex14.firstMatch('aabc'), ['aabc','a','bc']);
+  shouldBe(regex14.firstMatch('aabcx'), ['aabc','a','bc']);
+
+  var regex15 = new RegExp(r"(a)a(?=(b*c))bc");
+  shouldBe(regex15.firstMatch('aabc'), ['aabc','a','bc']);
+  shouldBe(regex15.firstMatch('aabcx'), ['aabc','a','bc']);
+
+  var regex16 = new RegExp(r"a(?=(b*c))bc");
+  shouldBeNull(regex16.firstMatch('ab'));
+  shouldBe(regex16.firstMatch('abc'), ['abc','bc']);
+
+  var regex17 = new RegExp(r"(?=((?:ab)*))a");
+  shouldBe(regex17.firstMatch('ab'), ['a','ab']);
+  shouldBe(regex17.firstMatch('abc'), ['a','ab']);
+
+  var regex18 = new RegExp(r"(?=((?:xx)*))x");
+  shouldBe(regex18.firstMatch('x'), ['x','']);
+  shouldBe(regex18.firstMatch('xx'), ['x','xx']);
+  shouldBe(regex18.firstMatch('xxx'), ['x','xx']);
+
+  var regex19 = new RegExp(r"(?=((xx)*))x");
+  shouldBe(regex19.firstMatch('x'), ['x','',null]);
+  shouldBe(regex19.firstMatch('xx'), ['x','xx','xx']);
+  shouldBe(regex19.firstMatch('xxx'), ['x','xx','xx']);
+
+  var regex20 = new RegExp(r"(?=(xx))+x");
+  shouldBeNull(regex20.firstMatch('x'));
+  shouldBe(regex20.firstMatch('xx'), ['x','xx']);
+  shouldBe(regex20.firstMatch('xxx'), ['x','xx']);
+
+  var regex21 = new RegExp(r"(?=a+b)aab");
+  shouldBe(regex21.firstMatch('aab'), ['aab']);
+
+  var regex22 = new RegExp(r"(?!(u|m{0,}g+)u{1,}|2{2,}!1%n|(?!K|(?=y)|(?=ip))+?)(?=(?=(((?:7))*?)*?))p", multiLine: true);
+  shouldBeNull(regex22.firstMatch('55up'));
+
+  var regex23 = new RegExp(r"(?=(a)b|c?)()*d");
+  shouldBeNull(regex23.firstMatch('ax'));
+
+  var regex24 = new RegExp(r"(?=a|b?)c");
+  shouldBeNull(regex24.firstMatch('x'));
+}
diff --git a/tests/corelib/regexp/backreferences_test.dart b/tests/corelib/regexp/backreferences_test.dart
new file mode 100644
index 0000000..5e5cac9
--- /dev/null
+++ b/tests/corelib/regexp/backreferences_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("Test to ensure correct behaviour when using backreferences in a RegExp");
+
+  shouldBeTrue(new RegExp(r"(...)\1$").hasMatch('abcabc'));
+  shouldBeFalse(new RegExp(r"(...)\1$").hasMatch('abcdef'));
+  shouldBeFalse(new RegExp(r"(...)\2$").hasMatch('abcabc'));
+  shouldBeFalse(new RegExp(r"(...)\2$").hasMatch('abc'));
+  shouldBeTrue(new RegExp(r"\1(...)$").hasMatch('abcabc'));
+  shouldBeTrue(new RegExp(r"\1(...)$").hasMatch('abcdef'));
+  shouldBeFalse(new RegExp(r"\2(...)$").hasMatch('abcabc'));
+  shouldBeFalse(new RegExp(r"\2(...)$").hasMatch('abc'));
+  shouldBeTrue(new RegExp(r"\1?(...)$").hasMatch('abc'));
+  shouldBeTrue(new RegExp(r"\1?(...)$").hasMatch('abc'));
+
+  var re = new RegExp(r"[^b]*((..)|(\2))+Sz", caseSensitive: false);
+
+  shouldBeFalse(re.hasMatch('axabcd'));
+  shouldBeTrue(re.hasMatch('axabcsz'));
+}
diff --git a/tests/corelib/regexp/bol-with-multiline_test.dart b/tests/corelib/regexp/bol-with-multiline_test.dart
new file mode 100644
index 0000000..46b0ea5
--- /dev/null
+++ b/tests/corelib/regexp/bol-with-multiline_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for beginning of line (BOL or ^) matching in a multiline string</a>'
+  );
+
+  var s = "aced\nabc";
+  shouldBeNull(firstMatch(s, new RegExp(r"^abc")));
+  shouldBe(firstMatch(s, new RegExp(r"^abc", multiLine: true)), ["abc"]);
+  shouldBeNull(firstMatch(s, new RegExp(r"(^|X)abc")));
+  shouldBe(firstMatch(s, new RegExp(r"(^|X)abc", multiLine: true)), ["abc",""]);
+  shouldBe(firstMatch(s, new RegExp(r"(^a|Xa)bc", multiLine: true)), ["abc","a"]);
+}
diff --git a/tests/corelib/regexp/bol_test.dart b/tests/corelib/regexp/bol_test.dart
new file mode 100644
index 0000000..d2a479e
--- /dev/null
+++ b/tests/corelib/regexp/bol_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for beginning of line (BOL or ^) matching</a>'
+  );
+
+  var s = "abc123def456xyzabc789abc999";
+  shouldBeNull(firstMatch(s, new RegExp(r"^notHere")));
+  shouldBe(firstMatch(s, new RegExp(r"^abc")), ["abc"]);
+  shouldBe(firstMatch(s, new RegExp(r"(^|X)abc")), ["abc",""]);
+  shouldBe(firstMatch(s, new RegExp(r"^longer|123")), ["123"]);
+  shouldBe(firstMatch(s, new RegExp(r"(^abc|c)123")), ["abc123","abc"]);
+  shouldBe(firstMatch(s, new RegExp(r"(c|^abc)123")), ["abc123","abc"]);
+  shouldBe(firstMatch(s, new RegExp(r"(^ab|abc)123")), ["abc123","abc"]);
+  shouldBe(firstMatch(s, new RegExp(r"(bc|^abc)([0-9]*)a")), ["bc789a","bc","789"]);
+  shouldBeNull(new RegExp(r"(?:(Y)X)|(X)").firstMatch("abc"));
+  shouldBeNull(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abc"));
+  shouldBeNull(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abcd"));
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("Xabcd"), ["X",null]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("aXbcd"), ["X","X"]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abXcd"), ["X","X"]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abcXd"), ["X","X"]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abcdX"), ["X","X"]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("YXabcd"), ["YX",null]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("aYXbcd"), ["YX",null]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abYXcd"), ["YX",null]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abcYXd"), ["YX",null]);
+  shouldBe(new RegExp(r"(?:(?:^|Y)X)|(X)").firstMatch("abcdYX"), ["YX",null]);
+}
diff --git a/tests/corelib/regexp/capture-3_test.dart b/tests/corelib/regexp/capture-3_test.dart
new file mode 100644
index 0000000..be935ef
--- /dev/null
+++ b/tests/corelib/regexp/capture-3_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  dynamic oneMatch(re) {
+    assertEquals("acd", "abcd".replaceAll(re, ""));
+  }
+
+  oneMatch(new RegExp(r"b"));
+  oneMatch(new RegExp(r"b"));
+
+  assertEquals("acdacd", "abcdabcd".replaceAll(new RegExp(r"b"), ""));
+
+  dynamic captureMatch(re) {
+    var match = firstMatch("abcd", re);
+    assertEquals("b", match.group(1));
+    assertEquals("c", match.group(2));
+  }
+
+  captureMatch(new RegExp(r"(b)(c)"));
+  captureMatch(new RegExp(r"(b)(c)"));
+
+  // A test that initially does a zero width match, but later does a non-zero
+  // width match.
+  var a = "foo bar baz".replaceAll(new RegExp(r"^|bar"), "");
+  assertEquals("foo  baz", a);
+
+  a = "foo bar baz".replaceAll(new RegExp(r"^|bar"), "*");
+  assertEquals("*foo * baz", a);
+
+  // We test FilterASCII using regexps that will backtrack forever.  Since
+  // a regexp with a non-ASCII character in it can never match an ASCII
+  // string we can test that the relevant node is removed by verifying that
+  // there is no hang.
+  dynamic NoHang(re) {
+    firstMatch("This is an ASCII string that could take forever", re);
+  }
+
+  NoHang(new RegExp(r"(((.*)*)*x)Ā"));  // Continuation after loop is filtered, so is loop.
+  NoHang(new RegExp(r"(((.*)*)*Ā)foo"));  // Body of loop filtered.
+  NoHang(new RegExp(r"Ā(((.*)*)*x)"));   // Everything after a filtered character is filtered.
+  NoHang(new RegExp(r"(((.*)*)*x)Ā"));   // Everything before a filtered character is filtered.
+  NoHang(new RegExp(r"[ćăĀ](((.*)*)*x)"));   // Everything after a filtered class is filtered.
+  NoHang(new RegExp(r"(((.*)*)*x)[ćăĀ]"));   // Everything before a filtered class is filtered.
+  NoHang(new RegExp(r"[^\x00-\xff](((.*)*)*x)"));   // After negated class.
+  NoHang(new RegExp(r"(((.*)*)*x)[^\x00-\xff]"));   // Before negated class.
+  NoHang(new RegExp(r"(?!(((.*)*)*x)Ā)foo"));  // Negative lookahead is filtered.
+  NoHang(new RegExp(r"(?!(((.*)*)*x))Ā"));  // Continuation branch of negative lookahead.
+  NoHang(new RegExp(r"(?=(((.*)*)*x)Ā)foo"));  // Positive lookahead is filtered.
+  NoHang(new RegExp(r"(?=(((.*)*)*x))Ā"));  // Continuation branch of positive lookahead.
+  NoHang(new RegExp(r"(?=Ā)(((.*)*)*x)"));  // Positive lookahead also prunes continuation.
+  NoHang(new RegExp(r"(æ|ø|Ā)(((.*)*)*x)"));  // All branches of alternation are filtered.
+  NoHang(new RegExp(r"(a|b|(((.*)*)*x))Ā"));  // 1 out of 3 branches pruned.
+  NoHang(new RegExp(r"(a|(((.*)*)*x)ă|(((.*)*)*x)Ā)"));  // 2 out of 3 branches pruned.
+
+  var s = "Don't prune based on a repetition of length 0";
+  assertEquals(null, firstMatch(s, new RegExp(r"å{1,1}prune")));
+  assertEquals("prune", (firstMatch(s, new RegExp(r"å{0,0}prune"))[0]));
+
+  // Some very deep regexps where FilterASCII gives up in order not to make the
+  // stack overflow.
+  var regex6 = new RegExp(r"a*\u0100*\w");
+  var input0 = "a";
+  regex6.firstMatch(input0);
+
+  var re = "\u0100*\\w";
+
+  for (var i = 0; i < 200; i++) re = "a*" + re;
+
+  var regex7 = new RegExp(re);
+  regex7.firstMatch(input0);
+
+  var regex8 = new RegExp(re, caseSensitive: false);
+  regex8.firstMatch(input0);
+
+  re = "[\u0100]*\\w";
+  for (var i = 0; i < 200; i++) re = "a*" + re;
+
+  var regex9 = new RegExp(re);
+  regex9.firstMatch(input0);
+
+  var regex10 = new RegExp(re, caseSensitive: false);
+  regex10.firstMatch(input0);
+
+  var regex11 = new RegExp(r"^(?:[^\u0000-\u0080]|[0-9a-z?,.!&\s#()])+$", caseSensitive: false);
+  regex11.firstMatch(input0);
+
+  var regex12 = new RegExp(r"u(\xf0{8}?\D*?|( ? !)$h??(|)*?(||)+?\6((?:\W\B|--\d-*-|)?$){0, }?|^Y( ? !1)\d+)+a");
+  regex12.firstMatch("");
+}
diff --git a/tests/corelib/regexp/capture_test.dart b/tests/corelib/regexp/capture_test.dart
new file mode 100644
index 0000000..fa7391a
--- /dev/null
+++ b/tests/corelib/regexp/capture_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Tests from http://blog.stevenlevithan.com/archives/npcg-javascript
+
+  assertEquals(true, new RegExp(r"(x)?\1y").hasMatch("y"));
+  shouldBe(new RegExp(r"(x)?\1y").firstMatch("y"), ["y", null]);
+  shouldBe(new RegExp(r"(x)?y").firstMatch("y"), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?\1y")), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?y")), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?\1y")), ["y", null]);
+  Expect.listEquals(["", ""], "y".split(new RegExp(r"(x)?\1y")));
+  Expect.listEquals(["", ""], "y".split(new RegExp(r"(x)?y")));
+  assertEquals(0, "y".indexOf(new RegExp(r"(x)?\1y")));
+  assertEquals("z", "y".replaceAll(new RegExp(r"(x)?\1y"), "z"));
+
+  // See https://bugzilla.mozilla.org/show_bug.cgi?id=476146
+  shouldBe(new RegExp(r"^(b+|a){1,2}?bc").firstMatch("bbc"), ["bbc", "b"]);
+  shouldBe(new RegExp(r"((\3|b)\2(a)){2,}").firstMatch("bbaababbabaaaaabbaaaabba"),
+      ["bbaa", "a", "", "a"]);
+
+  // From crbug.com/128821 - don't hang:
+  firstMatch("", new RegExp(r"((a|i|A|I|u|o|U|O)(s|c|b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z|B|C|D|F|G|H|J|K|L|M|N|P|Q|R|S|T|V|W|X|Y|Z)*) de\/da([.,!?\s]|$)"));
+}
diff --git a/tests/corelib/regexp/captures_test.dart b/tests/corelib/regexp/captures_test.dart
new file mode 100644
index 0000000..be91e2b
--- /dev/null
+++ b/tests/corelib/regexp/captures_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  var re = new RegExp(r"^(((N({)?)|(R)|(U)|(V)|(B)|(H)|(n((n)|(r)|(v)|(h))?)|(r(r)?)|(v)|(b((n)|(b))?)|(h))|((Y)|(A)|(E)|(o(u)?)|(p(u)?)|(q(u)?)|(s)|(t)|(u)|(w)|(x(u)?)|(y)|(z)|(a((T)|(A)|(L))?)|(c)|(e)|(f(u)?)|(g(u)?)|(i)|(j)|(l)|(m(u)?)))+");
+  var str = "Avtnennan gunzvmu pubExnY nEvln vaTxh rmuhguhaTxnY";
+  assertTrue(re.hasMatch(str));
+}
diff --git a/tests/corelib/regexp/char-insensitive_test.dart b/tests/corelib/regexp/char-insensitive_test.dart
new file mode 100644
index 0000000..95a550e
--- /dev/null
+++ b/tests/corelib/regexp/char-insensitive_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This test checks the case-insensitive matching of character literals."
+  );
+
+  shouldBeTrue(new RegExp(r"\u00E5", caseSensitive: false).hasMatch('new RegExp(r"\u00E5")'));
+  shouldBeTrue(new RegExp(r"\u00E5", caseSensitive: false).hasMatch('new RegExp(r"\u00C5")'));
+  shouldBeTrue(new RegExp(r"\u00C5", caseSensitive: false).hasMatch('new RegExp(r"\u00E5")'));
+  shouldBeTrue(new RegExp(r"\u00C5", caseSensitive: false).hasMatch('new RegExp(r"\u00C5")'));
+
+  shouldBeFalse(new RegExp(r"\u00E5", caseSensitive: false).hasMatch('P'));
+  shouldBeFalse(new RegExp(r"\u00E5", caseSensitive: false).hasMatch('PASS'));
+  shouldBeFalse(new RegExp(r"\u00C5", caseSensitive: false).hasMatch('P'));
+  shouldBeFalse(new RegExp(r"\u00C5", caseSensitive: false).hasMatch('PASS'));
+
+  shouldBeNull(firstMatch('PASS', new RegExp(r"\u00C5", caseSensitive: false)));
+  shouldBeNull(firstMatch('PASS', new RegExp(r"\u00C5", caseSensitive: false)));
+
+  assertEquals('PAS\u00E5'.replaceAll(new RegExp(r"\u00E5", caseSensitive: false), 'S'), 'PASS');
+  assertEquals('PAS\u00E5'.replaceAll(new RegExp(r"\u00C5", caseSensitive: false), 'S'), 'PASS');
+  assertEquals('PAS\u00C5'.replaceAll(new RegExp(r"\u00E5", caseSensitive: false), 'S'), 'PASS');
+  assertEquals('PAS\u00C5'.replaceAll(new RegExp(r"\u00C5", caseSensitive: false), 'S'), 'PASS');
+
+  assertEquals('PASS'.replaceAll(new RegExp(r"\u00E5", caseSensitive: false), '%C3%A5'), 'PASS');
+  assertEquals('PASS'.replaceAll(new RegExp(r"\u00C5", caseSensitive: false), '%C3%A5'), 'PASS');
+}
diff --git a/tests/corelib/regexp/character-match-out-of-order_test.dart b/tests/corelib/regexp/character-match-out-of-order_test.dart
new file mode 100644
index 0000000..75a2a67
--- /dev/null
+++ b/tests/corelib/regexp/character-match-out-of-order_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description('Test to ensure RegExp generates single character matches in the correct order');
+
+  shouldBe(new RegExp(r"[\w']+").firstMatch("'_'"), ["'_'"]);
+}
diff --git a/tests/corelib/regexp/compile-crash_test.dart b/tests/corelib/regexp/compile-crash_test.dart
new file mode 100644
index 0000000..ffc7a06
--- /dev/null
+++ b/tests/corelib/regexp/compile-crash_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description('Test regexp compiling to make sure it doens\'t crash like bug <a href="https://bugs.webkit.org/show_bug.cgi?id=16127">16127</a>');
+
+  shouldBeTrue(new RegExp(r"\)[;\s]+") != null);
+  assertThrows(() => new RegExp(r"["));
+  assertThrows(() => new RegExp(r"[a"));
+  assertThrows(() => new RegExp(r"[-"));
+  shouldBeTrue(new RegExp(r"(a)\1") != null);
+  shouldBeTrue(new RegExp(r"(a)\1{1,3}") != null);
+}
diff --git a/tests/corelib/regexp/compile_test.dart b/tests/corelib/regexp/compile_test.dart
new file mode 100644
index 0000000..18f96c9
--- /dev/null
+++ b/tests/corelib/regexp/compile_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test RegExp.compile method.'
+  );
+
+  var re = new RegExp("a", caseSensitive: false);
+  shouldBeTrue(re.hasMatch('A'));
+  shouldBeFalse(re.isMultiLine);
+  shouldBeFalse(re.isCaseSensitive);
+
+  re = new RegExp("a");
+  shouldBeFalse(re.isMultiLine);
+  shouldBeTrue(re.isCaseSensitive);
+  shouldBeFalse(re.hasMatch('A'));
+
+  assertThrows(() => new RegExp('+'));
+}
diff --git a/tests/corelib/regexp/constructor_test.dart b/tests/corelib/regexp/constructor_test.dart
new file mode 100644
index 0000000..54d8df1
--- /dev/null
+++ b/tests/corelib/regexp/constructor_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("This test checks use of the regexp constructor.");
+
+  var re = new RegExp(r"abc");
+
+  // We do not guarantee that the same regular expression will or will not be shared.
+  // shouldBeTrue(identical(re, new RegExp(r"abc")));
+  // shouldBeTrue(identical(re, new RegExp(r"abc", caseSensitive: true, multiLine: false)));
+
+  shouldBeFalse(identical(re, new RegExp(r"abc", caseSensitive: false, multiLine: true)));
+  shouldBeFalse(identical(re, new RegExp(r"abc", caseSensitive: true, multiLine: true)));
+  shouldBeFalse(identical(re, new RegExp(r"abc", caseSensitive: false, multiLine: false)));
+}
diff --git a/tests/corelib/regexp/dotstar_test.dart b/tests/corelib/regexp/dotstar_test.dart
new file mode 100644
index 0000000..16f63f0
--- /dev/null
+++ b/tests/corelib/regexp/dotstar_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("This page tests handling of parentheses subexpressions.");
+
+  var regexp1 = new RegExp(r".*blah.*");
+  shouldBeNull(regexp1.firstMatch('test'));
+  shouldBe(regexp1.firstMatch('blah'), ['blah']);
+  shouldBe(regexp1.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp1.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp1.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp1.firstMatch('blah\nsecond'), ['blah']);
+  shouldBe(regexp1.firstMatch('first\nblah'), ['blah']);
+  shouldBe(regexp1.firstMatch('first\nblah\nthird'), ['blah']);
+  shouldBe(regexp1.firstMatch('first\nblah2\nblah3'), ['blah2']);
+
+  var regexp2 = new RegExp(r"^.*blah.*");
+  shouldBeNull(regexp2.firstMatch('test'));
+  shouldBe(regexp2.firstMatch('blah'), ['blah']);
+  shouldBe(regexp2.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp2.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp2.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp2.firstMatch('blah\nsecond'), ['blah']);
+  shouldBeNull(regexp2.firstMatch('first\nblah'));
+  shouldBeNull(regexp2.firstMatch('first\nblah\nthird'));
+  shouldBeNull(regexp2.firstMatch('first\nblah2\nblah3'));
+
+  var regexp3 = new RegExp(r".*blah.*$");
+  shouldBeNull(regexp3.firstMatch('test'));
+  shouldBe(regexp3.firstMatch('blah'), ['blah']);
+  shouldBe(regexp3.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp3.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp3.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBeNull(regexp3.firstMatch('blah\nsecond'));
+  shouldBe(regexp3.firstMatch('first\nblah'), ['blah']);
+  shouldBeNull(regexp3.firstMatch('first\nblah\nthird'));
+  shouldBe(regexp3.firstMatch('first\nblah2\nblah3'), ['blah3']);
+
+  var regexp4 = new RegExp(r"^.*blah.*$");
+  shouldBeNull(regexp4.firstMatch('test'));
+  shouldBe(regexp4.firstMatch('blah'), ['blah']);
+  shouldBe(regexp4.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp4.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp4.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBeNull(regexp4.firstMatch('blah\nsecond'));
+  shouldBeNull(regexp4.firstMatch('first\nblah'));
+  shouldBeNull(regexp4.firstMatch('first\nblah\nthird'));
+  shouldBeNull(regexp4.firstMatch('first\nblah2\nblah3'));
+
+  var regexp5 = new RegExp(r".*?blah.*");
+  shouldBeNull(regexp5.firstMatch('test'));
+  shouldBe(regexp5.firstMatch('blah'), ['blah']);
+  shouldBe(regexp5.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp5.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp5.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp5.firstMatch('blah\nsecond'), ['blah']);
+  shouldBe(regexp5.firstMatch('first\nblah'), ['blah']);
+  shouldBe(regexp5.firstMatch('first\nblah\nthird'), ['blah']);
+  shouldBe(regexp5.firstMatch('first\nblah2\nblah3'), ['blah2']);
+
+  var regexp6 = new RegExp(r".*blah.*?");
+  shouldBeNull(regexp6.firstMatch('test'));
+  shouldBe(regexp6.firstMatch('blah'), ['blah']);
+  shouldBe(regexp6.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp6.firstMatch('blah1'), ['blah']);
+  shouldBe(regexp6.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp6.firstMatch('blah\nsecond'), ['blah']);
+  shouldBe(regexp6.firstMatch('first\nblah'), ['blah']);
+  shouldBe(regexp6.firstMatch('first\nblah\nthird'), ['blah']);
+  shouldBe(regexp6.firstMatch('first\nblah2\nblah3'), ['blah']);
+
+  var regexp7 = new RegExp(r"^.*?blah.*?$");
+  shouldBeNull(regexp7.firstMatch('test'));
+  shouldBe(regexp7.firstMatch('blah'), ['blah']);
+  shouldBe(regexp7.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp7.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp7.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBeNull(regexp7.firstMatch('blah\nsecond'));
+  shouldBeNull(regexp7.firstMatch('first\nblah'));
+  shouldBeNull(regexp7.firstMatch('first\nblah\nthird'));
+  shouldBeNull(regexp7.firstMatch('first\nblah2\nblah3'));
+
+  var regexp8 = new RegExp(r"^(.*)blah.*$");
+  shouldBeNull(regexp8.firstMatch('test'));
+  shouldBe(regexp8.firstMatch('blah'), ['blah','']);
+  shouldBe(regexp8.firstMatch('1blah'), ['1blah','1']);
+  shouldBe(regexp8.firstMatch('blah1'), ['blah1','']);
+  shouldBe(regexp8.firstMatch('blah blah blah'), ['blah blah blah','blah blah ']);
+  shouldBeNull(regexp8.firstMatch('blah\nsecond'));
+  shouldBeNull(regexp8.firstMatch('first\nblah'));
+  shouldBeNull(regexp8.firstMatch('first\nblah\nthird'));
+  shouldBeNull(regexp8.firstMatch('first\nblah2\nblah3'));
+
+  var regexp9 = new RegExp(r".*blah.*", multiLine: true);
+  shouldBeNull(regexp9.firstMatch('test'));
+  shouldBe(regexp9.firstMatch('blah'), ['blah']);
+  shouldBe(regexp9.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp9.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp9.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp9.firstMatch('blah\nsecond'), ['blah']);
+  shouldBe(regexp9.firstMatch('first\nblah'), ['blah']);
+  shouldBe(regexp9.firstMatch('first\nblah\nthird'), ['blah']);
+  shouldBe(regexp9.firstMatch('first\nblah2\nblah3'), ['blah2']);
+
+  var regexp10 = new RegExp(r"^.*blah.*", multiLine: true);
+  shouldBeNull(regexp10.firstMatch('test'));
+  shouldBe(regexp10.firstMatch('blah'), ['blah']);
+  shouldBe(regexp10.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp10.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp10.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBe(regexp10.firstMatch('blah\nsecond'), ['blah']);
+  shouldBe(regexp10.firstMatch('first\nblah'), ['blah']);
+  shouldBe(regexp10.firstMatch('first\nblah\nthird'), ['blah']);
+  shouldBe(regexp10.firstMatch('first\nblah2\nblah3'), ['blah2']);
+
+  var regexp11 = new RegExp(r".*(?:blah).*$");
+  shouldBeNull(regexp11.firstMatch('test'));
+  shouldBe(regexp11.firstMatch('blah'), ['blah']);
+  shouldBe(regexp11.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp11.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp11.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBeNull(regexp11.firstMatch('blah\nsecond'));
+  shouldBe(regexp11.firstMatch('first\nblah'), ['blah']);
+  shouldBeNull(regexp11.firstMatch('first\nblah\nthird'));
+  shouldBe(regexp11.firstMatch('first\nblah2\nblah3'), ['blah3']);
+
+  var regexp12 = new RegExp(r".*(?:blah|buzz|bang).*$");
+  shouldBeNull(regexp12.firstMatch('test'));
+  shouldBe(regexp12.firstMatch('blah'), ['blah']);
+  shouldBe(regexp12.firstMatch('1blah'), ['1blah']);
+  shouldBe(regexp12.firstMatch('blah1'), ['blah1']);
+  shouldBe(regexp12.firstMatch('blah blah blah'), ['blah blah blah']);
+  shouldBeNull(regexp12.firstMatch('blah\nsecond'));
+  shouldBe(regexp12.firstMatch('first\nblah'), ['blah']);
+  shouldBeNull(regexp12.firstMatch('first\nblah\nthird'));
+  shouldBe(regexp12.firstMatch('first\nblah2\nblah3'), ['blah3']);
+
+  var regexp13 = new RegExp(r".*\n\d+.*");
+  shouldBe(regexp13.firstMatch('abc\n123'), ['abc\n123']);
+}
diff --git a/tests/corelib/regexp/early-acid3-86_test.dart b/tests/corelib/regexp/early-acid3-86_test.dart
new file mode 100644
index 0000000..11b3b3c
--- /dev/null
+++ b/tests/corelib/regexp/early-acid3-86_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test that covers capturing brackets, and was adapted from a part of an early version of Acid3.'
+  );
+
+  // JS regexps aren't like Perl regexps, if their character
+  // classes start with a ] that means they're empty. So this
+  // is a syntax error; if we get here it's a bug.
+  assertThrows(() => new RegExp(r"TA[])]").firstMatch('TA]'));
+  shouldBeNull(new RegExp(r"[]").firstMatch(''));
+  shouldBe(new RegExp(r"(\3)(\1)(a)").firstMatch('cat'), ['a', '', '', 'a']);
+}
diff --git a/tests/corelib/regexp/ecma-regex-examples_test.dart b/tests/corelib/regexp/ecma-regex-examples_test.dart
new file mode 100644
index 0000000..c6cff0f
--- /dev/null
+++ b/tests/corelib/regexp/ecma-regex-examples_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests the regex examples from the ECMA-262 specification."
+  );
+
+  var regex01 = new RegExp(r"a|ab");
+  shouldBe(regex01.firstMatch("abc"), ["a"]);
+
+  var regex02 = new RegExp(r"((a)|(ab))((c)|(bc))");
+  shouldBe(regex02.firstMatch("abc"), ["abc", "a", "a", null, "bc", null, "bc"]);
+
+  var regex03 = new RegExp(r"a[a-z]{2,4}");
+  shouldBe(regex03.firstMatch("abcdefghi"), ["abcde"]);
+
+  var regex04 = new RegExp(r"a[a-z]{2,4}?");
+  shouldBe(regex04.firstMatch("abcdefghi"), ["abc"]);
+
+  var regex05 = new RegExp(r"(aa|aabaac|ba|b|c)*");
+  shouldBe(regex05.firstMatch("aabaac"), ["aaba", "ba"]);
+
+  var regex06 = new RegExp(r"^(a+)\1*,\1+$");
+  Expect.equals("aaaaaaaaaa,aaaaaaaaaaaaaaa".replaceAllMapped(regex06,(m) => m.group(1)), "aaaaa");
+
+  var regex07 = new RegExp(r"(z)((a+)?(b+)?(c))*");
+  shouldBe(regex07.firstMatch("zaacbbbcac"), ["zaacbbbcac", "z", "ac", "a", null, "c"]);
+
+  var regex08 = new RegExp(r"(a*)*");
+  shouldBe(regex08.firstMatch("b"), ["", null]);
+
+  var regex09 = new RegExp(r"(a*)b\1+");
+  shouldBe(regex09.firstMatch("baaaac"), ["b", ""]);
+
+  var regex10 = new RegExp(r"(?=(a+))");
+  shouldBe(regex10.firstMatch("baaabac"), ["", "aaa"]);
+
+  var regex11 = new RegExp(r"(?=(a+))a*b\1");
+  shouldBe(regex11.firstMatch("baaabac"), ["aba", "a"]);
+
+  var regex12 = new RegExp(r"(.*?)a(?!(a+)b\2c)\2(.*)");
+  shouldBe(regex12.firstMatch("baaabaac"), ["baaabaac", "ba", null, "abaac"]);
+}
diff --git a/tests/corelib/regexp/extended-characters-match_test.dart b/tests/corelib/regexp/extended-characters-match_test.dart
new file mode 100644
index 0000000..3135811
--- /dev/null
+++ b/tests/corelib/regexp/extended-characters-match_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This test checks regular expressions using extended (> 255) characters and character classes."
+  );
+
+  shouldBeNull((new RegExp("[\u0100-\u0101]")).firstMatch("a"));
+  shouldBeNull((new RegExp("[\u0100]")).firstMatch("a"));
+  shouldBeNull((new RegExp("\u0100")).firstMatch("a"));
+  assertEquals((new RegExp("[\u0061]")).firstMatch("a").group(0), "a");
+  assertEquals((new RegExp("[\u0100-\u0101a]")).firstMatch("a").group(0), "a");
+  assertEquals((new RegExp("[\u0100a]")).firstMatch("a").group(0), "a");
+  assertEquals((new RegExp("\u0061")).firstMatch("a").group(0), "a");
+  assertEquals((new RegExp("[a-\u0100]")).firstMatch("a").group(0), "a");
+  assertEquals((new RegExp("[\u0100]")).firstMatch("\u0100").group(0), "\u0100");
+  assertEquals((new RegExp("[\u0100-\u0101]")).firstMatch("\u0100").group(0), "\u0100");
+  assertEquals((new RegExp("\u0100")).firstMatch("\u0100").group(0), "\u0100");
+}
diff --git a/tests/corelib/regexp/extended-characters-more_test.dart b/tests/corelib/regexp/extended-characters-more_test.dart
new file mode 100644
index 0000000..e726d57
--- /dev/null
+++ b/tests/corelib/regexp/extended-characters-more_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This test checks a few cases of extended (> 127) characters in repeat regular expressions."
+  );
+
+  assertEquals("foo\u00a0\u00a0\u00a0".replaceFirst(new RegExp(new String.fromCharCode(0x00a0) + "*"), ""), "foo\u00a0\u00a0\u00a0");
+  assertEquals("foo\u00a0\u00a0\u00a0".replaceFirst(new RegExp(r"\u00a0+"), ""), "foo");
+  assertEquals("foo\u00a0\u00a0\u00a0".replaceFirst(new RegExp(r"\u00a0*$"), ""), "foo");
+}
diff --git a/tests/corelib/regexp/find-first-asserted_test.dart b/tests/corelib/regexp/find-first-asserted_test.dart
new file mode 100644
index 0000000..9dbc9f8
--- /dev/null
+++ b/tests/corelib/regexp/find-first-asserted_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Tests some regular expressions that were doing the wrong thing with the "find first asserted" optimization.'
+  );
+
+  shouldBe(new RegExp(r".*<body>(.*)</body>.*").firstMatch("foo<body>bar</body>baz"), ["foo<body>bar</body>baz", "bar"]);
+  shouldBe(new RegExp(r"\s*<!--([\s\S]*)//\s*-->\s*").firstMatch("<!--// -->"), ["<!--// -->", ""]);
+}
diff --git a/tests/corelib/regexp/global_test.dart b/tests/corelib/regexp/global_test.dart
new file mode 100644
index 0000000..2ad468f
--- /dev/null
+++ b/tests/corelib/regexp/global_test.dart
@@ -0,0 +1,189 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  var str = "ABX X";
+  str = str.replaceAll(new RegExp(r"(\w)?X"), "c");
+  assertEquals("Ac c", str);
+
+  // Test zero-length matches.
+  str = "Als Gregor Samsa eines Morgens";
+  str = str.replaceAll(new RegExp(r"\b"), "/");
+  assertEquals("/Als/ /Gregor/ /Samsa/ /eines/ /Morgens/", str);
+
+  // Test zero-length matches that have non-zero-length sub-captures.
+  str = "It was a pleasure to burn.";
+  str = str.replaceAllMapped(new RegExp(r"(?=(\w+))\b"), (Match m) => m.group(1).length.toString());
+  assertEquals("2It 3was 1a 8pleasure 2to 4burn.", str);
+
+  // Test multiple captures.
+  str = "Try not. Do, or do not. There is no try.";
+  str = str.replaceAllMapped(new RegExp(r"(not?)|(do)|(try)", caseSensitive: false),
+                    (m) { 
+                      if (m.group(1) != null) return "-";
+                      if (m.group(2) != null) return "+";
+                      if (m.group(3) != null) return "=";
+                    });
+  assertEquals("= -. +, or + -. There is - =.", str);
+
+  // Test multiple alternate captures.
+  str = "FOUR LEGS GOOD, TWO LEGS BAD!";
+  str = str.replaceAllMapped(new RegExp(r"(FOUR|TWO) LEGS (GOOD|BAD)"),
+                    (m) {
+                      if (m.group(1) == "FOUR") assertTrue(m.group(2) == "GOOD");
+                      if (m.group(1) == "TWO") assertTrue(m.group(2) == "BAD");
+                      return m.group(0).length - 10;
+                    });
+  assertEquals("4, 2!", str);
+
+
+  // The same tests with UC16.
+
+  //Test that an optional capture is cleared between two matches.
+  str = "AB\u1234 \u1234";
+  str = str.replaceAll(new RegExp(r"(\w)?\u1234"), "c");
+  assertEquals("Ac c", str);
+
+  // Test zero-length matches.
+  str = "Als \u2623\u2642 eines Morgens";
+  str = str.replaceAll(new RegExp(r"\b"), "/");
+
+  // Test zero-length matches that have non-zero-length sub-captures.
+  str = "It was a pleasure to \u70e7.";
+  str = str.replaceAllMapped(new RegExp(r"(?=(\w+))\b"), (m) => "${m.group(1).length}");
+  assertEquals("2It 3was 1a 8pleasure 2to \u70e7.", str);
+
+  // Test multiple captures.
+  str = "Try not. D\u26aa, or d\u26aa not. There is no try.";
+  str = str.replaceAllMapped(new RegExp(r"(not?)|(d\u26aa)|(try)", caseSensitive: false),
+                    (m) { 
+                      if (m.group(1) != null) return "-";
+                      if (m.group(2) != null) return "+";
+                      if (m.group(3) != null) return "=";
+                    });
+  assertEquals("= -. +, or + -. There is - =.", str);
+
+  // Test multiple alternate captures.
+  str = "FOUR \u817f GOOD, TWO \u817f BAD!";
+  str = str.replaceAllMapped(new RegExp(r"(FOUR|TWO) \u817f (GOOD|BAD)"),
+                    (m) {
+                      if (m.group(1) == "FOUR") assertTrue(m.group(2) == "GOOD");
+                      if (m.group(1) == "TWO") assertTrue(m.group(2) == "BAD");
+                      return m.group(0).length - 7;
+                    });
+  assertEquals("4, 2!", str);
+
+  // Test capture that is a real substring.
+  str = "Beasts of England, beasts of Ireland";
+  str = str.replaceAll(new RegExp(r"(.*)"), '~');
+  assertEquals("~~", str);
+
+  // Test zero-length matches that have non-zero-length sub-captures that do not
+  // start at the match start position.
+  str = "up up up up";
+  str = str.replaceAllMapped(new RegExp(r"\b(?=u(p))"), (m) => "${m.group(1).length}");
+
+  assertEquals("1up 1up 1up 1up", str);
+
+
+  // Create regexp that has a *lot* of captures.
+  var re_string = "(a)";
+  for (var i = 0; i < 500; i++) {
+    re_string = "(" + re_string + ")";
+  }
+  re_string = re_string + "1";
+  // re_string = "(((...((a))...)))1"
+
+  var regexps = new List();
+  var last_match_expectations = new List();
+  var first_capture_expectations = new List();
+
+  // Atomic regexp.
+  regexps.add(new RegExp(r"a1"));
+  last_match_expectations.add("a1");
+  first_capture_expectations.add("");
+  // Small regexp (no capture);
+  regexps.add(new RegExp(r"\w1"));
+  last_match_expectations.add("a1");
+  first_capture_expectations.add("");
+  // Small regexp (one capture).
+  regexps.add(new RegExp(r"(a)1"));
+  last_match_expectations.add("a1");
+  first_capture_expectations.add("a");
+  // Large regexp (a lot of captures).
+  regexps.add(new RegExp(re_string));
+  last_match_expectations.add("a1");
+  first_capture_expectations.add("a");
+
+  dynamic test_replace(result_expectation,
+                        subject,
+                        regexp,
+                        replacement) {
+    for (var i = 0; i < regexps.length; i++) {
+      // Conduct tests.
+      assertEquals(result_expectation, subject.replaceAll(regexps[i], replacement));
+    }
+  }
+
+
+  // Test for different number of matches.
+  for (var m = 0; m < 33; m++) {
+    // Create string that matches m times.
+    var subject = "";
+    var test_1_expectation = "";
+    var test_2_expectation = "";
+    var test_3_expectation = (m == 0) ? null : new List();
+    for (var i = 0; i < m; i++) {
+      subject += "a11";
+      test_1_expectation += "x1";
+      test_2_expectation += "1";
+      test_3_expectation.add("a1");
+    }
+
+    // Test 1a: String.replace with string.
+    test_replace(test_1_expectation, subject, new RegExp(r"a1"), "x");
+
+    // Test 2a: String.replace with empty string.
+    test_replace(test_2_expectation, subject, new RegExp(r"a1"), "");
+  }
+
+
+  // Test String hashing (compiling regular expression includes hashing).
+  var crosscheck = "\x80";
+  for (var i = 0; i < 12; i++) crosscheck += crosscheck;
+    new RegExp(crosscheck);
+
+  var subject = "ascii~only~string~here~";
+  var replacement = "\x80";
+  var result = subject.replaceAll(new RegExp(r"~"), replacement);
+  for (var i = 0; i < 5; i++) result += result;
+    new RegExp(result);
+}
diff --git a/tests/corelib/regexp/indexof_test.dart b/tests/corelib/regexp/indexof_test.dart
new file mode 100644
index 0000000..1082987
--- /dev/null
+++ b/tests/corelib/regexp/indexof_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  dynamic CheckMatch(re, str, matches) {
+    assertEquals(matches.length > 0, re.hasMatch(str));
+    var result = re.allMatches(str).toList();
+    if (matches.length > 0) {
+      assertEquals(matches.length, result.length);
+      var lastExpected;
+      var lastFrom;
+      var lastLength;
+      for (var idx = 0; idx < matches.length; idx++) {
+        var from = matches[idx][0];
+        var length = matches[idx][1];
+        var expected = str.substring(from, from + length);
+        var name = "$str[$from..${from+length}]";
+        assertEquals(expected, result[idx].group(0), name);
+      }
+    } else {
+      assertTrue(result.isEmpty);
+    }
+  }
+
+  CheckMatch(new RegExp(r"abc"), "xxxabcxxxabcxxx", [[3, 3], [9, 3]]);
+  CheckMatch(new RegExp(r"abc"), "abcabcabc", [[0, 3], [3, 3], [6, 3]]);
+  CheckMatch(new RegExp(r"aba"), "ababababa", [[0, 3], [4, 3]]);
+  CheckMatch(new RegExp(r"foo"), "ofooofoooofofooofo", [[1, 3], [5, 3], [12, 3]]);
+  CheckMatch(new RegExp(r"foobarbaz"), "xx", []);
+  CheckMatch(new RegExp(r"abc"), "abababa", []);
+
+  assertEquals("xxxdefxxxdefxxx", "xxxabcxxxabcxxx".replaceAll(new RegExp(r"abc"), "def"));
+  assertEquals("o-o-oofo-ofo", "ofooofoooofofooofo".replaceAll(new RegExp(r"foo"), "-"));
+  assertEquals("deded", "deded".replaceAll(new RegExp(r"x"), "-"));
+  assertEquals("-a-b-c-d-e-f-", "abcdef".replaceAll(new RegExp(""), "-"));
+
+  CheckMatch(new RegExp(r"a(.)"), "xyzzyabxyzzyacxyzzy", [[5, 2], [12, 2]]);
+
+  CheckMatch(new RegExp(r"a|(?:)"), "aba", [[0, 1], [1, 0], [2, 1], [3, 0]]);
+  CheckMatch(new RegExp(r"a|(?:)"), "baba", [[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]);
+  CheckMatch(new RegExp(r"a|(?:)"), "bab", [[0, 0], [1, 1], [2, 0], [3, 0]]);
+}
diff --git a/tests/corelib/regexp/invalid-range-in-class_test.dart b/tests/corelib/regexp/invalid-range-in-class_test.dart
new file mode 100644
index 0000000..d4a6aa5
--- /dev/null
+++ b/tests/corelib/regexp/invalid-range-in-class_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests invalid character ranges in character classes."
+  );
+
+  // These test a basic range / non range.
+  shouldBe(new RegExp(r"[a-c]+").firstMatch("-acbd"), ["acb"]);
+  shouldBe(new RegExp(r"[a\-c]+").firstMatch("-acbd"), ["-ac"]);
+
+  // A reverse-range is invalid.
+  assertThrows(() => new RegExp(r"[c-a]+").firstMatch("-acbd"));
+
+  // A character-class in a range is invalid, according to ECMA-262, but we allow it.
+  shouldBe(new RegExp(r"[\d-x]+").firstMatch("1-3xy"), ["1-3x"]);
+  shouldBe(new RegExp(r"[x-\d]+").firstMatch("1-3xy"), ["1-3x"]);
+  shouldBe(new RegExp(r"[\\d-\d]+").firstMatch("1-3xy"), ["1-3"]);
+
+  // Whilst we break with ECMA-262's definition of CharacterRange, we do comply with
+  // the grammar, and as such in the following regex a-z cannot be matched as a range.
+  shouldBe(new RegExp(r"[\d-a-z]+").firstMatch("az1-3y"), ["az1-3"]);
+
+  // An escaped hypen should not be confused for an invalid range.
+  shouldBe(new RegExp(r"[\d\-x]+").firstMatch("1-3xy"), ["1-3x"]);
+  shouldBe(new RegExp(r"[x\-\d]+").firstMatch("1-3xy"), ["1-3x"]);
+  shouldBe(new RegExp(r"[\d\-\d]+").firstMatch("1-3xy"), ["1-3"]);
+
+  // A hyphen after a character-class is not invalid.
+  shouldBe(new RegExp(r"[\d-]+").firstMatch("1-3xy"), ["1-3"]);
+}
diff --git a/tests/corelib/regexp/lastindex_test.dart b/tests/corelib/regexp/lastindex_test.dart
new file mode 100644
index 0000000..87f9a18
--- /dev/null
+++ b/tests/corelib/regexp/lastindex_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // 'Test for regression against "https://bugs.webkit.org/show_bug.cgi?id=5602"
+  // REGRESSION: RegExp("[^\\s$]+", "g") returns extra matches'
+
+  var re = new RegExp(r"[^\s$]+");
+  var accumulate = "";
+  var match;
+  for (var match in re.allMatches("  abcdefg"))
+    accumulate += match.group(0) + "; "; 
+  assertEquals(accumulate, "abcdefg; ");
+
+  re = new RegExp(r"\d");
+  accumulate = "";
+  for (var match in re.allMatches("123456789"))
+    accumulate += match.group(0) + "; "; 
+  assertEquals(accumulate, "1; 2; 3; 4; 5; 6; 7; 8; 9; ");
+}
diff --git a/tests/corelib/regexp/look-ahead_test.dart b/tests/corelib/regexp/look-ahead_test.dart
new file mode 100644
index 0000000..ffb67e4
--- /dev/null
+++ b/tests/corelib/regexp/look-ahead_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for regression against <a href="https://bugs.webkit.org/show_bug.cgi?id=41458">Yarr Interpreter is crashing in some cases of look-ahead regex patterns</a>'
+  );
+
+  shouldBe(firstMatch("ab", new RegExp(r"a(?=b|c)")), ["a"]);
+  shouldBe(firstMatch("abd", new RegExp(r"a(?=c|b)|d")), ["a"]);
+}
diff --git a/tests/corelib/regexp/lookahead_test.dart b/tests/corelib/regexp/lookahead_test.dart
new file mode 100644
index 0000000..fce48cd
--- /dev/null
+++ b/tests/corelib/regexp/lookahead_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Tests captures in positive and negative look-ahead in regular expressions.
+
+  dynamic testRE(re, input, expected_result) {
+    if (expected_result) {
+      assertTrue(re.hasMatch(input));
+    } else {
+      assertFalse(re.hasMatch(input));
+    }
+  }
+
+  dynamic execRE(re, input, expected_result) {
+    shouldBe(re.firstMatch(input), expected_result);
+  }
+
+  // Test of simple positive lookahead.
+
+  var re = new RegExp(r"^(?=a)");
+  testRE(re, "a", true);
+  testRE(re, "b", false);
+  execRE(re, "a", [""]);
+
+  re = new RegExp(r"^(?=\woo)f\w");
+  testRE(re, "foo", true);
+  testRE(re, "boo", false);
+  testRE(re, "fao", false);
+  testRE(re, "foa", false);
+  execRE(re, "foo", ["fo"]);
+
+  re = new RegExp(r"(?=\w).(?=\W)");
+  testRE(re, ".a! ", true);
+  testRE(re, ".! ", false);
+  testRE(re, ".ab! ", true);
+  execRE(re, ".ab! ", ["b"]);
+
+  re = new RegExp(r"(?=f(?=[^f]o))..");
+  testRE(re, ", foo!", true);
+  testRE(re, ", fo!", false);
+  testRE(re, ", ffo", false);
+  execRE(re, ", foo!", ["fo"]);
+
+  // Positive lookahead with captures.
+  re = new RegExp("^[^\'\"]*(?=([\'\"])).*\\1(\\w+)\\1");
+  testRE(re, "  'foo' ", true);
+  testRE(re, '  "foo" ', true);
+  testRE(re, " \" 'foo' ", false);
+  testRE(re, " ' \"foo\" ", false);
+  testRE(re, "  'foo\" ", false);
+  testRE(re, "  \"foo' ", false);
+  execRE(re, "  'foo' ", ["  'foo'", "'", "foo"]);
+  execRE(re, '  "foo" ', ['  "foo"', '"', 'foo']);
+
+  // Captures are cleared on backtrack past the look-ahead.
+  re = new RegExp(r"^(?:(?=(.))a|b)\1$");
+  testRE(re, "aa", true);
+  testRE(re, "b", true);
+  testRE(re, "bb", false);
+  testRE(re, "a", false);
+  execRE(re, "aa", ["aa", "a"]);
+  execRE(re, "b", ["b", null]);
+
+  re = new RegExp(r"^(?=(.)(?=(.)\1\2)\2\1)\1\2");
+  testRE(re, "abab", true);
+  testRE(re, "ababxxxxxxxx", true);
+  testRE(re, "aba", false);
+  execRE(re, "abab", ["ab", "a", "b"]);
+
+  re = new RegExp(r"^(?:(?=(.))a|b|c)$");
+  testRE(re, "a", true);
+  testRE(re, "b", true);
+  testRE(re, "c", true);
+  testRE(re, "d", false);
+  execRE(re, "a", ["a", "a"]);
+  execRE(re, "b", ["b", null]);
+  execRE(re, "c", ["c", null]);
+
+  execRE(new RegExp(r"^(?=(b))b"), "b", ["b", "b"]);
+  execRE(new RegExp(r"^(?:(?=(b))|a)b"), "ab", ["ab", null]);
+  execRE(new RegExp(r"^(?:(?=(b)(?:(?=(c))|d))|)bd"), "bd", ["bd", "b", null]);
+
+
+
+  // Test of Negative Look-Ahead.
+
+  re = new RegExp(r"(?!x).");
+  testRE(re, "y", true);
+  testRE(re, "x", false);
+  execRE(re, "y", ["y"]);
+
+  re = new RegExp(r"(?!(\d))|\d");
+  testRE(re, "4", true);
+  execRE(re, "4", ["4", null]);
+  execRE(re, "x", ["", null]);
+
+
+  // Test mixed nested look-ahead with captures.
+
+  re = new RegExp(r"^(?=(x)(?=(y)))");
+  testRE(re, "xy", true);
+  testRE(re, "xz", false);
+  execRE(re, "xy", ["", "x", "y"]);
+
+  re = new RegExp(r"^(?!(x)(?!(y)))");
+  testRE(re, "xy", true);
+  testRE(re, "xz", false);
+  execRE(re, "xy", ["", null, null]);
+
+  re = new RegExp(r"^(?=(x)(?!(y)))");
+  testRE(re, "xz", true);
+  testRE(re, "xy", false);
+  execRE(re, "xz", ["", "x", null]);
+
+  re = new RegExp(r"^(?!(x)(?=(y)))");
+  testRE(re, "xz", true);
+  testRE(re, "xy", false);
+  execRE(re, "xz", ["", null, null]);
+
+  re = new RegExp(r"^(?=(x)(?!(y)(?=(z))))");
+  testRE(re, "xaz", true);
+  testRE(re, "xya", true);
+  testRE(re, "xyz", false);
+  testRE(re, "a", false);
+  execRE(re, "xaz", ["", "x", null, null]);
+  execRE(re, "xya", ["", "x", null, null]);
+
+  re = new RegExp(r"^(?!(x)(?=(y)(?!(z))))");
+  testRE(re, "a", true);
+  testRE(re, "xa", true);
+  testRE(re, "xyz", true);
+  testRE(re, "xya", false);
+  execRE(re, "a", ["", null, null, null]);
+  execRE(re, "xa", ["", null, null, null]);
+  execRE(re, "xyz", ["", null, null, null]);
+}
diff --git a/tests/corelib/regexp/loop-capture_test.dart b/tests/corelib/regexp/loop-capture_test.dart
new file mode 100644
index 0000000..fb8174f
--- /dev/null
+++ b/tests/corelib/regexp/loop-capture_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  shouldBe(new RegExp(r"(?:(a)|(b)|(c))+").firstMatch("abc"), ["abc",null,null,"c"]);
+  shouldBe(new RegExp(r"(?:(a)|b)*").firstMatch("ab"), ["ab",null]);
+}
diff --git a/tests/corelib/regexp/malformed-escapes_test.dart b/tests/corelib/regexp/malformed-escapes_test.dart
new file mode 100644
index 0000000..b64090c
--- /dev/null
+++ b/tests/corelib/regexp/malformed-escapes_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests handling of malformed escape sequences."
+  );
+
+  var regexp;
+
+  regexp = new RegExp(r"\ug", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('ug'));
+
+  regexp = new RegExp(r"\xg", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('xg'));
+
+  regexp = new RegExp(r"\c_", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('\\\\c_'));
+
+  regexp = new RegExp(r"[\B]", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('B'));
+
+  regexp = new RegExp(r"[\b]", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('\b'));
+
+  regexp = new RegExp(r"\8", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('\\\8'));
+
+  regexp = new RegExp(r"^[\c]$");
+  shouldBeTrue(regexp.hasMatch('c'));
+
+  regexp = new RegExp(r"^[\c_]$");
+  shouldBeFalse(regexp.hasMatch('c'));
+
+  regexp = new RegExp(r"^[\c]]$");
+  shouldBeTrue(regexp.hasMatch('c]'));
+}
diff --git a/tests/corelib/regexp/many-brackets_test.dart b/tests/corelib/regexp/many-brackets_test.dart
new file mode 100644
index 0000000..d014f2b
--- /dev/null
+++ b/tests/corelib/regexp/many-brackets_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test regular expression processing with many capturing brackets (200).'
+  );
+
+  var count = 200;
+
+  var regexp = "";
+  for (var i = 0; i < count; ++i)
+      regexp += "(";
+  regexp += "hello";
+  for (var i = 0; i < count; ++i)
+      regexp += ")";
+
+  var manyHellosArray = [];
+  for (var i = 0; i <= count; ++i)
+      manyHellosArray.add("hello");
+
+  var manyBracketsRegExp = new RegExp(regexp);
+  shouldBe(firstMatch('hello', manyBracketsRegExp), manyHellosArray);
+}
diff --git a/tests/corelib/regexp/multiline_test.dart b/tests/corelib/regexp/multiline_test.dart
new file mode 100644
index 0000000..88222bf
--- /dev/null
+++ b/tests/corelib/regexp/multiline_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/**
+ * @fileoverview Check that various regexp constructs work as intended.
+ * Particularly those regexps that use ^ and $.
+ */
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  assertTrue(new RegExp(r"^bar").hasMatch("bar"));
+  assertTrue(new RegExp(r"^bar").hasMatch("bar\nfoo"));
+  assertFalse(new RegExp(r"^bar").hasMatch("foo\nbar"));
+  assertTrue(new RegExp(r"^bar", multiLine: true).hasMatch("bar"));
+  assertTrue(new RegExp(r"^bar", multiLine: true).hasMatch("bar\nfoo"));
+  assertTrue(new RegExp(r"^bar", multiLine: true).hasMatch("foo\nbar"));
+
+  assertTrue(new RegExp(r"bar$").hasMatch("bar"));
+  assertFalse(new RegExp(r"bar$").hasMatch("bar\nfoo"));
+  assertTrue(new RegExp(r"bar$").hasMatch("foo\nbar"));
+  assertTrue(new RegExp(r"bar$", multiLine: true).hasMatch("bar"));
+  assertTrue(new RegExp(r"bar$", multiLine: true).hasMatch("bar\nfoo"));
+  assertTrue(new RegExp(r"bar$", multiLine: true).hasMatch("foo\nbar"));
+
+  assertFalse(new RegExp(r"^bxr").hasMatch("bar"));
+  assertFalse(new RegExp(r"^bxr").hasMatch("bar\nfoo"));
+  assertFalse(new RegExp(r"^bxr", multiLine: true).hasMatch("bar"));
+  assertFalse(new RegExp(r"^bxr", multiLine: true).hasMatch("bar\nfoo"));
+  assertFalse(new RegExp(r"^bxr", multiLine: true).hasMatch("foo\nbar"));
+
+  assertFalse(new RegExp(r"bxr$").hasMatch("bar"));
+  assertFalse(new RegExp(r"bxr$").hasMatch("foo\nbar"));
+  assertFalse(new RegExp(r"bxr$", multiLine: true).hasMatch("bar"));
+  assertFalse(new RegExp(r"bxr$", multiLine: true).hasMatch("bar\nfoo"));
+  assertFalse(new RegExp(r"bxr$", multiLine: true).hasMatch("foo\nbar"));
+
+
+  assertTrue(new RegExp(r"^.*$").hasMatch(""));
+  assertTrue(new RegExp(r"^.*$").hasMatch("foo"));
+  assertFalse(new RegExp(r"^.*$").hasMatch("\n"));
+  assertTrue(new RegExp(r"^.*$", multiLine: true).hasMatch("\n"));
+
+  assertTrue(new RegExp(r"^[\s]*$").hasMatch(" "));
+  assertTrue(new RegExp(r"^[\s]*$").hasMatch("\n"));
+
+  assertTrue(new RegExp(r"^[^]*$").hasMatch(""));
+  assertTrue(new RegExp(r"^[^]*$").hasMatch("foo"));
+  assertTrue(new RegExp(r"^[^]*$").hasMatch("\n"));
+
+  assertTrue(new RegExp(r"^([()\s]|.)*$").hasMatch("()\n()"));
+  assertTrue(new RegExp(r"^([()\n]|.)*$").hasMatch("()\n()"));
+  assertFalse(new RegExp(r"^([()]|.)*$").hasMatch("()\n()"));
+  assertTrue(new RegExp(r"^([()]|.)*$", multiLine: true).hasMatch("()\n()"));
+  assertTrue(new RegExp(r"^([()]|.)*$", multiLine: true).hasMatch("()\n"));
+  assertTrue(new RegExp(r"^[()]*$", multiLine: true).hasMatch("()\n."));
+
+  assertTrue(new RegExp(r"^[\].]*$").hasMatch("...]..."));
+
+
+  dynamic check_case(lc, uc) {
+    var a = new RegExp("^" + lc + r"$");
+    assertFalse(a.hasMatch(uc));
+    a = new RegExp("^" + lc + r"$", caseSensitive: false);
+    assertTrue(a.hasMatch(uc));
+
+    var A = new RegExp("^" + uc + r"$");
+    assertFalse(A.hasMatch(lc));
+    A = new RegExp("^" + uc + r"$", caseSensitive: false);
+    assertTrue(A.hasMatch(lc));
+
+    a = new RegExp("^[" + lc + r"]$");
+    assertFalse(a.hasMatch(uc));
+    a = new RegExp("^[" + lc + r"]$", caseSensitive: false);
+    assertTrue(a.hasMatch(uc));
+
+    A = new RegExp("^[" + uc + r"]$");
+    assertFalse(A.hasMatch(lc));
+    A = new RegExp("^[" + uc + r"]$", caseSensitive: false);
+    assertTrue(A.hasMatch(lc));
+  }
+
+
+  check_case("a", "A");
+  // Aring
+  check_case(new String.fromCharCode(229), new String.fromCharCode(197));
+  // Russian G
+  check_case(new String.fromCharCode(0x413), new String.fromCharCode(0x433));
+
+
+  assertThrows(() => new RegExp('[z-a]'));
+}
diff --git a/tests/corelib/regexp/negative-special-characters_test.dart b/tests/corelib/regexp/negative-special-characters_test.dart
new file mode 100644
index 0000000..5fda4c9
--- /dev/null
+++ b/tests/corelib/regexp/negative-special-characters_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This test checks Unicode in negative RegExp character classes."
+  );
+
+  dynamic testPassed(str) { }
+  dynamic testFailed(str) => Expect.fail(str);
+
+  dynamic test(pattern, str, expected_length) {
+    var result = str.replaceAll(new RegExp(pattern, caseSensitive: false, multiLine: true), '');
+
+    if (result.length == expected_length)
+      testPassed('"' + pattern + '", ' + '"' + str + '".');
+    else
+      testFailed('"' + pattern + '", ' + '"' + str + '". Was "' + result + '".');
+  }
+
+
+  test("\\s", " \t\f\v\r\n", 0); // ASCII whitespace.
+  test("\\S", "Проверка", 0); // Cyrillic letters are non-whitespace...
+  test("\\s", "Проверка", 8); // ...and they aren't whitespace.
+  test("[\\s]", "Проверка", 8);
+  test("[\\S]", "Проверка", 0);
+  test("[^\\s]", "Проверка", 0);
+  test("[^\\S]", "Проверка", 8);
+  test("[\\s\\S]*", "\\u2002Проверка\\r\\n\\u00a0", 0);
+  test("\\S\\S", "уф", 0);
+  test("\\S{2}", "уф", 0);
+
+  test("\\w", "Проверка", 8); // Alas, only ASCII characters count as word ones in JS.
+  test("\\W", "Проверка", 0);
+  test("[\\w]", "Проверка", 8);
+  test("[\\W]", "Проверка", 0);
+  test("[^\\w]", "Проверка", 0);
+  test("[^\\W]", "Проверка", 8);
+  test("\\W\\W", "уф", 0);
+  test("\\W{2}", "уф", 0);
+
+  test("\\d", "Проверка", 8); // Digit and non-digit.
+  test("\\D", "Проверка", 0);
+  test("[\\d]", "Проверка", 8);
+  test("[\\D]", "Проверка", 0);
+  test("[^\\d]", "Проверка", 0);
+  test("[^\\D]", "Проверка", 8);
+  test("\\D\\D", "уф", 0);
+  test("\\D{2}", "уф", 0);
+
+  test("[\\S\\d]", "Проверка123", 0);
+  test("[\\d\\S]", "Проверка123", 0);
+  test("[^\\S\\d]", "Проверка123", 11);
+  test("[^\\d\\S]", "Проверка123", 11);
+
+  test("[ \\S]", " Проверка ", 0);
+  test("[\\S ]", " Проверка ", 0);
+  test("[ф \\S]", " Проверка ", 0);
+  test("[\\Sф ]", " Проверка ", 0);
+
+  test("[^р\\S]", " Проверка ", 8);
+  test("[^\\Sр]", " Проверка ", 8);
+  test("[^р\\s]", " Проверка ", 4);
+  test("[^\\sр]", " Проверка ", 4);
+
+  test("[ф \\s\\S]", "Проверка \\r\\n", 0);
+  test("[\\S\\sф ]", "Проверка \\r\\n", 0);
+
+  test("[^z]", "Проверка \\r\\n", 0);
+  test("[^ф]", "Проверка \\r\\n", 0);
+}
diff --git a/tests/corelib/regexp/no-extensions_test.dart b/tests/corelib/regexp/no-extensions_test.dart
new file mode 100644
index 0000000..8d2564b
--- /dev/null
+++ b/tests/corelib/regexp/no-extensions_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Tests that regular expressions do not have extensions that diverge from the JavaScript specification. '
+  + 'Because WebKit originally used a copy of PCRE, various non-JavaScript regular expression features were historically present. '
+  + 'Also tests various related edge cases.'
+  );
+
+  shouldBeNull(new RegExp(r"\\x{41}").firstMatch("yA1"));
+  assertEquals(new RegExp(r"[\x{41}]").firstMatch("yA1").group(0), "1");
+  assertEquals(new RegExp(r"\x1g").firstMatch("x1g").group(0), "x1g");
+  assertEquals(new RegExp(r"[\x1g]").firstMatch("x").group(0), "x");
+  assertEquals(new RegExp(r"[\x1g]").firstMatch("1").group(0), "1");
+  assertEquals(new RegExp(r"\2147483648").firstMatch(new String.fromCharCode(140) + "7483648").group(0), new String.fromCharCode(140) + "7483648");
+  assertEquals(new RegExp(r"\4294967296").firstMatch("\"94967296").group(0), "\"94967296");
+  assertEquals(new RegExp(r"\8589934592").firstMatch("\8589934592").group(0), "\8589934592");
+  assertEquals("\nAbc\n".replaceAllMapped(new RegExp(r"(\n)[^\n]+$"), (m) => m.group(1)), "\nAbc\n");
+  shouldBeNull(new RegExp(r"x$").firstMatch("x\n"));
+  assertThrows(() => new RegExp(r"x++"));
+  shouldBeNull(new RegExp(r"[]]").firstMatch("]"));
+
+  assertEquals(new RegExp(r"\060").firstMatch("y01").group(0), "0");
+  assertEquals(new RegExp(r"[\060]").firstMatch("y01").group(0), "0");
+  assertEquals(new RegExp(r"\606").firstMatch("y06").group(0), "06");
+  assertEquals(new RegExp(r"[\606]").firstMatch("y06").group(0), "0");
+  assertEquals(new RegExp(r"[\606]").firstMatch("y6").group(0), "6");
+  assertEquals(new RegExp(r"\101").firstMatch("yA1").group(0), "A");
+  assertEquals(new RegExp(r"[\101]").firstMatch("yA1").group(0), "A");
+  assertEquals(new RegExp(r"\1011").firstMatch("yA1").group(0), "A1");
+  assertEquals(new RegExp(r"[\1011]").firstMatch("yA1").group(0), "A");
+  assertEquals(new RegExp(r"[\1011]").firstMatch("y1").group(0), "1");
+  assertEquals(new RegExp(r"\10q").firstMatch("y" + new String.fromCharCode(8) + "q").group(0), new String.fromCharCode(8) + "q");
+  assertEquals(new RegExp(r"[\10q]").firstMatch("y" + new String.fromCharCode(8) + "q").group(0), new String.fromCharCode(8));
+  assertEquals(new RegExp(r"\1q").firstMatch("y" + new String.fromCharCode(1) + "q").group(0), new String.fromCharCode(1) + "q");
+  assertEquals(new RegExp(r"[\1q]").firstMatch("y" + new String.fromCharCode(1) + "q").group(0), new String.fromCharCode(1));
+  assertEquals(new RegExp(r"[\1q]").firstMatch("yq").group(0), "q");
+  assertEquals(new RegExp(r"\8q").firstMatch("\8q").group(0), "\8q");
+  assertEquals(new RegExp(r"[\8q]").firstMatch("y8q").group(0), "8");
+  assertEquals(new RegExp(r"[\8q]").firstMatch("yq").group(0), "q");
+  shouldBe(new RegExp(r"(x)\1q").firstMatch("xxq"), ["xxq", "x"]);
+  shouldBe(new RegExp(r"(x)[\1q]").firstMatch("xxq"), ["xq", "x"]);
+  shouldBe(new RegExp(r"(x)[\1q]").firstMatch("xx" + new String.fromCharCode(1)), ["x" + new String.fromCharCode(1), "x"]);
+}
diff --git a/tests/corelib/regexp/non-bmp_test.dart b/tests/corelib/regexp/non-bmp_test.dart
new file mode 100644
index 0000000..3160f9e
--- /dev/null
+++ b/tests/corelib/regexp/non-bmp_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Tests that regular expressions treat non-BMP characters as two separate characters. '
+  + 'From a Unicode correctness point of view this is wrong, but it is what other browsers do. '
+  + 'And given that we store strings as UTF-16, it is also more efficient to implement. '
+  + 'Also test some other cases related to UTF-8 and UTF-16.'
+  );
+
+  var surrogatePair = new String.fromCharCode(0xD800) + new String.fromCharCode(0xDC00);
+
+  assertEquals(new RegExp(r".").firstMatch(surrogatePair).group(0).length, 1);
+  assertEquals(new RegExp(r"\D").firstMatch(surrogatePair).group(0).length, 1);
+  assertEquals(new RegExp(r"\S").firstMatch(surrogatePair).group(0).length, 1);
+  assertEquals(new RegExp(r"\W").firstMatch(surrogatePair).group(0).length, 1);
+  assertEquals(new RegExp(r"[^x]").firstMatch(surrogatePair).group(0).length, 1);
+
+  assertEquals(new RegExp(r".{1,2}").firstMatch("!!" + new String.fromCharCode(0xA1)).group(0).length, 2);
+  shouldBeNull(new RegExp(r".").firstMatch(""));
+}
diff --git a/tests/corelib/regexp/non-capturing-backtracking_test.dart b/tests/corelib/regexp/non-capturing-backtracking_test.dart
new file mode 100644
index 0000000..f7796de
--- /dev/null
+++ b/tests/corelib/regexp/non-capturing-backtracking_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests for proper backtracking with greedy quantifiers and non-capturing parentheses."
+  );
+
+  var re = new RegExp(r"(?:a*)a");
+  shouldBe(re.firstMatch('a'), ['a']);
+}
diff --git a/tests/corelib/regexp/non-capturing-groups_test.dart b/tests/corelib/regexp/non-capturing-groups_test.dart
new file mode 100644
index 0000000..a91cdab
--- /dev/null
+++ b/tests/corelib/regexp/non-capturing-groups_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for behavior of non-capturing groups, as described in <a href="http://blog.stevenlevithan.com/archives/npcg-javascript">' +
+  'a blog post by Steven Levithan</a> and <a href="http://bugs.webkit.org/show_bug.cgi?id=14931">bug 14931</a>.'
+  );
+
+  shouldBeTrue(new RegExp(r"(x)?\1y").hasMatch("y"));
+  shouldBe(new RegExp(r"(x)?\1y").firstMatch("y"), ["y", null]);
+  shouldBe(new RegExp(r"(x)?y").firstMatch("y"), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?\1y")), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?y")), ["y", null]);
+  shouldBe(firstMatch("y", new RegExp(r"(x)?\1y")), ["y", null]);
+  Expect.listEquals("y".split(new RegExp(r"(x)?\1y")), ["", ""]);
+  Expect.listEquals("y".split(new RegExp(r"(x)?y")), ["", ""]);
+  assertEquals("y".indexOf(new RegExp(r"(x)?\1y")), 0);
+  assertEquals("y".replaceAll(new RegExp(r"(x)?\1y"), "z"), "z");
+  assertEquals("y".replaceAllMapped(new RegExp(r"(x)?y"), (m) => m.group(1)), "null");
+  assertEquals("y".replaceAllMapped(new RegExp(r"(x)?\1y"), (m) => m.group(1)), "null");
+  assertEquals("y".replaceAllMapped(new RegExp(r"(x)?y"), (m) => m.group(1)), "null");
+}
diff --git a/tests/corelib/regexp/non-character_test.dart b/tests/corelib/regexp/non-character_test.dart
new file mode 100644
index 0000000..bc4a206
--- /dev/null
+++ b/tests/corelib/regexp/non-character_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for regular expressions with non-character values in them, specifically in character classes.'
+  );
+
+  shouldBeNull(firstMatch("F", new RegExp(r"[\uD7FF]")));
+  shouldBeNull(firstMatch("0", new RegExp(r"[\uD800]")));
+  shouldBeNull(firstMatch("F", new RegExp(r"[\uDFFF]")));
+  shouldBeNull(firstMatch("E", new RegExp(r"[\uE000]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFDBF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFDD0]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFDEF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFDF0]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFEFF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFEFF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFFFE]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\uFFFF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\u10FFFF]")));
+  shouldBeNull(firstMatch("y", new RegExp(r"[\u110000]")));
+}
diff --git a/tests/corelib/regexp/non-greedy-parentheses_test.dart b/tests/corelib/regexp/non-greedy-parentheses_test.dart
new file mode 100644
index 0000000..94494bf
--- /dev/null
+++ b/tests/corelib/regexp/non-greedy-parentheses_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+'Test for regression against <a href="https://bugs.webkit.org/show_bug.cgi?id=39289">Wrong result in case of non-iterative matching of subpatterns in non-greedy cases in YARR Interpreter</a>'
+  );
+
+  shouldBe(firstMatch("a", new RegExp(r"(a)??")), ["", null]);
+  shouldBe(firstMatch("b", new RegExp(r"(a)??")), ["", null]);
+  shouldBe(firstMatch("ab", new RegExp(r"(a)??b")), ["ab", "a"]);
+  shouldBe(firstMatch("aaab", new RegExp(r"(a+)??b")), ["aaab", "aaa"]);
+  shouldBe(firstMatch("abbc", new RegExp(r"(a)??(b+)??c")), ["abbc", "a", "bb"]);
+  shouldBe(firstMatch("ac", new RegExp(r"(a)??(b)??c")), ["ac", "a", null]);
+  shouldBe(firstMatch("abc", new RegExp(r"(a(b)??)??c")), ["abc", "ab", "b"]);
+  shouldBe(firstMatch("ac", new RegExp(r"(a(b)??)??c")), ["ac", "a", null]);
+}
diff --git a/tests/corelib/regexp/norepeat_test.dart b/tests/corelib/regexp/norepeat_test.dart
new file mode 100644
index 0000000..2f7b9a4
--- /dev/null
+++ b/tests/corelib/regexp/norepeat_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for https://bugs.webkit.org/show_bug.cgi?id=46077'
+  );
+
+  var re = new RegExp(r"^b|^cd");
+  var str = "abcd";
+  shouldBeFalse(re.hasMatch(str));
+}
diff --git a/tests/corelib/regexp/overflow_test.dart b/tests/corelib/regexp/overflow_test.dart
new file mode 100644
index 0000000..67def80
--- /dev/null
+++ b/tests/corelib/regexp/overflow_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("This test checks expressions with alternative lengths of appox. 2^31.");
+
+  var regexp1 = new RegExp(r"(?:(?=g))|(?:m).{2147483648,}");
+  shouldBeNull(regexp1.firstMatch(''));
+
+  var regexp2 = new RegExp(r"(?:(?=g)).{2147483648,}");
+  shouldBeNull(regexp2.firstMatch(''));
+
+  var s3 = r"&{6}u4a64YfQP{C}u88c4u5772Qu8693{4294967167}u85f2u7f3fs((uf202){4})u5bc6u1947";
+  var regexp3 = new RegExp(s3);
+  shouldBeNull(regexp3.firstMatch(s3));
+
+  var regexp4 = new RegExp(r"[^a$]{4294967295}");
+  shouldBeNull(regexp4.firstMatch(s3));
+}
diff --git a/tests/corelib/regexp/parentheses_test.dart b/tests/corelib/regexp/parentheses_test.dart
new file mode 100644
index 0000000..4524035
--- /dev/null
+++ b/tests/corelib/regexp/parentheses_test.dart
@@ -0,0 +1,288 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("This page tests handling of parentheses subexpressions.");
+
+  var regexp1 = new RegExp(r"(a|A)(b|B)");
+  shouldBe(regexp1.firstMatch('abc'), ['ab','a','b']);
+
+  var regexp2 = new RegExp(r"(a((b)|c|d))e");
+  shouldBe(regexp2.firstMatch('abacadabe'), ['abe','ab','b','b']);
+
+  var regexp3 = new RegExp(r"(a(b|(c)|d))e");
+  shouldBe(regexp3.firstMatch('abacadabe'), ['abe','ab','b',null]);
+
+  var regexp4 = new RegExp(r"(a(b|c|(d)))e");
+  shouldBe(regexp4.firstMatch('abacadabe'), ['abe','ab','b',null]);
+
+  var regexp5 = new RegExp(r"(a((b)|(c)|(d)))e");
+  shouldBe(regexp5.firstMatch('abacadabe'), ['abe','ab','b','b',null,null]);
+
+  var regexp6 = new RegExp(r"(a((b)|(c)|(d)))");
+  shouldBe(regexp6.firstMatch('abcde'), ['ab','ab','b','b',null,null]);
+
+  var regexp7 = new RegExp(r"(a(b)??)??c");
+  shouldBe(regexp7.firstMatch('abc'), ['abc','ab','b']);
+
+  var regexp8 = new RegExp(r"(a|(e|q))(x|y)");
+  shouldBe(regexp8.firstMatch('bcaddxqy') , ['qy','q','q','y']);
+
+  var regexp9 = new RegExp(r"((t|b)?|a)$");
+  shouldBe(regexp9.firstMatch('asdfjejgsdflaksdfjkeljghkjea'), ['a','a',null]);
+
+  var regexp10 = new RegExp(r"(?:h|e?(?:t|b)?|a?(?:t|b)?)(?:$)");
+  shouldBe(regexp10.firstMatch('asdfjejgsdflaksdfjkeljghat'), ['at']);
+
+  var regexp11 = new RegExp(r"([Jj]ava([Ss]cript)?)\sis\s(fun\w*)");
+  shouldBeNull(regexp11.firstMatch('Developing with JavaScript is dangerous, do not try it without assistance'));
+
+  var regexp12 = new RegExp(r"(?:(.+), )?(.+), (..) to (?:(.+), )?(.+), (..)");
+  shouldBe(regexp12.firstMatch('Seattle, WA to Buckley, WA'), ['Seattle, WA to Buckley, WA', null, 'Seattle', 'WA', null, 'Buckley', 'WA']);
+
+  var regexp13 = new RegExp(r"(A)?(A.*)");
+  shouldBe(regexp13.firstMatch('zxcasd;fl\ ^AaaAAaaaf;lrlrzs'), ['AaaAAaaaf;lrlrzs',null,'AaaAAaaaf;lrlrzs']);
+
+  var regexp14 = new RegExp(r"(a)|(b)");
+  shouldBe(regexp14.firstMatch('b'), ['b',null,'b']);
+
+  var regexp15 = new RegExp(r"^(?!(ab)de|x)(abd)(f)");
+  shouldBe(regexp15.firstMatch('abdf'), ['abdf',null,'abd','f']);
+
+  var regexp16 = new RegExp(r"(a|A)(b|B)");
+  shouldBe(regexp16.firstMatch('abc'), ['ab','a','b']);
+
+  var regexp17 = new RegExp(r"(a|d|q|)x", caseSensitive: false);
+  shouldBe(regexp17.firstMatch('bcaDxqy'), ['Dx','D']);
+
+  var regexp18 = new RegExp(r"^.*?(:|$)");
+  shouldBe(regexp18.firstMatch('Hello: World'), ['Hello:',':']);
+
+  var regexp19 = new RegExp(r"(ab|^.{0,2})bar");
+  shouldBe(regexp19.firstMatch('barrel'), ['bar','']);
+
+  var regexp20 = new RegExp(r"(?:(?!foo)...|^.{0,2})bar(.*)");
+  shouldBe(regexp20.firstMatch('barrel'), ['barrel','rel']);
+  shouldBe(regexp20.firstMatch('2barrel'), ['2barrel','rel']);
+
+  var regexp21 = new RegExp(r"([a-g](b|B)|xyz)");
+  shouldBe(regexp21.firstMatch('abc'), ['ab','ab','b']);
+
+  var regexp22 = new RegExp(r"(?:^|;)\s*abc=([^;]*)");
+  shouldBeNull(regexp22.firstMatch('abcdlskfgjdslkfg'));
+
+  var regexp23 = new RegExp("\"[^<\"]*\"|'[^<']*'");
+  shouldBe(regexp23.firstMatch('<html xmlns=\"http://www.w3.org/1999/xhtml\"'),
+        ['\"http://www.w3.org/1999/xhtml\"']);
+
+  var regexp24 = new RegExp(r"^(?:(?=abc)\w{3}:|\d\d)$");
+  shouldBeNull(regexp24.firstMatch('123'));
+
+  var regexp25 = new RegExp(r"^\s*(\*|[\w\-]+)(\b|$)?");
+  shouldBe(regexp25.firstMatch('this is a test'), ['this','this',null]);
+  shouldBeNull(regexp25.firstMatch('!this is a test'));
+
+  var regexp26 = new RegExp(r"a(b)(a*)|aaa");
+  shouldBe(regexp26.firstMatch('aaa'), ['aaa',null,null]);
+
+  var regexp27 = new RegExp(
+      "^" +
+      "(?:" +
+          "([^:/?#]+):" + /* scheme */
+      ")?" +
+      "(?:" +
+          "(//)" + /* authorityRoot */
+          "(" + /* authority */
+              "(?:" +
+                  "(" + /* userInfo */
+                      "([^:@]*)" + /* user */
+                      ":?" +
+                      "([^:@]*)" + /* password */
+                  ")?" +
+                  "@" +
+              ")?" +
+              "([^:/?#]*)" + /* domain */
+              "(?::(\\d*))?" + /* port */
+          ")" +
+      ")?" +
+      "([^?#]*)" + /*path*/
+      "(?:\\?([^#]*))?" + /* queryString */
+      "(?:#(.*))?" /*fragment */
+  );
+  shouldBe(regexp27.firstMatch('file:///Users/Someone/Desktop/HelloWorld/index.html'), ['file:///Users/Someone/Desktop/HelloWorld/index.html','file','//','',null,null,null,'',null,'/Users/Someone/Desktop/HelloWorld/index.html',null,null]);
+
+  var regexp28 = new RegExp(
+      "^" +
+      "(?:" +
+          "([^:/?#]+):" + /* scheme */
+      ")?" +
+      "(?:" +
+          "(//)" + /* authorityRoot */
+          "(" + /* authority */
+              "(" + /* userInfo */
+                  "([^:@]*)" + /* user */
+                  ":?" +
+                  "([^:@]*)" + /* password */
+              ")?" +
+              "@" +
+          ")" +
+      ")?"
+  );
+  shouldBe(regexp28.firstMatch('file:///Users/Someone/Desktop/HelloWorld/index.html'), ['file:','file',null,null,null,null,null]);
+
+  var regexp29 = new RegExp(r'^\s*((\[[^\]]+\])|(u?)("[^"]+"))\s*');
+  shouldBeNull(regexp29.firstMatch('Committer:'));
+
+  var regexp30 = new RegExp(r'^\s*((\[[^\]]+\])|m(u?)("[^"]+"))\s*');
+  shouldBeNull(regexp30.firstMatch('Committer:'));
+
+  var regexp31 = new RegExp(r'^\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*');
+  shouldBeNull(regexp31.firstMatch('Committer:'));
+
+  var regexp32 = new RegExp(r'\s*(m(\[[^\]]+\])|m(u?)("[^"]+"))\s*');
+  shouldBeNull(regexp32.firstMatch('Committer:'));
+
+  var regexp33 = new RegExp('^(?:(?:(a)(xyz|[^>"\'\s]*)?)|(/?>)|.[^\w\s>]*)');
+  shouldBe(regexp33.firstMatch('> <head>'), ['>',null,null,'>']);
+
+  var regexp34 = new RegExp(r"(?:^|\b)btn-\S+");
+  shouldBeNull(regexp34.firstMatch('xyz123'));
+  shouldBe(regexp34.firstMatch('btn-abc'),['btn-abc']);
+  shouldBeNull(regexp34.firstMatch('btn- abc'));
+  shouldBeNull(regexp34.firstMatch('XXbtn-abc'));
+  shouldBe(regexp34.firstMatch('XX btn-abc'),['btn-abc']);
+
+  var regexp35 = new RegExp(r"^((a|b)(x|xxx)|)$");
+  shouldBe(regexp35.firstMatch('ax'), ['ax','ax','a','x']);
+  shouldBeNull(regexp35.firstMatch('axx'));
+  shouldBe(regexp35.firstMatch('axxx'), ['axxx','axxx','a','xxx']);
+  shouldBe(regexp35.firstMatch('bx'), ['bx','bx','b','x']);
+  shouldBeNull(regexp35.firstMatch('bxx'));
+  shouldBe(regexp35.firstMatch('bxxx'), ['bxxx','bxxx','b','xxx']);
+
+  var regexp36 = new RegExp(r"^((\/|\.|\-)(\d\d|\d\d\d\d)|)$");
+  shouldBe(regexp36.firstMatch('/2011'), ['/2011','/2011','/','2011']);
+  shouldBe(regexp36.firstMatch('/11'), ['/11','/11','/','11']);
+  shouldBeNull(regexp36.firstMatch('/123'));
+
+  var regexp37 = new RegExp(r"^([1][0-2]|[0]\d|\d)(\/|\.|\-)([0-2]\d|[3][0-1]|\d)((\/|\.|\-)(\d\d|\d\d\d\d)|)$");
+  shouldBe(regexp37.firstMatch('7/4/1776'), ['7/4/1776','7','/','4','/1776','/','1776']);
+  shouldBe(regexp37.firstMatch('07-04-1776'), ['07-04-1776','07','-','04','-1776','-','1776']);
+
+  var regexp38 = new RegExp(r"^(z|(x|xx)|b|)$");
+  shouldBe(regexp38.firstMatch('xx'), ['xx','xx','xx']);
+  shouldBe(regexp38.firstMatch('b'), ['b','b',null]);
+  shouldBe(regexp38.firstMatch('z'), ['z','z',null]);
+  shouldBe(regexp38.firstMatch(''), ['','',null]);
+
+  var regexp39 = new RegExp(r"(8|((?=P)))?");
+  shouldBe(regexp39.firstMatch(''), ['',null,null]);
+  shouldBe(regexp39.firstMatch('8'), ['8','8',null]);
+  shouldBe(regexp39.firstMatch('zP'), ['',null,null]);
+
+  var regexp40 = new RegExp(r"((8)|((?=P){4}))?()");
+  shouldBe(regexp40.firstMatch(''), ['',null,null,null,'']);
+  shouldBe(regexp40.firstMatch('8'), ['8','8','8',null,'']);
+  shouldBe(regexp40.firstMatch('zPz'), ['',null,null,null,'']);
+  shouldBe(regexp40.firstMatch('zPPz'), ['',null,null,null,'']);
+  shouldBe(regexp40.firstMatch('zPPPz'), ['',null,null,null,'']);
+  shouldBe(regexp40.firstMatch('zPPPPz'), ['',null,null,null,'']);
+
+  var regexp41 = new RegExp(r"(([\w\-]+:\/\/?|www[.])[^\s()<>]+(?:([\w\d]+)|([^\[:punct:\]\s()<>\W]|\/)))");
+  shouldBe(regexp41.firstMatch('Here is a link: http://www.acme.com/our_products/index.html. That is all we want!'),
+      ['http://www.acme.com/our_products/index.html','http://www.acme.com/our_products/index.html','http://','l',null]);
+
+  var regexp42 = new RegExp(r"((?:(4)?))?");
+  shouldBe(regexp42.firstMatch(''), ['',null,null]);
+  shouldBe(regexp42.firstMatch('4'), ['4','4','4']);
+  shouldBe(regexp42.firstMatch('4321'), ['4','4','4']);
+
+  shouldBeTrue(new RegExp(r"(?!(?=r{0}){2,})|((z)?)?", caseSensitive: false).hasMatch(''));
+
+  var regexp43 = new RegExp(r"(?!(?:\1+s))");
+  shouldBe(regexp43.firstMatch('SSS'), ['']);
+
+  var regexp44 = new RegExp(r"(?!(?:\3+(s+?)))");
+  shouldBe(regexp44.firstMatch('SSS'), ['',null]);
+
+  var regexp45 = new RegExp(r"((?!(?:|)v{2,}|))");
+  shouldBeNull(regexp45.firstMatch('vt'));
+
+  var regexp46 = new RegExp(r"(w)(?:5{3}|())|pk");
+  shouldBeNull(regexp46.firstMatch('5'));
+  shouldBe(regexp46.firstMatch('pk'), ['pk',null,null]);
+  shouldBe(regexp46.firstMatch('Xw555'), ['w555','w',null]);
+  shouldBe(regexp46.firstMatch('Xw55pk5'), ['w','w','']);
+
+  var regexp47 = new RegExp(r"(.*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$");
+  shouldBe(regexp47.firstMatch('/www.acme.com/this/is/a/path/file.txt'),
+        ['/www.acme.com/this/is/a/path/file.txt','/www.acme.com/this/is/a/path/file.txt',null]);
+
+  var regexp48 = new RegExp(r"^(?:(\w+):\/*([\w\.\-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)(?:\?(.*?)?|)(?:#(.*)|)$)");
+  shouldBe(regexp48.firstMatch('http://www.acme.com/this/is/a/path/file.txt'),
+      ['http://www.acme.com/this/is/a/path/file.txt','http','www.acme.com',null,'this/is/a/path/file.txt',null,null]);
+
+  var regexp49 = new RegExp(r"(?:([^:]*?)(?:(?:\?(.*?)?)?)(?:(?:#)?)$)|(?:^(?:(\w+):\/*([\w\.\-\d]+)(?::(\d+)|)(?=(?:\/|$))|)(?:$|\/?(.*?)(?:\?(.*?)?|)(?:#(.*)|)$))");
+  shouldBe(regexp49.firstMatch('http://www.acme.com/this/is/a/path/file.txt'),
+      ['http://www.acme.com/this/is/a/path/file.txt',null,null,'http','www.acme.com',null,'this/is/a/path/file.txt',null,null]);
+
+  var regexp50 = new RegExp(r"((a)b{28,}c|d)x");
+  shouldBeNull(regexp50.firstMatch('((a)b{28,}c|d)x'));
+  shouldBe(regexp50.firstMatch('abbbbbbbbbbbbbbbbbbbbbbbbbbbbcx'), ['abbbbbbbbbbbbbbbbbbbbbbbbbbbbcx', 'abbbbbbbbbbbbbbbbbbbbbbbbbbbbc', 'a']);
+  shouldBe(regexp50.firstMatch('dx'), ['dx', 'd', null]);
+
+  var s = "((.\s{-}).{28,}\P{Yi}?{,30}\|.)\x9e{-,}\P{Any}";
+  var regexp51 = new RegExp(s);
+  shouldBeNull(regexp51.firstMatch('abc'));
+  shouldBe(regexp51.firstMatch(s), [')\x9e{-,}P{Any}',')',null]);
+
+  var regexp52 = new RegExp(r"(Rob)|(Bob)|(Robert)|(Bobby)");
+  shouldBe(regexp52.firstMatch('Hi Bob'), ['Bob',null,'Bob',null,null]);
+
+  // Test cases discovered by fuzzing that crashed the compiler.
+  var regexp53 = new RegExp(r"(?=(?:(?:(gB)|(?!cs|<))((?=(?!v6){0,})))|(?=#)+?)", multiLine: true);
+  shouldBe(regexp53.firstMatch('#'), ['',null,'']);
+  var regexp54 = new RegExp(r"((?:(?:()|(?!))((?=(?!))))|())", multiLine: true);
+  shouldBe(regexp54.firstMatch('#'), ['','',null,null,'']);
+  var regexp55 = new RegExp(r"(?:(?:(?:a?|(?:))((?:)))|a?)", multiLine: true);
+  shouldBe(regexp55.firstMatch('#'), ['','']);
+
+  // Test evaluation order of empty subpattern alternatives.
+  var regexp56 = new RegExp(r"(|a)");
+  shouldBe(regexp56.firstMatch('a'), ['','']);
+  var regexp57 = new RegExp(r"(a|)");
+  shouldBe(regexp57.firstMatch('a'), ['a','a']);
+
+  // Tests that non-greedy repeat quantified parentheses will backtrack through multiple frames of subpattern matches.
+  var regexp58 = new RegExp(r"a|b(?:[^b])*?c");
+  shouldBe(regexp58.firstMatch('badbc'), ['a']);
+  var regexp59 = new RegExp(r"(X(?:.(?!X))*?Y)|(Y(?:.(?!Y))*?Z)");
+  Expect.listEquals(regexp59.allMatches('Y aaa X Match1 Y aaa Y Match2 Z')
+                   .map((m) => m.group(0))
+                   .toList(),
+      ['X Match1 Y','Y Match2 Z']);
+}
diff --git a/tests/corelib/regexp/pcre-test-4_test.dart b/tests/corelib/regexp/pcre-test-4_test.dart
new file mode 100644
index 0000000..fa4c37a
--- /dev/null
+++ b/tests/corelib/regexp/pcre-test-4_test.dart
@@ -0,0 +1,1027 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "A chunk of our port of PCRE's test suite, adapted to be more applicable to JavaScript."
+  );
+
+  var regex0 = new RegExp(r"a.b");
+  var input0 = "acb";
+  var results = ["acb"];
+  shouldBe(regex0.firstMatch(input0), results);
+  var input1 = "a\x7fb";
+  results = ["a\u007fb"];
+  shouldBe(regex0.firstMatch(input1), results);
+  var input2 = "a\u0100b";
+  results = ["a\u0100b"];
+  shouldBe(regex0.firstMatch(input2), results);
+  // Failers
+  var input3 = "a\nb";
+  results = null;
+  shouldBe(regex0.firstMatch(input3), results);
+
+  var regex1 = new RegExp(r"a(.{3})b");
+  input0 = "a\u4000xyb";
+  results = ["a\u4000xyb", "\u4000xy"];
+  shouldBe(regex1.firstMatch(input0), results);
+  input1 = "a\u4000\x7fyb";
+  results = ["a\u4000\u007fyb", "\u4000\u007fy"];
+  shouldBe(regex1.firstMatch(input1), results);
+  input2 = "a\u4000\u0100yb";
+  results = ["a\u4000\u0100yb", "\u4000\u0100y"];
+  shouldBe(regex1.firstMatch(input2), results);
+  // Failers
+  input3 = "a\u4000b";
+  results = null;
+  shouldBe(regex1.firstMatch(input3), results);
+  var input4 = "ac\ncb";
+  results = null;
+  shouldBe(regex1.firstMatch(input4), results);
+
+  var regex2 = new RegExp(r"a(.*?)(.)");
+  input0 = "a\xc0\x88b";
+  results = ["a\xc0", "", "\xc0"];
+  shouldBe(regex2.firstMatch(input0), results);
+
+  var regex3 = new RegExp(r"a(.*?)(.)");
+  input0 = "a\u0100b";
+  results = ["a\u0100", "", "\u0100"];
+  shouldBe(regex3.firstMatch(input0), results);
+
+  var regex4 = new RegExp(r"a(.*)(.)");
+  input0 = "a\xc0\x88b";
+  results = ["a\xc0\x88b", "\xc0\x88", "b"];
+  shouldBe(regex4.firstMatch(input0), results);
+
+  var regex5 = new RegExp(r"a(.*)(.)");
+  input0 = "a\u0100b";
+  results = ["a\u0100b", "\u0100", "b"];
+  shouldBe(regex5.firstMatch(input0), results);
+
+  var regex6 = new RegExp(r"a(.)(.)");
+  input0 = "a\xc0\x92bcd";
+  results = ["a\xc0\x92", "\xc0", "\x92"];
+  shouldBe(regex6.firstMatch(input0), results);
+
+  var regex7 = new RegExp(r"a(.)(.)");
+  input0 = "a\u0240bcd";
+  results = ["a\u0240b", "\u0240", "b"];
+  shouldBe(regex7.firstMatch(input0), results);
+
+  var regex8 = new RegExp(r"a(.?)(.)");
+  input0 = "a\xc0\x92bcd";
+  results = ["a\xc0\x92", "\xc0", "\x92"];
+  shouldBe(regex8.firstMatch(input0), results);
+
+  var regex9 = new RegExp(r"a(.?)(.)");
+  input0 = "a\u0240bcd";
+  results = ["a\u0240b", "\u0240", "b"];
+  shouldBe(regex9.firstMatch(input0), results);
+
+  var regex10 = new RegExp(r"a(.??)(.)");
+  input0 = "a\xc0\x92bcd";
+  results = ["a\xc0", "", "\xc0"];
+  shouldBe(regex10.firstMatch(input0), results);
+
+  var regex11 = new RegExp(r"a(.??)(.)");
+  input0 = "a\u0240bcd";
+  results = ["a\u0240", "", "\u0240"];
+  shouldBe(regex11.firstMatch(input0), results);
+
+  var regex12 = new RegExp(r"a(.{3})b");
+  input0 = "a\u1234xyb";
+  results = ["a\u1234xyb", "\u1234xy"];
+  shouldBe(regex12.firstMatch(input0), results);
+  input1 = "a\u1234\u4321yb";
+  results = ["a\u1234\u4321yb", "\u1234\u4321y"];
+  shouldBe(regex12.firstMatch(input1), results);
+  input2 = "a\u1234\u4321\u3412b";
+  results = ["a\u1234\u4321\u3412b", "\u1234\u4321\u3412"];
+  shouldBe(regex12.firstMatch(input2), results);
+  // Failers
+  input3 = "a\u1234b";
+  results = null;
+  shouldBe(regex12.firstMatch(input3), results);
+  input4 = "ac\ncb";
+  results = null;
+  shouldBe(regex12.firstMatch(input4), results);
+
+  var regex13 = new RegExp(r"a(.{3,})b");
+  input0 = "a\u1234xyb";
+  results = ["a\u1234xyb", "\u1234xy"];
+  shouldBe(regex13.firstMatch(input0), results);
+  input1 = "a\u1234\u4321yb";
+  results = ["a\u1234\u4321yb", "\u1234\u4321y"];
+  shouldBe(regex13.firstMatch(input1), results);
+  input2 = "a\u1234\u4321\u3412b";
+  results = ["a\u1234\u4321\u3412b", "\u1234\u4321\u3412"];
+  shouldBe(regex13.firstMatch(input2), results);
+  input3 = "axxxxbcdefghijb";
+  results = ["axxxxbcdefghijb", "xxxxbcdefghij"];
+  shouldBe(regex13.firstMatch(input3), results);
+  input4 = "a\u1234\u4321\u3412\u3421b";
+  results = ["a\u1234\u4321\u3412\u3421b", "\u1234\u4321\u3412\u3421"];
+  shouldBe(regex13.firstMatch(input4), results);
+  // Failers
+  var input5 = "a\u1234b";
+  results = null;
+  shouldBe(regex13.firstMatch(input5), results);
+
+  var regex14 = new RegExp(r"a(.{3,}?)b");
+  input0 = "a\u1234xyb";
+  results = ["a\u1234xyb", "\u1234xy"];
+  shouldBe(regex14.firstMatch(input0), results);
+  input1 = "a\u1234\u4321yb";
+  results = ["a\u1234\u4321yb", "\u1234\u4321y"];
+  shouldBe(regex14.firstMatch(input1), results);
+  input2 = "a\u1234\u4321\u3412b";
+  results = ["a\u1234\u4321\u3412b", "\u1234\u4321\u3412"];
+  shouldBe(regex14.firstMatch(input2), results);
+  input3 = "axxxxbcdefghijb";
+  results = ["axxxxb", "xxxx"];
+  shouldBe(regex14.firstMatch(input3), results);
+  input4 = "a\u1234\u4321\u3412\u3421b";
+  results = ["a\u1234\u4321\u3412\u3421b", "\u1234\u4321\u3412\u3421"];
+  shouldBe(regex14.firstMatch(input4), results);
+  // Failers
+  input5 = "a\u1234b";
+  results = null;
+  shouldBe(regex14.firstMatch(input5), results);
+
+  var regex15 = new RegExp(r"a(.{3,5})b");
+  input0 = "a\u1234xyb";
+  results = ["a\u1234xyb", "\u1234xy"];
+  shouldBe(regex15.firstMatch(input0), results);
+  input1 = "a\u1234\u4321yb";
+  results = ["a\u1234\u4321yb", "\u1234\u4321y"];
+  shouldBe(regex15.firstMatch(input1), results);
+  input2 = "a\u1234\u4321\u3412b";
+  results = ["a\u1234\u4321\u3412b", "\u1234\u4321\u3412"];
+  shouldBe(regex15.firstMatch(input2), results);
+  input3 = "axxxxbcdefghijb";
+  results = ["axxxxb", "xxxx"];
+  shouldBe(regex15.firstMatch(input3), results);
+  input4 = "a\u1234\u4321\u3412\u3421b";
+  results = ["a\u1234\u4321\u3412\u3421b", "\u1234\u4321\u3412\u3421"];
+  shouldBe(regex15.firstMatch(input4), results);
+  input5 = "axbxxbcdefghijb";
+  results = ["axbxxb", "xbxx"];
+  shouldBe(regex15.firstMatch(input5), results);
+  var input6 = "axxxxxbcdefghijb";
+  results = ["axxxxxb", "xxxxx"];
+  shouldBe(regex15.firstMatch(input6), results);
+  // Failers
+  var input7 = "a\u1234b";
+  results = null;
+  shouldBe(regex15.firstMatch(input7), results);
+  var input8 = "axxxxxxbcdefghijb";
+  results = null;
+  shouldBe(regex15.firstMatch(input8), results);
+
+  var regex16 = new RegExp(r"a(.{3,5}?)b");
+  input0 = "a\u1234xyb";
+  results = ["a\u1234xyb", "\u1234xy"];
+  shouldBe(regex16.firstMatch(input0), results);
+  input1 = "a\u1234\u4321yb";
+  results = ["a\u1234\u4321yb", "\u1234\u4321y"];
+  shouldBe(regex16.firstMatch(input1), results);
+  input2 = "a\u1234\u4321\u3412b";
+  results = ["a\u1234\u4321\u3412b", "\u1234\u4321\u3412"];
+  shouldBe(regex16.firstMatch(input2), results);
+  input3 = "axxxxbcdefghijb";
+  results = ["axxxxb", "xxxx"];
+  shouldBe(regex16.firstMatch(input3), results);
+  input4 = "a\u1234\u4321\u3412\u3421b";
+  results = ["a\u1234\u4321\u3412\u3421b", "\u1234\u4321\u3412\u3421"];
+  shouldBe(regex16.firstMatch(input4), results);
+  input5 = "axbxxbcdefghijb";
+  results = ["axbxxb", "xbxx"];
+  shouldBe(regex16.firstMatch(input5), results);
+  input6 = "axxxxxbcdefghijb";
+  results = ["axxxxxb", "xxxxx"];
+  shouldBe(regex16.firstMatch(input6), results);
+  // Failers
+  input7 = "a\u1234b";
+  results = null;
+  shouldBe(regex16.firstMatch(input7), results);
+  input8 = "axxxxxxbcdefghijb";
+  results = null;
+  shouldBe(regex16.firstMatch(input8), results);
+
+  var regex17 = new RegExp(r"^[a\u00c0]");
+  // Failers
+  input0 = "\u0100";
+  results = null;
+  shouldBe(regex17.firstMatch(input0), results);
+
+  var regex21 = new RegExp(r"(?:\u0100){3}b");
+  input0 = "\u0100\u0100\u0100b";
+  results = ["\u0100\u0100\u0100b"];
+  shouldBe(regex21.firstMatch(input0), results);
+  // Failers
+  input1 = "\u0100\u0100b";
+  results = null;
+  shouldBe(regex21.firstMatch(input1), results);
+
+  var regex22 = new RegExp(r"\u00ab");
+  input0 = "\u00ab";
+  results = ["\u00ab"];
+  shouldBe(regex22.firstMatch(input0), results);
+  input1 = "\xc2\xab";
+  results = ["\u00ab"];
+  shouldBe(regex22.firstMatch(input1), results);
+  // Failers
+  input2 = "\x00{ab}";
+  results = null;
+  shouldBe(regex22.firstMatch(input2), results);
+
+  var regex30 = new RegExp(r"^[^a]{2}");
+  input0 = "\u0100bc";
+  results = ["\u0100b"];
+  shouldBe(regex30.firstMatch(input0), results);
+
+  var regex31 = new RegExp(r"^[^a]{2,}");
+  input0 = "\u0100bcAa";
+  results = ["\u0100bcA"];
+  shouldBe(regex31.firstMatch(input0), results);
+
+  var regex32 = new RegExp(r"^[^a]{2,}?");
+  input0 = "\u0100bca";
+  results = ["\u0100b"];
+  shouldBe(regex32.firstMatch(input0), results);
+
+  var regex33 = new RegExp(r"^[^a]{2}", caseSensitive: false);
+  input0 = "\u0100bc";
+  results = ["\u0100b"];
+  shouldBe(regex33.firstMatch(input0), results);
+
+  var regex34 = new RegExp(r"^[^a]{2,}", caseSensitive: false);
+  input0 = "\u0100bcAa";
+  results = ["\u0100bc"];
+  shouldBe(regex34.firstMatch(input0), results);
+
+  var regex35 = new RegExp(r"^[^a]{2,}?", caseSensitive: false);
+  input0 = "\u0100bca";
+  results = ["\u0100b"];
+  shouldBe(regex35.firstMatch(input0), results);
+
+  var regex36 = new RegExp(r"\u0100{0,0}");
+  input0 = "abcd";
+  results = [""];
+  shouldBe(regex36.firstMatch(input0), results);
+
+  var regex37 = new RegExp(r"\u0100?");
+  input0 = "abcd";
+  results = [""];
+  shouldBe(regex37.firstMatch(input0), results);
+  input1 = "\u0100\u0100";
+  results = ["\u0100"];
+  shouldBe(regex37.firstMatch(input1), results);
+
+  var regex38 = new RegExp(r"\u0100{0,3}");
+  input0 = "\u0100\u0100";
+  results = ["\u0100\u0100"];
+  shouldBe(regex38.firstMatch(input0), results);
+  input1 = "\u0100\u0100\u0100\u0100";
+  results = ["\u0100\u0100\u0100"];
+  shouldBe(regex38.firstMatch(input1), results);
+
+  var regex39 = new RegExp(r"\u0100*");
+  input0 = "abce";
+  results = [""];
+  shouldBe(regex39.firstMatch(input0), results);
+  input1 = "\u0100\u0100\u0100\u0100";
+  results = ["\u0100\u0100\u0100\u0100"];
+  shouldBe(regex39.firstMatch(input1), results);
+
+  var regex40 = new RegExp(r"\u0100{1,1}");
+  input0 = "abcd\u0100\u0100\u0100\u0100";
+  results = ["\u0100"];
+  shouldBe(regex40.firstMatch(input0), results);
+
+  var regex41 = new RegExp(r"\u0100{1,3}");
+  input0 = "abcd\u0100\u0100\u0100\u0100";
+  results = ["\u0100\u0100\u0100"];
+  shouldBe(regex41.firstMatch(input0), results);
+
+  var regex42 = new RegExp(r"\u0100+");
+  input0 = "abcd\u0100\u0100\u0100\u0100";
+  results = ["\u0100\u0100\u0100\u0100"];
+  shouldBe(regex42.firstMatch(input0), results);
+
+  var regex43 = new RegExp(r"\u0100{3}");
+  input0 = "abcd\u0100\u0100\u0100XX";
+  results = ["\u0100\u0100\u0100"];
+  shouldBe(regex43.firstMatch(input0), results);
+
+  var regex44 = new RegExp(r"\u0100{3,5}");
+  input0 = "abcd\u0100\u0100\u0100\u0100\u0100\u0100\u0100XX";
+  results = ["\u0100\u0100\u0100\u0100\u0100"];
+  shouldBe(regex44.firstMatch(input0), results);
+
+  var regex45 = new RegExp(r"\u0100{3,}");
+  input0 = "abcd\u0100\u0100\u0100\u0100\u0100\u0100\u0100XX";
+  results = ["\u0100\u0100\u0100\u0100\u0100\u0100\u0100"];
+  shouldBe(regex45.firstMatch(input0), results);
+
+  var regex47 = new RegExp(r"\D*");
+  input0 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+  results = ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"];
+  shouldBe(regex47.firstMatch(input0), results);
+
+  var regex48 = new RegExp(r"\D*");
+  input0 = "\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100";
+  results = ["\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100\u0100"];
+  shouldBe(regex48.firstMatch(input0), results);
+
+  var regex49 = new RegExp(r"\D");
+  input0 = "1X2";
+  results = ["X"];
+  shouldBe(regex49.firstMatch(input0), results);
+  input1 = "1\u01002";
+  results = ["\u0100"];
+  shouldBe(regex49.firstMatch(input1), results);
+
+  var regex50 = new RegExp(r">\S");
+  input0 = "> >X Y";
+  results = [">X"];
+  shouldBe(regex50.firstMatch(input0), results);
+  input1 = "> >\u0100 Y";
+  results = [">\u0100"];
+  shouldBe(regex50.firstMatch(input1), results);
+
+  var regex51 = new RegExp(r"\d");
+  input0 = "\u01003";
+  results = ["3"];
+  shouldBe(regex51.firstMatch(input0), results);
+
+  var regex52 = new RegExp(r"\s");
+  input0 = "\u0100 X";
+  results = [" "];
+  shouldBe(regex52.firstMatch(input0), results);
+
+  var regex53 = new RegExp(r"\D+");
+  input0 = "12abcd34";
+  results = ["abcd"];
+  shouldBe(regex53.firstMatch(input0), results);
+  // Failers
+  input1 = "1234";
+  results = null;
+  shouldBe(regex53.firstMatch(input1), results);
+
+  var regex54 = new RegExp(r"\D{2,3}");
+  input0 = "12abcd34";
+  results = ["abc"];
+  shouldBe(regex54.firstMatch(input0), results);
+  input1 = "12ab34";
+  results = ["ab"];
+  shouldBe(regex54.firstMatch(input1), results);
+  // Failers
+  input2 = "1234";
+  results = null;
+  shouldBe(regex54.firstMatch(input2), results);
+  input3 = "12a34";
+  results = null;
+  shouldBe(regex54.firstMatch(input3), results);
+
+  var regex55 = new RegExp(r"\D{2,3}?");
+  input0 = "12abcd34";
+  results = ["ab"];
+  shouldBe(regex55.firstMatch(input0), results);
+  input1 = "12ab34";
+  results = ["ab"];
+  shouldBe(regex55.firstMatch(input1), results);
+  // Failers
+  input2 = "1234";
+  results = null;
+  shouldBe(regex55.firstMatch(input2), results);
+  input3 = "12a34";
+  results = null;
+  shouldBe(regex55.firstMatch(input3), results);
+
+  var regex56 = new RegExp(r"\d+");
+  input0 = "12abcd34";
+  results = ["12"];
+  shouldBe(regex56.firstMatch(input0), results);
+
+  var regex57 = new RegExp(r"\d{2,3}");
+  input0 = "12abcd34";
+  results = ["12"];
+  shouldBe(regex57.firstMatch(input0), results);
+  input1 = "1234abcd";
+  results = ["123"];
+  shouldBe(regex57.firstMatch(input1), results);
+  // Failers
+  input2 = "1.4";
+  results = null;
+  shouldBe(regex57.firstMatch(input2), results);
+
+  var regex58 = new RegExp(r"\d{2,3}?");
+  input0 = "12abcd34";
+  results = ["12"];
+  shouldBe(regex58.firstMatch(input0), results);
+  input1 = "1234abcd";
+  results = ["12"];
+  shouldBe(regex58.firstMatch(input1), results);
+  // Failers
+  input2 = "1.4";
+  results = null;
+  shouldBe(regex58.firstMatch(input2), results);
+
+  var regex59 = new RegExp(r"\S+");
+  input0 = "12abcd34";
+  results = ["12abcd34"];
+  shouldBe(regex59.firstMatch(input0), results);
+  // Failers
+  input1 = "    ";
+  results = null;
+  shouldBe(regex59.firstMatch(input1), results);
+
+  var regex60 = new RegExp(r"\S{2,3}");
+  input0 = "12abcd34";
+  results = ["12a"];
+  shouldBe(regex60.firstMatch(input0), results);
+  input1 = "1234abcd";
+  results = ["123"];
+  shouldBe(regex60.firstMatch(input1), results);
+  // Failers
+  input2 = "    ";
+  results = null;
+  shouldBe(regex60.firstMatch(input2), results);
+
+  var regex61 = new RegExp(r"\S{2,3}?");
+  input0 = "12abcd34";
+  results = ["12"];
+  shouldBe(regex61.firstMatch(input0), results);
+  input1 = "1234abcd";
+  results = ["12"];
+  shouldBe(regex61.firstMatch(input1), results);
+  // Failers
+  input2 = "    ";
+  results = null;
+  shouldBe(regex61.firstMatch(input2), results);
+
+  var regex62 = new RegExp(r">\s+<");
+  input0 = "12>      <34";
+  results = [">      <"];
+  shouldBe(regex62.firstMatch(input0), results);
+
+  var regex63 = new RegExp(r">\s{2,3}<");
+  input0 = "ab>  <cd";
+  results = [">  <"];
+  shouldBe(regex63.firstMatch(input0), results);
+  input1 = "ab>   <ce";
+  results = [">   <"];
+  shouldBe(regex63.firstMatch(input1), results);
+  // Failers
+  input2 = "ab>    <cd";
+  results = null;
+  shouldBe(regex63.firstMatch(input2), results);
+
+  var regex64 = new RegExp(r">\s{2,3}?<");
+  input0 = "ab>  <cd";
+  results = [">  <"];
+  shouldBe(regex64.firstMatch(input0), results);
+  input1 = "ab>   <ce";
+  results = [">   <"];
+  shouldBe(regex64.firstMatch(input1), results);
+  // Failers
+  input2 = "ab>    <cd";
+  results = null;
+  shouldBe(regex64.firstMatch(input2), results);
+
+  var regex65 = new RegExp(r"\w+");
+  input0 = "12      34";
+  results = ["12"];
+  shouldBe(regex65.firstMatch(input0), results);
+  // Failers
+  input1 = "+++=*!";
+  results = null;
+  shouldBe(regex65.firstMatch(input1), results);
+
+  var regex66 = new RegExp(r"\w{2,3}");
+  input0 = "ab  cd";
+  results = ["ab"];
+  shouldBe(regex66.firstMatch(input0), results);
+  input1 = "abcd ce";
+  results = ["abc"];
+  shouldBe(regex66.firstMatch(input1), results);
+  // Failers
+  input2 = "a.b.c";
+  results = null;
+  shouldBe(regex66.firstMatch(input2), results);
+
+  var regex67 = new RegExp(r"\w{2,3}?");
+  input0 = "ab  cd";
+  results = ["ab"];
+  shouldBe(regex67.firstMatch(input0), results);
+  input1 = "abcd ce";
+  results = ["ab"];
+  shouldBe(regex67.firstMatch(input1), results);
+  // Failers
+  input2 = "a.b.c";
+  results = null;
+  shouldBe(regex67.firstMatch(input2), results);
+
+  var regex68 = new RegExp(r"\W+");
+  input0 = "12====34";
+  results = ["===="];
+  shouldBe(regex68.firstMatch(input0), results);
+  // Failers
+  input1 = "abcd";
+  results = null;
+  shouldBe(regex68.firstMatch(input1), results);
+
+  var regex69 = new RegExp(r"\W{2,3}");
+  input0 = "ab====cd";
+  results = ["==="];
+  shouldBe(regex69.firstMatch(input0), results);
+  input1 = "ab==cd";
+  results = ["=="];
+  shouldBe(regex69.firstMatch(input1), results);
+  // Failers
+  input2 = "a.b.c";
+  results = null;
+  shouldBe(regex69.firstMatch(input2), results);
+
+  var regex70 = new RegExp(r"\W{2,3}?");
+  input0 = "ab====cd";
+  results = ["=="];
+  shouldBe(regex70.firstMatch(input0), results);
+  input1 = "ab==cd";
+  results = ["=="];
+  shouldBe(regex70.firstMatch(input1), results);
+  // Failers
+  input2 = "a.b.c";
+  results = null;
+  shouldBe(regex70.firstMatch(input2), results);
+
+  var regex71 = new RegExp(r"[\u0100]");
+  input0 = "\u0100";
+  results = ["\u0100"];
+  shouldBe(regex71.firstMatch(input0), results);
+  input1 = "Z\u0100";
+  results = ["\u0100"];
+  shouldBe(regex71.firstMatch(input1), results);
+  input2 = "\u0100Z";
+  results = ["\u0100"];
+  shouldBe(regex71.firstMatch(input2), results);
+
+  var regex72 = new RegExp(r"[Z\u0100]");
+  input0 = "Z\u0100";
+  results = ["Z"];
+  shouldBe(regex72.firstMatch(input0), results);
+  input1 = "\u0100";
+  results = ["\u0100"];
+  shouldBe(regex72.firstMatch(input1), results);
+  input2 = "\u0100Z";
+  results = ["\u0100"];
+  shouldBe(regex72.firstMatch(input2), results);
+
+  var regex73 = new RegExp(r"[\u0100\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex73.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex73.firstMatch(input1), results);
+
+  var regex74 = new RegExp(r"[\u0100-\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex74.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex74.firstMatch(input1), results);
+  input2 = "ab\u0111cd";
+  results = ["\u0111"];
+  shouldBe(regex74.firstMatch(input2), results);
+
+  var regex75 = new RegExp(r"[z-\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex75.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex75.firstMatch(input1), results);
+  input2 = "ab\u0111cd";
+  results = ["\u0111"];
+  shouldBe(regex75.firstMatch(input2), results);
+  input3 = "abzcd";
+  results = ["z"];
+  shouldBe(regex75.firstMatch(input3), results);
+  input4 = "ab|cd";
+  results = ["|"];
+  shouldBe(regex75.firstMatch(input4), results);
+
+  var regex76 = new RegExp(r"[Q\u0100\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex76.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex76.firstMatch(input1), results);
+  input2 = "Q?";
+  results = ["Q"];
+  shouldBe(regex76.firstMatch(input2), results);
+
+  var regex77 = new RegExp(r"[Q\u0100-\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex77.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex77.firstMatch(input1), results);
+  input2 = "ab\u0111cd";
+  results = ["\u0111"];
+  shouldBe(regex77.firstMatch(input2), results);
+  input3 = "Q?";
+  results = ["Q"];
+  shouldBe(regex77.firstMatch(input3), results);
+
+  var regex78 = new RegExp(r"[Qz-\u0200]");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex78.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex78.firstMatch(input1), results);
+  input2 = "ab\u0111cd";
+  results = ["\u0111"];
+  shouldBe(regex78.firstMatch(input2), results);
+  input3 = "abzcd";
+  results = ["z"];
+  shouldBe(regex78.firstMatch(input3), results);
+  input4 = "ab|cd";
+  results = ["|"];
+  shouldBe(regex78.firstMatch(input4), results);
+  input5 = "Q?";
+  results = ["Q"];
+  shouldBe(regex78.firstMatch(input5), results);
+
+  var regex79 = new RegExp(r"[\u0100\u0200]{1,3}");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex79.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex79.firstMatch(input1), results);
+  input2 = "ab\u0200\u0100\u0200\u0100cd";
+  results = ["\u0200\u0100\u0200"];
+  shouldBe(regex79.firstMatch(input2), results);
+
+  var regex80 = new RegExp(r"[\u0100\u0200]{1,3}?");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex80.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex80.firstMatch(input1), results);
+  input2 = "ab\u0200\u0100\u0200\u0100cd";
+  results = ["\u0200"];
+  shouldBe(regex80.firstMatch(input2), results);
+
+  var regex81 = new RegExp(r"[Q\u0100\u0200]{1,3}");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex81.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex81.firstMatch(input1), results);
+  input2 = "ab\u0200\u0100\u0200\u0100cd";
+  results = ["\u0200\u0100\u0200"];
+  shouldBe(regex81.firstMatch(input2), results);
+
+  var regex82 = new RegExp(r"[Q\u0100\u0200]{1,3}?");
+  input0 = "ab\u0100cd";
+  results = ["\u0100"];
+  shouldBe(regex82.firstMatch(input0), results);
+  input1 = "ab\u0200cd";
+  results = ["\u0200"];
+  shouldBe(regex82.firstMatch(input1), results);
+  input2 = "ab\u0200\u0100\u0200\u0100cd";
+  results = ["\u0200"];
+  shouldBe(regex82.firstMatch(input2), results);
+
+  var regex86 = new RegExp(r"[^\u0100\u0200]X");
+  input0 = "AX";
+  results = ["AX"];
+  shouldBe(regex86.firstMatch(input0), results);
+  input1 = "\u0150X";
+  results = ["\u0150X"];
+  shouldBe(regex86.firstMatch(input1), results);
+  input2 = "\u0500X";
+  results = ["\u0500X"];
+  shouldBe(regex86.firstMatch(input2), results);
+  // Failers
+  input3 = "\u0100X";
+  results = null;
+  shouldBe(regex86.firstMatch(input3), results);
+  input4 = "\u0200X";
+  results = null;
+  shouldBe(regex86.firstMatch(input4), results);
+
+  var regex87 = new RegExp(r"[^Q\u0100\u0200]X");
+  input0 = "AX";
+  results = ["AX"];
+  shouldBe(regex87.firstMatch(input0), results);
+  input1 = "\u0150X";
+  results = ["\u0150X"];
+  shouldBe(regex87.firstMatch(input1), results);
+  input2 = "\u0500X";
+  results = ["\u0500X"];
+  shouldBe(regex87.firstMatch(input2), results);
+  // Failers
+  input3 = "\u0100X";
+  results = null;
+  shouldBe(regex87.firstMatch(input3), results);
+  input4 = "\u0200X";
+  results = null;
+  shouldBe(regex87.firstMatch(input4), results);
+  input5 = "QX";
+  results = null;
+  shouldBe(regex87.firstMatch(input5), results);
+
+  var regex88 = new RegExp(r"[^\u0100-\u0200]X");
+  input0 = "AX";
+  results = ["AX"];
+  shouldBe(regex88.firstMatch(input0), results);
+  input1 = "\u0500X";
+  results = ["\u0500X"];
+  shouldBe(regex88.firstMatch(input1), results);
+  // Failers
+  input2 = "\u0100X";
+  results = null;
+  shouldBe(regex88.firstMatch(input2), results);
+  input3 = "\u0150X";
+  results = null;
+  shouldBe(regex88.firstMatch(input3), results);
+  input4 = "\u0200X";
+  results = null;
+  shouldBe(regex88.firstMatch(input4), results);
+
+  var regex91 = new RegExp(r"[z-\u0100]", caseSensitive: false);
+  input0 = "z";
+  results = ["z"];
+  shouldBe(regex91.firstMatch(input0), results);
+  input1 = "Z";
+  results = ["Z"];
+  shouldBe(regex91.firstMatch(input1), results);
+  input2 = "\u0100";
+  results = ["\u0100"];
+  shouldBe(regex91.firstMatch(input2), results);
+  // Failers
+  input3 = "\u0102";
+  results = null;
+  shouldBe(regex91.firstMatch(input3), results);
+  input4 = "y";
+  results = null;
+  shouldBe(regex91.firstMatch(input4), results);
+
+  var regex92 = new RegExp(r"[\xFF]");
+  input0 = ">\xff<";
+  results = ["\xff"];
+  shouldBe(regex92.firstMatch(input0), results);
+
+  var regex93 = new RegExp(r"[\xff]");
+  input0 = ">\u00ff<";
+  results = ["\u00ff"];
+  shouldBe(regex93.firstMatch(input0), results);
+
+  var regex94 = new RegExp(r"[^\xFF]");
+  input0 = "XYZ";
+  results = ["X"];
+  shouldBe(regex94.firstMatch(input0), results);
+
+  var regex95 = new RegExp(r"[^\xff]");
+  input0 = "XYZ";
+  results = ["X"];
+  shouldBe(regex95.firstMatch(input0), results);
+  input1 = "\u0123";
+  results = ["\u0123"];
+  shouldBe(regex95.firstMatch(input1), results);
+
+  var regex96 = new RegExp(r"^[ac]*b");
+  input0 = "xb";
+  results = null;
+  shouldBe(regex96.firstMatch(input0), results);
+
+  var regex97 = new RegExp(r"^[ac\u0100]*b");
+  input0 = "xb";
+  results = null;
+  shouldBe(regex97.firstMatch(input0), results);
+
+  var regex98 = new RegExp(r"^[^x]*b", caseSensitive: false);
+  input0 = "xb";
+  results = null;
+  shouldBe(regex98.firstMatch(input0), results);
+
+  var regex99 = new RegExp(r"^[^x]*b");
+  input0 = "xb";
+  results = null;
+  shouldBe(regex99.firstMatch(input0), results);
+
+  var regex100 = new RegExp(r"^\d*b");
+  input0 = "xb";
+  results = null;
+  shouldBe(regex100.firstMatch(input0), results);
+
+  var regex102 = new RegExp(r"^\u0085$", caseSensitive: false);
+  input0 = "\u0085";
+  results = ["\u0085"];
+  shouldBe(regex102.firstMatch(input0), results);
+
+  var regex103 = new RegExp(r"^\xe1\x88\xb4");
+  input0 = "\xe1\x88\xb4";
+  results = ["\xe1\x88\xb4"];
+  shouldBe(regex103.firstMatch(input0), results);
+
+  var regex104 = new RegExp(r"^\xe1\x88\xb4");
+  input0 = "\xe1\x88\xb4";
+  results = ["\xe1\x88\xb4"];
+  shouldBe(regex104.firstMatch(input0), results);
+
+  var regex105 = new RegExp(r"(.{1,5})");
+  input0 = "abcdefg";
+  results = ["abcde", "abcde"];
+  shouldBe(regex105.firstMatch(input0), results);
+  input1 = "ab";
+  results = ["ab", "ab"];
+  shouldBe(regex105.firstMatch(input1), results);
+
+  var regex106 = new RegExp(r"a*\u0100*\w");
+  input0 = "a";
+  results = ["a"];
+  shouldBe(regex106.firstMatch(input0), results);
+
+  var regex107 = new RegExp(r"[\S\s]*");
+  input0 = "abc\n\r\u0442\u0435\u0441\u0442xyz";
+  results = ["abc\u000a\u000d\u0442\u0435\u0441\u0442xyz"];
+  shouldBe(regex107.firstMatch(input0), results);
+
+  var regexGlobal0 = new RegExp(r"[^a]+");
+  input0 = "bcd";
+  results = ["bcd"];
+  shouldBe(firstMatch(input0, regexGlobal0), results);
+  input1 = "\u0100aY\u0256Z";
+  results = ["\u0100", "Y\u0256Z"];
+  Expect.listEquals(regexGlobal0.allMatches(input1)
+                      .map((m) => m.group(0)).toList(),
+                    results);
+
+  var regexGlobal1 = new RegExp(r"\S\S");
+  input0 = "A\u00a3BC";
+  results = ["A\u00a3", "BC"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal1), results);
+
+  var regexGlobal2 = new RegExp(r"\S{2}");
+  input0 = "A\u00a3BC";
+  results = ["A\u00a3", "BC"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal2), results);
+
+  var regexGlobal3 = new RegExp(r"\W\W");
+  input0 = "+\u00a3==";
+  results = ["+\u00a3", "=="];
+  Expect.listEquals(allStringMatches(input0, regexGlobal3), results);
+
+  var regexGlobal4 = new RegExp(r"\W{2}");
+  input0 = "+\u00a3==";
+  results = ["+\u00a3", "=="];
+  Expect.listEquals(allStringMatches(input0, regexGlobal4), results);
+
+  var regexGlobal5 = new RegExp(r"\S");
+  input0 = "\u0442\u0435\u0441\u0442";
+  results = ["\u0442", "\u0435", "\u0441", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal5), results);
+
+  var regexGlobal6 = new RegExp(r"[\S]");
+  input0 = "\u0442\u0435\u0441\u0442";
+  results = ["\u0442", "\u0435", "\u0441", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal6), results);
+
+  var regexGlobal7 = new RegExp(r"\D");
+  input0 = "\u0442\u0435\u0441\u0442";
+  results = ["\u0442", "\u0435", "\u0441", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal7), results);
+
+  var regexGlobal8 = new RegExp(r"[\D]");
+  input0 = "\u0442\u0435\u0441\u0442";
+  results = ["\u0442", "\u0435", "\u0441", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal8), results);
+
+  var regexGlobal9 = new RegExp(r"\W");
+  input0 = "\u2442\u2435\u2441\u2442";
+  results = ["\u2442", "\u2435", "\u2441", "\u2442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal9), results);
+
+  var regexGlobal10 = new RegExp(r"[\W]");
+  input0 = "\u2442\u2435\u2441\u2442";
+  results = ["\u2442", "\u2435", "\u2441", "\u2442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal10), results);
+
+  var regexGlobal11 = new RegExp(r"[\u041f\S]");
+  input0 = "\u0442\u0435\u0441\u0442";
+  results = ["\u0442", "\u0435", "\u0441", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal11), results);
+
+  var regexGlobal12 = new RegExp(r".[^\S].");
+  input0 = "abc def\u0442\u0443xyz\npqr";
+  results = ["c d", "z\u000ap"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal12), results);
+
+  var regexGlobal13 = new RegExp(r".[^\S\n].");
+  input0 = "abc def\u0442\u0443xyz\npqr";
+  results = ["c d"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal13), results);
+
+  var regexGlobal14 = new RegExp(r"[\W]");
+  input0 = "+\u2442";
+  results = ["+", "\u2442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal14), results);
+
+  var regexGlobal15 = new RegExp(r"[^a-zA-Z]");
+  input0 = "+\u2442";
+  results = ["+", "\u2442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal15), results);
+
+  var regexGlobal16 = new RegExp(r"[^a-zA-Z]");
+  input0 = "A\u0442";
+  results = ["\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal16), results);
+
+  var regexGlobal17 = new RegExp(r"[\S]");
+  input0 = "A\u0442";
+  results = ["A", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal17), results);
+
+  var regexGlobal19 = new RegExp(r"[\D]");
+  input0 = "A\u0442";
+  results = ["A", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal19), results);
+
+  var regexGlobal21 = new RegExp(r"[^a-z]");
+  input0 = "A\u0422";
+  results = ["A", "\u0422"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal21), results);
+
+  var regexGlobal24 = new RegExp(r"[\S]");
+  input0 = "A\u0442";
+  results = ["A", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal24), results);
+
+  var regexGlobal25 = new RegExp(r"[^A-Z]");
+  input0 = "a\u0442";
+  results = ["a", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal25), results);
+
+  var regexGlobal26 = new RegExp(r"[\W]");
+  input0 = "+\u2442";
+  results = ["+", "\u2442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal26), results);
+
+  var regexGlobal27 = new RegExp(r"[\D]");
+  input0 = "M\u0442";
+  results = ["M", "\u0442"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal27), results);
+
+  var regexGlobal28 = new RegExp(r"[^a]+", caseSensitive: false);
+  input0 = "bcd";
+  results = ["bcd"];
+  Expect.listEquals(allStringMatches(input0, regexGlobal28), results);
+  input1 = "\u0100aY\u0256Z";
+  results = ["\u0100", "Y\u0256Z"];
+  Expect.listEquals(allStringMatches(input1, regexGlobal28), results);
+
+  var regexGlobal29 = new RegExp(r"(a|)");
+  input0 = "catac";
+  results = ["", "a", "", "a", "", ""];
+  Expect.listEquals(allStringMatches(input0, regexGlobal29), results);
+  input1 = "a\u0256a";
+  results = ["a", "", "a", ""];
+  Expect.listEquals(allStringMatches(input1, regexGlobal29), results);
+}
diff --git a/tests/corelib/regexp/pcre_test.dart b/tests/corelib/regexp/pcre_test.dart
new file mode 100644
index 0000000..a8b6206
--- /dev/null
+++ b/tests/corelib/regexp/pcre_test.dart
@@ -0,0 +1,6599 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Autogenerated from the PCRE test suite Mon Feb  2 15:14:04 CET 2009
+
+// Note that some regexps in the PCRE test suite use features not present
+// in JavaScript.  These don't work in JS, but they fail to work in a
+// predictable way, and the expected results reflect this.
+
+// PCRE comes with the following license
+
+// PCRE LICENCE
+// ------------
+//
+// PCRE is a library of functions to support regular expressions whose syntax
+// and semantics are as close as possible to those of the Perl 5 language.
+//
+// Release 7 of PCRE is distributed under the terms of the "BSD" licence, as
+// specified below. The documentation for PCRE, supplied in the "doc"
+// directory, is distributed under the same terms as the software itself.
+//
+// The basic library functions are written in C and are freestanding. Also
+// included in the distribution is a set of C++ wrapper functions.
+//
+//
+// THE BASIC LIBRARY FUNCTIONS
+// ---------------------------
+//
+// Written by:       Philip Hazel
+// Email local part: ph10
+// Email domain:     cam.ac.uk
+//
+// University of Cambridge Computing Service,
+// Cambridge, England.
+//
+// Copyright (c) 1997-2007 University of Cambridge
+// All rights reserved.
+//
+//
+// THE C++ WRAPPER FUNCTIONS
+// -------------------------
+//
+// Contributed by:   Google Inc.
+//
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+//
+// THE "BSD" LICENCE
+// -----------------
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//
+//     * Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+//     * Neither the name of the University of Cambridge nor the name of Google
+//       Inc. nor the names of their contributors may be used to endorse or
+//       promote products derived from this software without specific prior
+//       written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// End
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  var res = <RegExp>[];
+  res.add(new RegExp(r"(a)b|", caseSensitive: false));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"^abc", caseSensitive: false));
+  res.add(new RegExp(r"a+bc", caseSensitive: false));
+  res.add(new RegExp(r"a*bc", caseSensitive: false));
+  res.add(new RegExp(r"a{3}bc", caseSensitive: false));
+  res.add(new RegExp(r"(abc|a+z)", caseSensitive: false));
+  res.add(new RegExp(r"^abc$", caseSensitive: false));
+  res.add(new RegExp(r"ab\idef"));
+  res.add(new RegExp(r".*b", caseSensitive: false));
+  res.add(new RegExp(r".*?b", caseSensitive: false));
+  res.add(new RegExp(r"cat|dog|elephant", caseSensitive: false));
+  res.add(new RegExp(r"cat|dog|elephant", caseSensitive: false));
+  res.add(new RegExp(r"cat|dog|elephant", caseSensitive: false));
+  res.add(new RegExp(r"a|[bcd]", caseSensitive: false));
+  res.add(new RegExp(r"(a|[^\dZ])", caseSensitive: false));
+  res.add(new RegExp(r"(a|b)*[\s]", caseSensitive: false));
+  res.add(new RegExp(r"(ab\2)"));
+  res.add(new RegExp(r"(a)(b)(c)\2", caseSensitive: false));
+  res.add(new RegExp(r"(a)bc|(a)(b)\2", caseSensitive: false));
+  res.add(new RegExp(r"abc$", caseSensitive: false));
+  res.add(new RegExp(r"(a)(b)(c)(d)(e)\6"));
+  res.add(new RegExp(r"the quick brown fox", caseSensitive: false));
+  res.add(new RegExp(r"^abc|def", caseSensitive: false));
+  res.add(new RegExp(r".*((abc)$|(def))", caseSensitive: false));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"^abc|def", caseSensitive: false));
+  res.add(new RegExp(r".*((abc)$|(def))", caseSensitive: false));
+  res.add(new RegExp(r"the quick brown fox", caseSensitive: false));
+  res.add(new RegExp(r"the quick brown fox", caseSensitive: false));
+  res.add(new RegExp(r"abc.def", caseSensitive: false));
+  res.add(new RegExp(r"abc$", caseSensitive: false));
+  res.add(new RegExp(r"(abc)\2", caseSensitive: false));
+  res.add(new RegExp(r"(abc\1)", caseSensitive: false));
+  res.add(new RegExp(r"a[]b"));
+  res.add(new RegExp(r"[^aeiou ]{3,}", caseSensitive: false));
+  res.add(new RegExp(r"<.*>", caseSensitive: false));
+  res.add(new RegExp(r"<.*?>", caseSensitive: false));
+  res.add(new RegExp(r"[abcd]", caseSensitive: false));
+  res.add(new RegExp(r"(^a|^b)", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"a$", caseSensitive: false));
+  res.add(new RegExp(r"a$", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"\Aabc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"(?!alphabet)[ab]", caseSensitive: false));
+  res.add(new RegExp(r"The next three are in testinput2 because they have variable length branches"));
+  res.add(new RegExp(r"This one is here because Perl 5.005_02 doesn't fail it", caseSensitive: false));
+  res.add(new RegExp(r"This one is here because I think Perl 5.005_02 gets the setting of $1 wrong", caseSensitive: false));
+  res.add(new RegExp(r"^(a\1?){4}$", caseSensitive: false));
+  res.add(new RegExp(r"These are syntax tests from Perl 5.005", caseSensitive: false));
+  res.add(new RegExp(r"a[]b"));
+  res.add(new RegExp(r"\1"));
+  res.add(new RegExp(r"\2"));
+  res.add(new RegExp(r"(a)|\2"));
+  res.add(new RegExp(r"a[]b", caseSensitive: false));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"(a)bc(d)", caseSensitive: false));
+  res.add(new RegExp(r"(.{20})", caseSensitive: false));
+  res.add(new RegExp(r"(.{15})", caseSensitive: false));
+  res.add(new RegExp(r"(.{16})", caseSensitive: false));
+  res.add(new RegExp(r"^(a|(bc))de(f)", caseSensitive: false));
+  res.add(new RegExp(r"^abc\00def", caseSensitive: false));
+  res.add(new RegExp(r"word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)?)?)?)?)?)?)?)?)?otherword", caseSensitive: false));
+  res.add(new RegExp(r".*X", caseSensitive: false));
+  res.add(new RegExp(r".*X", caseSensitive: false));
+  res.add(new RegExp(r"(.*X|^B)", caseSensitive: false));
+  res.add(new RegExp(r"(.*X|^B)", caseSensitive: false));
+  res.add(new RegExp(r"\Biss\B", caseSensitive: false));
+  res.add(new RegExp(r"\Biss\B", caseSensitive: false));
+  res.add(new RegExp(r"iss", caseSensitive: false));
+  res.add(new RegExp(r"\Biss\B", caseSensitive: false));
+  res.add(new RegExp(r"\Biss\B", caseSensitive: false));
+  res.add(new RegExp(r"^iss", caseSensitive: false));
+  res.add(new RegExp(r".*iss", caseSensitive: false));
+  res.add(new RegExp(r".i.", caseSensitive: false));
+  res.add(new RegExp(r"^.is", caseSensitive: false));
+  res.add(new RegExp(r"^ab\n", caseSensitive: false));
+  res.add(new RegExp(r"^ab\n", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"abc|bac", caseSensitive: false));
+  res.add(new RegExp(r"(abc|bac)", caseSensitive: false));
+  res.add(new RegExp(r"(abc|(c|dc))", caseSensitive: false));
+  res.add(new RegExp(r"(abc|(d|de)c)", caseSensitive: false));
+  res.add(new RegExp(r"a*", caseSensitive: false));
+  res.add(new RegExp(r"a+", caseSensitive: false));
+  res.add(new RegExp(r"(baa|a+)", caseSensitive: false));
+  res.add(new RegExp(r"a{0,3}", caseSensitive: false));
+  res.add(new RegExp(r"baa{3,}", caseSensitive: false));
+  res.add(new RegExp(r'"([^\\"]+|\.)*"', caseSensitive: false));
+  res.add(new RegExp(r"(abc|ab[cd])", caseSensitive: false));
+  res.add(new RegExp(r"(a|.)", caseSensitive: false));
+  res.add(new RegExp(r"a|ba|\w", caseSensitive: false));
+  res.add(new RegExp(r"abc(?=pqr)", caseSensitive: false));
+  res.add(new RegExp(r"abc(?!pqr)", caseSensitive: false));
+  res.add(new RegExp(r"ab.", caseSensitive: false));
+  res.add(new RegExp(r"ab[xyz]", caseSensitive: false));
+  res.add(new RegExp(r"abc*", caseSensitive: false));
+  res.add(new RegExp(r"ab.c*", caseSensitive: false));
+  res.add(new RegExp(r"a.c*", caseSensitive: false));
+  res.add(new RegExp(r".c*", caseSensitive: false));
+  res.add(new RegExp(r"ac*", caseSensitive: false));
+  res.add(new RegExp(r"(a.c*|b.c*)", caseSensitive: false));
+  res.add(new RegExp(r"a.c*|aba", caseSensitive: false));
+  res.add(new RegExp(r".+a", caseSensitive: false));
+  res.add(new RegExp(r"(?=abcda)a.*", caseSensitive: false));
+  res.add(new RegExp(r"(?=a)a.*", caseSensitive: false));
+  res.add(new RegExp(r"a(b)*", caseSensitive: false));
+  res.add(new RegExp(r"a\d*", caseSensitive: false));
+  res.add(new RegExp(r"ab\d*", caseSensitive: false));
+  res.add(new RegExp(r"a(\d)*", caseSensitive: false));
+  res.add(new RegExp(r"abcde{0,0}", caseSensitive: false));
+  res.add(new RegExp(r"ab\d+", caseSensitive: false));
+  res.add(new RegExp(r"ab\d{0}e", caseSensitive: false));
+  res.add(new RegExp(r"a?b?", caseSensitive: false));
+  res.add(new RegExp(r"|-", caseSensitive: false));
+  res.add(new RegExp(r"a*(b+)(z)(z)", caseSensitive: false));
+  res.add(new RegExp(r"^.?abcd", caseSensitive: false));
+  res.add(new RegExp(r"^[[:alnum:]]"));
+  res.add(new RegExp(r"^[[:^alnum:]]"));
+  res.add(new RegExp(r"^[[:alpha:]]"));
+  res.add(new RegExp(r"^[[:^alpha:]]"));
+  res.add(new RegExp(r"[_[:alpha:]]", caseSensitive: false));
+  res.add(new RegExp(r"^[[:ascii:]]"));
+  res.add(new RegExp(r"^[[:^ascii:]]"));
+  res.add(new RegExp(r"^[[:blank:]]"));
+  res.add(new RegExp(r"^[[:^blank:]]"));
+  res.add(new RegExp(r"[\n\x0b\x0c\x0d[:blank:]]", caseSensitive: false));
+  res.add(new RegExp(r"^[[:cntrl:]]"));
+  res.add(new RegExp(r"^[[:digit:]]"));
+  res.add(new RegExp(r"^[[:graph:]]"));
+  res.add(new RegExp(r"^[[:lower:]]"));
+  res.add(new RegExp(r"^[[:print:]]"));
+  res.add(new RegExp(r"^[[:punct:]]"));
+  res.add(new RegExp(r"^[[:space:]]"));
+  res.add(new RegExp(r"^[[:upper:]]"));
+  res.add(new RegExp(r"^[[:xdigit:]]"));
+  res.add(new RegExp(r"^[[:word:]]"));
+  res.add(new RegExp(r"^[[:^cntrl:]]"));
+  res.add(new RegExp(r"^[12[:^digit:]]"));
+  res.add(new RegExp(r"^[[:^blank:]]"));
+  res.add(new RegExp(r"[01[:alpha:]%]"));
+  res.add(new RegExp(r"[[.ch.]]", caseSensitive: false));
+  res.add(new RegExp(r"[[=ch=]]", caseSensitive: false));
+  res.add(new RegExp(r"[[:rhubarb:]]", caseSensitive: false));
+  res.add(new RegExp(r"[[:upper:]]", caseSensitive: false));
+  res.add(new RegExp(r"[[:lower:]]", caseSensitive: false));
+  res.add(new RegExp(r"This one's here because of the large output vector needed", caseSensitive: false));
+  res.add(new RegExp(r"(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)", caseSensitive: false));
+  res.add(new RegExp(r"This one's here because Perl does this differently and PCRE can't at present", caseSensitive: false));
+  res.add(new RegExp(r"(main(O)?)+", caseSensitive: false));
+  res.add(new RegExp(r"These are all cases where Perl does it differently (nested captures)", caseSensitive: false));
+  res.add(new RegExp(r"^(a(b)?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa(bb)?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa|aa(bb))+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa(bb)??)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(bb)?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa(b(b))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(b(b))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(b(?:b))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(bb(?:b))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(b(?:bb))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(?:b(b))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(?:aa(?:b(bb))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa(b(bb))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"^(aa(bb(bb))?)+$", caseSensitive: false));
+  res.add(new RegExp(r"a", caseSensitive: false));
+  res.add(new RegExp(r"[\s]"));
+  res.add(new RegExp(r"[\S]"));
+  res.add(new RegExp(r"123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"));
+  res.add(new RegExp(r"\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"));
+  res.add(new RegExp(r"\Q\E"));
+  res.add(new RegExp(r"\Q\Ex"));
+  res.add(new RegExp(r" \Q\E"));
+  res.add(new RegExp(r"a\Q\E"));
+  res.add(new RegExp(r"a\Q\Eb"));
+  res.add(new RegExp(r"\Q\Eabc"));
+  res.add(new RegExp(r"[.x.]", caseSensitive: false));
+  res.add(new RegExp(r"[=x=]", caseSensitive: false));
+  res.add(new RegExp(r"[:x:]", caseSensitive: false));
+  res.add(new RegExp(r"\l", caseSensitive: false));
+  res.add(new RegExp(r"\L", caseSensitive: false));
+  res.add(new RegExp(r"\N{name}", caseSensitive: false));
+  res.add(new RegExp(r"\u", caseSensitive: false));
+  res.add(new RegExp(r"\U", caseSensitive: false));
+  res.add(new RegExp(r"[[:space:]", caseSensitive: false));
+  res.add(new RegExp(r"[\s]", caseSensitive: false));
+  res.add(new RegExp(r"[[:space:]]", caseSensitive: false));
+  res.add(new RegExp(r"[[:space:]abcde]", caseSensitive: false));
+  res.add(new RegExp(r"(.*)\d+\1", caseSensitive: false));
+  res.add(new RegExp(r"(.*)\d+", caseSensitive: false));
+  res.add(new RegExp(r"(.*)\d+\1", caseSensitive: false));
+  res.add(new RegExp(r"(.*)\d+", caseSensitive: false));
+  res.add(new RegExp(r"(.*(xyz))\d+\2", caseSensitive: false));
+  res.add(new RegExp(r"((.*))\d+\1", caseSensitive: false));
+  res.add(new RegExp(r"a[b]", caseSensitive: false));
+  res.add(new RegExp(r"(?=a).*", caseSensitive: false));
+  res.add(new RegExp(r"(?=abc).xyz", caseSensitive: false));
+  res.add(new RegExp(r"(?=a)(?=b)", caseSensitive: false));
+  res.add(new RegExp(r"(?=.)a", caseSensitive: false));
+  res.add(new RegExp(r"((?=abcda)a)", caseSensitive: false));
+  res.add(new RegExp(r"((?=abcda)ab)", caseSensitive: false));
+  res.add(new RegExp(r"()a", caseSensitive: false));
+  res.add(new RegExp(r"(a)+", caseSensitive: false));
+  res.add(new RegExp(r"(a){2,3}", caseSensitive: false));
+  res.add(new RegExp(r"(a)*", caseSensitive: false));
+  res.add(new RegExp(r"[a]", caseSensitive: false));
+  res.add(new RegExp(r"[ab]", caseSensitive: false));
+  res.add(new RegExp(r"[ab]", caseSensitive: false));
+  res.add(new RegExp(r"[^a]", caseSensitive: false));
+  res.add(new RegExp(r"\d456", caseSensitive: false));
+  res.add(new RegExp(r"\d456", caseSensitive: false));
+  res.add(new RegExp(r"a^b", caseSensitive: false));
+  res.add(new RegExp(r"^a", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"c|abc", caseSensitive: false));
+  res.add(new RegExp(r"(.*)a", caseSensitive: false));
+  res.add(new RegExp(r"(.*)a\1", caseSensitive: false));
+  res.add(new RegExp(r"(.*)a(b)\2", caseSensitive: false));
+  res.add(new RegExp(r"((.*)a|(.*)b)z", caseSensitive: false));
+  res.add(new RegExp(r"((.*)a|(.*)b)z\1", caseSensitive: false));
+  res.add(new RegExp(r"((.*)a|(.*)b)z\2", caseSensitive: false));
+  res.add(new RegExp(r"((.*)a|(.*)b)z\3", caseSensitive: false));
+  res.add(new RegExp(r"((.*)a|^(.*)b)z\3", caseSensitive: false));
+  res.add(new RegExp(r"(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a", caseSensitive: false));
+  res.add(new RegExp(r"(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31", caseSensitive: false));
+  res.add(new RegExp(r"(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32", caseSensitive: false));
+  res.add(new RegExp(r"(a)(bc)", caseSensitive: false));
+  res.add(new RegExp(r"(a+)*zz", caseSensitive: false));
+  res.add(new RegExp(r"((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)", caseSensitive: false));
+  res.add(new RegExp(r"((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)", caseSensitive: false));
+  res.add(new RegExp(r"a*.*b", caseSensitive: false));
+  res.add(new RegExp(r"(a|b)*.?c", caseSensitive: false));
+  res.add(new RegExp(r"abcde", caseSensitive: false));
+  res.add(new RegExp(r"a*b", caseSensitive: false));
+  res.add(new RegExp(r"a+b", caseSensitive: false));
+  res.add(new RegExp(r"(abc|def)x", caseSensitive: false));
+  res.add(new RegExp(r"(ab|cd){3,4}", caseSensitive: false));
+  res.add(new RegExp(r"([ab]{,4}c|xy)", caseSensitive: false));
+  res.add(new RegExp(r"([ab]{1,4}c|xy){4,5}?123", caseSensitive: false));
+  res.add(new RegExp(r"\b.*", caseSensitive: false));
+  res.add(new RegExp(r"\b.*", caseSensitive: false));
+  res.add(new RegExp(r"(?!.bcd).*", caseSensitive: false));
+  res.add(new RegExp(r"abcde", caseSensitive: false));
+  res.add(new RegExp(r"0{0,2}ABC", caseSensitive: false));
+  res.add(new RegExp(r"\d{3,}ABC", caseSensitive: false));
+  res.add(new RegExp(r"\d*ABC", caseSensitive: false));
+  res.add(new RegExp(r"[abc]+DE", caseSensitive: false));
+  res.add(new RegExp(r"[abc]?123", caseSensitive: false));
+  res.add(new RegExp(r"^(?:\d){3,5}X", caseSensitive: false));
+  res.add(new RegExp(r"^a", caseSensitive: false));
+  res.add(new RegExp(r"line\nbreak", caseSensitive: false));
+  res.add(new RegExp(r"line\nbreak", caseSensitive: false));
+  res.add(new RegExp(r"line\nbreak", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"ab.cd", caseSensitive: false));
+  res.add(new RegExp(r"ab.cd", caseSensitive: false));
+  res.add(new RegExp(r"a(b)c", caseSensitive: false));
+  res.add(new RegExp(r"Inthisnexttest,Jisnotsetattheouterlevel;consequentlyitisn'tsetinthepattern'soptions;consequentlypcre_get_named_substring()producesarandomvalue.", caseSensitive: false));
+  res.add(new RegExp(r"\777", caseSensitive: false));
+  res.add(new RegExp(r"\s*,\s*", caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"abc$", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"^abc", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r".*", caseSensitive: false));
+  res.add(new RegExp(r"\w+(.)(.)?def", caseSensitive: false));
+  res.add(new RegExp(r"()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(.(.))", caseSensitive: false));
+  res.add(new RegExp(r"()[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"(|)[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"(|c)[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"(|c?)[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"(d?|c?)[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"(d?|c)[ab]xyz", caseSensitive: false));
+  res.add(new RegExp(r"^a*b\d"));
+  res.add(new RegExp(r"^a*?b\d"));
+  res.add(new RegExp(r"^a+A\d"));
+  res.add(new RegExp(r"^a*A\d", caseSensitive: false));
+  res.add(new RegExp(r"(a*|b*)[cd]", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b*)[cd]", caseSensitive: false));
+  res.add(new RegExp(r"(a*|b+)[cd]", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b+)[cd]", caseSensitive: false));
+  res.add(new RegExp(r"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((a)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", caseSensitive: false));
+  res.add(new RegExp(r"a*\d"));
+  res.add(new RegExp(r"a*\D"));
+  res.add(new RegExp(r"0*\d"));
+  res.add(new RegExp(r"0*\D"));
+  res.add(new RegExp(r"a*\s"));
+  res.add(new RegExp(r"a*\S"));
+  res.add(new RegExp(r" *\s"));
+  res.add(new RegExp(r" *\S"));
+  res.add(new RegExp(r"a*\w"));
+  res.add(new RegExp(r"a*\W"));
+  res.add(new RegExp(r"=*\w"));
+  res.add(new RegExp(r"=*\W"));
+  res.add(new RegExp(r"\d*a"));
+  res.add(new RegExp(r"\d*2"));
+  res.add(new RegExp(r"\d*\d"));
+  res.add(new RegExp(r"\d*\D"));
+  res.add(new RegExp(r"\d*\s"));
+  res.add(new RegExp(r"\d*\S"));
+  res.add(new RegExp(r"\d*\w"));
+  res.add(new RegExp(r"\d*\W"));
+  res.add(new RegExp(r"\D*a"));
+  res.add(new RegExp(r"\D*2"));
+  res.add(new RegExp(r"\D*\d"));
+  res.add(new RegExp(r"\D*\D"));
+  res.add(new RegExp(r"\D*\s"));
+  res.add(new RegExp(r"\D*\S"));
+  res.add(new RegExp(r"\D*\w"));
+  res.add(new RegExp(r"\D*\W"));
+  res.add(new RegExp(r"\s*a"));
+  res.add(new RegExp(r"\s*2"));
+  res.add(new RegExp(r"\s*\d"));
+  res.add(new RegExp(r"\s*\D"));
+  res.add(new RegExp(r"\s*\s"));
+  res.add(new RegExp(r"\s*\S"));
+  res.add(new RegExp(r"\s*\w"));
+  res.add(new RegExp(r"\s*\W"));
+  res.add(new RegExp(r"\S*a"));
+  res.add(new RegExp(r"\S*2"));
+  res.add(new RegExp(r"\S*\d"));
+  res.add(new RegExp(r"\S*\D"));
+  res.add(new RegExp(r"\S*\s"));
+  res.add(new RegExp(r"\S*\S"));
+  res.add(new RegExp(r"\S*\w"));
+  res.add(new RegExp(r"\S*\W"));
+  res.add(new RegExp(r"\w*a"));
+  res.add(new RegExp(r"\w*2"));
+  res.add(new RegExp(r"\w*\d"));
+  res.add(new RegExp(r"\w*\D"));
+  res.add(new RegExp(r"\w*\s"));
+  res.add(new RegExp(r"\w*\S"));
+  res.add(new RegExp(r"\w*\w"));
+  res.add(new RegExp(r"\w*\W"));
+  res.add(new RegExp(r"\W*a"));
+  res.add(new RegExp(r"\W*2"));
+  res.add(new RegExp(r"\W*\d"));
+  res.add(new RegExp(r"\W*\D"));
+  res.add(new RegExp(r"\W*\s"));
+  res.add(new RegExp(r"\W*\S"));
+  res.add(new RegExp(r"\W*\w"));
+  res.add(new RegExp(r"\W*\W"));
+  res.add(new RegExp(r"[^a]+a"));
+  res.add(new RegExp(r"[^a]+a", caseSensitive: false));
+  res.add(new RegExp(r"[^a]+A", caseSensitive: false));
+  res.add(new RegExp(r"[^a]+b"));
+  res.add(new RegExp(r"[^a]+\d"));
+  res.add(new RegExp(r"a*[^a]"));
+  res.add(new RegExp(r"^(?:(?:\1|X)(a|b))+"));
+  res.add(new RegExp(r"^[\E\Qa\E-\Qz\E]+"));
+  res.add(new RegExp(r"^[a\Q]bc\E]"));
+  res.add(new RegExp(r"(?=(\w+))\1:", caseSensitive: false));
+  res.add(new RegExp(r"(a|)*\d"));
+  res.add(new RegExp(r"^a.b"));
+  res.add(new RegExp(r"^abc.", multiLine: true));
+  res.add(new RegExp(r"abc.$", multiLine: true));
+  res.add(new RegExp(r"a"));
+  res.add(new RegExp(r"a"));
+  res.add(new RegExp(r"^a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"^a\R*b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R+b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R{1,3}b", caseSensitive: false));
+  res.add(new RegExp(r"^a[\R]b", caseSensitive: false));
+  res.add(new RegExp(r"^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z"));
+  res.add(new RegExp(r"^(a)\g-2"));
+  res.add(new RegExp(r"^(a)\g"));
+  res.add(new RegExp(r"^(a)\g{0}"));
+  res.add(new RegExp(r"^(a)\g{3"));
+  res.add(new RegExp(r"^(a)\g{4a}"));
+  res.add(new RegExp(r"^a.b"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r"^$", multiLine: true));
+  res.add(new RegExp(r"abc.$", multiLine: true));
+  res.add(new RegExp(r"^X", multiLine: true));
+  res.add(new RegExp(r"(foo)\Kbar"));
+  res.add(new RegExp(r"(foo)(\Kbar|baz)"));
+  res.add(new RegExp(r"(foo\Kbar)baz"));
+  res.add(new RegExp(r"\g{A"));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\H{3,4}"));
+  res.add(new RegExp(r".\h{3,4}."));
+  res.add(new RegExp(r"\h*X\h?\H+Y\H?Z"));
+  res.add(new RegExp(r"\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c"));
+  res.add(new RegExp(r"[\h]"));
+  res.add(new RegExp(r"[\h]+"));
+  res.add(new RegExp(r"[\v]"));
+  res.add(new RegExp(r"[\H]"));
+  res.add(new RegExp(r"[^\h]"));
+  res.add(new RegExp(r"[\V]"));
+  res.add(new RegExp(r"[\x0a\V]"));
+  res.add(new RegExp(r"\H+\hY"));
+  res.add(new RegExp(r"\H+ Y"));
+  res.add(new RegExp(r"\h+A"));
+  res.add(new RegExp(r"\v*B"));
+  res.add(new RegExp(r"\V+\x0a"));
+  res.add(new RegExp(r"A+\h"));
+  res.add(new RegExp(r" *\H"));
+  res.add(new RegExp(r"A*\v"));
+  res.add(new RegExp(r"\x0b*\V"));
+  res.add(new RegExp(r"\d+\h"));
+  res.add(new RegExp(r"\d*\v"));
+  res.add(new RegExp(r"S+\h\S+\v"));
+  res.add(new RegExp(r"\w{3,}\h\w+\v"));
+  res.add(new RegExp(r"\h+\d\h+\w\h+\S\h+\H"));
+  res.add(new RegExp(r"\v+\d\v+\w\v+\S\v+\V"));
+  res.add(new RegExp(r"\H+\h\H+\d"));
+  res.add(new RegExp(r"\V+\v\V+\w"));
+  res.add(new RegExp(r"[\E]AAA"));
+  res.add(new RegExp(r"[\Q\E]AAA"));
+  res.add(new RegExp(r"[^\E]AAA"));
+  res.add(new RegExp(r"[^\Q\E]AAA"));
+  res.add(new RegExp(r"[\E^]AAA"));
+  res.add(new RegExp(r"[\Q\E^]AAA"));
+  res.add(new RegExp(r"\g6666666666"));
+  res.add(new RegExp(r"[\g6666666666]"));
+  res.add(new RegExp(r".+A"));
+  res.add(new RegExp(r"\nA"));
+  res.add(new RegExp(r"[\r\n]A"));
+  res.add(new RegExp(r"(\r|\n)A"));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R{2,4}b", caseSensitive: false));
+  res.add(new RegExp(r"a\R{2,4}b", caseSensitive: false));
+  res.add(new RegExp(r"\k''"));
+  res.add(new RegExp(r"\k<>"));
+  res.add(new RegExp(r"\k{}"));
+  res.add(new RegExp(r"[[:foo:]]"));
+  res.add(new RegExp(r"[[:1234:]]"));
+  res.add(new RegExp(r"[[:f\oo:]]"));
+  res.add(new RegExp(r"[[: :]]"));
+  res.add(new RegExp(r"[[:...:]]"));
+  res.add(new RegExp(r"[[:l\ower:]]"));
+  res.add(new RegExp(r"[[:abc\:]]"));
+  res.add(new RegExp(r"[abc[:x\]pqr:]]"));
+  res.add(new RegExp(r"[[:a\dz:]]"));
+  res.add(new RegExp(r"^(a|b\g<1>c)"));
+  res.add(new RegExp(r"^(a|b\g'1'c)"));
+  res.add(new RegExp(r"^(a|b\g'-1'c)"));
+  res.add(new RegExp(r"(^(a|b\g<-1>c))"));
+  res.add(new RegExp(r"(^(a|b\g<-1'c))"));
+  res.add(new RegExp(r"(^(a|b\g{-1}))"));
+  res.add(new RegExp(r"(\3)(\1)(a)"));
+  res.add(new RegExp(r"(\3)(\1)(a)"));
+  res.add(new RegExp(r"TA]"));
+  res.add(new RegExp(r"TA]"));
+  res.add(new RegExp(r"a[]b"));
+  res.add(new RegExp(r"a[^]b"));
+  res.add(new RegExp(r"a[]b"));
+  res.add(new RegExp(r"a[]+b"));
+  res.add(new RegExp(r"a[^]b"));
+  res.add(new RegExp(r"a[^]+b"));
+  res.add(new RegExp(r"a(?!)+b"));
+  res.add(new RegExp(r"(abc|pqr|123){0}[xyz]", caseSensitive: false));
+  res.add(new RegExp(r" End of testinput2 "));
+  res.add(new RegExp(r"a.b"));
+  res.add(new RegExp(r"a(.{3})b"));
+  res.add(new RegExp(r"a(.*?)(.)"));
+  res.add(new RegExp(r"a(.*?)(.)"));
+  res.add(new RegExp(r"a(.*)(.)"));
+  res.add(new RegExp(r"a(.*)(.)"));
+  res.add(new RegExp(r"a(.)(.)"));
+  res.add(new RegExp(r"a(.)(.)"));
+  res.add(new RegExp(r"a(.?)(.)"));
+  res.add(new RegExp(r"a(.?)(.)"));
+  res.add(new RegExp(r"a(.??)(.)"));
+  res.add(new RegExp(r"a(.??)(.)"));
+  res.add(new RegExp(r"a(.{3})b"));
+  res.add(new RegExp(r"a(.{3,})b"));
+  res.add(new RegExp(r"a(.{3,}?)b"));
+  res.add(new RegExp(r"a(.{3,5})b"));
+  res.add(new RegExp(r"a(.{3,5}?)b"));
+  res.add(new RegExp(r"X(\C{3})"));
+  res.add(new RegExp(r"X(\C{4})"));
+  res.add(new RegExp(r"X\C*"));
+  res.add(new RegExp(r"X\C*?"));
+  res.add(new RegExp(r"X\C{3,5}"));
+  res.add(new RegExp(r"X\C{3,5}?"));
+  res.add(new RegExp(r"[^a]+"));
+  res.add(new RegExp(r"^[^a]{2}"));
+  res.add(new RegExp(r"^[^a]{2,}"));
+  res.add(new RegExp(r"^[^a]{2,}?"));
+  res.add(new RegExp(r"[^a]+", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2}", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2,}", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2,}?", caseSensitive: false));
+  res.add(new RegExp(r"\D*"));
+  res.add(new RegExp(r"\D*"));
+  res.add(new RegExp(r"\D"));
+  res.add(new RegExp(r">\S"));
+  res.add(new RegExp(r"\d"));
+  res.add(new RegExp(r"\s"));
+  res.add(new RegExp(r"\D+"));
+  res.add(new RegExp(r"\D{2,3}"));
+  res.add(new RegExp(r"\D{2,3}?"));
+  res.add(new RegExp(r"\d+"));
+  res.add(new RegExp(r"\d{2,3}"));
+  res.add(new RegExp(r"\d{2,3}?"));
+  res.add(new RegExp(r"\S+"));
+  res.add(new RegExp(r"\S{2,3}"));
+  res.add(new RegExp(r"\S{2,3}?"));
+  res.add(new RegExp(r">\s+<"));
+  res.add(new RegExp(r">\s{2,3}<"));
+  res.add(new RegExp(r">\s{2,3}?<"));
+  res.add(new RegExp(r"\w+"));
+  res.add(new RegExp(r"\w{2,3}"));
+  res.add(new RegExp(r"\w{2,3}?"));
+  res.add(new RegExp(r"\W+"));
+  res.add(new RegExp(r"\W{2,3}"));
+  res.add(new RegExp(r"\W{2,3}?"));
+  res.add(new RegExp(r"a\Cb"));
+  res.add(new RegExp(r"a\Cb"));
+  res.add(new RegExp(r"[\xFF]"));
+  res.add(new RegExp(r"[\xff]"));
+  res.add(new RegExp(r"[^\xFF]"));
+  res.add(new RegExp(r"[^\xff]"));
+  res.add(new RegExp(r"^[ac]*b"));
+  res.add(new RegExp(r"^[^x]*b", caseSensitive: false));
+  res.add(new RegExp(r"^[^x]*b"));
+  res.add(new RegExp(r"^\d*b"));
+  res.add(new RegExp(r"(|a)"));
+  res.add(new RegExp(r"\S\S"));
+  res.add(new RegExp(r"\S{2}"));
+  res.add(new RegExp(r"\W\W"));
+  res.add(new RegExp(r"\W{2}"));
+  res.add(new RegExp(r"\S"));
+  res.add(new RegExp(r"[\S]"));
+  res.add(new RegExp(r"\D"));
+  res.add(new RegExp(r"[\D]"));
+  res.add(new RegExp(r"\W"));
+  res.add(new RegExp(r"[\W]"));
+  res.add(new RegExp(r"[\S\s]*"));
+  res.add(new RegExp(r".[^\S]."));
+  res.add(new RegExp(r".[^\S\n]."));
+  res.add(new RegExp(r"[[:^alnum:]]"));
+  res.add(new RegExp(r"[[:^alpha:]]"));
+  res.add(new RegExp(r"[[:^ascii:]]"));
+  res.add(new RegExp(r"[[:^blank:]]"));
+  res.add(new RegExp(r"[[:^cntrl:]]"));
+  res.add(new RegExp(r"[[:^digit:]]"));
+  res.add(new RegExp(r"[[:^graph:]]"));
+  res.add(new RegExp(r"[[:^lower:]]"));
+  res.add(new RegExp(r"[[:^print:]]"));
+  res.add(new RegExp(r"[[:^punct:]]"));
+  res.add(new RegExp(r"[[:^space:]]"));
+  res.add(new RegExp(r"[[:^upper:]]"));
+  res.add(new RegExp(r"[[:^word:]]"));
+  res.add(new RegExp(r"[[:^xdigit:]]"));
+  res.add(new RegExp(r"^[^d]*?$"));
+  res.add(new RegExp(r"^[^d]*?$"));
+  res.add(new RegExp(r"^[^d]*?$", caseSensitive: false));
+  res.add(new RegExp(r"^[^d]*?$", caseSensitive: false));
+  res.add(new RegExp(r" End of testinput4 "));
+  res.add(new RegExp(r"\x80"));
+  res.add(new RegExp(r"\xff"));
+  res.add(new RegExp(r".{3,5}X"));
+  res.add(new RegExp(r".{3,5}?"));
+  res.add(new RegExp(r"X(\C)(.*)"));
+  res.add(new RegExp(r"^[ab]"));
+  res.add(new RegExp(r"^[^ab]"));
+  res.add(new RegExp(r"[^ab\xC0-\xF0]"));
+  res.add(new RegExp(r"[\xFF]"));
+  res.add(new RegExp(r"[\xff]"));
+  res.add(new RegExp(r"[^\xFF]"));
+  res.add(new RegExp(r"[^\xff]"));
+  res.add(new RegExp(r"anything"));
+  res.add(new RegExp(r"\W"));
+  res.add(new RegExp(r"\w"));
+  res.add(new RegExp(r"\777", caseSensitive: false));
+  res.add(new RegExp(r"\777", caseSensitive: false));
+  res.add(new RegExp(r"^abc.", multiLine: true));
+  res.add(new RegExp(r"abc.$", multiLine: true));
+  res.add(new RegExp(r"^a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"^a\R*b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R+b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R{1,3}b", caseSensitive: false));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"[\h]"));
+  res.add(new RegExp(r"[\h]{3,}"));
+  res.add(new RegExp(r"[\v]"));
+  res.add(new RegExp(r"[\H]"));
+  res.add(new RegExp(r"[\V]"));
+  res.add(new RegExp(r".*$"));
+  res.add(new RegExp(r"X"));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r".*a.*=.b.*"));
+  res.add(new RegExp(r"a[^]b"));
+  res.add(new RegExp(r"a[^]+b"));
+  res.add(new RegExp(r"X"));
+  res.add(new RegExp(r" End of testinput5 "));
+  res.add(new RegExp(r"^\pC\pL\pM\pN\pP\pS\pZ<"));
+  res.add(new RegExp(r"^\PC"));
+  res.add(new RegExp(r"^\PL"));
+  res.add(new RegExp(r"^\PM"));
+  res.add(new RegExp(r"^\PN"));
+  res.add(new RegExp(r"^\PP"));
+  res.add(new RegExp(r"^\PS"));
+  res.add(new RegExp(r"^\PZ"));
+  res.add(new RegExp(r"^\p{Cc}"));
+  res.add(new RegExp(r"^\p{Cf}"));
+  res.add(new RegExp(r"^\p{Cn}"));
+  res.add(new RegExp(r"^\p{Co}"));
+  res.add(new RegExp(r"^\p{Cs}"));
+  res.add(new RegExp(r"^\p{Ll}"));
+  res.add(new RegExp(r"^\p{Lm}"));
+  res.add(new RegExp(r"^\p{Lo}"));
+  res.add(new RegExp(r"^\p{Lt}"));
+  res.add(new RegExp(r"^\p{Lu}"));
+  res.add(new RegExp(r"^\p{Mc}"));
+  res.add(new RegExp(r"^\p{Me}"));
+  res.add(new RegExp(r"^\p{Mn}"));
+  res.add(new RegExp(r"^\p{Nl}"));
+  res.add(new RegExp(r"^\p{No}"));
+  res.add(new RegExp(r"^\p{Pc}"));
+  res.add(new RegExp(r"^\p{Pd}"));
+  res.add(new RegExp(r"^\p{Pe}"));
+  res.add(new RegExp(r"^\p{Pf}"));
+  res.add(new RegExp(r"^\p{Pi}"));
+  res.add(new RegExp(r"^\p{Po}"));
+  res.add(new RegExp(r"^\p{Ps}"));
+  res.add(new RegExp(r"^\p{Sk}"));
+  res.add(new RegExp(r"^\p{So}"));
+  res.add(new RegExp(r"^\p{Zl}"));
+  res.add(new RegExp(r"^\p{Zp}"));
+  res.add(new RegExp(r"^\p{Zs}"));
+  res.add(new RegExp(r"\p{Nd}{2,}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,}?(..)"));
+  res.add(new RegExp(r"\p{Nd}*(..)"));
+  res.add(new RegExp(r"\p{Nd}*?(..)"));
+  res.add(new RegExp(r"\p{Nd}{2}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,3}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,3}?(..)"));
+  res.add(new RegExp(r"\p{Nd}?(..)"));
+  res.add(new RegExp(r"\p{Nd}??(..)"));
+  res.add(new RegExp(r"\p{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\p{^Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\P{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"[\p{L}]"));
+  res.add(new RegExp(r"[\p{^L}]"));
+  res.add(new RegExp(r"[\P{L}]"));
+  res.add(new RegExp(r"[\P{^L}]"));
+  res.add(new RegExp(r"[\p{Nd}]"));
+  res.add(new RegExp(r"[\P{Nd}]+"));
+  res.add(new RegExp(r"\D+"));
+  res.add(new RegExp(r"[\D]+"));
+  res.add(new RegExp(r"[\P{Nd}]+"));
+  res.add(new RegExp(r"[\D\P{Nd}]+"));
+  res.add(new RegExp(r"\pL"));
+  res.add(new RegExp(r"\pL", caseSensitive: false));
+  res.add(new RegExp(r"\p{Lu}"));
+  res.add(new RegExp(r"\p{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\p{Ll}"));
+  res.add(new RegExp(r"\p{Ll}", caseSensitive: false));
+  res.add(new RegExp(r"^\X"));
+  res.add(new RegExp(r"^[\X]"));
+  res.add(new RegExp(r"^(\X*)C"));
+  res.add(new RegExp(r"^(\X*?)C"));
+  res.add(new RegExp(r"^(\X*)(.)"));
+  res.add(new RegExp(r"^(\X*?)(.)"));
+  res.add(new RegExp(r"^\X(.)"));
+  res.add(new RegExp(r"^\X{2,3}(.)"));
+  res.add(new RegExp(r"^\X{2,3}?(.)"));
+  res.add(new RegExp(r"^[\p{Arabic}]"));
+  res.add(new RegExp(r"^[\P{Yi}]"));
+  res.add(new RegExp(r"^\p{Any}X"));
+  res.add(new RegExp(r"^\P{Any}X"));
+  res.add(new RegExp(r"^\p{Any}?X"));
+  res.add(new RegExp(r"^\P{Any}?X"));
+  res.add(new RegExp(r"^\p{Any}*X"));
+  res.add(new RegExp(r"^\P{Any}*X"));
+  res.add(new RegExp(r"^[\p{Any}]X"));
+  res.add(new RegExp(r"^[\P{Any}]X"));
+  res.add(new RegExp(r"^[\p{Any}]?X"));
+  res.add(new RegExp(r"^[\P{Any}]?X"));
+  res.add(new RegExp(r"^[\p{Any}]+X"));
+  res.add(new RegExp(r"^[\P{Any}]+X"));
+  res.add(new RegExp(r"^[\p{Any}]*X"));
+  res.add(new RegExp(r"^[\P{Any}]*X"));
+  res.add(new RegExp(r"^\p{Any}{3,5}?"));
+  res.add(new RegExp(r"^\p{Any}{3,5}"));
+  res.add(new RegExp(r"^\P{Any}{3,5}?"));
+  res.add(new RegExp(r"^\p{L&}X"));
+  res.add(new RegExp(r"^[\p{L&}]X"));
+  res.add(new RegExp(r"^[\p{L&}]+X"));
+  res.add(new RegExp(r"^[\p{L&}]+?X"));
+  res.add(new RegExp(r"^\P{L&}X"));
+  res.add(new RegExp(r"^[\P{L&}]X"));
+  res.add(new RegExp(r"^(\p{Z}[^\p{C}\p{Z}]+)*$"));
+  res.add(new RegExp(r"([\pL]=(abc))*X"));
+  res.add(new RegExp(r"^\p{Balinese}\p{Cuneiform}\p{Nko}\p{Phags_Pa}\p{Phoenician}"));
+  res.add(new RegExp(r"The next two are special cases where the lengths of the different cases of the \nsame character differ. The first went wrong with heap frame storage; the 2nd\nwas broken in all cases."));
+  res.add(new RegExp(r"Check property support in non-UTF-8 mode"));
+  res.add(new RegExp(r"\p{L}{4}"));
+  res.add(new RegExp(r"\X{1,3}\d"));
+  res.add(new RegExp(r"\X?\d"));
+  res.add(new RegExp(r"\P{L}?\d"));
+  res.add(new RegExp(r"[\PPP\x8a]{1,}\x80"));
+  res.add(new RegExp(r"(?:[\PPa*]*){8,}"));
+  res.add(new RegExp(r"[\P{Any}]"));
+  res.add(new RegExp(r"[\P{Any}\E]"));
+  res.add(new RegExp(r"(\P{Yi}{2}\277)?"));
+  res.add(new RegExp(r"[\P{Yi}A]"));
+  res.add(new RegExp(r"[\P{Yi}\P{Yi}\P{Yi}A]"));
+  res.add(new RegExp(r"[^\P{Yi}A]"));
+  res.add(new RegExp(r"[^\P{Yi}\P{Yi}\P{Yi}A]"));
+  res.add(new RegExp(r"(\P{Yi}*\277)*"));
+  res.add(new RegExp(r"(\P{Yi}*?\277)*"));
+  res.add(new RegExp(r"(\P{Yi}?\277)*"));
+  res.add(new RegExp(r"(\P{Yi}??\277)*"));
+  res.add(new RegExp(r"(\P{Yi}{0,3}\277)*"));
+  res.add(new RegExp(r"(\P{Yi}{0,3}?\277)*"));
+  res.add(new RegExp(r"^[\p{Arabic}]"));
+  res.add(new RegExp(r"^\p{Cyrillic}"));
+  res.add(new RegExp(r"^\p{Common}"));
+  res.add(new RegExp(r"^\p{Inherited}"));
+  res.add(new RegExp(r"^\p{Shavian}"));
+  res.add(new RegExp(r"^\p{Deseret}"));
+  res.add(new RegExp(r"^\p{Osmanya}"));
+  res.add(new RegExp(r"\p{Zl}"));
+  res.add(new RegExp(r"\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}"));
+  res.add(new RegExp(r"(A)\1", caseSensitive: false));
+  res.add(new RegExp(r" End of testinput6 "));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"ab*c"));
+  res.add(new RegExp(r"ab+c"));
+  res.add(new RegExp(r"a*"));
+  res.add(new RegExp(r"(a|abcd|african)"));
+  res.add(new RegExp(r"^abc"));
+  res.add(new RegExp(r"^abc", multiLine: true));
+  res.add(new RegExp(r"\Aabc"));
+  res.add(new RegExp(r"\Aabc", multiLine: true));
+  res.add(new RegExp(r"\Gabc"));
+  res.add(new RegExp(r"x\dy\Dz"));
+  res.add(new RegExp(r"x\sy\Sz"));
+  res.add(new RegExp(r"x\wy\Wz"));
+  res.add(new RegExp(r"x.y"));
+  res.add(new RegExp(r"x.y"));
+  res.add(new RegExp(r"a\d\z"));
+  res.add(new RegExp(r"a\d\z", multiLine: true));
+  res.add(new RegExp(r"a\d\Z"));
+  res.add(new RegExp(r"a\d\Z", multiLine: true));
+  res.add(new RegExp(r"a\d$"));
+  res.add(new RegExp(r"a\d$", multiLine: true));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"[^a]"));
+  res.add(new RegExp(r"ab?\w"));
+  res.add(new RegExp(r"x{0,3}yz"));
+  res.add(new RegExp(r"x{3}yz"));
+  res.add(new RegExp(r"x{2,3}yz"));
+  res.add(new RegExp(r"[^a]+"));
+  res.add(new RegExp(r"[^a]*"));
+  res.add(new RegExp(r"[^a]{3,5}"));
+  res.add(new RegExp(r"\d*"));
+  res.add(new RegExp(r"\D*"));
+  res.add(new RegExp(r"\d+"));
+  res.add(new RegExp(r"\D+"));
+  res.add(new RegExp(r"\d?A"));
+  res.add(new RegExp(r"\D?A"));
+  res.add(new RegExp(r"a+"));
+  res.add(new RegExp(r"^.*xyz"));
+  res.add(new RegExp(r"^.+xyz"));
+  res.add(new RegExp(r"^.?xyz"));
+  res.add(new RegExp(r"^\d{2,3}X"));
+  res.add(new RegExp(r"^[abcd]\d"));
+  res.add(new RegExp(r"^[abcd]*\d"));
+  res.add(new RegExp(r"^[abcd]+\d"));
+  res.add(new RegExp(r"^a+X"));
+  res.add(new RegExp(r"^[abcd]?\d"));
+  res.add(new RegExp(r"^[abcd]{2,3}\d"));
+  res.add(new RegExp(r"^(abc)*\d"));
+  res.add(new RegExp(r"^(abc)+\d"));
+  res.add(new RegExp(r"^(abc)?\d"));
+  res.add(new RegExp(r"^(abc){2,3}\d"));
+  res.add(new RegExp(r"^(a*\w|ab)=(a*\w|ab)"));
+  res.add(new RegExp(r"^(?=abc)\w{5}:$"));
+  res.add(new RegExp(r"^(?!abc)\d\d$"));
+  res.add(new RegExp(r"(ab|cd){3,4}"));
+  res.add(new RegExp(r"^abc"));
+  res.add(new RegExp(r"^(a*|xyz)"));
+  res.add(new RegExp(r"xyz$"));
+  res.add(new RegExp(r"xyz$", multiLine: true));
+  res.add(new RegExp(r"\Gabc"));
+  res.add(new RegExp(r"^abcdef"));
+  res.add(new RegExp(r"^a{2,4}\d+z"));
+  res.add(new RegExp(r"^abcdef"));
+  res.add(new RegExp(r"(ab*(cd|ef))+X"));
+  res.add(new RegExp(r"the quick brown fox"));
+  res.add(new RegExp(r"The quick brown fox", caseSensitive: false));
+  res.add(new RegExp(r"abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz"));
+  res.add(new RegExp(r"a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz"));
+  res.add(new RegExp(r"^(abc){1,2}zz"));
+  res.add(new RegExp(r"^(b+?|a){1,2}?c"));
+  res.add(new RegExp(r"^(b+|a){1,2}c"));
+  res.add(new RegExp(r"^(b*|ba){1,2}?bc"));
+  res.add(new RegExp(r"^(ba|b*){1,2}?bc"));
+  res.add(new RegExp(r"^[ab\]cde]"));
+  res.add(new RegExp(r"^[]cde]"));
+  res.add(new RegExp(r"^[^ab\]cde]"));
+  res.add(new RegExp(r"^[^]cde]"));
+  res.add(new RegExp(r"^[0-9]+$"));
+  res.add(new RegExp(r"^.*nter"));
+  res.add(new RegExp(r"^xxx[0-9]+$"));
+  res.add(new RegExp(r"^.+[0-9][0-9][0-9]$"));
+  res.add(new RegExp(r"^.+?[0-9][0-9][0-9]$"));
+  res.add(new RegExp(r"^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$"));
+  res.add(new RegExp(r":"));
+  res.add(new RegExp(r"([\da-f:]+)$", caseSensitive: false));
+  res.add(new RegExp(r"^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$"));
+  res.add(new RegExp(r"^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$"));
+  res.add(new RegExp(r"^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$"));
+  res.add(new RegExp(r"^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$"));
+  res.add(new RegExp(r"^(?=ab(de))(abd)(e)"));
+  res.add(new RegExp(r"^(?!(ab)de|x)(abd)(f)"));
+  res.add(new RegExp(r"^(?=(ab(cd)))(ab)"));
+  res.add(new RegExp(r"^[\da-f](\.[\da-f])*$", caseSensitive: false));
+  res.add(new RegExp(r'^\".*\"\s*(;.*)?$'));
+  res.add(new RegExp(r"^$"));
+  res.add(new RegExp(r"^ab\sc$"));
+  res.add(new RegExp(r"^a\ b[c]d$"));
+  res.add(new RegExp(r"^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$"));
+  res.add(new RegExp(r"^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$"));
+  res.add(new RegExp(r"^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]"));
+  res.add(new RegExp(r"^a*\w"));
+  res.add(new RegExp(r"^a*?\w"));
+  res.add(new RegExp(r"^a+\w"));
+  res.add(new RegExp(r"^a+?\w"));
+  res.add(new RegExp(r"^\d{8}\w{2,}"));
+  res.add(new RegExp(r"^[aeiou\d]{4,5}$"));
+  res.add(new RegExp(r"^[aeiou\d]{4,5}?"));
+  res.add(new RegExp(r"^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]"));
+  res.add(new RegExp(r"^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d"));
+  res.add(new RegExp(r"^12.34"));
+  res.add(new RegExp(r"\w+(?=\t)"));
+  res.add(new RegExp(r"foo(?!bar)(.*)"));
+  res.add(new RegExp(r"(?:(?!foo)...|^.{0,2})bar(.*)"));
+  res.add(new RegExp(r"^(\D*)(?=\d)(?!123)"));
+  res.add(new RegExp(r"^1234"));
+  res.add(new RegExp(r"^1234"));
+  res.add(new RegExp(r"abcd"));
+  res.add(new RegExp(r"^abcd"));
+  res.add(new RegExp(r"(?!^)abc"));
+  res.add(new RegExp(r"(?=^)abc"));
+  res.add(new RegExp(r"^[ab]{1,3}(ab*|b)"));
+  res.add(new RegExp(r"^[ab]{1,3}?(ab*|b)"));
+  res.add(new RegExp(r"^[ab]{1,3}?(ab*?|b)"));
+  res.add(new RegExp(r"^[ab]{1,3}(ab*?|b)"));
+  res.add(new RegExp(r'(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\)|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")*<(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*,(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*)*:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*")(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"(?:[^\\\x80-\xff\n\015"]|\\[^\x80-\xff])*"))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*@(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*\.(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*>)(?:[\040\t]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff]|\((?:[^\\\x80-\xff\n\015()]|\\[^\x80-\xff])*\))*\))*'));
+  res.add(new RegExp(r'[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>)'));
+  res.add(new RegExp(r"abc\x0def\x00pqr\x000xyz\x0000AB"));
+  res.add(new RegExp(r"^[\000-\037]"));
+  res.add(new RegExp(r"\0*"));
+  res.add(new RegExp(r"A\x0{2,3}Z"));
+  res.add(new RegExp(r"^\s"));
+  res.add(new RegExp(r"^abc"));
+  res.add(new RegExp(r"ab{1,3}bc"));
+  res.add(new RegExp(r"([^.]*)\.([^:]*):[T ]+(.*)"));
+  res.add(new RegExp(r"([^.]*)\.([^:]*):[T ]+(.*)", caseSensitive: false));
+  res.add(new RegExp(r"([^.]*)\.([^:]*):[t ]+(.*)", caseSensitive: false));
+  res.add(new RegExp(r"^[W-c]+$"));
+  res.add(new RegExp(r"^[W-c]+$", caseSensitive: false));
+  res.add(new RegExp(r"^[\x3f-\x5F]+$", caseSensitive: false));
+  res.add(new RegExp(r"^abc$", multiLine: true));
+  res.add(new RegExp(r"^abc$"));
+  res.add(new RegExp(r"\Aabc\Z", multiLine: true));
+  res.add(new RegExp(r"\A(.)*\Z"));
+  res.add(new RegExp(r"\A(.)*\Z", multiLine: true));
+  res.add(new RegExp(r"(?:b)|(?::+)"));
+  res.add(new RegExp(r"[-az]+"));
+  res.add(new RegExp(r"[az-]+"));
+  res.add(new RegExp(r"[a\-z]+"));
+  res.add(new RegExp(r"[a-z]+"));
+  res.add(new RegExp(r"[\d-]+"));
+  res.add(new RegExp(r"[\d-z]+"));
+  res.add(new RegExp(r"\x5c"));
+  res.add(new RegExp(r"\x20Z"));
+  res.add(new RegExp(r"ab{3cd"));
+  res.add(new RegExp(r"ab{3,cd"));
+  res.add(new RegExp(r"ab{3,4a}cd"));
+  res.add(new RegExp(r"{4,5a}bc"));
+  res.add(new RegExp(r"^a.b"));
+  res.add(new RegExp(r"abc$"));
+  res.add(new RegExp(r"(abc)\123"));
+  res.add(new RegExp(r"(abc)\223"));
+  res.add(new RegExp(r"(abc)\323"));
+  res.add(new RegExp(r"(abc)\100"));
+  res.add(new RegExp(r"abc\81"));
+  res.add(new RegExp(r"abc\91"));
+  res.add(new RegExp(r"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123"));
+  res.add(new RegExp(r"ab\idef"));
+  res.add(new RegExp(r"a{0}bc"));
+  res.add(new RegExp(r"(a|(bc)){0,0}?xyz"));
+  res.add(new RegExp(r"abc[\10]de"));
+  res.add(new RegExp(r"abc[\1]de"));
+  res.add(new RegExp(r"(abc)[\1]de"));
+  res.add(new RegExp(r"^([^a])([^\b])([^c]*)([^d]{3,4})"));
+  res.add(new RegExp(r"[^a]"));
+  res.add(new RegExp(r"[^a]", caseSensitive: false));
+  res.add(new RegExp(r"[^a]+"));
+  res.add(new RegExp(r"[^a]+", caseSensitive: false));
+  res.add(new RegExp(r"[^a]+"));
+  res.add(new RegExp(r"[^k]$"));
+  res.add(new RegExp(r"[^k]{2,3}$"));
+  res.add(new RegExp(r"^\d{8,}\@.+[^k]$"));
+  res.add(new RegExp(r"[^a]"));
+  res.add(new RegExp(r"[^a]", caseSensitive: false));
+  res.add(new RegExp(r"[^az]"));
+  res.add(new RegExp(r"[^az]", caseSensitive: false));
+  res.add(new RegExp(r"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"));
+  res.add(new RegExp(r"P[^*]TAIRE[^*]{1,6}?LL"));
+  res.add(new RegExp(r"P[^*]TAIRE[^*]{1,}?LL"));
+  res.add(new RegExp(r"(\.\d\d[1-9]?)\d+"));
+  res.add(new RegExp(r"(\.\d\d((?=0)|\d(?=\d)))"));
+  res.add(new RegExp(r"\b(foo)\s+(\w+)", caseSensitive: false));
+  res.add(new RegExp(r"foo(.*)bar"));
+  res.add(new RegExp(r"foo(.*?)bar"));
+  res.add(new RegExp(r"(.*)(\d*)"));
+  res.add(new RegExp(r"(.*)(\d+)"));
+  res.add(new RegExp(r"(.*?)(\d*)"));
+  res.add(new RegExp(r"(.*?)(\d+)"));
+  res.add(new RegExp(r"(.*)(\d+)$"));
+  res.add(new RegExp(r"(.*?)(\d+)$"));
+  res.add(new RegExp(r"(.*)\b(\d+)$"));
+  res.add(new RegExp(r"(.*\D)(\d+)$"));
+  res.add(new RegExp(r"^\D*(?!123)"));
+  res.add(new RegExp(r"^(\D*)(?=\d)(?!123)"));
+  res.add(new RegExp(r"^[W-]46]"));
+  res.add(new RegExp(r"^[W-\]46]"));
+  res.add(new RegExp(r"\d\d\/\d\d\/\d\d\d\d"));
+  res.add(new RegExp(r"word (?:[a-zA-Z0-9]+ ){0,10}otherword"));
+  res.add(new RegExp(r"word (?:[a-zA-Z0-9]+ ){0,300}otherword"));
+  res.add(new RegExp(r"^(a){0,0}"));
+  res.add(new RegExp(r"^(a){0,1}"));
+  res.add(new RegExp(r"^(a){0,2}"));
+  res.add(new RegExp(r"^(a){0,3}"));
+  res.add(new RegExp(r"^(a){0,}"));
+  res.add(new RegExp(r"^(a){1,1}"));
+  res.add(new RegExp(r"^(a){1,2}"));
+  res.add(new RegExp(r"^(a){1,3}"));
+  res.add(new RegExp(r"^(a){1,}"));
+  res.add(new RegExp(r".*\.gif"));
+  res.add(new RegExp(r".{0,}\.gif"));
+  res.add(new RegExp(r".*\.gif", multiLine: true));
+  res.add(new RegExp(r".*\.gif"));
+  res.add(new RegExp(r".*\.gif", multiLine: true));
+  res.add(new RegExp(r".*$"));
+  res.add(new RegExp(r".*$", multiLine: true));
+  res.add(new RegExp(r".*$"));
+  res.add(new RegExp(r".*$", multiLine: true));
+  res.add(new RegExp(r".*$"));
+  res.add(new RegExp(r".*$", multiLine: true));
+  res.add(new RegExp(r".*$"));
+  res.add(new RegExp(r".*$", multiLine: true));
+  res.add(new RegExp(r"(.*X|^B)"));
+  res.add(new RegExp(r"(.*X|^B)", multiLine: true));
+  res.add(new RegExp(r"(.*X|^B)"));
+  res.add(new RegExp(r"(.*X|^B)", multiLine: true));
+  res.add(new RegExp(r"^.*B"));
+  res.add(new RegExp(r"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"));
+  res.add(new RegExp(r"^\d\d\d\d\d\d\d\d\d\d\d\d"));
+  res.add(new RegExp(r"^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]"));
+  res.add(new RegExp(r"^[abc]{12}"));
+  res.add(new RegExp(r"^[a-c]{12}"));
+  res.add(new RegExp(r"^(a|b|c){12}"));
+  res.add(new RegExp(r"^[abcdefghijklmnopqrstuvwxy0123456789]"));
+  res.add(new RegExp(r"abcde{0,0}"));
+  res.add(new RegExp(r"ab[cd]{0,0}e"));
+  res.add(new RegExp(r"ab(c){0,0}d"));
+  res.add(new RegExp(r"a(b*)"));
+  res.add(new RegExp(r"ab\d{0}e"));
+  res.add(new RegExp(r'"([^\\"]+|\\.)*"'));
+  res.add(new RegExp(r".*?"));
+  res.add(new RegExp(r"\b"));
+  res.add(new RegExp(r"\b"));
+  res.add(new RegExp(r"<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>", caseSensitive: false));
+  res.add(new RegExp(r"a[^a]b"));
+  res.add(new RegExp(r"a.b"));
+  res.add(new RegExp(r"a[^a]b"));
+  res.add(new RegExp(r"a.b"));
+  res.add(new RegExp(r"^(b+?|a){1,2}?c"));
+  res.add(new RegExp(r"^(b+|a){1,2}?c"));
+  res.add(new RegExp(r"(?!\A)x", multiLine: true));
+  res.add(new RegExp(r"\x0{ab}"));
+  res.add(new RegExp(r"(A|B)*?CD"));
+  res.add(new RegExp(r"(A|B)*CD"));
+  res.add(new RegExp(r"\Aabc\z", multiLine: true));
+  res.add(new RegExp(r"(\d+)(\w)"));
+  res.add(new RegExp(r"(a+|b+|c+)*c"));
+  res.add(new RegExp(r"(abc|)+"));
+  res.add(new RegExp(r"([a]*)*"));
+  res.add(new RegExp(r"([ab]*)*"));
+  res.add(new RegExp(r"([^a]*)*"));
+  res.add(new RegExp(r"([^ab]*)*"));
+  res.add(new RegExp(r"([a]*?)*"));
+  res.add(new RegExp(r"([ab]*?)*"));
+  res.add(new RegExp(r"([^a]*?)*"));
+  res.add(new RegExp(r"([^ab]*?)*"));
+  res.add(new RegExp(r"The following tests are taken from the Perl 5.005 test suite; some of them"));
+  res.add(new RegExp(r"are compatible with 5.004, but I'd rather not have to sort them out."));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"ab*c"));
+  res.add(new RegExp(r"ab*bc"));
+  res.add(new RegExp(r".{1}"));
+  res.add(new RegExp(r".{3,4}"));
+  res.add(new RegExp(r"ab{0,}bc"));
+  res.add(new RegExp(r"ab+bc"));
+  res.add(new RegExp(r"ab{1,}bc"));
+  res.add(new RegExp(r"ab+bc"));
+  res.add(new RegExp(r"ab{1,}bc"));
+  res.add(new RegExp(r"ab{1,3}bc"));
+  res.add(new RegExp(r"ab{3,4}bc"));
+  res.add(new RegExp(r"ab{4,5}bc"));
+  res.add(new RegExp(r"ab?bc"));
+  res.add(new RegExp(r"ab{0,1}bc"));
+  res.add(new RegExp(r"ab?bc"));
+  res.add(new RegExp(r"ab?c"));
+  res.add(new RegExp(r"ab{0,1}c"));
+  res.add(new RegExp(r"^abc$"));
+  res.add(new RegExp(r"^abc"));
+  res.add(new RegExp(r"^abc$"));
+  res.add(new RegExp(r"abc$"));
+  res.add(new RegExp(r"^"));
+  res.add(new RegExp(r"$"));
+  res.add(new RegExp(r"a.c"));
+  res.add(new RegExp(r"a.*c"));
+  res.add(new RegExp(r"a[bc]d"));
+  res.add(new RegExp(r"a[b-d]e"));
+  res.add(new RegExp(r"a[b-d]"));
+  res.add(new RegExp(r"a[-b]"));
+  res.add(new RegExp(r"a[b-]"));
+  res.add(new RegExp(r"a]"));
+  res.add(new RegExp(r"a[]]b"));
+  res.add(new RegExp(r"a[^bc]d"));
+  res.add(new RegExp(r"a[^-b]c"));
+  res.add(new RegExp(r"a[^]b]c"));
+  res.add(new RegExp(r"\ba\b"));
+  res.add(new RegExp(r"\by\b"));
+  res.add(new RegExp(r"\Ba\B"));
+  res.add(new RegExp(r"\By\b"));
+  res.add(new RegExp(r"\by\B"));
+  res.add(new RegExp(r"\By\B"));
+  res.add(new RegExp(r"\w"));
+  res.add(new RegExp(r"\W"));
+  res.add(new RegExp(r"a\sb"));
+  res.add(new RegExp(r"a\Sb"));
+  res.add(new RegExp(r"\d"));
+  res.add(new RegExp(r"\D"));
+  res.add(new RegExp(r"[\w]"));
+  res.add(new RegExp(r"[\W]"));
+  res.add(new RegExp(r"a[\s]b"));
+  res.add(new RegExp(r"a[\S]b"));
+  res.add(new RegExp(r"[\d]"));
+  res.add(new RegExp(r"[\D]"));
+  res.add(new RegExp(r"ab|cd"));
+  res.add(new RegExp(r"()ef"));
+  res.add(new RegExp(r"$b"));
+  res.add(new RegExp(r"a\(b"));
+  res.add(new RegExp(r"a\\b"));
+  res.add(new RegExp(r"((a))"));
+  res.add(new RegExp(r"(a)b(c)"));
+  res.add(new RegExp(r"a+b+c"));
+  res.add(new RegExp(r"a{1,}b{1,}c"));
+  res.add(new RegExp(r"a.+?c"));
+  res.add(new RegExp(r"(a+|b)*"));
+  res.add(new RegExp(r"(a+|b){0,}"));
+  res.add(new RegExp(r"(a+|b)+"));
+  res.add(new RegExp(r"(a+|b){1,}"));
+  res.add(new RegExp(r"(a+|b)?"));
+  res.add(new RegExp(r"(a+|b){0,1}"));
+  res.add(new RegExp(r"[^ab]*"));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"a*"));
+  res.add(new RegExp(r"([abc])*d"));
+  res.add(new RegExp(r"([abc])*bcd"));
+  res.add(new RegExp(r"a|b|c|d|e"));
+  res.add(new RegExp(r"(a|b|c|d|e)f"));
+  res.add(new RegExp(r"abcd*efg"));
+  res.add(new RegExp(r"ab*"));
+  res.add(new RegExp(r"(ab|cd)e"));
+  res.add(new RegExp(r"[abhgefdc]ij"));
+  res.add(new RegExp(r"^(ab|cd)e"));
+  res.add(new RegExp(r"(abc|)ef"));
+  res.add(new RegExp(r"(a|b)c*d"));
+  res.add(new RegExp(r"(ab|ab*)bc"));
+  res.add(new RegExp(r"a([bc]*)c*"));
+  res.add(new RegExp(r"a([bc]*)(c*d)"));
+  res.add(new RegExp(r"a([bc]+)(c*d)"));
+  res.add(new RegExp(r"a([bc]*)(c+d)"));
+  res.add(new RegExp(r"a[bcd]*dcdcde"));
+  res.add(new RegExp(r"a[bcd]+dcdcde"));
+  res.add(new RegExp(r"(ab|a)b*c"));
+  res.add(new RegExp(r"((a)(b)c)(d)"));
+  res.add(new RegExp(r"[a-zA-Z_][a-zA-Z0-9_]*"));
+  res.add(new RegExp(r"^a(bc+|b[eh])g|.h$"));
+  res.add(new RegExp(r"(bc+d$|ef*g.|h?i(j|k))"));
+  res.add(new RegExp(r"((((((((((a))))))))))"));
+  res.add(new RegExp(r"(((((((((a)))))))))"));
+  res.add(new RegExp(r"multiple words of text"));
+  res.add(new RegExp(r"multiple words"));
+  res.add(new RegExp(r"(.*)c(.*)"));
+  res.add(new RegExp(r"\((.*), (.*)\)"));
+  res.add(new RegExp(r"[k]"));
+  res.add(new RegExp(r"abcd"));
+  res.add(new RegExp(r"a(bc)d"));
+  res.add(new RegExp(r"a[-]?c"));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"ab*c", caseSensitive: false));
+  res.add(new RegExp(r"ab*bc", caseSensitive: false));
+  res.add(new RegExp(r"ab*?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{0,}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab+?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab+bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{1,}bc", caseSensitive: false));
+  res.add(new RegExp(r"ab+bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{1,}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{1,3}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{3,4}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{4,5}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab??bc", caseSensitive: false));
+  res.add(new RegExp(r"ab{0,1}?bc", caseSensitive: false));
+  res.add(new RegExp(r"ab??bc", caseSensitive: false));
+  res.add(new RegExp(r"ab??c", caseSensitive: false));
+  res.add(new RegExp(r"ab{0,1}?c", caseSensitive: false));
+  res.add(new RegExp(r"^abc$", caseSensitive: false));
+  res.add(new RegExp(r"^abc", caseSensitive: false));
+  res.add(new RegExp(r"^abc$", caseSensitive: false));
+  res.add(new RegExp(r"abc$", caseSensitive: false));
+  res.add(new RegExp(r"^", caseSensitive: false));
+  res.add(new RegExp(r"$", caseSensitive: false));
+  res.add(new RegExp(r"a.c", caseSensitive: false));
+  res.add(new RegExp(r"a.*?c", caseSensitive: false));
+  res.add(new RegExp(r"a.*c", caseSensitive: false));
+  res.add(new RegExp(r"a[bc]d", caseSensitive: false));
+  res.add(new RegExp(r"a[b-d]e", caseSensitive: false));
+  res.add(new RegExp(r"a[b-d]", caseSensitive: false));
+  res.add(new RegExp(r"a[-b]", caseSensitive: false));
+  res.add(new RegExp(r"a[b-]", caseSensitive: false));
+  res.add(new RegExp(r"a]", caseSensitive: false));
+  res.add(new RegExp(r"a[]]b", caseSensitive: false));
+  res.add(new RegExp(r"a[^bc]d", caseSensitive: false));
+  res.add(new RegExp(r"a[^-b]c", caseSensitive: false));
+  res.add(new RegExp(r"a[^]b]c", caseSensitive: false));
+  res.add(new RegExp(r"ab|cd", caseSensitive: false));
+  res.add(new RegExp(r"()ef", caseSensitive: false));
+  res.add(new RegExp(r"$b", caseSensitive: false));
+  res.add(new RegExp(r"a\(b", caseSensitive: false));
+  res.add(new RegExp(r"a\\b", caseSensitive: false));
+  res.add(new RegExp(r"((a))", caseSensitive: false));
+  res.add(new RegExp(r"(a)b(c)", caseSensitive: false));
+  res.add(new RegExp(r"a+b+c", caseSensitive: false));
+  res.add(new RegExp(r"a{1,}b{1,}c", caseSensitive: false));
+  res.add(new RegExp(r"a.+?c", caseSensitive: false));
+  res.add(new RegExp(r"a.*?c", caseSensitive: false));
+  res.add(new RegExp(r"a.{0,5}?c", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b)*", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b){0,}", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b)+", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b){1,}", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b)?", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b){0,1}", caseSensitive: false));
+  res.add(new RegExp(r"(a+|b){0,1}?", caseSensitive: false));
+  res.add(new RegExp(r"[^ab]*", caseSensitive: false));
+  res.add(new RegExp(r"abc", caseSensitive: false));
+  res.add(new RegExp(r"a*", caseSensitive: false));
+  res.add(new RegExp(r"([abc])*d", caseSensitive: false));
+  res.add(new RegExp(r"([abc])*bcd", caseSensitive: false));
+  res.add(new RegExp(r"a|b|c|d|e", caseSensitive: false));
+  res.add(new RegExp(r"(a|b|c|d|e)f", caseSensitive: false));
+  res.add(new RegExp(r"abcd*efg", caseSensitive: false));
+  res.add(new RegExp(r"ab*", caseSensitive: false));
+  res.add(new RegExp(r"(ab|cd)e", caseSensitive: false));
+  res.add(new RegExp(r"[abhgefdc]ij", caseSensitive: false));
+  res.add(new RegExp(r"^(ab|cd)e", caseSensitive: false));
+  res.add(new RegExp(r"(abc|)ef", caseSensitive: false));
+  res.add(new RegExp(r"(a|b)c*d", caseSensitive: false));
+  res.add(new RegExp(r"(ab|ab*)bc", caseSensitive: false));
+  res.add(new RegExp(r"a([bc]*)c*", caseSensitive: false));
+  res.add(new RegExp(r"a([bc]*)(c*d)", caseSensitive: false));
+  res.add(new RegExp(r"a([bc]+)(c*d)", caseSensitive: false));
+  res.add(new RegExp(r"a([bc]*)(c+d)", caseSensitive: false));
+  res.add(new RegExp(r"a[bcd]*dcdcde", caseSensitive: false));
+  res.add(new RegExp(r"a[bcd]+dcdcde", caseSensitive: false));
+  res.add(new RegExp(r"(ab|a)b*c", caseSensitive: false));
+  res.add(new RegExp(r"((a)(b)c)(d)", caseSensitive: false));
+  res.add(new RegExp(r"[a-zA-Z_][a-zA-Z0-9_]*", caseSensitive: false));
+  res.add(new RegExp(r"^a(bc+|b[eh])g|.h$", caseSensitive: false));
+  res.add(new RegExp(r"(bc+d$|ef*g.|h?i(j|k))", caseSensitive: false));
+  res.add(new RegExp(r"((((((((((a))))))))))", caseSensitive: false));
+  res.add(new RegExp(r"(((((((((a)))))))))", caseSensitive: false));
+  res.add(new RegExp(r"(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))", caseSensitive: false));
+  res.add(new RegExp(r"(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))", caseSensitive: false));
+  res.add(new RegExp(r"multiple words of text", caseSensitive: false));
+  res.add(new RegExp(r"multiple words", caseSensitive: false));
+  res.add(new RegExp(r"(.*)c(.*)", caseSensitive: false));
+  res.add(new RegExp(r"\((.*), (.*)\)", caseSensitive: false));
+  res.add(new RegExp(r"[k]", caseSensitive: false));
+  res.add(new RegExp(r"abcd", caseSensitive: false));
+  res.add(new RegExp(r"a(bc)d", caseSensitive: false));
+  res.add(new RegExp(r"a[-]?c", caseSensitive: false));
+  res.add(new RegExp(r"a(?!b)."));
+  res.add(new RegExp(r"a(?=d)."));
+  res.add(new RegExp(r"a(?=c|d)."));
+  res.add(new RegExp(r"a(?:b|c|d)(.)"));
+  res.add(new RegExp(r"a(?:b|c|d)*(.)"));
+  res.add(new RegExp(r"a(?:b|c|d)+?(.)"));
+  res.add(new RegExp(r"a(?:b|c|d)+(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){2}(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){4,5}(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){4,5}?(.)"));
+  res.add(new RegExp(r"((foo)|(bar))*"));
+  res.add(new RegExp(r"a(?:b|c|d){6,7}(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){6,7}?(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){5,6}(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){5,6}?(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){5,7}(.)"));
+  res.add(new RegExp(r"a(?:b|c|d){5,7}?(.)"));
+  res.add(new RegExp(r"a(?:b|(c|e){1,2}?|d)+?(.)"));
+  res.add(new RegExp(r"^(.+)?B"));
+  res.add(new RegExp(r"^([^a-z])|(\^)$"));
+  res.add(new RegExp(r"^[<>]&"));
+  res.add(new RegExp(r"(?:(f)(o)(o)|(b)(a)(r))*"));
+  res.add(new RegExp(r"(?:..)*a"));
+  res.add(new RegExp(r"(?:..)*?a"));
+  res.add(new RegExp(r"^(){3,5}"));
+  res.add(new RegExp(r"^(a+)*ax"));
+  res.add(new RegExp(r"^((a|b)+)*ax"));
+  res.add(new RegExp(r"^((a|bc)+)*ax"));
+  res.add(new RegExp(r"(a|x)*ab"));
+  res.add(new RegExp(r"(a)*ab"));
+  res.add(new RegExp(r"(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))"));
+  res.add(new RegExp(r"(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))"));
+  res.add(new RegExp(r"foo\w*\d{4}baz"));
+  res.add(new RegExp(r"x(~~)*(?:(?:F)?)?"));
+  res.add(new RegExp(r"^a{3}c"));
+  res.add(new RegExp(r"^a{3}c"));
+  res.add(new RegExp(r"^(?:a?b?)*$"));
+  res.add(new RegExp(r"^b"));
+  res.add(new RegExp(r"()^b"));
+  res.add(new RegExp(r"(\w+:)+"));
+  res.add(new RegExp(r"([\w:]+::)?(\w+)$"));
+  res.add(new RegExp(r"^[^bcd]*(c+)"));
+  res.add(new RegExp(r"(a*)b+"));
+  res.add(new RegExp(r"([\w:]+::)?(\w+)$"));
+  res.add(new RegExp(r"^[^bcd]*(c+)"));
+  res.add(new RegExp(r"(>a+)ab"));
+  res.add(new RegExp(r"([[:]+)"));
+  res.add(new RegExp(r"([[=]+)"));
+  res.add(new RegExp(r"([[.]+)"));
+  res.add(new RegExp(r"a\Z"));
+  res.add(new RegExp(r"b\Z"));
+  res.add(new RegExp(r"b\z"));
+  res.add(new RegExp(r"b\Z"));
+  res.add(new RegExp(r"b\z"));
+  res.add(new RegExp(r"((Z)+|A)*"));
+  res.add(new RegExp(r"(Z()|A)*"));
+  res.add(new RegExp(r"(Z(())|A)*"));
+  res.add(new RegExp(r"a*"));
+  res.add(new RegExp(r"^[\d-a]"));
+  res.add(new RegExp(r"[[:space:]]+"));
+  res.add(new RegExp(r"[[:blank:]]+"));
+  res.add(new RegExp(r"[\s]+"));
+  res.add(new RegExp(r"\s+"));
+  res.add(new RegExp(r"ab"));
+  res.add(new RegExp(r"(?!\A)x", multiLine: true));
+  res.add(new RegExp(r"(?!^)x", multiLine: true));
+  res.add(new RegExp(r"abc\Qabc\Eabc"));
+  res.add(new RegExp(r"abc\Qabc\Eabc"));
+  res.add(new RegExp(r"abc\Qliteral\E"));
+  res.add(new RegExp(r"abc\Qliteral"));
+  res.add(new RegExp(r"abc\Qliteral\E"));
+  res.add(new RegExp(r"abc\Qliteral\E"));
+  res.add(new RegExp(r"\Qabc\$xyz\E"));
+  res.add(new RegExp(r"\Qabc\E\$\Qxyz\E"));
+  res.add(new RegExp(r"\Gabc"));
+  res.add(new RegExp(r"\Gabc."));
+  res.add(new RegExp(r"abc."));
+  res.add(new RegExp(r"[z\Qa-d]\E]"));
+  res.add(new RegExp(r"[\z\C]"));
+  res.add(new RegExp(r"\M"));
+  res.add(new RegExp(r"(a+)*b"));
+  res.add(new RegExp(r"line\nbreak"));
+  res.add(new RegExp(r"line\nbreak"));
+  res.add(new RegExp(r"line\nbreak", multiLine: true));
+  res.add(new RegExp(r"1234"));
+  res.add(new RegExp(r"1234"));
+  res.add(new RegExp(r"^", multiLine: true));
+  res.add(new RegExp(r"Content-Type\x3A[^\r\n]{6,}"));
+  res.add(new RegExp(r"Content-Type\x3A[^\r\n]{6,}z"));
+  res.add(new RegExp(r"Content-Type\x3A[^a]{6,}"));
+  res.add(new RegExp(r"Content-Type\x3A[^a]{6,}z"));
+  res.add(new RegExp(r"^abc", multiLine: true));
+  res.add(new RegExp(r"abc$", multiLine: true));
+  res.add(new RegExp(r"^abc", multiLine: true));
+  res.add(new RegExp(r"^abc", multiLine: true));
+  res.add(new RegExp(r"^abc", multiLine: true));
+  res.add(new RegExp(r".*"));
+  res.add(new RegExp(r"\w+(.)(.)?def"));
+  res.add(new RegExp(r"^\w+=.*(\\\n.*)*"));
+  res.add(new RegExp(r"^(a()*)*"));
+  res.add(new RegExp(r"^(?:a(?:(?:))*)*"));
+  res.add(new RegExp(r"^(a()+)+"));
+  res.add(new RegExp(r"^(?:a(?:(?:))+)+"));
+  res.add(new RegExp(r"(a|)*\d"));
+  res.add(new RegExp(r"(?:a|)*\d"));
+  res.add(new RegExp(r"^a.b"));
+  res.add(new RegExp(r"^abc.", multiLine: true));
+  res.add(new RegExp(r"abc.$", multiLine: true));
+  res.add(new RegExp(r"^a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"^a\R*b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R+b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R{1,3}b", caseSensitive: false));
+  res.add(new RegExp(r"^a[\R]b", caseSensitive: false));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r".+foo"));
+  res.add(new RegExp(r"^$", multiLine: true));
+  res.add(new RegExp(r"^X", multiLine: true));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\H{3,4}"));
+  res.add(new RegExp(r".\h{3,4}."));
+  res.add(new RegExp(r"\h*X\h?\H+Y\H?Z"));
+  res.add(new RegExp(r"\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c"));
+  res.add(new RegExp(r".+A"));
+  res.add(new RegExp(r"\nA"));
+  res.add(new RegExp(r"[\r\n]A"));
+  res.add(new RegExp(r"(\r|\n)A"));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R{2,4}b", caseSensitive: false));
+  res.add(new RegExp(r"a\R{2,4}b", caseSensitive: false));
+  res.add(new RegExp(r"a(?!)|\wbc"));
+  res.add(new RegExp(r"a[]b"));
+  res.add(new RegExp(r"a[]+b"));
+  res.add(new RegExp(r"a[^]b"));
+  res.add(new RegExp(r"a[^]+b"));
+  res.add(new RegExp(r" End of testinput7 "));
+  res.add(new RegExp(r"\bX"));
+  res.add(new RegExp(r"\BX"));
+  res.add(new RegExp(r"X\b"));
+  res.add(new RegExp(r"X\B"));
+  res.add(new RegExp(r"[^a]"));
+  res.add(new RegExp(r"abc"));
+  res.add(new RegExp(r"a.b"));
+  res.add(new RegExp(r"a(.{3})b"));
+  res.add(new RegExp(r"a(.*?)(.)"));
+  res.add(new RegExp(r"a(.*?)(.)"));
+  res.add(new RegExp(r"a(.*)(.)"));
+  res.add(new RegExp(r"a(.*)(.)"));
+  res.add(new RegExp(r"a(.)(.)"));
+  res.add(new RegExp(r"a(.)(.)"));
+  res.add(new RegExp(r"a(.?)(.)"));
+  res.add(new RegExp(r"a(.?)(.)"));
+  res.add(new RegExp(r"a(.??)(.)"));
+  res.add(new RegExp(r"a(.??)(.)"));
+  res.add(new RegExp(r"a(.{3})b"));
+  res.add(new RegExp(r"a(.{3,})b"));
+  res.add(new RegExp(r"a(.{3,}?)b"));
+  res.add(new RegExp(r"a(.{3,5})b"));
+  res.add(new RegExp(r"a(.{3,5}?)b"));
+  res.add(new RegExp(r"[^a]+"));
+  res.add(new RegExp(r"^[^a]{2}"));
+  res.add(new RegExp(r"^[^a]{2,}"));
+  res.add(new RegExp(r"^[^a]{2,}?"));
+  res.add(new RegExp(r"[^a]+", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2}", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2,}", caseSensitive: false));
+  res.add(new RegExp(r"^[^a]{2,}?", caseSensitive: false));
+  res.add(new RegExp(r"\D*"));
+  res.add(new RegExp(r"\D*"));
+  res.add(new RegExp(r"\D"));
+  res.add(new RegExp(r">\S"));
+  res.add(new RegExp(r"\d"));
+  res.add(new RegExp(r"\s"));
+  res.add(new RegExp(r"\D+"));
+  res.add(new RegExp(r"\D{2,3}"));
+  res.add(new RegExp(r"\D{2,3}?"));
+  res.add(new RegExp(r"\d+"));
+  res.add(new RegExp(r"\d{2,3}"));
+  res.add(new RegExp(r"\d{2,3}?"));
+  res.add(new RegExp(r"\S+"));
+  res.add(new RegExp(r"\S{2,3}"));
+  res.add(new RegExp(r"\S{2,3}?"));
+  res.add(new RegExp(r">\s+<"));
+  res.add(new RegExp(r">\s{2,3}<"));
+  res.add(new RegExp(r">\s{2,3}?<"));
+  res.add(new RegExp(r"\w+"));
+  res.add(new RegExp(r"\w{2,3}"));
+  res.add(new RegExp(r"\w{2,3}?"));
+  res.add(new RegExp(r"\W+"));
+  res.add(new RegExp(r"\W{2,3}"));
+  res.add(new RegExp(r"\W{2,3}?"));
+  res.add(new RegExp(r"[\xFF]"));
+  res.add(new RegExp(r"[\xff]"));
+  res.add(new RegExp(r"[^\xFF]"));
+  res.add(new RegExp(r"[^\xff]"));
+  res.add(new RegExp(r"^[ac]*b"));
+  res.add(new RegExp(r"^[^x]*b", caseSensitive: false));
+  res.add(new RegExp(r"^[^x]*b"));
+  res.add(new RegExp(r"^\d*b"));
+  res.add(new RegExp(r"(|a)"));
+  res.add(new RegExp(r"^abc.", multiLine: true));
+  res.add(new RegExp(r"abc.$", multiLine: true));
+  res.add(new RegExp(r"^a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"^a\R*b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R+b", caseSensitive: false));
+  res.add(new RegExp(r"^a\R{1,3}b", caseSensitive: false));
+  res.add(new RegExp(r"\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\V?\v{3,4}"));
+  res.add(new RegExp(r"\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\V?\v{3,4}"));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"\H\h\V\v"));
+  res.add(new RegExp(r"\H*\h+\V?\v{3,4}"));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\Rb", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"a\R?b", caseSensitive: false));
+  res.add(new RegExp(r"X"));
+  res.add(new RegExp(r" End of testinput 8 "));
+  res.add(new RegExp(r"\pL\P{Nd}"));
+  res.add(new RegExp(r"\X."));
+  res.add(new RegExp(r"\X\X"));
+  res.add(new RegExp(r"^\pL+"));
+  res.add(new RegExp(r"^\PL+"));
+  res.add(new RegExp(r"^\X+"));
+  res.add(new RegExp(r"\X?abc"));
+  res.add(new RegExp(r"^\X?abc"));
+  res.add(new RegExp(r"\X*abc"));
+  res.add(new RegExp(r"^\X*abc"));
+  res.add(new RegExp(r"^\pL?=."));
+  res.add(new RegExp(r"^\pL*=."));
+  res.add(new RegExp(r"^\X{2,3}X"));
+  res.add(new RegExp(r"^\pC\pL\pM\pN\pP\pS\pZ<"));
+  res.add(new RegExp(r"^\PC"));
+  res.add(new RegExp(r"^\PL"));
+  res.add(new RegExp(r"^\PM"));
+  res.add(new RegExp(r"^\PN"));
+  res.add(new RegExp(r"^\PP"));
+  res.add(new RegExp(r"^\PS"));
+  res.add(new RegExp(r"^\PZ"));
+  res.add(new RegExp(r"^\p{Cc}"));
+  res.add(new RegExp(r"^\p{Cf}"));
+  res.add(new RegExp(r"^\p{Cn}"));
+  res.add(new RegExp(r"^\p{Co}"));
+  res.add(new RegExp(r"^\p{Cs}"));
+  res.add(new RegExp(r"^\p{Ll}"));
+  res.add(new RegExp(r"^\p{Lm}"));
+  res.add(new RegExp(r"^\p{Lo}"));
+  res.add(new RegExp(r"^\p{Lt}"));
+  res.add(new RegExp(r"^\p{Lu}"));
+  res.add(new RegExp(r"^\p{Mc}"));
+  res.add(new RegExp(r"^\p{Me}"));
+  res.add(new RegExp(r"^\p{Mn}"));
+  res.add(new RegExp(r"^\p{Nl}"));
+  res.add(new RegExp(r"^\p{No}"));
+  res.add(new RegExp(r"^\p{Pc}"));
+  res.add(new RegExp(r"^\p{Pd}"));
+  res.add(new RegExp(r"^\p{Pe}"));
+  res.add(new RegExp(r"^\p{Pf}"));
+  res.add(new RegExp(r"^\p{Pi}"));
+  res.add(new RegExp(r"^\p{Po}"));
+  res.add(new RegExp(r"^\p{Ps}"));
+  res.add(new RegExp(r"^\p{Sk}"));
+  res.add(new RegExp(r"^\p{So}"));
+  res.add(new RegExp(r"^\p{Zl}"));
+  res.add(new RegExp(r"^\p{Zp}"));
+  res.add(new RegExp(r"^\p{Zs}"));
+  res.add(new RegExp(r"\p{Nd}{2,}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,}?(..)"));
+  res.add(new RegExp(r"\p{Nd}*(..)"));
+  res.add(new RegExp(r"\p{Nd}*?(..)"));
+  res.add(new RegExp(r"\p{Nd}{2}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,3}(..)"));
+  res.add(new RegExp(r"\p{Nd}{2,3}?(..)"));
+  res.add(new RegExp(r"\p{Nd}?(..)"));
+  res.add(new RegExp(r"\p{Nd}??(..)"));
+  res.add(new RegExp(r"\p{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\p{^Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\P{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"[\p{Nd}]"));
+  res.add(new RegExp(r"[\P{Nd}]+"));
+  res.add(new RegExp(r"\D+"));
+  res.add(new RegExp(r"[\D]+"));
+  res.add(new RegExp(r"[\P{Nd}]+"));
+  res.add(new RegExp(r"[\D\P{Nd}]+"));
+  res.add(new RegExp(r"\pL"));
+  res.add(new RegExp(r"\pL", caseSensitive: false));
+  res.add(new RegExp(r"\p{Lu}"));
+  res.add(new RegExp(r"\p{Lu}", caseSensitive: false));
+  res.add(new RegExp(r"\p{Ll}"));
+  res.add(new RegExp(r"\p{Ll}", caseSensitive: false));
+  res.add(new RegExp(r"^\X"));
+  res.add(new RegExp(r"^[\X]"));
+  res.add(new RegExp(r"^(\X*)C"));
+  res.add(new RegExp(r"^(\X*?)C"));
+  res.add(new RegExp(r"^(\X*)(.)"));
+  res.add(new RegExp(r"^(\X*?)(.)"));
+  res.add(new RegExp(r"^\X(.)"));
+  res.add(new RegExp(r"^\X{2,3}(.)"));
+  res.add(new RegExp(r"^\X{2,3}?(.)"));
+  res.add(new RegExp(r"^\pN{2,3}X"));
+  res.add(new RegExp(r"^[\p{Arabic}]"));
+  res.add(new RegExp(r"^[\P{Yi}]"));
+  res.add(new RegExp(r"^\p{Any}X"));
+  res.add(new RegExp(r"^\P{Any}X"));
+  res.add(new RegExp(r"^\p{Any}?X"));
+  res.add(new RegExp(r"^\P{Any}?X"));
+  res.add(new RegExp(r"^\p{Any}*X"));
+  res.add(new RegExp(r"^\P{Any}*X"));
+  res.add(new RegExp(r"^[\p{Any}]X"));
+  res.add(new RegExp(r"^[\P{Any}]X"));
+  res.add(new RegExp(r"^[\p{Any}]?X"));
+  res.add(new RegExp(r"^[\P{Any}]?X"));
+  res.add(new RegExp(r"^[\p{Any}]+X"));
+  res.add(new RegExp(r"^[\P{Any}]+X"));
+  res.add(new RegExp(r"^[\p{Any}]*X"));
+  res.add(new RegExp(r"^[\P{Any}]*X"));
+  res.add(new RegExp(r"^\p{Any}{3,5}?"));
+  res.add(new RegExp(r"^\p{Any}{3,5}"));
+  res.add(new RegExp(r"^\P{Any}{3,5}?"));
+  res.add(new RegExp(r"^\p{L&}X"));
+  res.add(new RegExp(r"^[\p{L&}]X"));
+  res.add(new RegExp(r"^[\p{L&}]+X"));
+  res.add(new RegExp(r"^[\p{L&}]+?X"));
+  res.add(new RegExp(r"^\P{L&}X"));
+  res.add(new RegExp(r"^[\P{L&}]X"));
+  res.add(new RegExp(r"Check property support in non-UTF-8 mode"));
+  res.add(new RegExp(r"\p{L}{4}"));
+  res.add(new RegExp(r"\p{Carian}\p{Cham}\p{Kayah_Li}\p{Lepcha}\p{Lycian}\p{Lydian}\p{Ol_Chiki}\p{Rejang}\p{Saurashtra}\p{Sundanese}\p{Vai}"));
+  res.add(new RegExp(r" End "));
+  res.add(new RegExp(r"^[[:alnum:]]", multiLine: true));
+  res.add(new RegExp(r"a", multiLine: true, caseSensitive: false));
+  res.add(new RegExp(r"abcde", multiLine: true));
+  res.add(new RegExp(r"\x80", multiLine: true));
+  res.add(new RegExp(r"\xff", multiLine: true));
+  res.add(new RegExp(r"[\p{L}]", multiLine: true));
+  res.add(new RegExp(r"[\p{^L}]", multiLine: true));
+  res.add(new RegExp(r"[\P{L}]", multiLine: true));
+  res.add(new RegExp(r"[\P{^L}]", multiLine: true));
+  res.add(new RegExp(r"[\p{Nd}]", multiLine: true));
+  res.add(new RegExp(r"[a]", multiLine: true));
+  res.add(new RegExp(r"[a]", multiLine: true));
+  res.add(new RegExp(r"[\xaa]", multiLine: true));
+  res.add(new RegExp(r"[\xaa]", multiLine: true));
+  res.add(new RegExp(r"[^a]", multiLine: true));
+  res.add(new RegExp(r"[^a]", multiLine: true));
+  res.add(new RegExp(r"[^\xaa]", multiLine: true));
+  res.add(new RegExp(r"[^\xaa]", multiLine: true));
+  res.add(new RegExp(r" End of testinput10 "));
+  assertToStringEquals("abc", res[1].firstMatch("abc"), 0);
+  assertToStringEquals("abc", res[1].firstMatch("defabc"), 1);
+  assertToStringEquals("abc", res[1].firstMatch("Aabc"), 2);
+  assertNull(res[1].firstMatch("*** Failers"), 3);
+  assertToStringEquals("abc", res[1].firstMatch("Adefabc"), 4);
+  assertToStringEquals("ABC", res[1].firstMatch("ABC"), 5);
+  assertToStringEquals("abc", res[2].firstMatch("abc"), 6);
+  assertNull(res[2].firstMatch("Aabc"), 7);
+  assertNull(res[2].firstMatch("*** Failers"), 8);
+  assertNull(res[2].firstMatch("defabc"), 9);
+  assertNull(res[2].firstMatch("Adefabc"), 10);
+  assertToStringEquals("abc", res[7].firstMatch("abc"), 11);
+  assertNull(res[7].firstMatch("*** Failers"), 12);
+  assertNull(res[7].firstMatch("def\nabc"), 13);
+  assertThrows(() => new RegExp(r"x{5,4}"));
+  assertThrows(() => new RegExp(r"[abcd"));
+  assertThrows(() => new RegExp(r"[z-a]"));
+  assertThrows(() => new RegExp(r"^*"));
+  assertThrows(() => new RegExp(r"(abc"));
+  assertThrows(() => new RegExp(r"(?# abc"));
+  assertToStringEquals("cat", res[11].firstMatch("this sentence eventually mentions a cat"), 20);
+  assertToStringEquals("elephant", res[11].firstMatch("this sentences rambles on and on for a while and then reaches elephant"), 21);
+  assertToStringEquals("cat", res[12].firstMatch("this sentence eventually mentions a cat"), 22);
+  assertToStringEquals("elephant", res[12].firstMatch("this sentences rambles on and on for a while and then reaches elephant"), 23);
+  assertToStringEquals("CAT", res[13].firstMatch("this sentence eventually mentions a CAT cat"), 24);
+  assertToStringEquals("elephant", res[13].firstMatch("this sentences rambles on and on for a while to elephant ElePhant"), 25);
+  assertThrows(() => new RegExp(r"{4,5}abc"));
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("abcb"), 27);
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("O0abcb"), 28);
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("O3abcb"), 29);
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("O6abcb"), 30);
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("O9abcb"), 31);
+  assertToStringEquals("abcb,a,b,c", res[18].firstMatch("O12abcb"), 32);
+  assertToStringEquals("abc,a,,", res[19].firstMatch("abc"), 33);
+  assertToStringEquals("abc,a,,", res[19].firstMatch("O0abc"), 34);
+  assertToStringEquals("abc,a,,", res[19].firstMatch("O3abc"), 35);
+  assertToStringEquals("abc,a,,", res[19].firstMatch("O6abc"), 36);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("aba"), 37);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("O0aba"), 38);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("O3aba"), 39);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("O6aba"), 40);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("O9aba"), 41);
+  assertToStringEquals("aba,,a,b", res[19].firstMatch("O12aba"), 42);
+  assertToStringEquals("abc", res[20].firstMatch("abc"), 43);
+  assertNull(res[20].firstMatch("*** Failers"), 44);
+  assertNull(res[20].firstMatch("abc\n"), 45);
+  assertNull(res[20].firstMatch("abc\ndef"), 46);
+  assertToStringEquals("the quick brown fox", res[22].firstMatch("the quick brown fox"), 47);
+  assertToStringEquals("the quick brown fox", res[22].firstMatch("this is a line with the quick brown fox"), 48);
+  assertToStringEquals("abc", res[23].firstMatch("abcdef"), 49);
+  assertToStringEquals("abc", res[23].firstMatch("abcdefB"), 50);
+  assertToStringEquals("defabc,abc,abc,", res[24].firstMatch("defabc"), 51);
+  assertToStringEquals("Zdefabc,abc,abc,", res[24].firstMatch("Zdefabc"), 52);
+  assertToStringEquals("abc", res[25].firstMatch("abc"), 53);
+  assertNull(res[25].firstMatch("*** Failers"), 54);
+  assertToStringEquals("abc", res[26].firstMatch("abcdef"), 55);
+  assertToStringEquals("abc", res[26].firstMatch("abcdefB"), 56);
+  assertToStringEquals("defabc,abc,abc,", res[27].firstMatch("defabc"), 57);
+  assertToStringEquals("Zdefabc,abc,abc,", res[27].firstMatch("Zdefabc"), 58);
+  assertToStringEquals("the quick brown fox", res[28].firstMatch("the quick brown fox"), 59);
+  assertNull(res[28].firstMatch("*** Failers"), 60);
+  assertToStringEquals("The Quick Brown Fox", res[28].firstMatch("The Quick Brown Fox"), 61);
+  assertToStringEquals("the quick brown fox", res[29].firstMatch("the quick brown fox"), 62);
+  assertToStringEquals("The Quick Brown Fox", res[29].firstMatch("The Quick Brown Fox"), 63);
+  assertNull(res[30].firstMatch("*** Failers"), 64);
+  assertNull(res[30].firstMatch("abc\ndef"), 65);
+  assertToStringEquals("abc", res[31].firstMatch("abc"), 66);
+  assertNull(res[31].firstMatch("abc\n"), 67);
+  assertToStringEquals("abc,abc", res[33].firstMatch("abc"), 68);
+  assertThrows(() => new RegExp(r")"));
+  assertToStringEquals("-pr", res[35].firstMatch("co-processors, and for"), 70);
+  assertToStringEquals("<def>ghi<klm>", res[36].firstMatch("abc<def>ghi<klm>nop"), 71);
+  assertToStringEquals("<def>", res[37].firstMatch("abc<def>ghi<klm>nop"), 72);
+  assertToStringEquals("<def>", res[37].firstMatch("abc<def>ghi<klm>nop"), 73);
+  assertNull(res[37].firstMatch("abc========def"), 74);
+  assertNull(res[37].firstMatch("foo"), 75);
+  assertNull(res[37].firstMatch("catfoo"), 76);
+  assertNull(res[37].firstMatch("*** Failers"), 77);
+  assertNull(res[37].firstMatch("the barfoo"), 78);
+  assertNull(res[37].firstMatch("and cattlefoo"), 79);
+  assertToStringEquals("a", res[40].firstMatch("a"), 80);
+  assertNull(res[40].firstMatch("a\n"), 81);
+  assertNull(res[40].firstMatch("*** Failers"), 82);
+  assertToStringEquals("a", res[40].firstMatch("Za"), 83);
+  assertNull(res[40].firstMatch("Za\n"), 84);
+  assertToStringEquals("a", res[41].firstMatch("a"), 85);
+  assertToStringEquals("a", res[41].firstMatch("a\n"), 86);
+  assertToStringEquals("a", res[41].firstMatch("Za\n"), 87);
+  assertNull(res[41].firstMatch("*** Failers"), 88);
+  assertToStringEquals("a", res[41].firstMatch("Za"), 89);
+  assertToStringEquals("b", res[44].firstMatch("foo\nbarbar"), 90);
+  assertToStringEquals("a", res[44].firstMatch("***Failers"), 91);
+  assertToStringEquals("b", res[44].firstMatch("rhubarb"), 92);
+  assertToStringEquals("b", res[44].firstMatch("barbell"), 93);
+  assertToStringEquals("a", res[44].firstMatch("abc\nbarton"), 94);
+  assertToStringEquals("b", res[44].firstMatch("foo\nbarbar"), 95);
+  assertToStringEquals("a", res[44].firstMatch("***Failers"), 96);
+  assertToStringEquals("b", res[44].firstMatch("rhubarb"), 97);
+  assertToStringEquals("b", res[44].firstMatch("barbell"), 98);
+  assertToStringEquals("a", res[44].firstMatch("abc\nbarton"), 99);
+  assertToStringEquals("a", res[44].firstMatch("abc"), 100);
+  assertToStringEquals("a", res[44].firstMatch("def\nabc"), 101);
+  assertToStringEquals("a", res[44].firstMatch("*** Failers"), 102);
+  assertToStringEquals("a", res[44].firstMatch("defabc"), 103);
+  assertNull(res[45].firstMatch("the bullock-cart"), 104);
+  assertNull(res[45].firstMatch("a donkey-cart race"), 105);
+  assertNull(res[45].firstMatch("*** Failers"), 106);
+  assertNull(res[45].firstMatch("cart"), 107);
+  assertNull(res[45].firstMatch("horse-and-cart"), 108);
+  assertNull(res[45].firstMatch("alphabetabcd"), 109);
+  assertNull(res[45].firstMatch("endingxyz"), 110);
+  assertNull(res[45].firstMatch("abxyZZ"), 111);
+  assertNull(res[45].firstMatch("abXyZZ"), 112);
+  assertNull(res[45].firstMatch("ZZZ"), 113);
+  assertNull(res[45].firstMatch("zZZ"), 114);
+  assertNull(res[45].firstMatch("bZZ"), 115);
+  assertNull(res[45].firstMatch("BZZ"), 116);
+  assertNull(res[45].firstMatch("*** Failers"), 117);
+  assertNull(res[45].firstMatch("ZZ"), 118);
+  assertNull(res[45].firstMatch("abXYZZ"), 119);
+  assertNull(res[45].firstMatch("zzz"), 120);
+  assertNull(res[45].firstMatch("bzz"), 121);
+  assertNull(res[45].firstMatch("bar"), 122);
+  assertNull(res[45].firstMatch("foobbar"), 123);
+  assertNull(res[45].firstMatch("*** Failers"), 124);
+  assertNull(res[45].firstMatch("fooabar"), 125);
+  assertNull(res[46].firstMatch("*** Failers"), 126);
+  assertNull(res[46].firstMatch("a"), 127);
+  assertNull(res[48].firstMatch("aaaaaa"), 128);
+  assertThrows(() => new RegExp(r"a[b-a]"), 129);
+  assertThrows(() => new RegExp(r"a["), 130);
+  assertThrows(() => new RegExp(r"*a"), 131);
+  assertThrows(() => new RegExp(r"abc)"), 132);
+  assertThrows(() => new RegExp(r"(abc"), 133);
+  assertThrows(() => new RegExp(r"a**"), 134);
+  assertThrows(() => new RegExp(r")("), 135);
+  assertThrows(() => new RegExp(r"a[b-a]"), 136);
+  assertThrows(() => new RegExp(r"a["), 137);
+  assertThrows(() => new RegExp(r"*a"), 138);
+  assertThrows(() => new RegExp(r"abc)"), 139);
+  assertThrows(() => new RegExp(r"(abc"), 140);
+  assertThrows(() => new RegExp(r"a**"), 141);
+  assertThrows(() => new RegExp(r")("), 142);
+  assertThrows(() => new RegExp(r":(?:"), 143);
+  assertThrows(() => new RegExp(r"a(?{)b"), 144);
+  assertThrows(() => new RegExp(r"a(?{{})b"), 145);
+  assertThrows(() => new RegExp(r"a(?{}})b"), 146);
+  assertThrows(() => new RegExp(r'a(?{\"{\"})b'), 147);
+  assertThrows(() => new RegExp(r'a(?{\"{\"}})b'), 148);
+  assertThrows(() => new RegExp(r"[a[:xyz:"), 149);
+  assertThrows(() => new RegExp(r"a{37,17}"), 150);
+  assertToStringEquals("abcd,a,d", res[58].firstMatch("abcd"), 151);
+  assertToStringEquals("abcd,a,d", res[58].firstMatch("abcdC2"), 152);
+  assertToStringEquals("abcd,a,d", res[58].firstMatch("abcdC5"), 153);
+  assertToStringEquals("abcdefghijklmnopqrst,abcdefghijklmnopqrst", res[59].firstMatch("abcdefghijklmnopqrstuvwxyz"), 154);
+  assertToStringEquals("abcdefghijklmnopqrst,abcdefghijklmnopqrst", res[59].firstMatch("abcdefghijklmnopqrstuvwxyzC1"), 155);
+  assertToStringEquals("abcdefghijklmnopqrst,abcdefghijklmnopqrst", res[59].firstMatch("abcdefghijklmnopqrstuvwxyzG1"), 156);
+  assertToStringEquals("abcdefghijklmno,abcdefghijklmno", res[60].firstMatch("abcdefghijklmnopqrstuvwxyz"), 157);
+  assertToStringEquals("abcdefghijklmno,abcdefghijklmno", res[60].firstMatch("abcdefghijklmnopqrstuvwxyzC1G1"), 158);
+  assertToStringEquals("abcdefghijklmnop,abcdefghijklmnop", res[61].firstMatch("abcdefghijklmnopqrstuvwxyz"), 159);
+  assertToStringEquals("abcdefghijklmnop,abcdefghijklmnop", res[61].firstMatch("abcdefghijklmnopqrstuvwxyzC1G1L"), 160);
+  assertToStringEquals("adef,a,,f", res[62].firstMatch("adefG1G2G3G4L"), 161);
+  assertToStringEquals("bcdef,bc,bc,f", res[62].firstMatch("bcdefG1G2G3G4L"), 162);
+  assertToStringEquals("adef,a,,f", res[62].firstMatch("adefghijkC0"), 163);
+  assertToStringEquals("abc\x00def", res[63].firstMatch("abc\x00defLC0"), 164);
+  assertToStringEquals("iss", res[69].firstMatch("Mississippi"), 165);
+  assertToStringEquals("iss", res[70].firstMatch("Mississippi"), 166);
+  assertToStringEquals("iss", res[71].firstMatch("Mississippi"), 167);
+  assertToStringEquals("iss", res[72].firstMatch("Mississippi"), 168);
+  assertToStringEquals("iss", res[73].firstMatch("Mississippi"), 169);
+  assertNull(res[73].firstMatch("*** Failers"), 170);
+  assertToStringEquals("iss", res[73].firstMatch("MississippiA"), 171);
+  assertToStringEquals("iss", res[73].firstMatch("Mississippi"), 172);
+  assertToStringEquals("iss", res[74].firstMatch("ississippi"), 174);
+  assertToStringEquals("abciss", res[75].firstMatch("abciss\nxyzisspqr"), 175);
+  assertToStringEquals("Mis", res[76].firstMatch("Mississippi"), 176);
+  assertToStringEquals("Mis", res[77].firstMatch("Mississippi"), 180);
+  assertToStringEquals("ab\n", res[78].firstMatch("ab\nab\ncd"), 181);
+  assertToStringEquals("ab\n", res[79].firstMatch("ab\nab\ncd"), 182);
+  assertToStringEquals("a", res[115].firstMatch("a"), 183);
+  assertToStringEquals("b", res[115].firstMatch("b"), 184);
+  assertToStringEquals("ab", res[115].firstMatch("ab"), 185);
+  assertToStringEquals("", res[115].firstMatch("\\"), 186);
+  assertToStringEquals("", res[115].firstMatch("*** Failers"), 187);
+  assertToStringEquals("", res[115].firstMatch("N"), 188);
+  assertToStringEquals("", res[116].firstMatch("abcd"), 189);
+  assertToStringEquals("", res[116].firstMatch("-abc"), 190);
+  assertToStringEquals("", res[116].firstMatch("Nab-c"), 191);
+  assertToStringEquals("", res[116].firstMatch("*** Failers"), 192);
+  assertToStringEquals("", res[116].firstMatch("Nabc"), 193);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzz"), 194);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO0"), 195);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO1"), 196);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO2"), 197);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO3"), 198);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO4"), 199);
+  assertToStringEquals("aaaabbbbzz,bbbb,z,z", res[117].firstMatch("aaaabbbbzzzzO5"), 200);
+  assertToStringEquals("(abcd", res[118].firstMatch("(abcd)"), 201);
+  assertToStringEquals("(abcd", res[118].firstMatch("(abcd)xyz"), 202);
+  assertNull(res[118].firstMatch("xyz(abcd)"), 203);
+  assertNull(res[118].firstMatch("(ab(xy)cd)pqr"), 204);
+  assertNull(res[118].firstMatch("(ab(xycd)pqr"), 205);
+  assertNull(res[118].firstMatch("() abc ()"), 206);
+  assertNull(res[118].firstMatch("12(abcde(fsh)xyz(foo(bar))lmno)89"), 207);
+  assertNull(res[118].firstMatch("*** Failers"), 208);
+  assertToStringEquals("abcd", res[118].firstMatch("abcd"), 209);
+  assertToStringEquals("abcd", res[118].firstMatch("abcd)"), 210);
+  assertToStringEquals("(abcd", res[118].firstMatch("(abcd"), 211);
+  assertNull(res[118].firstMatch("(ab(xy)cd)pqr"), 212);
+  assertNull(res[118].firstMatch("1(abcd)(x(y)z)pqr"), 213);
+  assertToStringEquals("(abcd", res[118].firstMatch("(abcd)"), 214);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 215);
+  assertNull(res[118].firstMatch("(a(b(c)d)e)"), 216);
+  assertNull(res[118].firstMatch("((ab))"), 217);
+  assertNull(res[118].firstMatch("*** Failers"), 218);
+  assertNull(res[118].firstMatch("()"), 219);
+  assertNull(res[118].firstMatch("()"), 220);
+  assertNull(res[118].firstMatch("12(abcde(fsh)xyz(foo(bar))lmno)89"), 221);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 222);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 223);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 224);
+  assertNull(res[118].firstMatch("(123ab(xy)cd)"), 225);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 226);
+  assertNull(res[118].firstMatch("(123ab(xy)cd)"), 227);
+  assertNull(res[118].firstMatch("(ab(xy)cd)"), 228);
+  assertToStringEquals("(abcd", res[118].firstMatch("(abcd(xyz<p>qrs)123)"), 229);
+  assertNull(res[118].firstMatch("(ab(cd)ef)"), 230);
+  assertNull(res[118].firstMatch("(ab(cd(ef)gh)ij)"), 231);
+  assertNull(res[146].firstMatch("A"), 232);
+  assertNull(res[146].firstMatch("a"), 233);
+  assertNull(res[147].firstMatch("A"), 234);
+  assertNull(res[147].firstMatch("a"), 235);
+  assertNull(res[147].firstMatch("ab"), 236);
+  assertNull(res[147].firstMatch("aB"), 237);
+  assertNull(res[147].firstMatch("*** Failers"), 238);
+  assertNull(res[147].firstMatch("Ab"), 239);
+  assertNull(res[147].firstMatch("AB"), 240);
+  assertThrows(() => new RegExp(r"[\200-\110]"), 241);
+  // TODO(jgruber): Reintegrate stack-overflow2_test.dart once it passes.
+  assertToStringEquals("mainmain,main,", res[151].firstMatch("mainmain"), 243);
+  assertToStringEquals("mainOmain,main,", res[151].firstMatch("mainOmain"), 244);
+  assertToStringEquals("aba,a,", res[153].firstMatch("aba"), 245);
+  assertToStringEquals("aabbaa,aa,", res[154].firstMatch("aabbaa"), 246);
+  assertToStringEquals("aabbaa,aa,", res[155].firstMatch("aabbaa"), 247);
+  assertToStringEquals("aabbaa,aa,", res[156].firstMatch("aabbaa"), 248);
+  assertToStringEquals("aabbaa,", res[157].firstMatch("aabbaa"), 249);
+  assertToStringEquals("aabbaa,aa,,", res[158].firstMatch("aabbaa"), 250);
+  assertToStringEquals("aabbaa,,", res[159].firstMatch("aabbaa"), 251);
+  assertToStringEquals("aabbaa,", res[160].firstMatch("aabbaa"), 252);
+  assertToStringEquals("aabbbaa,", res[161].firstMatch("aabbbaa"), 253);
+  assertToStringEquals("aabbbaa,", res[162].firstMatch("aabbbaa"), 254);
+  assertToStringEquals("aabbaa,", res[163].firstMatch("aabbaa"), 255);
+  assertToStringEquals("aabbbaa,", res[164].firstMatch("aabbbaa"), 256);
+  assertToStringEquals("aabbbaa,aa,,", res[165].firstMatch("aabbbaa"), 257);
+  assertToStringEquals("aabbbbaa,aa,,", res[166].firstMatch("aabbbbaa"), 258);
+  // Dart does not have RegExp literals and thus no translatation of the below.
+  // assertThrows("var re = //;", 259);
+  assertToStringEquals("a", res[169].firstMatch("ab"), 260);
+  assertToStringEquals("a", res[169].firstMatch("aB"), 261);
+  assertToStringEquals("*", res[169].firstMatch("*** Failers"), 262);
+  assertToStringEquals("A", res[169].firstMatch("AB"), 263);
+  assertToStringEquals("a", res[169].firstMatch("ab"), 264);
+  assertToStringEquals("a", res[169].firstMatch("aB"), 265);
+  assertToStringEquals("*", res[169].firstMatch("*** Failers"), 266);
+  assertToStringEquals("A", res[169].firstMatch("AB"), 267);
+  assertNull(res[172].firstMatch("\\"), 268);
+  assertNull(res[177].firstMatch("*** Failers"), 269);
+  assertNull(res[177].firstMatch("xxxxx"), 270);
+  assertNull(res[177].firstMatch("now is the time for all good men to come to the aid of the party"), 271);
+  assertNull(res[177].firstMatch("*** Failers"), 272);
+  assertNull(res[177].firstMatch("this is not a line with only words and spaces!"), 273);
+  assertNull(res[177].firstMatch("12345a"), 274);
+  assertNull(res[177].firstMatch("*** Failers"), 275);
+  assertNull(res[177].firstMatch("12345+"), 276);
+  assertNull(res[177].firstMatch("aaab"), 277);
+  assertNull(res[177].firstMatch("aaab"), 278);
+  assertNull(res[177].firstMatch("aaab"), 279);
+  assertNull(res[177].firstMatch("((abc(ade)ufh()()x"), 280);
+  assertNull(res[177].firstMatch("(abc)"), 281);
+  assertNull(res[177].firstMatch("(abc(def)xyz)"), 282);
+  assertNull(res[177].firstMatch("*** Failers"), 283);
+  assertNull(res[177].firstMatch("((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 284);
+  assertNull(res[177].firstMatch("xaaaab"), 285);
+  assertNull(res[177].firstMatch("xaaaab"), 286);
+  assertThrows(() => new RegExp(r"["), 287);
+  assertThrows(() => new RegExp(r"[a-"), 288);
+  assertNull(res[189].firstMatch("<>"), 289);
+  assertNull(res[189].firstMatch("<abcd>"), 290);
+  assertNull(res[189].firstMatch("<abc <123> hij>"), 291);
+  assertNull(res[189].firstMatch("<abc <def> hij>"), 292);
+  assertNull(res[189].firstMatch("<abc<>def>"), 293);
+  assertNull(res[189].firstMatch("<abc<>"), 294);
+  assertNull(res[189].firstMatch("*** Failers"), 295);
+  assertNull(res[189].firstMatch("<abc"), 296);
+  assertToStringEquals("bc123bc,bc,bc", res[195].firstMatch("abc123bc"), 297);
+  assertToStringEquals("abc", res[215].firstMatch("abcdef"), 298);
+  assertToStringEquals("abc", res[215].firstMatch("1234abcdef"), 299);
+  assertNull(res[215].firstMatch("*** Failers"), 300);
+  assertToStringEquals("abc", res[215].firstMatch("abcxyz"), 301);
+  assertToStringEquals("abc", res[215].firstMatch("abcxyzf"), 302);
+  assertToStringEquals("abc", res[215].firstMatch("123abcdef"), 303);
+  assertToStringEquals("abc", res[215].firstMatch("1234abcdef"), 304);
+  assertNull(res[215].firstMatch("*** Failers"), 305);
+  assertToStringEquals("abc", res[215].firstMatch("abcdef"), 306);
+  assertNull(res[215].firstMatch("*** Failers"), 307);
+  assertToStringEquals("abc", res[215].firstMatch("\x83x0abcdef"), 308);
+  assertToStringEquals("abc", res[215].firstMatch("123abcdef"), 309);
+  assertToStringEquals("abc", res[215].firstMatch("123abcdefC+"), 310);
+  assertToStringEquals("abc", res[215].firstMatch("123abcdefC-"), 311);
+  assertNull(res[215].firstMatch("*** Failers"), 312);
+  assertToStringEquals("abc", res[215].firstMatch("123abcdefC!1"), 313);
+  assertToStringEquals("abc", res[215].firstMatch("abcabcabc"), 314);
+  assertToStringEquals("abc", res[215].firstMatch("abcabcC!1!3"), 315);
+  assertNull(res[215].firstMatch("*** Failers"), 316);
+  assertToStringEquals("abc", res[215].firstMatch("abcabcabcC!1!3"), 317);
+  assertToStringEquals("C", res[215].firstMatch("123C+"), 318);
+  assertToStringEquals("C", res[215].firstMatch("123456C+"), 319);
+  assertToStringEquals("C", res[215].firstMatch("123456789C+"), 320);
+  assertToStringEquals("abc", res[215].firstMatch("xyzabcC+"), 321);
+  assertToStringEquals("abc", res[215].firstMatch("XxyzabcC+"), 322);
+  assertToStringEquals("abc", res[215].firstMatch("abcdefC+"), 323);
+  assertToStringEquals("abc", res[215].firstMatch("abcxyzC+"), 324);
+  assertToStringEquals("c", res[215].firstMatch("abbbbbcccC*1"), 325);
+  assertToStringEquals("c", res[215].firstMatch("abbbbbcccC*1"), 326);
+  assertNull(res[215].firstMatch("xab"), 327);
+  assertToStringEquals("c", res[215].firstMatch("xbc"), 328);
+  assertNull(res[215].firstMatch("xde"), 329);
+  assertNull(res[215].firstMatch("xxab"), 330);
+  assertNull(res[215].firstMatch("xxxab"), 331);
+  assertNull(res[215].firstMatch("*** Failers"), 332);
+  assertNull(res[215].firstMatch("xyab"), 333);
+  assertToStringEquals("abc", res[215].firstMatch("abc"), 334);
+  assertToStringEquals("c", res[215].firstMatch("a(b)c"), 335);
+  assertToStringEquals("c", res[215].firstMatch("a(b(c))d"), 336);
+  assertNull(res[215].firstMatch("*** Failers)"), 337);
+  assertToStringEquals("c", res[215].firstMatch("a(b(c)d"), 338);
+  assertNull(res[215].firstMatch("1221"), 339);
+  assertToStringEquals("c", res[215].firstMatch("Satan, oscillate my metallic sonatas!"), 340);
+  assertToStringEquals("c", res[215].firstMatch("A man, a plan, a canal: Panama!"), 341);
+  assertNull(res[215].firstMatch("Able was I ere I saw Elba."), 342);
+  assertNull(res[215].firstMatch("*** Failers"), 343);
+  assertToStringEquals("c", res[215].firstMatch("The quick brown fox"), 344);
+  assertNull(res[215].firstMatch("12"), 345);
+  assertNull(res[215].firstMatch("(((2+2)*-3)-7)"), 346);
+  assertNull(res[215].firstMatch("-12"), 347);
+  assertNull(res[215].firstMatch("*** Failers"), 348);
+  assertNull(res[215].firstMatch("((2+2)*-3)-7)"), 349);
+  assertNull(res[215].firstMatch("xyz"), 350);
+  assertNull(res[215].firstMatch("xxyzxyzz"), 351);
+  assertNull(res[215].firstMatch("*** Failers"), 352);
+  assertNull(res[215].firstMatch("xxyzz"), 353);
+  assertNull(res[215].firstMatch("xxyzxyzxyzz"), 354);
+  assertNull(res[215].firstMatch("<>"), 355);
+  assertToStringEquals("abc", res[215].firstMatch("<abcd>"), 356);
+  assertToStringEquals("abc", res[215].firstMatch("<abc <123> hij>"), 357);
+  assertToStringEquals("abc", res[215].firstMatch("<abc <def> hij>"), 358);
+  assertToStringEquals("abc", res[215].firstMatch("<abc<>def>"), 359);
+  assertToStringEquals("abc", res[215].firstMatch("<abc<>"), 360);
+  assertNull(res[215].firstMatch("*** Failers"), 361);
+  assertToStringEquals("abc", res[215].firstMatch("<abc"), 362);
+  assertToStringEquals("abc", res[215].firstMatch("abcdefabc"), 363);
+  assertNull(res[215].firstMatch("a=a"), 364);
+  assertNull(res[215].firstMatch("a=b"), 365);
+  assertToStringEquals("c", res[215].firstMatch("a=bc"), 366);
+  assertNull(res[215].firstMatch("a=a"), 367);
+  assertNull(res[215].firstMatch("a=b"), 368);
+  assertToStringEquals("c", res[215].firstMatch("a=bc"), 369);
+  assertNull(res[215].firstMatch("abde"), 370);
+  assertToStringEquals("c", res[215].firstMatch("acde"), 371);
+  assertNull(res[215].firstMatch("1221"), 372);
+  assertToStringEquals("c", res[215].firstMatch("Satan, oscillate my metallic sonatas!"), 373);
+  assertToStringEquals("c", res[215].firstMatch("A man, a plan, a canal: Panama!"), 374);
+  assertNull(res[215].firstMatch("Able was I ere I saw Elba."), 375);
+  assertNull(res[215].firstMatch("*** Failers"), 376);
+  assertToStringEquals("c", res[215].firstMatch("The quick brown fox"), 377);
+  assertNull(res[228].firstMatch("abcdefgh"), 378);
+  assertNull(res[228].firstMatch("abcdefghC1Gtwo"), 379);
+  assertNull(res[228].firstMatch("abcdefghConeCtwo"), 380);
+  assertNull(res[228].firstMatch("abcdefghCthree"), 381);
+  assertToStringEquals("zz,", res[228].firstMatch("zzaaCZ"), 382);
+  assertToStringEquals("zz,", res[228].firstMatch("zzaaCA"), 383);
+  assertNull(res[228].firstMatch("[10,20,30,5,5,4,4,2,43,23,4234]"), 384);
+  assertNull(res[228].firstMatch("*** Failers"), 385);
+  assertNull(res[228].firstMatch("[]"), 386);
+  assertNull(res[228].firstMatch("[10,20,30,5,5,4,4,2,43,23,4234]"), 387);
+  assertNull(res[228].firstMatch("[]"), 388);
+  assertToStringEquals(" Baby Bjorn Active Carrier - With free SHIPPING!!, Baby Bjorn Active Carrier - With free SHIPPING!!,,", res[229].firstMatch(" Baby Bjorn Active Carrier - With free SHIPPING!!"), 389);
+  assertToStringEquals(" Baby Bjorn Active Carrier - With free SHIPPING!!, Baby Bjorn Active Carrier - With free SHIPPING!!,,", res[230].firstMatch(" Baby Bjorn Active Carrier - With free SHIPPING!!"), 390);
+  assertNull(res[238].firstMatch("Note: that { does NOT introduce a quantifier"), 391);
+  assertToStringEquals("aacaacaacaacaac123,aac", res[239].firstMatch("aacaacaacaacaac123"), 392);
+  assertNull(res[243].firstMatch("abP"), 393);
+  assertNull(res[243].firstMatch("abcP"), 394);
+  assertNull(res[243].firstMatch("abcdP"), 395);
+  assertToStringEquals("abcde", res[243].firstMatch("abcdeP"), 396);
+  assertNull(res[243].firstMatch("the quick brown abcP"), 397);
+  assertNull(res[243].firstMatch("** FailersP"), 398);
+  assertNull(res[243].firstMatch("the quick brown abxyz foxP"), 399);
+  assertNull(res[243].firstMatch("13/05/04P"), 400);
+  assertNull(res[243].firstMatch("13/5/2004P"), 401);
+  assertNull(res[243].firstMatch("02/05/09P"), 402);
+  assertNull(res[243].firstMatch("1P"), 403);
+  assertNull(res[243].firstMatch("1/2P"), 404);
+  assertNull(res[243].firstMatch("1/2/0P"), 405);
+  assertNull(res[243].firstMatch("1/2/04P"), 406);
+  assertNull(res[243].firstMatch("0P"), 407);
+  assertNull(res[243].firstMatch("02/P"), 408);
+  assertNull(res[243].firstMatch("02/0P"), 409);
+  assertNull(res[243].firstMatch("02/1P"), 410);
+  assertNull(res[243].firstMatch("** FailersP"), 411);
+  assertNull(res[243].firstMatch("P"), 412);
+  assertNull(res[243].firstMatch("123P"), 413);
+  assertNull(res[243].firstMatch("33/4/04P"), 414);
+  assertNull(res[243].firstMatch("3/13/04P"), 415);
+  assertNull(res[243].firstMatch("0/1/2003P"), 416);
+  assertNull(res[243].firstMatch("0/P"), 417);
+  assertNull(res[243].firstMatch("02/0/P"), 418);
+  assertNull(res[243].firstMatch("02/13P"), 419);
+  assertToStringEquals("123", res[248].firstMatch("123P"), 420);
+  assertNull(res[248].firstMatch("aP"), 421);
+  assertNull(res[248].firstMatch("bP"), 422);
+  assertNull(res[248].firstMatch("cP"), 423);
+  assertNull(res[248].firstMatch("c12P"), 424);
+  assertToStringEquals("c123", res[248].firstMatch("c123P"), 425);
+  assertNull(res[249].firstMatch("1P"), 426);
+  assertNull(res[249].firstMatch("123P"), 427);
+  assertToStringEquals("123X", res[249].firstMatch("123X"), 428);
+  assertNull(res[249].firstMatch("1234P"), 429);
+  assertToStringEquals("1234X", res[249].firstMatch("1234X"), 430);
+  assertNull(res[249].firstMatch("12345P"), 431);
+  assertToStringEquals("12345X", res[249].firstMatch("12345X"), 432);
+  assertNull(res[249].firstMatch("*** Failers"), 433);
+  assertNull(res[249].firstMatch("1X"), 434);
+  assertNull(res[249].firstMatch("123456P"), 435);
+  assertNull(res[249].firstMatch("abc"), 436);
+  assertNull(res[249].firstMatch("** Failers"), 437);
+  assertNull(res[249].firstMatch("bca"), 438);
+  assertNull(res[249].firstMatch("abc"), 439);
+  assertNull(res[249].firstMatch("** Failers"), 440);
+  assertNull(res[249].firstMatch("bca"), 441);
+  assertNull(res[249].firstMatch("abc"), 442);
+  assertNull(res[249].firstMatch("** Failers"), 443);
+  assertNull(res[249].firstMatch("def"), 444);
+  assertNull(res[249].firstMatch("abc"), 445);
+  assertNull(res[249].firstMatch("** Failers"), 446);
+  assertNull(res[249].firstMatch("def"), 447);
+  assertNull(res[249].firstMatch("<!DOCTYPE seite SYSTEM \"http://www.lco.lineas.de/xmlCms.dtd\">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel=\"http://www.ca.com/\" zielfenster=\"_blank\">\n<bild name=\"logo_ca.gif\" rahmen=\"no\"/></link> <link\nziel=\"http://www.ey.com/\" zielfenster=\"_blank\"><bild\nname=\"logo_euy.gif\" rahmen=\"no\"/></link>\n</absatz>\n\n<absatz><link ziel=\"http://www.cisco.de/\" zielfenster=\"_blank\">\n<bild name=\"logo_cisco.gif\" rahmen=\"ja\"/></link></absatz>\n\n<absatz><link ziel=\"http://www.atelion.de/\"\nzielfenster=\"_blank\"><bild\nname=\"logo_atelion.gif\" rahmen=\"no\"/></link>\n</absatz>\n\n<absatz><link ziel=\"http://www.line-information.de/\"\nzielfenster=\"_blank\">\n<bild name=\"logo_line_information.gif\" rahmen=\"no\"/></link>\n</absatz>\n\n<absatz><bild name=\"logo_aw.gif\" rahmen=\"no\"/></absatz>\n\n<absatz><link ziel=\"http://www.incognis.de/\"\nzielfenster=\"_blank\"><bild\nname=\"logo_incognis.gif\" rahmen=\"no\"/></link></absatz>\n\n<absatz><link ziel=\"http://www.addcraft.com/\"\nzielfenster=\"_blank\"><bild\nname=\"logo_addcraft.gif\" rahmen=\"no\"/></link></absatz>\n\n<absatz><link ziel=\"http://www.comendo.com/\"\nzielfenster=\"_blank\"><bild\nname=\"logo_comendo.gif\" rahmen=\"no\"/></link></absatz>\n\n</inhalt>\n</seite>"), 448);
+  assertToStringEquals("line\nbreak", res[251].firstMatch("this is a line\nbreak"), 449);
+  assertToStringEquals("line\nbreak", res[251].firstMatch("line one\nthis is a line\nbreak in the second line"), 450);
+  assertToStringEquals("line\nbreak", res[252].firstMatch("this is a line\nbreak"), 451);
+  assertNull(res[252].firstMatch("** Failers"), 452);
+  assertToStringEquals("line\nbreak", res[252].firstMatch("line one\nthis is a line\nbreak in the second line"), 453);
+  assertToStringEquals("line\nbreak", res[253].firstMatch("this is a line\nbreak"), 454);
+  assertNull(res[253].firstMatch("** Failers"), 455);
+  assertToStringEquals("line\nbreak", res[253].firstMatch("line one\nthis is a line\nbreak in the second line"), 456);
+  assertToStringEquals("ab-cd", res[254].firstMatch("ab-cd"), 457);
+  assertToStringEquals("ab=cd", res[254].firstMatch("ab=cd"), 458);
+  assertNull(res[254].firstMatch("** Failers"), 459);
+  assertNull(res[254].firstMatch("ab\ncd"), 460);
+  assertToStringEquals("ab-cd", res[255].firstMatch("ab-cd"), 461);
+  assertToStringEquals("ab=cd", res[255].firstMatch("ab=cd"), 462);
+  assertNull(res[255].firstMatch("ab\ncd"), 463);
+  assertNull(res[255].firstMatch("AbCd"), 464);
+  assertNull(res[255].firstMatch("** Failers"), 465);
+  assertNull(res[255].firstMatch("abcd"), 466);
+  // We are compatible with JSC, and don't throw an exception in this case.
+  // assertThrows("var re = /(){2,4294967295}/;", 467);
+  assertNull(res[255].firstMatch("abcdefghijklAkB"), 468);
+  assertNull(res[255].firstMatch("abcdefghijklAkB"), 469);
+  assertNull(res[255].firstMatch("abcdefghijklAkB"), 470);
+  assertNull(res[255].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 471);
+  assertNull(res[255].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 472);
+  assertNull(res[255].firstMatch("(this(and)that"), 473);
+  assertNull(res[255].firstMatch("(this(and)that)"), 474);
+  assertNull(res[255].firstMatch("(this(and)that)stuff"), 475);
+  assertNull(res[255].firstMatch("(this(and)that"), 476);
+  assertNull(res[255].firstMatch("(this(and)that)"), 477);
+  assertNull(res[255].firstMatch("(this(and)that"), 478);
+  assertNull(res[255].firstMatch("(this(and)that)"), 479);
+  assertNull(res[255].firstMatch("(this(and)that"), 480);
+  assertNull(res[255].firstMatch("(this(and)that)"), 481);
+  assertNull(res[255].firstMatch("((this))"), 482);
+  assertNull(res[255].firstMatch("(this(and)that"), 483);
+  assertNull(res[255].firstMatch("(this(and)that)"), 484);
+  assertNull(res[255].firstMatch("(this)"), 485);
+  assertNull(res[255].firstMatch("((this))"), 486);
+  assertToStringEquals("abc,b", res[256].firstMatch("abc"), 487);
+  assertToStringEquals("abc,b", res[256].firstMatch("abc"), 488);
+  assertNull(res[256].firstMatch("a1bCA"), 489);
+  assertNull(res[256].firstMatch("a2bCA"), 490);
+  assertNull(res[257].firstMatch("a bc dCACBCC"), 491);
+  assertNull(res[257].firstMatch("aabc"), 492);
+  assertNull(res[257].firstMatch("bc"), 493);
+  assertNull(res[257].firstMatch("** Failers"), 494);
+  assertNull(res[257].firstMatch("abc"), 495);
+  assertNull(res[257].firstMatch("bXaX"), 496);
+  assertNull(res[257].firstMatch("bbXaaX"), 497);
+  assertNull(res[257].firstMatch("(b)\\Xa\\X"), 498);
+  assertNull(res[257].firstMatch("bXXaYYaY"), 499);
+  assertNull(res[257].firstMatch("bXYaXXaX"), 500);
+  assertNull(res[257].firstMatch("bXXaYYaY"), 501);
+  assertToStringEquals("\x0b,\x0b", res[259].firstMatch("\x0b,\x0b"), 502);
+  assertToStringEquals("\x0c,\x0d", res[259].firstMatch("\x0c,\x0d"), 503);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\nabc"), 504);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\nabc<lf>"), 505);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0d\nabc<lf>"), 506);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0dabc<cr>"), 507);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0d\nabc<crlf>"), 508);
+  assertNull(res[260].firstMatch("** Failers"), 509);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\nabc<cr>"), 510);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0d\nabc<cr>"), 511);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\nabc<crlf>"), 512);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0dabc<crlf>"), 513);
+  assertToStringEquals("abc", res[260].firstMatch("xyz\x0dabc<lf>"), 514);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc"), 515);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\n"), 516);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\npqr"), 517);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d<cr>"), 518);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0dpqr<cr>"), 519);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d\n<crlf>"), 520);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d\npqr<crlf>"), 521);
+  assertNull(res[261].firstMatch("** Failers"), 522);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d"), 523);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0dpqr"), 524);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d\n"), 525);
+  assertToStringEquals("abc", res[261].firstMatch("xyzabc\x0d\npqr"), 526);
+  assertToStringEquals("abc", res[262].firstMatch("xyz\x0dabcdef"), 527);
+  assertToStringEquals("abc", res[262].firstMatch("xyz\nabcdef<lf>"), 528);
+  assertNull(res[262].firstMatch("** Failers"), 529);
+  assertToStringEquals("abc", res[262].firstMatch("xyz\nabcdef"), 530);
+  assertToStringEquals("abc", res[263].firstMatch("xyz\nabcdef"), 531);
+  assertToStringEquals("abc", res[263].firstMatch("xyz\x0dabcdef<cr>"), 532);
+  assertNull(res[263].firstMatch("** Failers"), 533);
+  assertToStringEquals("abc", res[263].firstMatch("xyz\x0dabcdef"), 534);
+  assertToStringEquals("abc", res[264].firstMatch("xyz\x0d\nabcdef"), 535);
+  assertToStringEquals("abc", res[264].firstMatch("xyz\x0dabcdef<cr>"), 536);
+  assertNull(res[264].firstMatch("** Failers"), 537);
+  assertToStringEquals("abc", res[264].firstMatch("xyz\x0dabcdef"), 538);
+  assertToStringEquals("abc", res[266].firstMatch("xyz\x0dabc<bad>"), 539);
+  assertToStringEquals("abc", res[266].firstMatch("abc"), 540);
+  assertToStringEquals("abc", res[267].firstMatch("abc\ndef"), 541);
+  assertToStringEquals("abc", res[267].firstMatch("abc\x0ddef"), 542);
+  assertToStringEquals("abc", res[267].firstMatch("abc\x0d\ndef"), 543);
+  assertToStringEquals("<cr>abc", res[267].firstMatch("<cr>abc\ndef"), 544);
+  assertToStringEquals("<cr>abc", res[267].firstMatch("<cr>abc\x0ddef"), 545);
+  assertToStringEquals("<cr>abc", res[267].firstMatch("<cr>abc\x0d\ndef"), 546);
+  assertToStringEquals("<crlf>abc", res[267].firstMatch("<crlf>abc\ndef"), 547);
+  assertToStringEquals("<crlf>abc", res[267].firstMatch("<crlf>abc\x0ddef"), 548);
+  assertToStringEquals("<crlf>abc", res[267].firstMatch("<crlf>abc\x0d\ndef"), 549);
+  assertNull(res[268].firstMatch("abc\ndef"), 550);
+  assertNull(res[268].firstMatch("abc\x0ddef"), 551);
+  assertNull(res[268].firstMatch("abc\x0d\ndef"), 552);
+  assertToStringEquals("XY,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,XY,Y", res[269].firstMatch("XYO400"), 553);
+  assertToStringEquals("aaaA5", res[278].firstMatch("aaaA5"), 554);
+  assertNull(res[278].firstMatch("** Failers"), 555);
+  assertNull(res[278].firstMatch("aaaa5"), 556);
+  assertToStringEquals("aaaA5", res[279].firstMatch("aaaA5"), 557);
+  assertToStringEquals("aaaa5", res[279].firstMatch("aaaa5"), 558);
+  assertToStringEquals("x", res[350].firstMatch("xyCabcCxyz"), 559);
+  assertToStringEquals("x", res[350].firstMatch("xyCabcCxyz"), 560);
+  assertToStringEquals("b", res[350].firstMatch("bXaX"), 561);
+  assertToStringEquals("b", res[350].firstMatch("bXbX"), 562);
+  assertToStringEquals("*", res[350].firstMatch("** Failers"), 563);
+  assertToStringEquals("aX", res[350].firstMatch("aXaX"), 564);
+  assertToStringEquals("aX", res[350].firstMatch("aXbX"), 565);
+  assertToStringEquals("x", res[350].firstMatch("xx"), 566);
+  assertToStringEquals("x", res[350].firstMatch("xy"), 567);
+  assertToStringEquals("y", res[350].firstMatch("yy"), 568);
+  assertToStringEquals("y", res[350].firstMatch("yx"), 569);
+  assertToStringEquals("x", res[350].firstMatch("xx"), 570);
+  assertToStringEquals("x", res[350].firstMatch("xy"), 571);
+  assertToStringEquals("y", res[350].firstMatch("yy"), 572);
+  assertToStringEquals("y", res[350].firstMatch("yx"), 573);
+  assertToStringEquals("b", res[350].firstMatch("bxay"), 574);
+  assertToStringEquals("b", res[350].firstMatch("bxby"), 575);
+  assertToStringEquals("*", res[350].firstMatch("** Failers"), 576);
+  assertToStringEquals("ax", res[350].firstMatch("axby"), 577);
+  assertToStringEquals("X", res[350].firstMatch("XxXxxx"), 578);
+  assertToStringEquals("X", res[350].firstMatch("XxXyyx"), 579);
+  assertToStringEquals("X", res[350].firstMatch("XxXyxx"), 580);
+  assertToStringEquals("*", res[350].firstMatch("** Failers"), 581);
+  assertToStringEquals("x", res[350].firstMatch("x"), 582);
+  assertToStringEquals("ab", res[350].firstMatch("abcabc"), 583);
+  assertToStringEquals("Xaaa,a", res[351].firstMatch("Xaaa"), 584);
+  assertToStringEquals("Xaba,a", res[351].firstMatch("Xaba"), 585);
+  assertThrows(() => new RegExp(r"^[a-\\Q\\E]"), 586);
+  assertNull(res[353].firstMatch("(xy)x"), 587);
+  assertNull(res[353].firstMatch("1221"), 588);
+  assertNull(res[353].firstMatch("Satan, oscillate my metallic sonatas!"), 589);
+  assertNull(res[353].firstMatch("A man, a plan, a canal: Panama!"), 590);
+  assertNull(res[353].firstMatch("Able was I ere I saw Elba."), 591);
+  assertNull(res[353].firstMatch("*** Failers"), 592);
+  assertNull(res[353].firstMatch("The quick brown fox"), 593);
+  assertToStringEquals("abcd:,abcd", res[354].firstMatch("abcd:"), 594);
+  assertToStringEquals("abcd:,abcd", res[354].firstMatch("abcd:"), 595);
+  assertToStringEquals("a:,a", res[354].firstMatch("a:aaxyz"), 596);
+  assertToStringEquals("ab:,ab", res[354].firstMatch("ab:ababxyz"), 597);
+  assertNull(res[354].firstMatch("** Failers"), 598);
+  assertToStringEquals("a:,a", res[354].firstMatch("a:axyz"), 599);
+  assertToStringEquals("ab:,ab", res[354].firstMatch("ab:abxyz"), 600);
+  assertNull(res[354].firstMatch("abd"), 601);
+  assertNull(res[354].firstMatch("ce"), 602);
+  assertNull(res[354].firstMatch("abcabc1Xabc2XabcXabcabc"), 603);
+  assertNull(res[354].firstMatch("abcabc1Xabc2XabcXabcabc"), 604);
+  assertNull(res[354].firstMatch("abcabc1Xabc2XabcXabcabc"), 605);
+  assertNull(res[354].firstMatch("abcd"), 606);
+  assertNull(res[354].firstMatch("metcalfe 33"), 607);
+  assertNull(res[356].firstMatch("a\x0db"), 608);
+  assertNull(res[356].firstMatch("a\nb<cr>"), 609);
+  assertToStringEquals("a\x85b", res[356].firstMatch("a\x85b<anycrlf> "), 610);
+  assertNull(res[356].firstMatch("** Failers"), 611);
+  assertNull(res[356].firstMatch("a\nb"), 612);
+  assertNull(res[356].firstMatch("a\nb<any>"), 613);
+  assertNull(res[356].firstMatch("a\x0db<cr>"), 614);
+  assertNull(res[356].firstMatch("a\x0db<any>"), 615);
+  assertToStringEquals("a\x85b", res[356].firstMatch("a\x85b<any> "), 616);
+  assertNull(res[356].firstMatch("a\x0db<anycrlf>"), 617);
+  assertToStringEquals("abc1", res[357].firstMatch("abc1 \nabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\nabc6 \x85abc7 JUNK"), 618);
+  assertToStringEquals("abc1", res[358].firstMatch("abc1\n abc2\x0b abc3\x0c abc4\x0d abc5\x0d\n abc6\x85 abc7 abc9"), 619);
+  assertNull(res[361].firstMatch("a\nb"), 620);
+  assertNull(res[361].firstMatch("a\x0db"), 621);
+  assertNull(res[361].firstMatch("a\x0d\nb"), 622);
+  assertNull(res[361].firstMatch("a\x0bb"), 623);
+  assertNull(res[361].firstMatch("a\x0cb"), 624);
+  assertNull(res[361].firstMatch("a\x85b"), 625);
+  assertNull(res[361].firstMatch("** Failers"), 626);
+  assertNull(res[361].firstMatch("a\n\x0db"), 627);
+  assertToStringEquals("ab", res[362].firstMatch("ab"), 628);
+  assertNull(res[362].firstMatch("a\nb"), 629);
+  assertNull(res[362].firstMatch("a\x0db"), 630);
+  assertNull(res[362].firstMatch("a\x0d\nb"), 631);
+  assertNull(res[362].firstMatch("a\x0bb"), 632);
+  assertNull(res[362].firstMatch("a\x0cb"), 633);
+  assertNull(res[362].firstMatch("a\x85b"), 634);
+  assertNull(res[362].firstMatch("a\n\x0db"), 635);
+  assertNull(res[362].firstMatch("a\n\x0d\x85\x0cb"), 636);
+  assertNull(res[363].firstMatch("a\nb"), 637);
+  assertNull(res[363].firstMatch("a\x0db"), 638);
+  assertNull(res[363].firstMatch("a\x0d\nb"), 639);
+  assertNull(res[363].firstMatch("a\x0bb"), 640);
+  assertNull(res[363].firstMatch("a\x0cb"), 641);
+  assertNull(res[363].firstMatch("a\x85b"), 642);
+  assertNull(res[363].firstMatch("a\n\x0db"), 643);
+  assertNull(res[363].firstMatch("a\n\x0d\x85\x0cb"), 644);
+  assertNull(res[363].firstMatch("** Failers"), 645);
+  assertNull(res[363].firstMatch("ab"), 646);
+  assertNull(res[364].firstMatch("a\nb"), 647);
+  assertNull(res[364].firstMatch("a\n\x0db"), 648);
+  assertNull(res[364].firstMatch("a\n\x0d\x85b"), 649);
+  assertNull(res[364].firstMatch("a\x0d\n\x0d\nb"), 650);
+  assertNull(res[364].firstMatch("a\x0d\n\x0d\n\x0d\nb"), 651);
+  assertNull(res[364].firstMatch("a\n\x0d\n\x0db"), 652);
+  assertNull(res[364].firstMatch("a\n\n\x0d\nb"), 653);
+  assertNull(res[364].firstMatch("** Failers"), 654);
+  assertNull(res[364].firstMatch("a\n\n\n\x0db"), 655);
+  assertNull(res[364].firstMatch("a\x0d"), 656);
+  assertToStringEquals("aRb", res[365].firstMatch("aRb"), 657);
+  assertNull(res[365].firstMatch("** Failers"), 658);
+  assertNull(res[365].firstMatch("a\nb"), 659);
+  assertNull(res[365].firstMatch("abcPXP123"), 660);
+  assertNull(res[365].firstMatch("abcPXP123"), 661);
+  assertNull(res[365].firstMatch("1.2.3.4"), 662);
+  assertNull(res[365].firstMatch("131.111.10.206"), 663);
+  assertNull(res[365].firstMatch("10.0.0.0"), 664);
+  assertNull(res[365].firstMatch("** Failers"), 665);
+  assertNull(res[365].firstMatch("10.6"), 666);
+  assertNull(res[365].firstMatch("455.3.4.5"), 667);
+  assertNull(res[365].firstMatch("1.2.3.4"), 668);
+  assertNull(res[365].firstMatch("131.111.10.206"), 669);
+  assertNull(res[365].firstMatch("10.0.0.0"), 670);
+  assertNull(res[365].firstMatch("** Failers"), 671);
+  assertNull(res[365].firstMatch("10.6"), 672);
+  assertNull(res[365].firstMatch("455.3.4.5"), 673);
+  assertNull(res[365].firstMatch("123axbaxbaxbx456"), 674);
+  assertNull(res[365].firstMatch("123axbaxbaxb456"), 675);
+  assertNull(res[365].firstMatch("123axbaxbaxbx456"), 676);
+  assertNull(res[365].firstMatch("123axbaxbaxbx456"), 677);
+  assertNull(res[365].firstMatch("123axbaxbaxbx456"), 678);
+  assertNull(res[366].firstMatch("ababababbbabZXXXX"), 679);
+  assertNull(res[372].firstMatch("a\x0db"), 680);
+  assertNull(res[372].firstMatch("*** Failers"), 681);
+  assertNull(res[372].firstMatch("a\nb"), 682);
+  assertToStringEquals("afoo", res[373].firstMatch("afoo"), 683);
+  assertNull(res[373].firstMatch("** Failers"), 684);
+  assertNull(res[373].firstMatch("\x0d\nfoo"), 685);
+  assertNull(res[373].firstMatch("\nfoo"), 686);
+  assertToStringEquals("afoo", res[374].firstMatch("afoo"), 687);
+  assertNull(res[374].firstMatch("\nfoo"), 688);
+  assertNull(res[374].firstMatch("** Failers"), 689);
+  assertNull(res[374].firstMatch("\x0d\nfoo"), 690);
+  assertToStringEquals("afoo", res[375].firstMatch("afoo"), 691);
+  assertNull(res[375].firstMatch("** Failers"), 692);
+  assertNull(res[375].firstMatch("\nfoo"), 693);
+  assertNull(res[375].firstMatch("\x0d\nfoo"), 694);
+  assertToStringEquals("afoo", res[376].firstMatch("afoo"), 695);
+  assertNull(res[376].firstMatch("\x0d\nfoo"), 696);
+  assertNull(res[376].firstMatch("\nfoo"), 697);
+  assertToStringEquals("", res[377].firstMatch("abc\x0d\x0dxyz"), 698);
+  assertToStringEquals("", res[377].firstMatch("abc\n\x0dxyz  "), 699);
+  assertNull(res[377].firstMatch("** Failers "), 700);
+  assertToStringEquals("", res[377].firstMatch("abc\x0d\nxyz"), 701);
+  assertToStringEquals("", res[377].firstMatch("abc\x0d\n\x0d\n"), 702);
+  assertToStringEquals("", res[377].firstMatch("abc\x0d\n\x0d\n"), 703);
+  assertToStringEquals("", res[377].firstMatch("abc\x0d\n\x0d\n"), 704);
+  assertToStringEquals("abc1", res[378].firstMatch("abc1\n abc2\x0b abc3\x0c abc4\x0d abc5\x0d\n abc6\x85 abc9"), 705);
+  assertToStringEquals("X", res[379].firstMatch("XABC"), 706);
+  assertNull(res[379].firstMatch("** Failers "), 707);
+  assertToStringEquals("X", res[379].firstMatch("XABCB"), 708);
+  assertThrows(() => new RegExp(r"(ab|c)(?-1)"), 709);
+  assertNull(res[379].firstMatch("abc"), 710);
+  assertNull(res[379].firstMatch("xyabcabc"), 711);
+  assertNull(res[379].firstMatch("** Failers"), 712);
+  assertNull(res[379].firstMatch("xyabc  "), 713);
+  assertThrows(() => new RegExp(r"x(?-0)y"), 714);
+  assertThrows(() => new RegExp(r"x(?-1)y"), 715);
+  assertNull(res[379].firstMatch("abcX"), 716);
+  assertNull(res[379].firstMatch("Y"), 717);
+  assertNull(res[379].firstMatch("** Failers"), 718);
+  assertNull(res[379].firstMatch("abcY   "), 719);
+  assertNull(res[379].firstMatch("YabcXabc"), 720);
+  assertNull(res[379].firstMatch("YabcXabcXabc"), 721);
+  assertNull(res[379].firstMatch("** Failers"), 722);
+  assertToStringEquals("X", res[379].firstMatch("XabcXabc  "), 723);
+  assertNull(res[379].firstMatch("Y!"), 724);
+  assertNull(res[380].firstMatch("foobar"), 725);
+  assertNull(res[381].firstMatch("foobar"), 726);
+  assertToStringEquals("foobaz,foo,baz", res[381].firstMatch("foobaz "), 727);
+  assertNull(res[382].firstMatch("foobarbaz"), 728);
+  assertNull(res[382].firstMatch("tom-tom"), 729);
+  assertNull(res[382].firstMatch("bon-bon "), 730);
+  assertNull(res[382].firstMatch("** Failers"), 731);
+  assertNull(res[382].firstMatch("tom-bon  "), 732);
+  assertNull(res[382].firstMatch("tom-tom"), 733);
+  assertNull(res[382].firstMatch("bon-bon "), 734);
+  assertThrows(() => new RegExp(r"(?|(abc)|(xyz))"), 735);
+  assertThrows(() => new RegExp(r"(x)(?|(abc)|(xyz))(x)"), 736);
+  assertNull(res[383].firstMatch("xabcx"), 737);
+  assertNull(res[383].firstMatch("xxyzx "), 738);
+  assertThrows(() => new RegExp(r"(x)(?|(abc)(pqr)|(xyz))(x)"), 739);
+  assertNull(res[383].firstMatch("xabcpqrx"), 740);
+  assertNull(res[383].firstMatch("xxyzx "), 741);
+  assertThrows(() => new RegExp(r"(?|(abc)|(xyz))\1"), 742);
+  assertNull(res[383].firstMatch("abcabc"), 743);
+  assertNull(res[383].firstMatch("xyzxyz "), 744);
+  assertNull(res[383].firstMatch("** Failers"), 745);
+  assertNull(res[383].firstMatch("abcxyz"), 746);
+  assertNull(res[383].firstMatch("xyzabc   "), 747);
+  assertNull(res[383].firstMatch("abcabc"), 748);
+  assertNull(res[383].firstMatch("xyzabc "), 749);
+  assertNull(res[383].firstMatch("** Failers "), 750);
+  assertNull(res[383].firstMatch("xyzxyz "), 751);
+  assertNull(res[384].firstMatch("X X\n"), 752);
+  assertNull(res[384].firstMatch("X\x09X\x0b"), 753);
+  assertNull(res[384].firstMatch("** Failers"), 754);
+  assertNull(res[384].firstMatch("\xa0 X\n   "), 755);
+  assertNull(res[385].firstMatch("\x09 \xa0X\n\x0b\x0c\x0d\n"), 756);
+  assertNull(res[385].firstMatch("\x09 \xa0\n\x0b\x0c\x0d\n"), 757);
+  assertNull(res[385].firstMatch("\x09 \xa0\n\x0b\x0c"), 758);
+  assertNull(res[385].firstMatch("** Failers "), 759);
+  assertNull(res[385].firstMatch("\x09 \xa0\n\x0b"), 760);
+  assertNull(res[385].firstMatch(" "), 761);
+  assertNull(res[386].firstMatch("XY  ABCDE"), 762);
+  assertNull(res[386].firstMatch("XY  PQR ST "), 763);
+  assertNull(res[387].firstMatch("XY  AB    PQRS"), 764);
+  assertNull(res[388].firstMatch(">XNNNYZ"), 765);
+  assertNull(res[388].firstMatch(">  X NYQZ"), 766);
+  assertNull(res[388].firstMatch("** Failers"), 767);
+  assertNull(res[388].firstMatch(">XYZ   "), 768);
+  assertNull(res[388].firstMatch(">  X NY Z"), 769);
+  assertNull(res[389].firstMatch(">XY\nZ\nA\x0bNN\x0c"), 770);
+  assertNull(res[389].firstMatch(">\n\x0dX\nY\n\x0bZZZ\nAAA\x0bNNN\x0c"), 771);
+  assertNull(res[390].firstMatch(">\x09<"), 772);
+  assertNull(res[391].firstMatch(">\x09 \xa0<"), 773);
+  assertNull(res[396].firstMatch("** Failers"), 774);
+  assertNull(res[396].firstMatch("XXXX"), 775);
+  assertNull(res[397].firstMatch("XXXX Y "), 776);
+  assertNull(res[419].firstMatch("aaaaaa"), 777);
+  assertNull(res[419].firstMatch("aaabccc"), 778);
+  assertNull(res[419].firstMatch("aaabccc"), 779);
+  assertNull(res[419].firstMatch("aaabccc"), 780);
+  assertNull(res[419].firstMatch("aaabcccaaabccc"), 781);
+  assertNull(res[419].firstMatch("aaaxxxxxx"), 782);
+  assertNull(res[419].firstMatch("aaa++++++ "), 783);
+  assertNull(res[419].firstMatch("bbbxxxxx"), 784);
+  assertNull(res[419].firstMatch("bbb+++++ "), 785);
+  assertNull(res[419].firstMatch("cccxxxx"), 786);
+  assertNull(res[419].firstMatch("ccc++++ "), 787);
+  assertNull(res[419].firstMatch("dddddddd   "), 788);
+  assertNull(res[419].firstMatch("aaaxxxxxx"), 789);
+  assertNull(res[419].firstMatch("aaa++++++ "), 790);
+  assertNull(res[419].firstMatch("bbbxxxxx"), 791);
+  assertNull(res[419].firstMatch("bbb+++++ "), 792);
+  assertNull(res[419].firstMatch("cccxxxx"), 793);
+  assertNull(res[419].firstMatch("ccc++++ "), 794);
+  assertNull(res[419].firstMatch("dddddddd   "), 795);
+  assertNull(res[419].firstMatch("aaabccc"), 796);
+  assertNull(res[419].firstMatch("ABX"), 797);
+  assertNull(res[419].firstMatch("AADE"), 798);
+  assertNull(res[419].firstMatch("ACDE"), 799);
+  assertNull(res[419].firstMatch("** Failers"), 800);
+  assertNull(res[419].firstMatch("AD "), 801);
+  assertNull(res[419].firstMatch("    "), 802);
+  assertNull(res[419].firstMatch("aaaaaa"), 803);
+  assertNull(res[419].firstMatch("aaabccc"), 804);
+  assertNull(res[419].firstMatch("aaabccc"), 805);
+  assertNull(res[419].firstMatch("aaabccc"), 806);
+  assertNull(res[419].firstMatch("aaabcccaaabccc"), 807);
+  assertNull(res[419].firstMatch("aaabccc"), 808);
+  assertNull(res[422].firstMatch("\x0d\nA"), 809);
+  assertToStringEquals("\nA", res[423].firstMatch("\x0d\nA "), 810);
+  assertToStringEquals("\nA", res[424].firstMatch("\x0d\nA "), 811);
+  assertToStringEquals("\nA,\n", res[425].firstMatch("\x0d\nA "), 812);
+  assertNull(res[425].firstMatch("a\nb"), 813);
+  assertNull(res[425].firstMatch("** Failers"), 814);
+  assertNull(res[425].firstMatch("a\x0db  "), 815);
+  assertNull(res[425].firstMatch("a\nb"), 816);
+  assertNull(res[425].firstMatch("** Failers"), 817);
+  assertNull(res[425].firstMatch("a\x0db  "), 818);
+  assertNull(res[425].firstMatch("a\x0db"), 819);
+  assertNull(res[425].firstMatch("** Failers"), 820);
+  assertNull(res[425].firstMatch("a\nb  "), 821);
+  assertNull(res[425].firstMatch("a\x0db"), 822);
+  assertNull(res[425].firstMatch("a\nb  "), 823);
+  assertNull(res[425].firstMatch("** Failers"), 824);
+  assertNull(res[425].firstMatch("a\x0d\nb  "), 825);
+  assertNull(res[425].firstMatch("** Failers"), 826);
+  assertNull(res[425].firstMatch("a\x0db"), 827);
+  assertNull(res[425].firstMatch("a\nb  "), 828);
+  assertNull(res[425].firstMatch("a\x0d\nb  "), 829);
+  assertNull(res[425].firstMatch("** Failers"), 830);
+  assertNull(res[425].firstMatch("a\x0db"), 831);
+  assertNull(res[425].firstMatch("a\nb  "), 832);
+  assertNull(res[425].firstMatch("a\x0d\nb  "), 833);
+  assertNull(res[425].firstMatch("a\x85b "), 834);
+  assertNull(res[426].firstMatch("a\x0db"), 835);
+  assertNull(res[426].firstMatch("a\nb"), 836);
+  assertNull(res[426].firstMatch("a\x0d\nb"), 837);
+  assertNull(res[426].firstMatch("** Failers"), 838);
+  assertNull(res[426].firstMatch("a\x85b"), 839);
+  assertNull(res[426].firstMatch("a\x0bb     "), 840);
+  assertNull(res[427].firstMatch("a\x0db"), 841);
+  assertNull(res[427].firstMatch("a\nb"), 842);
+  assertNull(res[427].firstMatch("a\x0d\nb"), 843);
+  assertNull(res[427].firstMatch("a\x85b"), 844);
+  assertNull(res[427].firstMatch("a\x0bb     "), 845);
+  assertNull(res[427].firstMatch("** Failers "), 846);
+  assertNull(res[427].firstMatch("a\x85b<bsr_anycrlf>"), 847);
+  assertNull(res[427].firstMatch("a\x0bb<bsr_anycrlf>"), 848);
+  assertNull(res[428].firstMatch("a\x0db"), 849);
+  assertNull(res[428].firstMatch("a\nb"), 850);
+  assertNull(res[428].firstMatch("a\x0d\nb"), 851);
+  assertNull(res[428].firstMatch("** Failers"), 852);
+  assertNull(res[428].firstMatch("a\x85b"), 853);
+  assertNull(res[428].firstMatch("a\x0bb     "), 854);
+  assertNull(res[429].firstMatch("a\x0db"), 855);
+  assertNull(res[429].firstMatch("a\nb"), 856);
+  assertNull(res[429].firstMatch("a\x0d\nb"), 857);
+  assertNull(res[429].firstMatch("a\x85b"), 858);
+  assertNull(res[429].firstMatch("a\x0bb     "), 859);
+  assertNull(res[429].firstMatch("** Failers "), 860);
+  assertNull(res[429].firstMatch("a\x85b<bsr_anycrlf>"), 861);
+  assertNull(res[429].firstMatch("a\x0bb<bsr_anycrlf>"), 862);
+  assertNull(res[430].firstMatch("a\x0d\n\nb"), 863);
+  assertNull(res[430].firstMatch("a\n\x0d\x0db"), 864);
+  assertNull(res[430].firstMatch("a\x0d\n\x0d\n\x0d\n\x0d\nb"), 865);
+  assertNull(res[430].firstMatch("** Failers"), 866);
+  assertNull(res[430].firstMatch("a\x8585b"), 867);
+  assertNull(res[430].firstMatch("a\x0b\x00bb     "), 868);
+  assertNull(res[431].firstMatch("a\x0d\x0db"), 869);
+  assertNull(res[431].firstMatch("a\n\n\nb"), 870);
+  assertNull(res[431].firstMatch("a\x0d\n\n\x0d\x0db"), 871);
+  assertNull(res[431].firstMatch("a\x8585b"), 872);
+  assertNull(res[431].firstMatch("a\x0b\x00bb     "), 873);
+  assertNull(res[431].firstMatch("** Failers "), 874);
+  assertNull(res[431].firstMatch("a\x0d\x0d\x0d\x0d\x0db "), 875);
+  assertNull(res[431].firstMatch("a\x8585b<bsr_anycrlf>"), 876);
+  assertNull(res[431].firstMatch("a\x0b\x00bb<bsr_anycrlf>"), 877);
+  assertNull(res[431].firstMatch("a\nb"), 878);
+  assertNull(res[431].firstMatch("a\x0db "), 879);
+  assertNull(res[431].firstMatch("a\x85b"), 880);
+  assertNull(res[431].firstMatch("a\nb"), 881);
+  assertNull(res[431].firstMatch("a\x0db "), 882);
+  assertNull(res[431].firstMatch("a\x85b"), 883);
+  assertThrows(() => new RegExp(r"(?-+a)"), 884);
+  assertNull(res[443].firstMatch("aaaa"), 885);
+  assertNull(res[443].firstMatch("bacxxx"), 886);
+  assertNull(res[443].firstMatch("bbaccxxx "), 887);
+  assertNull(res[443].firstMatch("bbbacccxx"), 888);
+  assertNull(res[443].firstMatch("aaaa"), 889);
+  assertNull(res[443].firstMatch("bacxxx"), 890);
+  assertNull(res[443].firstMatch("bbaccxxx "), 891);
+  assertNull(res[443].firstMatch("bbbacccxx"), 892);
+  assertToStringEquals("a,a", res[444].firstMatch("aaaa"), 893);
+  assertNull(res[444].firstMatch("bacxxx"), 894);
+  assertNull(res[444].firstMatch("bbaccxxx "), 895);
+  assertNull(res[444].firstMatch("bbbacccxx"), 896);
+  assertToStringEquals("a,a", res[445].firstMatch("aaaa"), 897);
+  assertNull(res[445].firstMatch("bacxxx"), 898);
+  assertNull(res[445].firstMatch("bbaccxxx "), 899);
+  assertNull(res[445].firstMatch("bbbacccxx"), 900);
+  assertToStringEquals("a,a", res[446].firstMatch("aaaa"), 901);
+  assertNull(res[446].firstMatch("bacxxx"), 902);
+  assertNull(res[446].firstMatch("bbaccxxx "), 903);
+  assertNull(res[446].firstMatch("bbbacccxx"), 904);
+  assertToStringEquals("a,a,a", res[447].firstMatch("aaaa"), 905);
+  assertNull(res[447].firstMatch("bacxxx"), 906);
+  assertNull(res[447].firstMatch("bbaccxxx "), 907);
+  assertNull(res[447].firstMatch("bbbacccxx"), 908);
+  assertNull(res[449].firstMatch("bacxxx"), 909);
+  assertNull(res[449].firstMatch("XaaX"), 910);
+  assertNull(res[449].firstMatch("XAAX "), 911);
+  assertNull(res[449].firstMatch("XaaX"), 912);
+  assertNull(res[449].firstMatch("** Failers "), 913);
+  assertNull(res[449].firstMatch("XAAX "), 914);
+  assertNull(res[449].firstMatch("XaaX"), 915);
+  assertNull(res[449].firstMatch("XAAX "), 916);
+  assertNull(res[449].firstMatch("xzxx"), 917);
+  assertNull(res[449].firstMatch("yzyy "), 918);
+  assertNull(res[449].firstMatch("** Failers"), 919);
+  assertNull(res[449].firstMatch("xxz  "), 920);
+  assertToStringEquals("a,,,a", res[450].firstMatch("cat"), 921);
+  assertToStringEquals("a,,,a", res[451].firstMatch("cat"), 922);
+  assertToStringEquals("TA]", res[452].firstMatch("The ACTA] comes "), 923);
+  assertToStringEquals("TA]", res[453].firstMatch("The ACTA] comes "), 924);
+  assertNull(res[453].firstMatch("abcbabc"), 925);
+  assertNull(res[453].firstMatch("abcbabc"), 926);
+  assertNull(res[453].firstMatch("abcbabc"), 927);
+  assertNull(res[453].firstMatch("** Failers "), 928);
+  assertNull(res[453].firstMatch("abcXabc"), 929);
+  assertNull(res[453].firstMatch("abcXabc"), 930);
+  assertNull(res[453].firstMatch("** Failers "), 931);
+  assertNull(res[453].firstMatch("abcbabc"), 932);
+  assertNull(res[453].firstMatch("xyzbabcxyz"), 933);
+  assertNull(res[456].firstMatch("** Failers"), 934);
+  assertNull(res[456].firstMatch("ab"), 935);
+  assertNull(res[457].firstMatch("** Failers"), 936);
+  assertNull(res[457].firstMatch("ab "), 937);
+  assertNull(res[457].firstMatch("** Failers"), 938);
+  assertNull(res[457].firstMatch("ab "), 939);
+  assertToStringEquals("aXb", res[458].firstMatch("aXb"), 940);
+  assertToStringEquals("a\nb", res[458].firstMatch("a\nb "), 941);
+  assertNull(res[458].firstMatch("** Failers"), 942);
+  assertNull(res[458].firstMatch("ab  "), 943);
+  assertToStringEquals("aXb", res[459].firstMatch("aXb"), 944);
+  assertToStringEquals("a\nX\nXb", res[459].firstMatch("a\nX\nXb "), 945);
+  assertNull(res[459].firstMatch("** Failers"), 946);
+  assertNull(res[459].firstMatch("ab  "), 947);
+  assertToStringEquals("acb", res[463].firstMatch("acb"), 948);
+  assertToStringEquals("ab", res[463].firstMatch("ab"), 949);
+  assertNull(res[463].firstMatch("ax{100}b "), 950);
+  assertNull(res[463].firstMatch("*** Failers"), 951);
+  assertNull(res[463].firstMatch("a\nb  "), 952);
+  assertNull(res[464].firstMatch("ax{4000}xyb "), 953);
+  assertNull(res[464].firstMatch("ax{4000}yb "), 954);
+  assertNull(res[464].firstMatch("ax{4000}x{100}yb "), 955);
+  assertNull(res[464].firstMatch("*** Failers"), 956);
+  assertNull(res[464].firstMatch("ax{4000}b "), 957);
+  assertNull(res[464].firstMatch("ac\ncb "), 958);
+  assertToStringEquals("a\xc0,,\xc0", res[465].firstMatch("a\xc0\x88b"), 959);
+  assertToStringEquals("ax,,x", res[466].firstMatch("ax{100}b"), 960);
+  assertToStringEquals("a\xc0\x88b,\xc0\x88,b", res[467].firstMatch("a\xc0\x88b"), 961);
+  assertToStringEquals("ax{100}b,x{100},b", res[468].firstMatch("ax{100}b"), 962);
+  assertToStringEquals("a\xc0\x92,\xc0,\x92", res[469].firstMatch("a\xc0\x92bcd"), 963);
+  assertToStringEquals("ax{,x,{", res[470].firstMatch("ax{240}bcd"), 964);
+  assertToStringEquals("a\xc0\x92,\xc0,\x92", res[471].firstMatch("a\xc0\x92bcd"), 965);
+  assertToStringEquals("ax{,x,{", res[472].firstMatch("ax{240}bcd"), 966);
+  assertToStringEquals("a\xc0,,\xc0", res[473].firstMatch("a\xc0\x92bcd"), 967);
+  assertToStringEquals("ax,,x", res[474].firstMatch("ax{240}bcd"), 968);
+  assertNull(res[475].firstMatch("ax{1234}xyb "), 969);
+  assertNull(res[475].firstMatch("ax{1234}x{4321}yb "), 970);
+  assertNull(res[475].firstMatch("ax{1234}x{4321}x{3412}b "), 971);
+  assertNull(res[475].firstMatch("*** Failers"), 972);
+  assertNull(res[475].firstMatch("ax{1234}b "), 973);
+  assertNull(res[475].firstMatch("ac\ncb "), 974);
+  assertToStringEquals("ax{1234}xyb,x{1234}xy", res[476].firstMatch("ax{1234}xyb "), 975);
+  assertToStringEquals("ax{1234}x{4321}yb,x{1234}x{4321}y", res[476].firstMatch("ax{1234}x{4321}yb "), 976);
+  assertToStringEquals("ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}", res[476].firstMatch("ax{1234}x{4321}x{3412}b "), 977);
+  assertToStringEquals("axxxxbcdefghijb,xxxxbcdefghij", res[476].firstMatch("axxxxbcdefghijb "), 978);
+  assertToStringEquals("ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}", res[476].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 979);
+  assertNull(res[476].firstMatch("*** Failers"), 980);
+  assertToStringEquals("ax{1234}b,x{1234}", res[476].firstMatch("ax{1234}b "), 981);
+  assertToStringEquals("ax{1234}xyb,x{1234}xy", res[477].firstMatch("ax{1234}xyb "), 982);
+  assertToStringEquals("ax{1234}x{4321}yb,x{1234}x{4321}y", res[477].firstMatch("ax{1234}x{4321}yb "), 983);
+  assertToStringEquals("ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}", res[477].firstMatch("ax{1234}x{4321}x{3412}b "), 984);
+  assertToStringEquals("axxxxb,xxxx", res[477].firstMatch("axxxxbcdefghijb "), 985);
+  assertToStringEquals("ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}", res[477].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 986);
+  assertNull(res[477].firstMatch("*** Failers"), 987);
+  assertToStringEquals("ax{1234}b,x{1234}", res[477].firstMatch("ax{1234}b "), 988);
+  assertNull(res[478].firstMatch("ax{1234}xyb "), 989);
+  assertNull(res[478].firstMatch("ax{1234}x{4321}yb "), 990);
+  assertNull(res[478].firstMatch("ax{1234}x{4321}x{3412}b "), 991);
+  assertToStringEquals("axxxxb,xxxx", res[478].firstMatch("axxxxbcdefghijb "), 992);
+  assertNull(res[478].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 993);
+  assertToStringEquals("axbxxb,xbxx", res[478].firstMatch("axbxxbcdefghijb "), 994);
+  assertToStringEquals("axxxxxb,xxxxx", res[478].firstMatch("axxxxxbcdefghijb "), 995);
+  assertNull(res[478].firstMatch("*** Failers"), 996);
+  assertNull(res[478].firstMatch("ax{1234}b "), 997);
+  assertNull(res[478].firstMatch("axxxxxxbcdefghijb "), 998);
+  assertNull(res[479].firstMatch("ax{1234}xyb "), 999);
+  assertNull(res[479].firstMatch("ax{1234}x{4321}yb "), 1000);
+  assertNull(res[479].firstMatch("ax{1234}x{4321}x{3412}b "), 1001);
+  assertToStringEquals("axxxxb,xxxx", res[479].firstMatch("axxxxbcdefghijb "), 1002);
+  assertNull(res[479].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 1003);
+  assertToStringEquals("axbxxb,xbxx", res[479].firstMatch("axbxxbcdefghijb "), 1004);
+  assertToStringEquals("axxxxxb,xxxxx", res[479].firstMatch("axxxxxbcdefghijb "), 1005);
+  assertNull(res[479].firstMatch("*** Failers"), 1006);
+  assertNull(res[479].firstMatch("ax{1234}b "), 1007);
+  assertNull(res[479].firstMatch("axxxxxxbcdefghijb "), 1008);
+  assertNull(res[479].firstMatch("*** Failers"), 1009);
+  assertNull(res[479].firstMatch("x{100}"), 1010);
+  assertNull(res[479].firstMatch("aXbcd"), 1011);
+  assertNull(res[479].firstMatch("ax{100}bcd"), 1012);
+  assertNull(res[479].firstMatch("ax{100000}bcd"), 1013);
+  assertNull(res[479].firstMatch("x{100}x{100}x{100}b"), 1014);
+  assertNull(res[479].firstMatch("*** Failers "), 1015);
+  assertNull(res[479].firstMatch("x{100}x{100}b"), 1016);
+  assertNull(res[479].firstMatch("x{ab} "), 1017);
+  assertNull(res[479].firstMatch("\xc2\xab"), 1018);
+  assertNull(res[479].firstMatch("*** Failers "), 1019);
+  assertNull(res[479].firstMatch("\x00{ab}"), 1020);
+  assertNull(res[479].firstMatch("WXYZ"), 1021);
+  assertNull(res[479].firstMatch("x{256}XYZ "), 1022);
+  assertNull(res[479].firstMatch("*** Failers"), 1023);
+  assertNull(res[479].firstMatch("XYZ "), 1024);
+  assertNull(res[480].firstMatch("Xx{1234}"), 1025);
+  assertNull(res[481].firstMatch("Xx{1234}YZ"), 1026);
+  assertToStringEquals("X", res[482].firstMatch("XYZabcdce"), 1027);
+  assertToStringEquals("X", res[483].firstMatch("XYZabcde"), 1028);
+  assertNull(res[484].firstMatch("Xabcdefg   "), 1029);
+  assertNull(res[484].firstMatch("Xx{1234} "), 1030);
+  assertNull(res[484].firstMatch("Xx{1234}YZ"), 1031);
+  assertNull(res[484].firstMatch("Xx{1234}x{512}  "), 1032);
+  assertNull(res[484].firstMatch("Xx{1234}x{512}YZ"), 1033);
+  assertNull(res[485].firstMatch("Xabcdefg   "), 1034);
+  assertNull(res[485].firstMatch("Xx{1234} "), 1035);
+  assertNull(res[485].firstMatch("Xx{1234}YZ"), 1036);
+  assertNull(res[485].firstMatch("Xx{1234}x{512}  "), 1037);
+  assertToStringEquals("bcd", res[486].firstMatch("bcd"), 1038);
+  assertToStringEquals("x{", res[487].firstMatch("x{100}bc"), 1040);
+  assertToStringEquals("x{100}bcA", res[488].firstMatch("x{100}bcAa"), 1041);
+  assertToStringEquals("x{", res[489].firstMatch("x{100}bca"), 1042);
+  assertToStringEquals("bcd", res[490].firstMatch("bcd"), 1043);
+  assertToStringEquals("x{", res[491].firstMatch("x{100}bc"), 1045);
+  assertToStringEquals("x{100}bc", res[492].firstMatch("x{100}bcAa"), 1046);
+  assertToStringEquals("x{", res[493].firstMatch("x{100}bca"), 1047);
+  assertNull(res[493].firstMatch("abcd"), 1048);
+  assertNull(res[493].firstMatch("abcd"), 1049);
+  assertToStringEquals("x{", res[493].firstMatch("x{100}x{100} "), 1050);
+  assertToStringEquals("x{", res[493].firstMatch("x{100}x{100} "), 1051);
+  assertToStringEquals("x{", res[493].firstMatch("x{100}x{100}x{100}x{100} "), 1052);
+  assertNull(res[493].firstMatch("abce"), 1053);
+  assertToStringEquals("x{", res[493].firstMatch("x{100}x{100}x{100}x{100} "), 1054);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}x{100} "), 1055);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}x{100} "), 1056);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}x{100} "), 1057);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}XX"), 1058);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}x{100}x{100}x{100}x{100}XX"), 1059);
+  assertNull(res[493].firstMatch("abcdx{100}x{100}x{100}x{100}x{100}x{100}x{100}XX"), 1060);
+  assertToStringEquals("Xy", res[493].firstMatch("Xyyyax{100}x{100}bXzzz"), 1061);
+  assertToStringEquals("X", res[496].firstMatch("1X2"), 1062);
+  assertToStringEquals("x", res[496].firstMatch("1x{100}2 "), 1063);
+  assertToStringEquals(">X", res[497].firstMatch("> >X Y"), 1064);
+  assertToStringEquals(">x", res[497].firstMatch("> >x{100} Y"), 1065);
+  assertToStringEquals("1", res[498].firstMatch("x{100}3"), 1066);
+  assertToStringEquals(" ", res[499].firstMatch("x{100} X"), 1067);
+  assertToStringEquals("abcd", res[500].firstMatch("12abcd34"), 1068);
+  assertToStringEquals("*** Failers", res[500].firstMatch("*** Failers"), 1069);
+  assertToStringEquals("  ", res[500].firstMatch("1234  "), 1070);
+  assertToStringEquals("abc", res[501].firstMatch("12abcd34"), 1071);
+  assertToStringEquals("ab", res[501].firstMatch("12ab34"), 1072);
+  assertToStringEquals("***", res[501].firstMatch("*** Failers  "), 1073);
+  assertNull(res[501].firstMatch("1234"), 1074);
+  assertToStringEquals("  ", res[501].firstMatch("12a34  "), 1075);
+  assertToStringEquals("ab", res[502].firstMatch("12abcd34"), 1076);
+  assertToStringEquals("ab", res[502].firstMatch("12ab34"), 1077);
+  assertToStringEquals("**", res[502].firstMatch("*** Failers  "), 1078);
+  assertNull(res[502].firstMatch("1234"), 1079);
+  assertToStringEquals("  ", res[502].firstMatch("12a34  "), 1080);
+  assertToStringEquals("12", res[503].firstMatch("12abcd34"), 1081);
+  assertNull(res[503].firstMatch("*** Failers"), 1082);
+  assertToStringEquals("12", res[504].firstMatch("12abcd34"), 1083);
+  assertToStringEquals("123", res[504].firstMatch("1234abcd"), 1084);
+  assertNull(res[504].firstMatch("*** Failers  "), 1085);
+  assertNull(res[504].firstMatch("1.4 "), 1086);
+  assertToStringEquals("12", res[505].firstMatch("12abcd34"), 1087);
+  assertToStringEquals("12", res[505].firstMatch("1234abcd"), 1088);
+  assertNull(res[505].firstMatch("*** Failers  "), 1089);
+  assertNull(res[505].firstMatch("1.4 "), 1090);
+  assertToStringEquals("12abcd34", res[506].firstMatch("12abcd34"), 1091);
+  assertToStringEquals("***", res[506].firstMatch("*** Failers"), 1092);
+  assertNull(res[506].firstMatch("     "), 1093);
+  assertToStringEquals("12a", res[507].firstMatch("12abcd34"), 1094);
+  assertToStringEquals("123", res[507].firstMatch("1234abcd"), 1095);
+  assertToStringEquals("***", res[507].firstMatch("*** Failers"), 1096);
+  assertNull(res[507].firstMatch("       "), 1097);
+  assertToStringEquals("12", res[508].firstMatch("12abcd34"), 1098);
+  assertToStringEquals("12", res[508].firstMatch("1234abcd"), 1099);
+  assertToStringEquals("**", res[508].firstMatch("*** Failers"), 1100);
+  assertNull(res[508].firstMatch("       "), 1101);
+  assertToStringEquals(">      <", res[509].firstMatch("12>      <34"), 1102);
+  assertNull(res[509].firstMatch("*** Failers"), 1103);
+  assertToStringEquals(">  <", res[510].firstMatch("ab>  <cd"), 1104);
+  assertToStringEquals(">   <", res[510].firstMatch("ab>   <ce"), 1105);
+  assertNull(res[510].firstMatch("*** Failers"), 1106);
+  assertNull(res[510].firstMatch("ab>    <cd "), 1107);
+  assertToStringEquals(">  <", res[511].firstMatch("ab>  <cd"), 1108);
+  assertToStringEquals(">   <", res[511].firstMatch("ab>   <ce"), 1109);
+  assertNull(res[511].firstMatch("*** Failers"), 1110);
+  assertNull(res[511].firstMatch("ab>    <cd "), 1111);
+  assertToStringEquals("12", res[512].firstMatch("12      34"), 1112);
+  assertToStringEquals("Failers", res[512].firstMatch("*** Failers"), 1113);
+  assertNull(res[512].firstMatch("+++=*! "), 1114);
+  assertToStringEquals("ab", res[513].firstMatch("ab  cd"), 1115);
+  assertToStringEquals("abc", res[513].firstMatch("abcd ce"), 1116);
+  assertToStringEquals("Fai", res[513].firstMatch("*** Failers"), 1117);
+  assertNull(res[513].firstMatch("a.b.c"), 1118);
+  assertToStringEquals("ab", res[514].firstMatch("ab  cd"), 1119);
+  assertToStringEquals("ab", res[514].firstMatch("abcd ce"), 1120);
+  assertToStringEquals("Fa", res[514].firstMatch("*** Failers"), 1121);
+  assertNull(res[514].firstMatch("a.b.c"), 1122);
+  assertToStringEquals("====", res[515].firstMatch("12====34"), 1123);
+  assertToStringEquals("*** ", res[515].firstMatch("*** Failers"), 1124);
+  assertToStringEquals(" ", res[515].firstMatch("abcd "), 1125);
+  assertToStringEquals("===", res[516].firstMatch("ab====cd"), 1126);
+  assertToStringEquals("==", res[516].firstMatch("ab==cd"), 1127);
+  assertToStringEquals("***", res[516].firstMatch("*** Failers"), 1128);
+  assertNull(res[516].firstMatch("a.b.c"), 1129);
+  assertToStringEquals("==", res[517].firstMatch("ab====cd"), 1130);
+  assertToStringEquals("==", res[517].firstMatch("ab==cd"), 1131);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1132);
+  assertNull(res[517].firstMatch("a.b.c"), 1133);
+  assertNull(res[517].firstMatch("x{100}"), 1134);
+  assertNull(res[517].firstMatch("Zx{100}"), 1135);
+  assertNull(res[517].firstMatch("x{100}Z"), 1136);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers "), 1137);
+  assertNull(res[517].firstMatch("Zx{100}"), 1138);
+  assertNull(res[517].firstMatch("x{100}"), 1139);
+  assertNull(res[517].firstMatch("x{100}Z"), 1140);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers "), 1141);
+  assertNull(res[517].firstMatch("abcx{200}X"), 1142);
+  assertNull(res[517].firstMatch("abcx{100}X "), 1143);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1144);
+  assertToStringEquals("  ", res[517].firstMatch("X  "), 1145);
+  assertNull(res[517].firstMatch("abcx{200}X"), 1146);
+  assertNull(res[517].firstMatch("abcx{100}X "), 1147);
+  assertNull(res[517].firstMatch("abQX "), 1148);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1149);
+  assertToStringEquals("  ", res[517].firstMatch("X  "), 1150);
+  assertNull(res[517].firstMatch("abcx{100}x{200}x{100}X"), 1151);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1152);
+  assertNull(res[517].firstMatch("abcx{200}X"), 1153);
+  assertToStringEquals("  ", res[517].firstMatch("X  "), 1154);
+  assertNull(res[517].firstMatch("AX"), 1155);
+  assertNull(res[517].firstMatch("x{150}X"), 1156);
+  assertNull(res[517].firstMatch("x{500}X "), 1157);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1158);
+  assertNull(res[517].firstMatch("x{100}X"), 1159);
+  assertToStringEquals("  ", res[517].firstMatch("x{200}X   "), 1160);
+  assertNull(res[517].firstMatch("AX"), 1161);
+  assertNull(res[517].firstMatch("x{150}X"), 1162);
+  assertNull(res[517].firstMatch("x{500}X "), 1163);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1164);
+  assertNull(res[517].firstMatch("x{100}X"), 1165);
+  assertToStringEquals("  ", res[517].firstMatch("x{200}X   "), 1166);
+  assertNull(res[517].firstMatch("QX "), 1167);
+  assertNull(res[517].firstMatch("AX"), 1168);
+  assertNull(res[517].firstMatch("x{500}X "), 1169);
+  assertToStringEquals("**", res[517].firstMatch("*** Failers"), 1170);
+  assertNull(res[517].firstMatch("x{100}X"), 1171);
+  assertNull(res[517].firstMatch("x{150}X"), 1172);
+  assertToStringEquals("  ", res[517].firstMatch("x{200}X   "), 1173);
+  assertNull(res[518].firstMatch("aXb"), 1174);
+  assertNull(res[518].firstMatch("a\nb"), 1175);
+  assertNull(res[519].firstMatch("aXb"), 1176);
+  assertNull(res[519].firstMatch("a\nb"), 1177);
+  assertNull(res[519].firstMatch("*** Failers "), 1178);
+  assertNull(res[519].firstMatch("ax{100}b "), 1179);
+  assertNull(res[519].firstMatch("z"), 1180);
+  assertNull(res[519].firstMatch("Z "), 1181);
+  assertNull(res[519].firstMatch("x{100}"), 1182);
+  assertNull(res[519].firstMatch("*** Failers"), 1183);
+  assertNull(res[519].firstMatch("x{102}"), 1184);
+  assertNull(res[519].firstMatch("y    "), 1185);
+  assertToStringEquals("\xff", res[520].firstMatch(">\xff<"), 1186);
+  assertNull(res[521].firstMatch(">x{ff}<"), 1187);
+  assertToStringEquals("X", res[522].firstMatch("XYZ"), 1188);
+  assertToStringEquals("X", res[523].firstMatch("XYZ"), 1189);
+  assertToStringEquals("x", res[523].firstMatch("x{123} "), 1190);
+  assertToStringEquals(",", res[528].firstMatch("catac"), 1191);
+  assertToStringEquals(",", res[528].firstMatch("ax{256}a "), 1192);
+  assertToStringEquals(",", res[528].firstMatch("x{85}"), 1193);
+  assertToStringEquals(",", res[528].firstMatch("\u1234 "), 1194);
+  assertToStringEquals(",", res[528].firstMatch("\u1234 "), 1195);
+  assertToStringEquals(",", res[528].firstMatch("abcdefg"), 1196);
+  assertToStringEquals(",", res[528].firstMatch("ab"), 1197);
+  assertToStringEquals(",", res[528].firstMatch("a "), 1198);
+  assertToStringEquals("Ax", res[529].firstMatch("Ax{a3}BC"), 1199);
+  assertToStringEquals("Ax", res[530].firstMatch("Ax{a3}BC"), 1200);
+  assertToStringEquals("}=", res[531].firstMatch("+x{a3}== "), 1201);
+  assertToStringEquals("}=", res[532].firstMatch("+x{a3}== "), 1202);
+  assertToStringEquals("x", res[533].firstMatch("x{442}x{435}x{441}x{442}"), 1203);
+  assertToStringEquals("x", res[534].firstMatch("x{442}x{435}x{441}x{442}"), 1204);
+  assertToStringEquals("x", res[535].firstMatch("x{442}x{435}x{441}x{442}"), 1205);
+  assertToStringEquals("x", res[536].firstMatch("x{442}x{435}x{441}x{442}"), 1206);
+  assertToStringEquals("{", res[537].firstMatch("x{2442}x{2435}x{2441}x{2442}"), 1207);
+  assertToStringEquals("{", res[538].firstMatch("x{2442}x{2435}x{2441}x{2442}"), 1208);
+  assertToStringEquals("abc\n\x0dx{442}x{435}x{441}x{442}xyz ", res[539].firstMatch("abc\n\x0dx{442}x{435}x{441}x{442}xyz "), 1209);
+  assertToStringEquals("x{442}x{435}x{441}x{442}", res[539].firstMatch("x{442}x{435}x{441}x{442}"), 1210);
+  assertToStringEquals("c d", res[540].firstMatch("abc defx{442}x{443}xyz\npqr"), 1211);
+  assertToStringEquals("c d", res[541].firstMatch("abc defx{442}x{443}xyz\npqr"), 1212);
+  assertNull(res[542].firstMatch("+x{2442}"), 1213);
+  assertNull(res[543].firstMatch("+x{2442}"), 1214);
+  assertNull(res[544].firstMatch("Ax{442}"), 1215);
+  assertNull(res[545].firstMatch("Ax{442}"), 1216);
+  assertNull(res[546].firstMatch("Ax{442}"), 1217);
+  assertNull(res[547].firstMatch("Ax{442}"), 1218);
+  assertNull(res[548].firstMatch("\x19x{e01ff}"), 1219);
+  assertNull(res[549].firstMatch("Ax{422}"), 1220);
+  assertNull(res[550].firstMatch("x{19}x{e01ff}"), 1221);
+  assertNull(res[551].firstMatch("Ax{442}"), 1222);
+  assertNull(res[552].firstMatch("Ax{442}"), 1223);
+  assertNull(res[553].firstMatch("ax{442}"), 1224);
+  assertNull(res[554].firstMatch("+x{2442}"), 1225);
+  assertNull(res[555].firstMatch("Mx{442}"), 1226);
+  assertToStringEquals("abc", res[556].firstMatch("abc"), 1227);
+  assertToStringEquals("abc", res[557].firstMatch("abc"), 1228);
+  assertToStringEquals("abc", res[558].firstMatch("abc"), 1229);
+  assertToStringEquals("abc", res[559].firstMatch("abc"), 1230);
+  assertNull(res[560].firstMatch("x{100}ax{1234}bcd"), 1231);
+  assertNull(res[562].firstMatch("x{0041}x{2262}x{0391}x{002e}"), 1232);
+  assertNull(res[562].firstMatch("x{D55c}x{ad6d}x{C5B4} "), 1233);
+  assertNull(res[562].firstMatch("x{65e5}x{672c}x{8a9e}"), 1234);
+  assertToStringEquals("{861}X", res[563].firstMatch("x{212ab}x{212ab}x{212ab}x{861}X"), 1235);
+  assertToStringEquals("x{2", res[564].firstMatch("x{212ab}x{212ab}x{212ab}x{861}"), 1236);
+  assertToStringEquals("x{c", res[564].firstMatch("x{c0}b"), 1237);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}aaaa/ "), 1238);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}aaaa/ "), 1239);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}ax{c0}aaa/ "), 1240);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}aaaa/ "), 1241);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}ax{c0}aaa/ "), 1242);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}aaaa/ "), 1243);
+  assertToStringEquals("ax{", res[564].firstMatch("ax{c0}ax{c0}aaa/ "), 1244);
+  assertToStringEquals("Sho", res[564].firstMatch("Should produce an error diagnostic"), 1245);
+  assertNull(res[565].firstMatch("Xx{1234}"), 1246);
+  assertNull(res[565].firstMatch("X\nabc "), 1247);
+  assertToStringEquals("b", res[566].firstMatch("bar"), 1248);
+  assertNull(res[566].firstMatch("*** Failers"), 1249);
+  assertNull(res[566].firstMatch("c"), 1250);
+  assertNull(res[566].firstMatch("x{ff}"), 1251);
+  assertNull(res[566].firstMatch("x{100}  "), 1252);
+  assertToStringEquals("c", res[567].firstMatch("c"), 1253);
+  assertToStringEquals("x", res[567].firstMatch("x{ff}"), 1254);
+  assertToStringEquals("x", res[567].firstMatch("x{100}  "), 1255);
+  assertToStringEquals("*", res[567].firstMatch("*** Failers "), 1256);
+  assertNull(res[567].firstMatch("aaa"), 1257);
+  assertToStringEquals("x", res[568].firstMatch("x{f1}"), 1258);
+  assertToStringEquals("x", res[568].firstMatch("x{bf}"), 1259);
+  assertToStringEquals("x", res[568].firstMatch("x{100}"), 1260);
+  assertToStringEquals("x", res[568].firstMatch("x{1000}   "), 1261);
+  assertToStringEquals("*", res[568].firstMatch("*** Failers"), 1262);
+  assertToStringEquals("x", res[568].firstMatch("x{c0} "), 1263);
+  assertToStringEquals("x", res[568].firstMatch("x{f0} "), 1264);
+  assertToStringEquals("1", res[568].firstMatch("1234"), 1265);
+  assertToStringEquals("\"", res[568].firstMatch("\"1234\" "), 1266);
+  assertToStringEquals("x", res[568].firstMatch("x{100}1234"), 1267);
+  assertToStringEquals("\"", res[568].firstMatch("\"x{100}1234\"  "), 1268);
+  assertToStringEquals("x", res[568].firstMatch("x{100}x{100}12ab "), 1269);
+  assertToStringEquals("x", res[568].firstMatch("x{100}x{100}\"12\" "), 1270);
+  assertToStringEquals("*", res[568].firstMatch("*** Failers "), 1271);
+  assertToStringEquals("x", res[568].firstMatch("x{100}x{100}abcd"), 1272);
+  assertToStringEquals("A", res[568].firstMatch("A"), 1273);
+  assertToStringEquals("x", res[568].firstMatch("x{100}"), 1274);
+  assertToStringEquals("Z", res[568].firstMatch("Zx{100}"), 1275);
+  assertToStringEquals("x", res[568].firstMatch("x{100}Z"), 1276);
+  assertToStringEquals("*", res[568].firstMatch("*** Failers "), 1277);
+  assertToStringEquals("Z", res[568].firstMatch("Zx{100}"), 1278);
+  assertToStringEquals("x", res[568].firstMatch("x{100}"), 1279);
+  assertToStringEquals("x", res[568].firstMatch("x{100}Z"), 1280);
+  assertToStringEquals("*", res[568].firstMatch("*** Failers "), 1281);
+  assertToStringEquals("x", res[568].firstMatch("x{100}"), 1282);
+  assertToStringEquals("x", res[568].firstMatch("x{104}"), 1283);
+  assertToStringEquals("*", res[568].firstMatch("*** Failers"), 1284);
+  assertToStringEquals("x", res[568].firstMatch("x{105}"), 1285);
+  assertToStringEquals("x", res[568].firstMatch("x{ff}    "), 1286);
+  assertToStringEquals("x", res[568].firstMatch("x{100}"), 1287);
+  assertToStringEquals("\u0100", res[568].firstMatch("\u0100 "), 1288);
+  assertToStringEquals("\xff", res[569].firstMatch(">\xff<"), 1289);
+  assertNull(res[570].firstMatch(">x{ff}<"), 1290);
+  assertToStringEquals("\xd6", res[572].firstMatch("\xd6 # Matches without Study"), 1291);
+  assertToStringEquals("x", res[572].firstMatch("x{d6}"), 1292);
+  assertToStringEquals("\xd6", res[572].firstMatch("\xd6 <-- Same with Study"), 1293);
+  assertToStringEquals("x", res[572].firstMatch("x{d6}"), 1294);
+  assertToStringEquals("\xd6", res[572].firstMatch("\xd6 # Matches without Study"), 1295);
+  assertToStringEquals("x", res[572].firstMatch("x{d6} "), 1296);
+  assertToStringEquals("\xd6", res[572].firstMatch("\xd6 <-- Same with Study"), 1297);
+  assertToStringEquals("x", res[572].firstMatch("x{d6} "), 1298);
+  assertToStringEquals("\ufffd", res[572].firstMatch("\ufffd]"), 1299);
+  assertToStringEquals("\ufffd", res[572].firstMatch("\ufffd"), 1300);
+  assertToStringEquals("\ufffd", res[572].firstMatch("\ufffd\ufffd\ufffd"), 1301);
+  assertToStringEquals("\ufffd", res[572].firstMatch("\ufffd\ufffd\ufffd?"), 1302);
+  assertNull(res[573].firstMatch("\xc0\x80"), 1303);
+  assertNull(res[573].firstMatch("\xc1\x8f "), 1304);
+  assertNull(res[573].firstMatch("\xe0\x9f\x80"), 1305);
+  assertNull(res[573].firstMatch("\xf0\x8f\x80\x80 "), 1306);
+  assertNull(res[573].firstMatch("\xf8\x87\x80\x80\x80  "), 1307);
+  assertNull(res[573].firstMatch("\xfc\x83\x80\x80\x80\x80"), 1308);
+  assertNull(res[573].firstMatch("\xfe\x80\x80\x80\x80\x80  "), 1309);
+  assertNull(res[573].firstMatch("\xff\x80\x80\x80\x80\x80  "), 1310);
+  assertNull(res[573].firstMatch("\xc3\x8f"), 1311);
+  assertNull(res[573].firstMatch("\xe0\xaf\x80"), 1312);
+  assertNull(res[573].firstMatch("\xe1\x80\x80"), 1313);
+  assertNull(res[573].firstMatch("\xf0\x9f\x80\x80 "), 1314);
+  assertNull(res[573].firstMatch("\xf1\x8f\x80\x80 "), 1315);
+  assertNull(res[573].firstMatch("\xf8\x88\x80\x80\x80  "), 1316);
+  assertNull(res[573].firstMatch("\xf9\x87\x80\x80\x80  "), 1317);
+  assertNull(res[573].firstMatch("\xfc\x84\x80\x80\x80\x80"), 1318);
+  assertNull(res[573].firstMatch("\xfd\x83\x80\x80\x80\x80"), 1319);
+  assertNull(res[573].firstMatch("?\xf8\x88\x80\x80\x80  "), 1320);
+  assertNull(res[573].firstMatch("?\xf9\x87\x80\x80\x80  "), 1321);
+  assertNull(res[573].firstMatch("?\xfc\x84\x80\x80\x80\x80"), 1322);
+  assertNull(res[573].firstMatch("?\xfd\x83\x80\x80\x80\x80"), 1323);
+  assertToStringEquals(".", res[574].firstMatch("A.B"), 1324);
+  assertToStringEquals("{", res[574].firstMatch("Ax{100}B "), 1325);
+  assertToStringEquals("x", res[575].firstMatch("x{100}X   "), 1326);
+  assertToStringEquals("a", res[575].firstMatch("ax{1234}b"), 1327);
+  assertNull(res[577].firstMatch("AxxB     "), 1328);
+  assertToStringEquals("abc1", res[578].firstMatch("abc1 \nabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\nabc6 x{0085}abc7 x{2028}abc8 x{2029}abc9 JUNK"), 1329);
+  assertToStringEquals("abc1", res[579].firstMatch("abc1\n abc2\x0b abc3\x0c abc4\x0d abc5\x0d\n abc6x{0085} abc7x{2028} abc8x{2029} abc9"), 1330);
+  assertNull(res[580].firstMatch("a\nb"), 1331);
+  assertNull(res[580].firstMatch("a\x0db"), 1332);
+  assertNull(res[580].firstMatch("a\x0d\nb"), 1333);
+  assertNull(res[580].firstMatch("a\x0bb"), 1334);
+  assertNull(res[580].firstMatch("a\x0cb"), 1335);
+  assertNull(res[580].firstMatch("ax{85}b   "), 1336);
+  assertNull(res[580].firstMatch("ax{2028}b "), 1337);
+  assertNull(res[580].firstMatch("ax{2029}b "), 1338);
+  assertNull(res[580].firstMatch("** Failers"), 1339);
+  assertNull(res[580].firstMatch("a\n\x0db    "), 1340);
+  assertToStringEquals("ab", res[581].firstMatch("ab"), 1341);
+  assertNull(res[581].firstMatch("a\nb"), 1342);
+  assertNull(res[581].firstMatch("a\x0db"), 1343);
+  assertNull(res[581].firstMatch("a\x0d\nb"), 1344);
+  assertNull(res[581].firstMatch("a\x0bb"), 1345);
+  assertNull(res[581].firstMatch("a\x0cx{2028}x{2029}b"), 1346);
+  assertNull(res[581].firstMatch("ax{85}b   "), 1347);
+  assertNull(res[581].firstMatch("a\n\x0db    "), 1348);
+  assertNull(res[581].firstMatch("a\n\x0dx{85}\x0cb "), 1349);
+  assertNull(res[582].firstMatch("a\nb"), 1350);
+  assertNull(res[582].firstMatch("a\x0db"), 1351);
+  assertNull(res[582].firstMatch("a\x0d\nb"), 1352);
+  assertNull(res[582].firstMatch("a\x0bb"), 1353);
+  assertNull(res[582].firstMatch("a\x0cx{2028}x{2029}b"), 1354);
+  assertNull(res[582].firstMatch("ax{85}b   "), 1355);
+  assertNull(res[582].firstMatch("a\n\x0db    "), 1356);
+  assertNull(res[582].firstMatch("a\n\x0dx{85}\x0cb "), 1357);
+  assertNull(res[582].firstMatch("** Failers"), 1358);
+  assertNull(res[582].firstMatch("ab  "), 1359);
+  assertNull(res[583].firstMatch("a\nb"), 1360);
+  assertNull(res[583].firstMatch("a\n\x0db"), 1361);
+  assertNull(res[583].firstMatch("a\n\x0dx{85}b"), 1362);
+  assertNull(res[583].firstMatch("a\x0d\n\x0d\nb "), 1363);
+  assertNull(res[583].firstMatch("a\x0d\n\x0d\n\x0d\nb "), 1364);
+  assertNull(res[583].firstMatch("a\n\x0d\n\x0db"), 1365);
+  assertNull(res[583].firstMatch("a\n\n\x0d\nb "), 1366);
+  assertNull(res[583].firstMatch("** Failers"), 1367);
+  assertNull(res[583].firstMatch("a\n\n\n\x0db"), 1368);
+  assertNull(res[583].firstMatch("a\x0d"), 1369);
+  assertNull(res[584].firstMatch("X X\n"), 1370);
+  assertNull(res[584].firstMatch("X\x09X\x0b"), 1371);
+  assertNull(res[584].firstMatch("** Failers"), 1372);
+  assertNull(res[584].firstMatch("x{a0} X\n   "), 1373);
+  assertNull(res[585].firstMatch("\x09 x{a0}X\n\x0b\x0c\x0d\n"), 1374);
+  assertNull(res[585].firstMatch("\x09 x{a0}\n\x0b\x0c\x0d\n"), 1375);
+  assertNull(res[585].firstMatch("\x09 x{a0}\n\x0b\x0c"), 1376);
+  assertNull(res[585].firstMatch("** Failers "), 1377);
+  assertNull(res[585].firstMatch("\x09 x{a0}\n\x0b"), 1378);
+  assertNull(res[585].firstMatch(" "), 1379);
+  assertNull(res[586].firstMatch("x{3001}x{3000}x{2030}x{2028}"), 1380);
+  assertNull(res[586].firstMatch("Xx{180e}Xx{85}"), 1381);
+  assertNull(res[586].firstMatch("** Failers"), 1382);
+  assertNull(res[586].firstMatch("x{2009} X\n   "), 1383);
+  assertNull(res[587].firstMatch("x{1680}x{180e}x{2007}Xx{2028}x{2029}\x0c\x0d\n"), 1384);
+  assertNull(res[587].firstMatch("\x09x{205f}x{a0}\nx{2029}\x0cx{2028}\n"), 1385);
+  assertNull(res[587].firstMatch("\x09 x{202f}\n\x0b\x0c"), 1386);
+  assertNull(res[587].firstMatch("** Failers "), 1387);
+  assertNull(res[587].firstMatch("\x09x{200a}x{a0}x{2028}\x0b"), 1388);
+  assertNull(res[587].firstMatch(" "), 1389);
+  assertNull(res[588].firstMatch(">x{1680}"), 1390);
+  assertNull(res[589].firstMatch(">x{1680}x{180e}x{2000}x{2003}x{200a}x{202f}x{205f}x{3000}<"), 1391);
+  assertToStringEquals("x{1ec5} ", res[593].firstMatch("x{1ec5} "), 1392);
+  assertNull(res[594].firstMatch("x{0}x{d7ff}x{e000}x{10ffff}"), 1393);
+  assertNull(res[594].firstMatch("x{d800}"), 1394);
+  assertNull(res[594].firstMatch("x{d800}?"), 1395);
+  assertNull(res[594].firstMatch("x{da00}"), 1396);
+  assertNull(res[594].firstMatch("x{da00}?"), 1397);
+  assertNull(res[594].firstMatch("x{dfff}"), 1398);
+  assertNull(res[594].firstMatch("x{dfff}?"), 1399);
+  assertNull(res[594].firstMatch("x{110000}    "), 1400);
+  assertNull(res[594].firstMatch("x{110000}?    "), 1401);
+  assertNull(res[594].firstMatch("x{2000000} "), 1402);
+  assertNull(res[594].firstMatch("x{2000000}? "), 1403);
+  assertNull(res[594].firstMatch("x{7fffffff} "), 1404);
+  assertNull(res[594].firstMatch("x{7fffffff}? "), 1405);
+  assertNull(res[595].firstMatch("a\x0db"), 1406);
+  assertNull(res[595].firstMatch("a\nb"), 1407);
+  assertNull(res[595].firstMatch("a\x0d\nb"), 1408);
+  assertNull(res[595].firstMatch("** Failers"), 1409);
+  assertNull(res[595].firstMatch("ax{85}b"), 1410);
+  assertNull(res[595].firstMatch("a\x0bb     "), 1411);
+  assertNull(res[596].firstMatch("a\x0db"), 1412);
+  assertNull(res[596].firstMatch("a\nb"), 1413);
+  assertNull(res[596].firstMatch("a\x0d\nb"), 1414);
+  assertNull(res[596].firstMatch("ax{85}b"), 1415);
+  assertNull(res[596].firstMatch("a\x0bb     "), 1416);
+  assertNull(res[596].firstMatch("** Failers "), 1417);
+  assertNull(res[596].firstMatch("ax{85}b<bsr_anycrlf>"), 1418);
+  assertNull(res[596].firstMatch("a\x0bb<bsr_anycrlf>"), 1419);
+  assertNull(res[597].firstMatch("a\x0db"), 1420);
+  assertNull(res[597].firstMatch("a\nb"), 1421);
+  assertNull(res[597].firstMatch("a\x0d\nb"), 1422);
+  assertNull(res[597].firstMatch("** Failers"), 1423);
+  assertNull(res[597].firstMatch("ax{85}b"), 1424);
+  assertNull(res[597].firstMatch("a\x0bb     "), 1425);
+  assertNull(res[598].firstMatch("a\x0db"), 1426);
+  assertNull(res[598].firstMatch("a\nb"), 1427);
+  assertNull(res[598].firstMatch("a\x0d\nb"), 1428);
+  assertNull(res[598].firstMatch("ax{85}b"), 1429);
+  assertNull(res[598].firstMatch("a\x0bb     "), 1430);
+  assertNull(res[598].firstMatch("** Failers "), 1431);
+  assertNull(res[598].firstMatch("ax{85}b<bsr_anycrlf>"), 1432);
+  assertNull(res[598].firstMatch("a\x0bb<bsr_anycrlf>"), 1433);
+  assertToStringEquals("QQQx{2029}ABCaXYZ=!bPQR", res[599].firstMatch("QQQx{2029}ABCaXYZ=!bPQR"), 1434);
+  assertNull(res[599].firstMatch("** Failers"), 1435);
+  assertNull(res[599].firstMatch("ax{2029}b"), 1436);
+  assertNull(res[599].firstMatch("a\xe2\x80\xa9b "), 1437);
+  assertNull(res[600].firstMatch("ax{1234}b"), 1438);
+  assertToStringEquals("a\nb", res[600].firstMatch("a\nb "), 1439);
+  assertNull(res[600].firstMatch("** Failers"), 1440);
+  assertNull(res[600].firstMatch("ab  "), 1441);
+  assertToStringEquals("aXb", res[601].firstMatch("aXb"), 1442);
+  assertToStringEquals("a\nX\nXx{1234}b", res[601].firstMatch("a\nX\nXx{1234}b "), 1443);
+  assertNull(res[601].firstMatch("** Failers"), 1444);
+  assertNull(res[601].firstMatch("ab  "), 1445);
+  assertNull(res[601].firstMatch("x{de}x{de}"), 1446);
+  assertNull(res[601].firstMatch("x{123} "), 1447);
+  assertToStringEquals("X", res[602].firstMatch("Ax{1ec5}ABCXYZ"), 1448);
+  assertNull(res[604].firstMatch("x{c0}x{30f}x{660}x{66c}x{f01}x{1680}<"), 1449);
+  assertNull(res[604].firstMatch("\npx{300}9!\$ < "), 1450);
+  assertNull(res[604].firstMatch("** Failers "), 1451);
+  assertNull(res[604].firstMatch("apx{300}9!\$ < "), 1452);
+  assertNull(res[605].firstMatch("X"), 1453);
+  assertNull(res[605].firstMatch("** Failers "), 1454);
+  assertNull(res[605].firstMatch(""), 1455);
+  assertNull(res[606].firstMatch("9"), 1456);
+  assertNull(res[606].firstMatch("** Failers "), 1457);
+  assertNull(res[606].firstMatch("x{c0}"), 1458);
+  assertNull(res[607].firstMatch("X"), 1459);
+  assertNull(res[607].firstMatch("** Failers "), 1460);
+  assertNull(res[607].firstMatch("x{30f}"), 1461);
+  assertNull(res[608].firstMatch("X"), 1462);
+  assertNull(res[608].firstMatch("** Failers "), 1463);
+  assertNull(res[608].firstMatch("x{660}"), 1464);
+  assertNull(res[609].firstMatch("X"), 1465);
+  assertNull(res[609].firstMatch("** Failers "), 1466);
+  assertNull(res[609].firstMatch("x{66c}"), 1467);
+  assertNull(res[610].firstMatch("X"), 1468);
+  assertNull(res[610].firstMatch("** Failers "), 1469);
+  assertNull(res[610].firstMatch("x{f01}"), 1470);
+  assertNull(res[611].firstMatch("X"), 1471);
+  assertNull(res[611].firstMatch("** Failers "), 1472);
+  assertNull(res[611].firstMatch("x{1680}"), 1473);
+  assertNull(res[612].firstMatch("x{017}"), 1474);
+  assertNull(res[612].firstMatch("x{09f} "), 1475);
+  assertNull(res[612].firstMatch("** Failers"), 1476);
+  assertNull(res[612].firstMatch("x{0600} "), 1477);
+  assertNull(res[613].firstMatch("x{601}"), 1478);
+  assertNull(res[613].firstMatch("** Failers"), 1479);
+  assertNull(res[613].firstMatch("x{09f} "), 1480);
+  assertNull(res[614].firstMatch("x{e0000}"), 1481);
+  assertNull(res[614].firstMatch("** Failers"), 1482);
+  assertNull(res[614].firstMatch("x{09f} "), 1483);
+  assertNull(res[615].firstMatch("x{f8ff}"), 1484);
+  assertNull(res[615].firstMatch("** Failers"), 1485);
+  assertNull(res[615].firstMatch("x{09f} "), 1486);
+  assertNull(res[616].firstMatch("?x{dfff}"), 1487);
+  assertNull(res[616].firstMatch("** Failers"), 1488);
+  assertNull(res[616].firstMatch("x{09f} "), 1489);
+  assertNull(res[617].firstMatch("a"), 1490);
+  assertNull(res[617].firstMatch("** Failers "), 1491);
+  assertNull(res[617].firstMatch("Z"), 1492);
+  assertNull(res[617].firstMatch("x{e000}  "), 1493);
+  assertNull(res[618].firstMatch("x{2b0}"), 1494);
+  assertNull(res[618].firstMatch("** Failers"), 1495);
+  assertNull(res[618].firstMatch("a "), 1496);
+  assertNull(res[619].firstMatch("x{1bb}"), 1497);
+  assertNull(res[619].firstMatch("x{3400}"), 1498);
+  assertNull(res[619].firstMatch("x{3401}"), 1499);
+  assertNull(res[619].firstMatch("x{4d00}"), 1500);
+  assertNull(res[619].firstMatch("x{4db4}"), 1501);
+  assertNull(res[619].firstMatch("x{4db5}     "), 1502);
+  assertNull(res[619].firstMatch("** Failers"), 1503);
+  assertNull(res[619].firstMatch("a "), 1504);
+  assertNull(res[619].firstMatch("x{2b0}"), 1505);
+  assertNull(res[619].firstMatch("x{4db6} "), 1506);
+  assertNull(res[620].firstMatch("x{1c5}"), 1507);
+  assertNull(res[620].firstMatch("** Failers"), 1508);
+  assertNull(res[620].firstMatch("a "), 1509);
+  assertNull(res[620].firstMatch("x{2b0}"), 1510);
+  assertNull(res[621].firstMatch("A"), 1511);
+  assertNull(res[621].firstMatch("** Failers"), 1512);
+  assertNull(res[621].firstMatch("x{2b0}"), 1513);
+  assertNull(res[622].firstMatch("x{903}"), 1514);
+  assertNull(res[622].firstMatch("** Failers"), 1515);
+  assertNull(res[622].firstMatch("X"), 1516);
+  assertNull(res[622].firstMatch("x{300}"), 1517);
+  assertNull(res[622].firstMatch("   "), 1518);
+  assertNull(res[623].firstMatch("x{488}"), 1519);
+  assertNull(res[623].firstMatch("** Failers"), 1520);
+  assertNull(res[623].firstMatch("X"), 1521);
+  assertNull(res[623].firstMatch("x{903}"), 1522);
+  assertNull(res[623].firstMatch("x{300}"), 1523);
+  assertNull(res[624].firstMatch("x{300}"), 1524);
+  assertNull(res[624].firstMatch("** Failers"), 1525);
+  assertNull(res[624].firstMatch("X"), 1526);
+  assertNull(res[624].firstMatch("x{903}"), 1527);
+  assertNull(res[624].firstMatch("0123456789x{660}x{661}x{662}x{663}x{664}x{665}x{666}x{667}x{668}x{669}x{66a}"), 1528);
+  assertNull(res[624].firstMatch("x{6f0}x{6f1}x{6f2}x{6f3}x{6f4}x{6f5}x{6f6}x{6f7}x{6f8}x{6f9}x{6fa}"), 1529);
+  assertNull(res[624].firstMatch("x{966}x{967}x{968}x{969}x{96a}x{96b}x{96c}x{96d}x{96e}x{96f}x{970}"), 1530);
+  assertNull(res[624].firstMatch("** Failers"), 1531);
+  assertNull(res[624].firstMatch("X"), 1532);
+  assertNull(res[625].firstMatch("x{16ee}"), 1533);
+  assertNull(res[625].firstMatch("** Failers"), 1534);
+  assertNull(res[625].firstMatch("X"), 1535);
+  assertNull(res[625].firstMatch("x{966}"), 1536);
+  assertNull(res[626].firstMatch("x{b2}"), 1537);
+  assertNull(res[626].firstMatch("x{b3}"), 1538);
+  assertNull(res[626].firstMatch("** Failers"), 1539);
+  assertNull(res[626].firstMatch("X"), 1540);
+  assertNull(res[626].firstMatch("x{16ee}"), 1541);
+  assertNull(res[627].firstMatch("_"), 1542);
+  assertNull(res[627].firstMatch("x{203f}"), 1543);
+  assertNull(res[627].firstMatch("** Failers"), 1544);
+  assertNull(res[627].firstMatch("X"), 1545);
+  assertNull(res[627].firstMatch("-"), 1546);
+  assertNull(res[627].firstMatch("x{58a}"), 1547);
+  assertNull(res[628].firstMatch("-"), 1548);
+  assertNull(res[628].firstMatch("x{58a}"), 1549);
+  assertNull(res[628].firstMatch("** Failers"), 1550);
+  assertNull(res[628].firstMatch("X"), 1551);
+  assertNull(res[628].firstMatch("x{203f}"), 1552);
+  assertNull(res[629].firstMatch(")"), 1553);
+  assertNull(res[629].firstMatch("]"), 1554);
+  assertNull(res[629].firstMatch("}"), 1555);
+  assertNull(res[629].firstMatch("x{f3b}"), 1556);
+  assertNull(res[629].firstMatch("** Failers"), 1557);
+  assertNull(res[629].firstMatch("X"), 1558);
+  assertNull(res[629].firstMatch("x{203f}"), 1559);
+  assertNull(res[629].firstMatch("("), 1560);
+  assertNull(res[629].firstMatch("["), 1561);
+  assertNull(res[629].firstMatch("{"), 1562);
+  assertNull(res[629].firstMatch("x{f3c}"), 1563);
+  assertNull(res[630].firstMatch("x{bb}"), 1564);
+  assertNull(res[630].firstMatch("x{2019}"), 1565);
+  assertNull(res[630].firstMatch("** Failers"), 1566);
+  assertNull(res[630].firstMatch("X"), 1567);
+  assertNull(res[630].firstMatch("x{203f}"), 1568);
+  assertNull(res[631].firstMatch("x{ab}"), 1569);
+  assertNull(res[631].firstMatch("x{2018}"), 1570);
+  assertNull(res[631].firstMatch("** Failers"), 1571);
+  assertNull(res[631].firstMatch("X"), 1572);
+  assertNull(res[631].firstMatch("x{203f}"), 1573);
+  assertNull(res[632].firstMatch("!"), 1574);
+  assertNull(res[632].firstMatch("x{37e}"), 1575);
+  assertNull(res[632].firstMatch("** Failers"), 1576);
+  assertNull(res[632].firstMatch("X"), 1577);
+  assertNull(res[632].firstMatch("x{203f}"), 1578);
+  assertNull(res[633].firstMatch("("), 1579);
+  assertNull(res[633].firstMatch("["), 1580);
+  assertNull(res[633].firstMatch("{"), 1581);
+  assertNull(res[633].firstMatch("x{f3c}"), 1582);
+  assertNull(res[633].firstMatch("** Failers"), 1583);
+  assertNull(res[633].firstMatch("X"), 1584);
+  assertNull(res[633].firstMatch(")"), 1585);
+  assertNull(res[633].firstMatch("]"), 1586);
+  assertNull(res[633].firstMatch("}"), 1587);
+  assertNull(res[633].firstMatch("x{f3b}"), 1588);
+  assertNull(res[633].firstMatch("\$x{a2}x{a3}x{a4}x{a5}x{a6}"), 1589);
+  assertNull(res[633].firstMatch("x{9f2}"), 1590);
+  assertNull(res[633].firstMatch("** Failers"), 1591);
+  assertNull(res[633].firstMatch("X"), 1592);
+  assertNull(res[633].firstMatch("x{2c2}"), 1593);
+  assertNull(res[634].firstMatch("x{2c2}"), 1594);
+  assertNull(res[634].firstMatch("** Failers"), 1595);
+  assertNull(res[634].firstMatch("X"), 1596);
+  assertNull(res[634].firstMatch("x{9f2}"), 1597);
+  assertNull(res[634].firstMatch("+<|~x{ac}x{2044}"), 1598);
+  assertNull(res[634].firstMatch("** Failers"), 1599);
+  assertNull(res[634].firstMatch("X"), 1600);
+  assertNull(res[634].firstMatch("x{9f2}"), 1601);
+  assertNull(res[635].firstMatch("x{a6}"), 1602);
+  assertNull(res[635].firstMatch("x{482} "), 1603);
+  assertNull(res[635].firstMatch("** Failers"), 1604);
+  assertNull(res[635].firstMatch("X"), 1605);
+  assertNull(res[635].firstMatch("x{9f2}"), 1606);
+  assertNull(res[636].firstMatch("x{2028}"), 1607);
+  assertNull(res[636].firstMatch("** Failers"), 1608);
+  assertNull(res[636].firstMatch("X"), 1609);
+  assertNull(res[636].firstMatch("x{2029}"), 1610);
+  assertNull(res[637].firstMatch("x{2029}"), 1611);
+  assertNull(res[637].firstMatch("** Failers"), 1612);
+  assertNull(res[637].firstMatch("X"), 1613);
+  assertNull(res[637].firstMatch("x{2028}"), 1614);
+  assertNull(res[638].firstMatch("\\ \\"), 1615);
+  assertNull(res[638].firstMatch("x{a0}"), 1616);
+  assertNull(res[638].firstMatch("x{1680}"), 1617);
+  assertNull(res[638].firstMatch("x{180e}"), 1618);
+  assertNull(res[638].firstMatch("x{2000}"), 1619);
+  assertNull(res[638].firstMatch("x{2001}     "), 1620);
+  assertNull(res[638].firstMatch("** Failers"), 1621);
+  assertNull(res[638].firstMatch("x{2028}"), 1622);
+  assertNull(res[638].firstMatch("x{200d} "), 1623);
+  assertNull(res[638].firstMatch("  x{660}x{661}x{662}ABC"), 1624);
+  assertNull(res[638].firstMatch("  x{660}x{661}x{662}ABC"), 1625);
+  assertNull(res[639].firstMatch("  x{660}x{661}x{662}ABC"), 1626);
+  assertNull(res[640].firstMatch("  x{660}x{661}x{662}ABC"), 1627);
+  assertNull(res[641].firstMatch("  x{660}x{661}x{662}ABC"), 1628);
+  assertNull(res[642].firstMatch("  x{660}x{661}x{662}ABC"), 1629);
+  assertNull(res[643].firstMatch("  x{660}x{661}x{662}ABC"), 1630);
+  assertNull(res[644].firstMatch("  x{660}x{661}x{662}ABC"), 1631);
+  assertNull(res[645].firstMatch("  x{660}x{661}x{662}ABC"), 1632);
+  assertNull(res[646].firstMatch("  x{660}x{661}x{662}ABC"), 1633);
+  assertNull(res[647].firstMatch("  x{660}x{661}x{662}ABC"), 1634);
+  assertNull(res[647].firstMatch("  x{660}x{661}x{662}ABC"), 1635);
+  assertNull(res[647].firstMatch("  x{660}x{661}x{662}ABC"), 1636);
+  assertNull(res[647].firstMatch("  ** Failers"), 1637);
+  assertNull(res[647].firstMatch("  x{660}x{661}x{662}ABC"), 1638);
+  assertNull(res[648].firstMatch("A"), 1639);
+  assertNull(res[648].firstMatch("ax{10a0}B "), 1640);
+  assertNull(res[648].firstMatch("** Failers "), 1641);
+  assertNull(res[648].firstMatch("a"), 1642);
+  assertNull(res[648].firstMatch("x{1d00}  "), 1643);
+  assertNull(res[649].firstMatch("1234"), 1644);
+  assertNull(res[649].firstMatch("** Failers"), 1645);
+  assertNull(res[649].firstMatch("ABC "), 1646);
+  assertNull(res[650].firstMatch("1234"), 1647);
+  assertNull(res[650].firstMatch("** Failers"), 1648);
+  assertNull(res[650].firstMatch("ABC "), 1649);
+  assertNull(res[650].firstMatch("A2XYZ"), 1650);
+  assertNull(res[650].firstMatch("123A5XYZPQR"), 1651);
+  assertNull(res[650].firstMatch("ABAx{660}XYZpqr"), 1652);
+  assertNull(res[650].firstMatch("** Failers"), 1653);
+  assertNull(res[650].firstMatch("AXYZ"), 1654);
+  assertNull(res[650].firstMatch("XYZ     "), 1655);
+  assertNull(res[650].firstMatch("1XYZ"), 1656);
+  assertNull(res[650].firstMatch("AB=XYZ.. "), 1657);
+  assertNull(res[650].firstMatch("XYZ "), 1658);
+  assertNull(res[650].firstMatch("** Failers"), 1659);
+  assertNull(res[650].firstMatch("WXYZ "), 1660);
+  assertNull(res[655].firstMatch("1234"), 1661);
+  assertNull(res[655].firstMatch("1234"), 1662);
+  assertNull(res[655].firstMatch("12-34"), 1663);
+  assertToStringEquals("{", res[655].firstMatch("12+x{661}-34  "), 1664);
+  assertNull(res[655].firstMatch("** Failers"), 1665);
+  assertToStringEquals("d", res[655].firstMatch("abcd  "), 1666);
+  assertToStringEquals("d", res[656].firstMatch("abcd"), 1667);
+  assertNull(res[656].firstMatch("** Failers"), 1668);
+  assertNull(res[656].firstMatch("1234"), 1669);
+  assertNull(res[657].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 1670);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[657].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1671);
+  assertToStringEquals(" ", res[657].firstMatch(" "), 1672);
+  assertNull(res[657].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 1673);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[657].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1674);
+  assertNull(res[658].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 1675);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[658].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1676);
+  assertNull(res[659].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 1677);
+  assertNull(res[659].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1678);
+  assertNull(res[660].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 1679);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[660].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 1680);
+  assertNull(res[661].firstMatch("a"), 1681);
+  assertNull(res[661].firstMatch("A "), 1682);
+  assertNull(res[662].firstMatch("a"), 1683);
+  assertNull(res[662].firstMatch("A "), 1684);
+  assertNull(res[663].firstMatch("A"), 1685);
+  assertNull(res[663].firstMatch("aZ"), 1686);
+  assertNull(res[663].firstMatch("** Failers"), 1687);
+  assertNull(res[663].firstMatch("abc   "), 1688);
+  assertNull(res[664].firstMatch("A"), 1689);
+  assertNull(res[664].firstMatch("aZ"), 1690);
+  assertNull(res[664].firstMatch("** Failers"), 1691);
+  assertNull(res[664].firstMatch("abc   "), 1692);
+  assertNull(res[665].firstMatch("a"), 1693);
+  assertNull(res[665].firstMatch("Az"), 1694);
+  assertNull(res[665].firstMatch("** Failers"), 1695);
+  assertNull(res[665].firstMatch("ABC   "), 1696);
+  assertNull(res[666].firstMatch("a"), 1697);
+  assertNull(res[666].firstMatch("Az"), 1698);
+  assertNull(res[666].firstMatch("** Failers"), 1699);
+  assertNull(res[666].firstMatch("ABC   "), 1700);
+  assertNull(res[666].firstMatch("x{c0}"), 1701);
+  assertNull(res[666].firstMatch("x{e0} "), 1702);
+  assertNull(res[666].firstMatch("x{c0}"), 1703);
+  assertNull(res[666].firstMatch("x{e0} "), 1704);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb0}"), 1705);
+  assertNull(res[666].firstMatch("** Failers"), 1706);
+  assertNull(res[666].firstMatch("ax{391}x{10427}x{ff3a}x{1fb0}   "), 1707);
+  assertNull(res[666].firstMatch("Ax{3b1}x{10427}x{ff3a}x{1fb0}"), 1708);
+  assertNull(res[666].firstMatch("Ax{391}x{1044F}x{ff3a}x{1fb0}"), 1709);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff5a}x{1fb0}"), 1710);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb8}"), 1711);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb0}"), 1712);
+  assertNull(res[666].firstMatch("ax{391}x{10427}x{ff3a}x{1fb0}   "), 1713);
+  assertNull(res[666].firstMatch("Ax{3b1}x{10427}x{ff3a}x{1fb0}"), 1714);
+  assertNull(res[666].firstMatch("Ax{391}x{1044F}x{ff3a}x{1fb0}"), 1715);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff5a}x{1fb0}"), 1716);
+  assertNull(res[666].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb8}"), 1717);
+  assertNull(res[666].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}"), 1718);
+  assertNull(res[666].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}X"), 1719);
+  assertNull(res[666].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}X"), 1720);
+  assertNull(res[666].firstMatch("x{391}"), 1721);
+  assertNull(res[666].firstMatch("x{ff3a}"), 1722);
+  assertNull(res[666].firstMatch("x{3b1}"), 1723);
+  assertNull(res[666].firstMatch("x{ff5a}   "), 1724);
+  assertNull(res[666].firstMatch("x{c0}"), 1725);
+  assertNull(res[666].firstMatch("x{e0} "), 1726);
+  assertNull(res[666].firstMatch("x{104}"), 1727);
+  assertNull(res[666].firstMatch("x{105}"), 1728);
+  assertNull(res[666].firstMatch("x{109}  "), 1729);
+  assertNull(res[666].firstMatch("** Failers"), 1730);
+  assertNull(res[666].firstMatch("x{100}"), 1731);
+  assertNull(res[666].firstMatch("x{10a} "), 1732);
+  assertNull(res[666].firstMatch("Z"), 1733);
+  assertNull(res[666].firstMatch("z"), 1734);
+  assertNull(res[666].firstMatch("x{39c}"), 1735);
+  assertNull(res[666].firstMatch("x{178}"), 1736);
+  assertNull(res[666].firstMatch("|"), 1737);
+  assertNull(res[666].firstMatch("x{80}"), 1738);
+  assertNull(res[666].firstMatch("x{ff}"), 1739);
+  assertNull(res[666].firstMatch("x{100}"), 1740);
+  assertNull(res[666].firstMatch("x{101} "), 1741);
+  assertNull(res[666].firstMatch("** Failers"), 1742);
+  assertNull(res[666].firstMatch("x{102}"), 1743);
+  assertNull(res[666].firstMatch("Y"), 1744);
+  assertNull(res[666].firstMatch("y           "), 1745);
+  assertNull(res[667].firstMatch("A"), 1746);
+  assertNull(res[667].firstMatch("Ax{300}BC "), 1747);
+  assertNull(res[667].firstMatch("Ax{300}x{301}x{302}BC "), 1748);
+  assertNull(res[667].firstMatch("*** Failers"), 1749);
+  assertNull(res[667].firstMatch("x{300}  "), 1750);
+  assertToStringEquals("X", res[668].firstMatch("X123"), 1751);
+  assertNull(res[668].firstMatch("*** Failers"), 1752);
+  assertNull(res[668].firstMatch("AXYZ"), 1753);
+  assertNull(res[669].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 1754);
+  assertNull(res[669].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 1755);
+  assertNull(res[670].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 1756);
+  assertNull(res[670].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 1757);
+  assertToStringEquals("A,,A", res[671].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 1758);
+  assertToStringEquals("A,,A", res[671].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 1759);
+  assertToStringEquals("A,,A", res[672].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 1760);
+  assertToStringEquals("A,,A", res[672].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 1761);
+  assertNull(res[673].firstMatch("*** Failers"), 1762);
+  assertNull(res[673].firstMatch("Ax{300}x{301}x{302}"), 1763);
+  assertNull(res[674].firstMatch("Ax{300}x{301}Bx{300}X"), 1764);
+  assertNull(res[674].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}"), 1765);
+  assertNull(res[674].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}X"), 1766);
+  assertNull(res[674].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}DAx{300}X"), 1767);
+  assertNull(res[675].firstMatch("Ax{300}x{301}Bx{300}X"), 1768);
+  assertNull(res[675].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}"), 1769);
+  assertNull(res[675].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}X"), 1770);
+  assertNull(res[675].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}DAx{300}X"), 1771);
+  assertNull(res[675].firstMatch("x{2e81}x{3007}x{2f804}x{31a0}"), 1772);
+  assertNull(res[675].firstMatch("** Failers"), 1773);
+  assertNull(res[675].firstMatch("x{2e7f}  "), 1774);
+  assertNull(res[675].firstMatch("x{3105}"), 1775);
+  assertNull(res[675].firstMatch("** Failers"), 1776);
+  assertNull(res[675].firstMatch("x{30ff}  "), 1777);
+  assertNull(res[676].firstMatch("x{06e9}"), 1778);
+  assertNull(res[676].firstMatch("x{060b}"), 1779);
+  assertNull(res[676].firstMatch("** Failers"), 1780);
+  assertNull(res[676].firstMatch("Xx{06e9}   "), 1781);
+  assertNull(res[677].firstMatch("x{2f800}"), 1782);
+  assertNull(res[677].firstMatch("** Failers"), 1783);
+  assertNull(res[677].firstMatch("x{a014}"), 1784);
+  assertNull(res[677].firstMatch("x{a4c6}   "), 1785);
+  assertNull(res[678].firstMatch("AXYZ"), 1786);
+  assertNull(res[678].firstMatch("x{1234}XYZ "), 1787);
+  assertNull(res[678].firstMatch("** Failers"), 1788);
+  assertNull(res[678].firstMatch("X  "), 1789);
+  assertNull(res[679].firstMatch("** Failers"), 1790);
+  assertNull(res[679].firstMatch("AX"), 1791);
+  assertNull(res[680].firstMatch("XYZ"), 1792);
+  assertNull(res[680].firstMatch("AXYZ"), 1793);
+  assertNull(res[680].firstMatch("x{1234}XYZ "), 1794);
+  assertNull(res[680].firstMatch("** Failers"), 1795);
+  assertNull(res[680].firstMatch("ABXYZ   "), 1796);
+  assertNull(res[681].firstMatch("XYZ"), 1797);
+  assertNull(res[681].firstMatch("** Failers"), 1798);
+  assertNull(res[681].firstMatch("AXYZ"), 1799);
+  assertNull(res[681].firstMatch("x{1234}XYZ "), 1800);
+  assertNull(res[681].firstMatch("ABXYZ   "), 1801);
+  assertNull(res[681].firstMatch("AXYZ"), 1802);
+  assertNull(res[681].firstMatch("x{1234}XYZ"), 1803);
+  assertNull(res[681].firstMatch("Ax{1234}XYZ"), 1804);
+  assertNull(res[681].firstMatch("** Failers"), 1805);
+  assertNull(res[681].firstMatch("XYZ"), 1806);
+  assertNull(res[681].firstMatch("** Failers"), 1807);
+  assertNull(res[681].firstMatch("AXYZ"), 1808);
+  assertNull(res[681].firstMatch("x{1234}XYZ"), 1809);
+  assertNull(res[681].firstMatch("Ax{1234}XYZ"), 1810);
+  assertNull(res[681].firstMatch("XYZ"), 1811);
+  assertNull(res[682].firstMatch("XYZ"), 1812);
+  assertNull(res[682].firstMatch("AXYZ"), 1813);
+  assertNull(res[682].firstMatch("x{1234}XYZ"), 1814);
+  assertNull(res[682].firstMatch("Ax{1234}XYZ"), 1815);
+  assertNull(res[682].firstMatch("** Failers"), 1816);
+  assertNull(res[683].firstMatch("XYZ"), 1817);
+  assertNull(res[683].firstMatch("** Failers"), 1818);
+  assertNull(res[683].firstMatch("AXYZ"), 1819);
+  assertNull(res[683].firstMatch("x{1234}XYZ"), 1820);
+  assertNull(res[683].firstMatch("Ax{1234}XYZ"), 1821);
+  assertToStringEquals("AX", res[684].firstMatch("AXYZ"), 1822);
+  assertNull(res[684].firstMatch("x{1234}XYZ "), 1823);
+  assertNull(res[684].firstMatch("** Failers"), 1824);
+  assertNull(res[684].firstMatch("X  "), 1825);
+  assertNull(res[685].firstMatch("** Failers"), 1826);
+  assertToStringEquals("AX", res[685].firstMatch("AX"), 1827);
+  assertToStringEquals("X", res[686].firstMatch("XYZ"), 1828);
+  assertToStringEquals("AX", res[686].firstMatch("AXYZ"), 1829);
+  assertNull(res[686].firstMatch("x{1234}XYZ "), 1830);
+  assertNull(res[686].firstMatch("** Failers"), 1831);
+  assertNull(res[686].firstMatch("ABXYZ   "), 1832);
+  assertToStringEquals("X", res[687].firstMatch("XYZ"), 1833);
+  assertNull(res[687].firstMatch("** Failers"), 1834);
+  assertToStringEquals("AX", res[687].firstMatch("AXYZ"), 1835);
+  assertNull(res[687].firstMatch("x{1234}XYZ "), 1836);
+  assertNull(res[687].firstMatch("ABXYZ   "), 1837);
+  assertToStringEquals("AX", res[688].firstMatch("AXYZ"), 1838);
+  assertNull(res[688].firstMatch("x{1234}XYZ"), 1839);
+  assertNull(res[688].firstMatch("Ax{1234}XYZ"), 1840);
+  assertNull(res[688].firstMatch("** Failers"), 1841);
+  assertNull(res[688].firstMatch("XYZ"), 1842);
+  assertNull(res[689].firstMatch("** Failers"), 1843);
+  assertToStringEquals("AX", res[689].firstMatch("AXYZ"), 1844);
+  assertNull(res[689].firstMatch("x{1234}XYZ"), 1845);
+  assertNull(res[689].firstMatch("Ax{1234}XYZ"), 1846);
+  assertNull(res[689].firstMatch("XYZ"), 1847);
+  assertToStringEquals("X", res[690].firstMatch("XYZ"), 1848);
+  assertToStringEquals("AX", res[690].firstMatch("AXYZ"), 1849);
+  assertNull(res[690].firstMatch("x{1234}XYZ"), 1850);
+  assertNull(res[690].firstMatch("Ax{1234}XYZ"), 1851);
+  assertNull(res[690].firstMatch("** Failers"), 1852);
+  assertToStringEquals("X", res[691].firstMatch("XYZ"), 1853);
+  assertNull(res[691].firstMatch("** Failers"), 1854);
+  assertToStringEquals("AX", res[691].firstMatch("AXYZ"), 1855);
+  assertNull(res[691].firstMatch("x{1234}XYZ"), 1856);
+  assertNull(res[691].firstMatch("Ax{1234}XYZ"), 1857);
+  assertNull(res[692].firstMatch("abcdefgh"), 1858);
+  assertNull(res[692].firstMatch("x{1234}\n\x0dx{3456}xyz "), 1859);
+  assertNull(res[693].firstMatch("abcdefgh"), 1860);
+  assertNull(res[693].firstMatch("x{1234}\n\x0dx{3456}xyz "), 1861);
+  assertNull(res[694].firstMatch("** Failers"), 1862);
+  assertNull(res[694].firstMatch("abcdefgh"), 1863);
+  assertNull(res[694].firstMatch("x{1234}\n\x0dx{3456}xyz "), 1864);
+  assertNull(res[695].firstMatch(" AXY"), 1865);
+  assertNull(res[695].firstMatch(" aXY"), 1866);
+  assertNull(res[695].firstMatch(" x{1c5}XY"), 1867);
+  assertNull(res[695].firstMatch(" ** Failers"), 1868);
+  assertNull(res[695].firstMatch(" x{1bb}XY"), 1869);
+  assertNull(res[695].firstMatch(" x{2b0}XY"), 1870);
+  assertNull(res[695].firstMatch(" !XY      "), 1871);
+  assertNull(res[696].firstMatch(" AXY"), 1872);
+  assertNull(res[696].firstMatch(" aXY"), 1873);
+  assertNull(res[696].firstMatch(" x{1c5}XY"), 1874);
+  assertNull(res[696].firstMatch(" ** Failers"), 1875);
+  assertNull(res[696].firstMatch(" x{1bb}XY"), 1876);
+  assertNull(res[696].firstMatch(" x{2b0}XY"), 1877);
+  assertNull(res[696].firstMatch(" !XY      "), 1878);
+  assertNull(res[696].firstMatch(" AXY"), 1879);
+  assertNull(res[696].firstMatch(" aXY"), 1880);
+  assertNull(res[696].firstMatch(" AbcdeXyz "), 1881);
+  assertNull(res[696].firstMatch(" x{1c5}AbXY"), 1882);
+  assertNull(res[696].firstMatch(" abcDEXypqreXlmn "), 1883);
+  assertNull(res[696].firstMatch(" ** Failers"), 1884);
+  assertNull(res[696].firstMatch(" x{1bb}XY"), 1885);
+  assertNull(res[696].firstMatch(" x{2b0}XY"), 1886);
+  assertNull(res[696].firstMatch(" !XY      "), 1887);
+  assertNull(res[697].firstMatch(" AXY"), 1888);
+  assertNull(res[697].firstMatch(" aXY"), 1889);
+  assertNull(res[697].firstMatch(" AbcdeXyz "), 1890);
+  assertNull(res[697].firstMatch(" x{1c5}AbXY"), 1891);
+  assertNull(res[697].firstMatch(" abcDEXypqreXlmn "), 1892);
+  assertNull(res[697].firstMatch(" ** Failers"), 1893);
+  assertNull(res[697].firstMatch(" x{1bb}XY"), 1894);
+  assertNull(res[697].firstMatch(" x{2b0}XY"), 1895);
+  assertNull(res[697].firstMatch(" !XY      "), 1896);
+  assertNull(res[697].firstMatch(" AXY"), 1897);
+  assertNull(res[697].firstMatch(" aXY"), 1898);
+  assertNull(res[697].firstMatch(" AbcdeXyz "), 1899);
+  assertNull(res[697].firstMatch(" x{1c5}AbXY"), 1900);
+  assertNull(res[697].firstMatch(" abcDEXypqreXlmn "), 1901);
+  assertNull(res[697].firstMatch(" ** Failers"), 1902);
+  assertNull(res[697].firstMatch(" x{1bb}XY"), 1903);
+  assertNull(res[697].firstMatch(" x{2b0}XY"), 1904);
+  assertNull(res[697].firstMatch(" !XY      "), 1905);
+  assertNull(res[698].firstMatch(" AXY"), 1906);
+  assertNull(res[698].firstMatch(" aXY"), 1907);
+  assertNull(res[698].firstMatch(" AbcdeXyz "), 1908);
+  assertNull(res[698].firstMatch(" x{1c5}AbXY"), 1909);
+  assertNull(res[698].firstMatch(" abcDEXypqreXlmn "), 1910);
+  assertNull(res[698].firstMatch(" ** Failers"), 1911);
+  assertNull(res[698].firstMatch(" x{1bb}XY"), 1912);
+  assertNull(res[698].firstMatch(" x{2b0}XY"), 1913);
+  assertNull(res[698].firstMatch(" !XY      "), 1914);
+  assertNull(res[699].firstMatch(" !XY"), 1915);
+  assertNull(res[699].firstMatch(" x{1bb}XY"), 1916);
+  assertNull(res[699].firstMatch(" x{2b0}XY"), 1917);
+  assertNull(res[699].firstMatch(" ** Failers"), 1918);
+  assertNull(res[699].firstMatch(" x{1c5}XY"), 1919);
+  assertNull(res[699].firstMatch(" AXY      "), 1920);
+  assertNull(res[700].firstMatch(" !XY"), 1921);
+  assertNull(res[700].firstMatch(" x{1bb}XY"), 1922);
+  assertNull(res[700].firstMatch(" x{2b0}XY"), 1923);
+  assertNull(res[700].firstMatch(" ** Failers"), 1924);
+  assertNull(res[700].firstMatch(" x{1c5}XY"), 1925);
+  assertNull(res[700].firstMatch(" AXY      "), 1926);
+  assertNull(res[701].firstMatch("\xa0!"), 1927);
+  assertNull(res[701].firstMatch("AabcabcYZ    "), 1928);
+  assertToStringEquals("L=abcX,L=abc,abc", res[702].firstMatch("L=abcX"), 1929);
+  assertNull(res[702].firstMatch("x{c0}"), 1930);
+  assertNull(res[702].firstMatch("x{e0} "), 1931);
+  assertNull(res[702].firstMatch("x{c0}"), 1932);
+  assertNull(res[702].firstMatch("x{e0} "), 1933);
+  assertNull(res[703].firstMatch("x{1b00}x{12000}x{7c0}x{a840}x{10900}"), 1934);
+  assertNull(res[706].firstMatch("123abcdefg"), 1935);
+  assertNull(res[706].firstMatch("123abc\xc4\xc5zz"), 1936);
+  assertNull(res[710].firstMatch("A\x80"), 1937);
+  assertNull(res[725].firstMatch("x{60e} "), 1938);
+  assertNull(res[725].firstMatch("x{656} "), 1939);
+  assertNull(res[725].firstMatch("x{657} "), 1940);
+  assertNull(res[725].firstMatch("x{658} "), 1941);
+  assertNull(res[725].firstMatch("x{659} "), 1942);
+  assertNull(res[725].firstMatch("x{65a} "), 1943);
+  assertNull(res[725].firstMatch("x{65b} "), 1944);
+  assertNull(res[725].firstMatch("x{65c} "), 1945);
+  assertNull(res[725].firstMatch("x{65d} "), 1946);
+  assertNull(res[725].firstMatch("x{65e} "), 1947);
+  assertNull(res[725].firstMatch("x{66a} "), 1948);
+  assertNull(res[725].firstMatch("x{6e9} "), 1949);
+  assertNull(res[725].firstMatch("x{6ef}"), 1950);
+  assertNull(res[725].firstMatch("x{6fa}  "), 1951);
+  assertNull(res[725].firstMatch("** Failers"), 1952);
+  assertNull(res[725].firstMatch("x{600}"), 1953);
+  assertNull(res[725].firstMatch("x{650}"), 1954);
+  assertNull(res[725].firstMatch("x{651}  "), 1955);
+  assertNull(res[725].firstMatch("x{652}  "), 1956);
+  assertNull(res[725].firstMatch("x{653}  "), 1957);
+  assertNull(res[725].firstMatch("x{654} "), 1958);
+  assertNull(res[725].firstMatch("x{655} "), 1959);
+  assertNull(res[725].firstMatch("x{65f}  "), 1960);
+  assertNull(res[726].firstMatch("x{1d2b} "), 1961);
+  assertNull(res[727].firstMatch("x{589}"), 1962);
+  assertNull(res[727].firstMatch("x{60c}"), 1963);
+  assertNull(res[727].firstMatch("x{61f}  "), 1964);
+  assertNull(res[727].firstMatch("x{964}"), 1965);
+  assertNull(res[727].firstMatch("x{965}  "), 1966);
+  assertNull(res[727].firstMatch("x{970}  "), 1967);
+  assertNull(res[728].firstMatch("x{64b}"), 1968);
+  assertNull(res[728].firstMatch("x{654}"), 1969);
+  assertNull(res[728].firstMatch("x{655}"), 1970);
+  assertNull(res[728].firstMatch("x{200c} "), 1971);
+  assertNull(res[728].firstMatch("** Failers"), 1972);
+  assertNull(res[728].firstMatch("x{64a}"), 1973);
+  assertNull(res[728].firstMatch("x{656}     "), 1974);
+  assertNull(res[729].firstMatch("x{10450}"), 1975);
+  assertNull(res[729].firstMatch("x{1047f}"), 1976);
+  assertNull(res[730].firstMatch("x{10400}"), 1977);
+  assertNull(res[730].firstMatch("x{1044f}"), 1978);
+  assertNull(res[731].firstMatch("x{10480}"), 1979);
+  assertNull(res[731].firstMatch("x{1049d}"), 1980);
+  assertNull(res[731].firstMatch("x{104a0}"), 1981);
+  assertNull(res[731].firstMatch("x{104a9}"), 1982);
+  assertNull(res[731].firstMatch("** Failers"), 1983);
+  assertNull(res[731].firstMatch("x{1049e}"), 1984);
+  assertNull(res[731].firstMatch("x{1049f}"), 1985);
+  assertNull(res[731].firstMatch("x{104aa}           "), 1986);
+  assertNull(res[731].firstMatch("\xe2\x80\xa8\xe2\x80\xa8"), 1987);
+  assertNull(res[731].firstMatch("x{2028}x{2028}x{2028}"), 1988);
+  assertNull(res[732].firstMatch("x{c0}x{e0}x{116}x{117}"), 1989);
+  assertNull(res[732].firstMatch("x{c0}x{e0}x{116}x{117}"), 1990);
+  assertNull(res[733].firstMatch("x{102A4}x{AA52}x{A91D}x{1C46}x{10283}x{1092E}x{1C6B}x{A93B}x{A8BF}x{1BA0}x{A50A}===="), 1991);
+  assertNull(res[733].firstMatch("x{a77d}x{1d79}"), 1992);
+  assertNull(res[733].firstMatch("x{1d79}x{a77d} "), 1993);
+  assertNull(res[733].firstMatch("x{a77d}x{1d79}"), 1994);
+  assertNull(res[733].firstMatch("** Failers "), 1995);
+  assertNull(res[733].firstMatch("x{1d79}x{a77d} "), 1996);
+  assertToStringEquals("AA,A", res[734].firstMatch("AA"), 1997);
+  assertToStringEquals("Aa,A", res[734].firstMatch("Aa"), 1998);
+  assertToStringEquals("aa,a", res[734].firstMatch("aa"), 1999);
+  assertToStringEquals("aA,a", res[734].firstMatch("aA"), 2000);
+  assertNull(res[734].firstMatch("x{de}x{de}"), 2001);
+  assertNull(res[734].firstMatch("x{de}x{fe}"), 2002);
+  assertNull(res[734].firstMatch("x{fe}x{fe}"), 2003);
+  assertNull(res[734].firstMatch("x{fe}x{de}"), 2004);
+  assertNull(res[734].firstMatch("x{10a}x{10a}"), 2005);
+  assertNull(res[734].firstMatch("x{10a}x{10b}"), 2006);
+  assertNull(res[734].firstMatch("x{10b}x{10b}"), 2007);
+  assertNull(res[734].firstMatch("x{10b}x{10a}"), 2008);
+  assertToStringEquals("abc", res[736].firstMatch("abc"), 2009);
+  assertToStringEquals("abc", res[737].firstMatch("abc"), 2010);
+  assertToStringEquals("abbbbc", res[737].firstMatch("abbbbc"), 2011);
+  assertToStringEquals("ac", res[737].firstMatch("ac"), 2012);
+  assertToStringEquals("abc", res[738].firstMatch("abc"), 2013);
+  assertToStringEquals("abbbbbbc", res[738].firstMatch("abbbbbbc"), 2014);
+  assertNull(res[738].firstMatch("*** Failers "), 2015);
+  assertNull(res[738].firstMatch("ac"), 2016);
+  assertNull(res[738].firstMatch("ab"), 2017);
+  assertToStringEquals("a", res[739].firstMatch("a"), 2018);
+  assertToStringEquals("aaaaaaaaaaaaaaaaa", res[739].firstMatch("aaaaaaaaaaaaaaaaa"), 2019);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[739].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "), 2020);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[739].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaF "), 2021);
+  assertToStringEquals("a,a", res[740].firstMatch("a"), 2022);
+  assertToStringEquals("a,a", res[740].firstMatch("abcd"), 2023);
+  assertToStringEquals("a,a", res[740].firstMatch("african"), 2024);
+  assertToStringEquals("abc", res[741].firstMatch("abcdef"), 2025);
+  assertNull(res[741].firstMatch("*** Failers"), 2026);
+  assertNull(res[741].firstMatch("xyzabc"), 2027);
+  assertNull(res[741].firstMatch("xyz\nabc    "), 2028);
+  assertToStringEquals("abc", res[742].firstMatch("abcdef"), 2029);
+  assertToStringEquals("abc", res[742].firstMatch("xyz\nabc    "), 2030);
+  assertNull(res[742].firstMatch("*** Failers"), 2031);
+  assertNull(res[742].firstMatch("xyzabc"), 2032);
+  assertNull(res[743].firstMatch("abcdef"), 2033);
+  assertNull(res[743].firstMatch("*** Failers"), 2034);
+  assertNull(res[743].firstMatch("xyzabc"), 2035);
+  assertNull(res[743].firstMatch("xyz\nabc    "), 2036);
+  assertNull(res[744].firstMatch("abcdef"), 2037);
+  assertNull(res[744].firstMatch("*** Failers"), 2038);
+  assertNull(res[744].firstMatch("xyzabc"), 2039);
+  assertNull(res[744].firstMatch("xyz\nabc    "), 2040);
+  assertNull(res[745].firstMatch("abcdef"), 2041);
+  assertNull(res[745].firstMatch("xyzabc>3"), 2042);
+  assertNull(res[745].firstMatch("*** Failers"), 2043);
+  assertNull(res[745].firstMatch("xyzabc    "), 2044);
+  assertNull(res[745].firstMatch("xyzabc>2 "), 2045);
+  assertToStringEquals("x9yzz", res[746].firstMatch("x9yzz"), 2046);
+  assertToStringEquals("x0y+z", res[746].firstMatch("x0y+z"), 2047);
+  assertNull(res[746].firstMatch("*** Failers"), 2048);
+  assertNull(res[746].firstMatch("xyz"), 2049);
+  assertNull(res[746].firstMatch("xxy0z     "), 2050);
+  assertToStringEquals("x yzz", res[747].firstMatch("x yzz"), 2051);
+  assertToStringEquals("x y+z", res[747].firstMatch("x y+z"), 2052);
+  assertNull(res[747].firstMatch("*** Failers"), 2053);
+  assertNull(res[747].firstMatch("xyz"), 2054);
+  assertNull(res[747].firstMatch("xxyyz"), 2055);
+  assertToStringEquals("xxy+z", res[748].firstMatch("xxy+z"), 2056);
+  assertNull(res[748].firstMatch("*** Failers"), 2057);
+  assertNull(res[748].firstMatch("xxy0z"), 2058);
+  assertNull(res[748].firstMatch("x+y+z         "), 2059);
+  assertToStringEquals("x+y", res[749].firstMatch("x+y"), 2060);
+  assertToStringEquals("x-y", res[749].firstMatch("x-y"), 2061);
+  assertNull(res[749].firstMatch("*** Failers"), 2062);
+  assertNull(res[749].firstMatch("x\ny"), 2063);
+  assertToStringEquals("x+y", res[750].firstMatch("x+y"), 2064);
+  assertToStringEquals("x-y", res[750].firstMatch("x-y"), 2065);
+  assertNull(res[750].firstMatch("x\ny"), 2066);
+  assertNull(res[750].firstMatch("a+bc+dp+q"), 2067);
+  assertNull(res[750].firstMatch("a+bc\ndp+q"), 2068);
+  assertNull(res[750].firstMatch("x\nyp+q "), 2069);
+  assertNull(res[750].firstMatch("*** Failers "), 2070);
+  assertNull(res[750].firstMatch("a\nbc\ndp+q"), 2071);
+  assertNull(res[750].firstMatch("a+bc\ndp\nq"), 2072);
+  assertNull(res[750].firstMatch("x\nyp\nq "), 2073);
+  assertNull(res[751].firstMatch("ba0"), 2074);
+  assertNull(res[751].firstMatch("*** Failers"), 2075);
+  assertNull(res[751].firstMatch("ba0\n"), 2076);
+  assertNull(res[751].firstMatch("ba0\ncd   "), 2077);
+  assertNull(res[752].firstMatch("ba0"), 2078);
+  assertNull(res[752].firstMatch("*** Failers"), 2079);
+  assertNull(res[752].firstMatch("ba0\n"), 2080);
+  assertNull(res[752].firstMatch("ba0\ncd   "), 2081);
+  assertNull(res[753].firstMatch("ba0"), 2082);
+  assertNull(res[753].firstMatch("ba0\n"), 2083);
+  assertNull(res[753].firstMatch("*** Failers"), 2084);
+  assertNull(res[753].firstMatch("ba0\ncd   "), 2085);
+  assertNull(res[754].firstMatch("ba0"), 2086);
+  assertNull(res[754].firstMatch("ba0\n"), 2087);
+  assertNull(res[754].firstMatch("*** Failers"), 2088);
+  assertNull(res[754].firstMatch("ba0\ncd   "), 2089);
+  assertToStringEquals("a0", res[755].firstMatch("ba0"), 2090);
+  assertNull(res[755].firstMatch("ba0\n"), 2091);
+  assertNull(res[755].firstMatch("*** Failers"), 2092);
+  assertNull(res[755].firstMatch("ba0\ncd   "), 2093);
+  assertToStringEquals("a0", res[756].firstMatch("ba0"), 2094);
+  assertToStringEquals("a0", res[756].firstMatch("ba0\n"), 2095);
+  assertToStringEquals("a0", res[756].firstMatch("ba0\ncd   "), 2096);
+  assertNull(res[756].firstMatch("*** Failers"), 2097);
+  assertToStringEquals("abc", res[757].firstMatch("abc"), 2098);
+  assertToStringEquals("aBc", res[757].firstMatch("aBc"), 2099);
+  assertToStringEquals("ABC", res[757].firstMatch("ABC"), 2100);
+  assertToStringEquals("b", res[758].firstMatch("abcd"), 2101);
+  assertToStringEquals("abz", res[759].firstMatch("abz"), 2102);
+  assertToStringEquals("abb", res[759].firstMatch("abbz"), 2103);
+  assertToStringEquals("az", res[759].firstMatch("azz  "), 2104);
+  assertToStringEquals("yz", res[760].firstMatch("ayzq"), 2105);
+  assertToStringEquals("xyz", res[760].firstMatch("axyzq"), 2106);
+  assertToStringEquals("xxyz", res[760].firstMatch("axxyz"), 2107);
+  assertToStringEquals("xxxyz", res[760].firstMatch("axxxyzq"), 2108);
+  assertToStringEquals("xxxyz", res[760].firstMatch("axxxxyzq"), 2109);
+  assertNull(res[760].firstMatch("*** Failers"), 2110);
+  assertNull(res[760].firstMatch("ax"), 2111);
+  assertNull(res[760].firstMatch("axx     "), 2112);
+  assertNull(res[760].firstMatch("  "), 2113);
+  assertToStringEquals("xxxyz", res[761].firstMatch("axxxyzq"), 2114);
+  assertToStringEquals("xxxyz", res[761].firstMatch("axxxxyzq"), 2115);
+  assertNull(res[761].firstMatch("*** Failers"), 2116);
+  assertNull(res[761].firstMatch("ax"), 2117);
+  assertNull(res[761].firstMatch("axx     "), 2118);
+  assertNull(res[761].firstMatch("ayzq"), 2119);
+  assertNull(res[761].firstMatch("axyzq"), 2120);
+  assertNull(res[761].firstMatch("axxyz"), 2121);
+  assertNull(res[761].firstMatch("  "), 2122);
+  assertToStringEquals("xxyz", res[762].firstMatch("axxyz"), 2123);
+  assertToStringEquals("xxxyz", res[762].firstMatch("axxxyzq"), 2124);
+  assertToStringEquals("xxxyz", res[762].firstMatch("axxxxyzq"), 2125);
+  assertNull(res[762].firstMatch("*** Failers"), 2126);
+  assertNull(res[762].firstMatch("ax"), 2127);
+  assertNull(res[762].firstMatch("axx     "), 2128);
+  assertNull(res[762].firstMatch("ayzq"), 2129);
+  assertNull(res[762].firstMatch("axyzq"), 2130);
+  assertNull(res[762].firstMatch("  "), 2131);
+  assertToStringEquals("b", res[763].firstMatch("bac"), 2132);
+  assertToStringEquals("bcdef", res[763].firstMatch("bcdefax"), 2133);
+  assertToStringEquals("*** F", res[763].firstMatch("*** Failers"), 2134);
+  assertToStringEquals("   ", res[763].firstMatch("aaaaa   "), 2135);
+  assertToStringEquals("b", res[764].firstMatch("bac"), 2136);
+  assertToStringEquals("bcdef", res[764].firstMatch("bcdefax"), 2137);
+  assertToStringEquals("*** F", res[764].firstMatch("*** Failers"), 2138);
+  assertToStringEquals("", res[764].firstMatch("aaaaa   "), 2139);
+  assertToStringEquals("xyz", res[765].firstMatch("xyz"), 2140);
+  assertToStringEquals("wxyz", res[765].firstMatch("awxyza"), 2141);
+  assertToStringEquals("bcdef", res[765].firstMatch("abcdefa"), 2142);
+  assertToStringEquals("bcdef", res[765].firstMatch("abcdefghijk"), 2143);
+  assertToStringEquals("*** F", res[765].firstMatch("*** Failers"), 2144);
+  assertNull(res[765].firstMatch("axya"), 2145);
+  assertNull(res[765].firstMatch("axa"), 2146);
+  assertToStringEquals("     ", res[765].firstMatch("aaaaa         "), 2147);
+  assertToStringEquals("1234", res[766].firstMatch("1234b567"), 2148);
+  assertToStringEquals("", res[766].firstMatch("xyz"), 2149);
+  assertToStringEquals("a", res[767].firstMatch("a1234b567"), 2150);
+  assertToStringEquals("xyz", res[767].firstMatch("xyz"), 2151);
+  assertToStringEquals(" ", res[767].firstMatch(" "), 2152);
+  assertToStringEquals("1234", res[768].firstMatch("ab1234c56"), 2153);
+  assertNull(res[768].firstMatch("*** Failers"), 2154);
+  assertNull(res[768].firstMatch("xyz"), 2155);
+  assertToStringEquals("ab", res[769].firstMatch("ab123c56"), 2156);
+  assertToStringEquals("*** Failers", res[769].firstMatch("*** Failers"), 2157);
+  assertNull(res[769].firstMatch("789"), 2158);
+  assertToStringEquals("5A", res[770].firstMatch("045ABC"), 2159);
+  assertToStringEquals("A", res[770].firstMatch("ABC"), 2160);
+  assertNull(res[770].firstMatch("*** Failers"), 2161);
+  assertNull(res[770].firstMatch("XYZ"), 2162);
+  assertToStringEquals("A", res[771].firstMatch("ABC"), 2163);
+  assertToStringEquals("BA", res[771].firstMatch("BAC"), 2164);
+  assertToStringEquals("A", res[771].firstMatch("9ABC             "), 2165);
+  assertNull(res[771].firstMatch("*** Failers"), 2166);
+  assertToStringEquals("aaaa", res[772].firstMatch("aaaa"), 2167);
+  assertToStringEquals("xyz", res[773].firstMatch("xyz"), 2168);
+  assertToStringEquals("ggggggggxyz", res[773].firstMatch("ggggggggxyz"), 2169);
+  assertToStringEquals("abcdxyz", res[774].firstMatch("abcdxyz"), 2170);
+  assertToStringEquals("axyz", res[774].firstMatch("axyz"), 2171);
+  assertNull(res[774].firstMatch("*** Failers"), 2172);
+  assertNull(res[774].firstMatch("xyz"), 2173);
+  assertToStringEquals("xyz", res[775].firstMatch("xyz"), 2174);
+  assertToStringEquals("cxyz", res[775].firstMatch("cxyz       "), 2175);
+  assertToStringEquals("12X", res[776].firstMatch("12X"), 2176);
+  assertToStringEquals("123X", res[776].firstMatch("123X"), 2177);
+  assertNull(res[776].firstMatch("*** Failers"), 2178);
+  assertNull(res[776].firstMatch("X"), 2179);
+  assertNull(res[776].firstMatch("1X"), 2180);
+  assertNull(res[776].firstMatch("1234X     "), 2181);
+  assertToStringEquals("a4", res[777].firstMatch("a45"), 2182);
+  assertToStringEquals("b9", res[777].firstMatch("b93"), 2183);
+  assertToStringEquals("c9", res[777].firstMatch("c99z"), 2184);
+  assertToStringEquals("d0", res[777].firstMatch("d04"), 2185);
+  assertNull(res[777].firstMatch("*** Failers"), 2186);
+  assertNull(res[777].firstMatch("e45"), 2187);
+  assertNull(res[777].firstMatch("abcd      "), 2188);
+  assertNull(res[777].firstMatch("abcd1234"), 2189);
+  assertNull(res[777].firstMatch("1234  "), 2190);
+  assertToStringEquals("a4", res[778].firstMatch("a45"), 2191);
+  assertToStringEquals("b9", res[778].firstMatch("b93"), 2192);
+  assertToStringEquals("c9", res[778].firstMatch("c99z"), 2193);
+  assertToStringEquals("d0", res[778].firstMatch("d04"), 2194);
+  assertToStringEquals("abcd1", res[778].firstMatch("abcd1234"), 2195);
+  assertToStringEquals("1", res[778].firstMatch("1234  "), 2196);
+  assertNull(res[778].firstMatch("*** Failers"), 2197);
+  assertNull(res[778].firstMatch("e45"), 2198);
+  assertNull(res[778].firstMatch("abcd      "), 2199);
+  assertToStringEquals("a4", res[779].firstMatch("a45"), 2200);
+  assertToStringEquals("b9", res[779].firstMatch("b93"), 2201);
+  assertToStringEquals("c9", res[779].firstMatch("c99z"), 2202);
+  assertToStringEquals("d0", res[779].firstMatch("d04"), 2203);
+  assertToStringEquals("abcd1", res[779].firstMatch("abcd1234"), 2204);
+  assertNull(res[779].firstMatch("*** Failers"), 2205);
+  assertNull(res[779].firstMatch("1234  "), 2206);
+  assertNull(res[779].firstMatch("e45"), 2207);
+  assertNull(res[779].firstMatch("abcd      "), 2208);
+  assertToStringEquals("aX", res[780].firstMatch("aX"), 2209);
+  assertToStringEquals("aaX", res[780].firstMatch("aaX "), 2210);
+  assertToStringEquals("a4", res[781].firstMatch("a45"), 2211);
+  assertToStringEquals("b9", res[781].firstMatch("b93"), 2212);
+  assertToStringEquals("c9", res[781].firstMatch("c99z"), 2213);
+  assertToStringEquals("d0", res[781].firstMatch("d04"), 2214);
+  assertToStringEquals("1", res[781].firstMatch("1234  "), 2215);
+  assertNull(res[781].firstMatch("*** Failers"), 2216);
+  assertNull(res[781].firstMatch("abcd1234"), 2217);
+  assertNull(res[781].firstMatch("e45"), 2218);
+  assertToStringEquals("ab4", res[782].firstMatch("ab45"), 2219);
+  assertToStringEquals("bcd9", res[782].firstMatch("bcd93"), 2220);
+  assertNull(res[782].firstMatch("*** Failers"), 2221);
+  assertNull(res[782].firstMatch("1234 "), 2222);
+  assertNull(res[782].firstMatch("a36 "), 2223);
+  assertNull(res[782].firstMatch("abcd1234"), 2224);
+  assertNull(res[782].firstMatch("ee45"), 2225);
+  assertToStringEquals("abc4,abc", res[783].firstMatch("abc45"), 2226);
+  assertToStringEquals("abcabcabc4,abc", res[783].firstMatch("abcabcabc45"), 2227);
+  assertToStringEquals("4,", res[783].firstMatch("42xyz "), 2228);
+  assertNull(res[783].firstMatch("*** Failers"), 2229);
+  assertToStringEquals("abc4,abc", res[784].firstMatch("abc45"), 2230);
+  assertToStringEquals("abcabcabc4,abc", res[784].firstMatch("abcabcabc45"), 2231);
+  assertNull(res[784].firstMatch("*** Failers"), 2232);
+  assertNull(res[784].firstMatch("42xyz "), 2233);
+  assertToStringEquals("abc4,abc", res[785].firstMatch("abc45"), 2234);
+  assertToStringEquals("4,", res[785].firstMatch("42xyz "), 2235);
+  assertNull(res[785].firstMatch("*** Failers"), 2236);
+  assertNull(res[785].firstMatch("abcabcabc45"), 2237);
+  assertToStringEquals("abcabc4,abc", res[786].firstMatch("abcabc45"), 2238);
+  assertToStringEquals("abcabcabc4,abc", res[786].firstMatch("abcabcabc45"), 2239);
+  assertNull(res[786].firstMatch("*** Failers"), 2240);
+  assertNull(res[786].firstMatch("abcabcabcabc45"), 2241);
+  assertNull(res[786].firstMatch("abc45"), 2242);
+  assertNull(res[786].firstMatch("42xyz "), 2243);
+  assertNull(res[786].firstMatch("1abc2abc3456"), 2244);
+  assertNull(res[786].firstMatch("1abc2xyz3456 "), 2245);
+  assertToStringEquals("ab=ab,ab,ab", res[787].firstMatch("ab=ab"), 2246);
+  assertToStringEquals("ab=ab,ab,ab", res[787].firstMatch("ab=ab"), 2247);
+  assertNull(res[787].firstMatch("abc"), 2248);
+  assertNull(res[787].firstMatch("a(b)c"), 2249);
+  assertNull(res[787].firstMatch("a(b(c))d  "), 2250);
+  assertNull(res[787].firstMatch("*** Failers)"), 2251);
+  assertNull(res[787].firstMatch("a(b(c)d  "), 2252);
+  assertNull(res[787].firstMatch(">abc>123<xyz<"), 2253);
+  assertNull(res[787].firstMatch(">abc>1(2)3<xyz<"), 2254);
+  assertNull(res[787].firstMatch(">abc>(1(2)3)<xyz<"), 2255);
+  assertNull(res[787].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876"), 2256);
+  assertNull(res[787].firstMatch("*** Failers "), 2257);
+  assertNull(res[787].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 2258);
+  assertNull(res[787].firstMatch("<>"), 2259);
+  assertNull(res[787].firstMatch("<abcd>"), 2260);
+  assertNull(res[787].firstMatch("<abc <123> hij>"), 2261);
+  assertNull(res[787].firstMatch("<abc <def> hij>"), 2262);
+  assertNull(res[787].firstMatch("<abc<>def> "), 2263);
+  assertNull(res[787].firstMatch("<abc<>      "), 2264);
+  assertNull(res[787].firstMatch("*** Failers"), 2265);
+  assertNull(res[787].firstMatch("<abc"), 2266);
+  assertNull(res[787].firstMatch("abc:                          "), 2267);
+  assertNull(res[787].firstMatch("12                             "), 2268);
+  assertNull(res[787].firstMatch("*** Failers                     "), 2269);
+  assertNull(res[787].firstMatch("123                       "), 2270);
+  assertNull(res[787].firstMatch("xyz                        "), 2271);
+  assertNull(res[787].firstMatch("                            "), 2272);
+  assertNull(res[787].firstMatch("abc:                        "), 2273);
+  assertNull(res[787].firstMatch("12         "), 2274);
+  assertNull(res[787].firstMatch("*** Failers"), 2275);
+  assertNull(res[787].firstMatch("123"), 2276);
+  assertNull(res[787].firstMatch("xyz    "), 2277);
+  assertNull(res[788].firstMatch("abcde:                          "), 2278);
+  assertNull(res[788].firstMatch("*** Failers                     "), 2279);
+  assertNull(res[788].firstMatch("abc.. "), 2280);
+  assertNull(res[788].firstMatch("123                       "), 2281);
+  assertNull(res[788].firstMatch("vwxyz                        "), 2282);
+  assertNull(res[788].firstMatch("                            "), 2283);
+  assertNull(res[789].firstMatch("12         "), 2284);
+  assertNull(res[789].firstMatch("*** Failers"), 2285);
+  assertNull(res[789].firstMatch("abcde:"), 2286);
+  assertNull(res[789].firstMatch("abc..  "), 2287);
+  assertNull(res[789].firstMatch("123"), 2288);
+  assertNull(res[789].firstMatch("vwxyz    "), 2289);
+  assertNull(res[789].firstMatch("abc12345"), 2290);
+  assertNull(res[789].firstMatch("wxy123z"), 2291);
+  assertNull(res[789].firstMatch("*** Failers"), 2292);
+  assertNull(res[789].firstMatch("123abc"), 2293);
+  assertNull(res[789].firstMatch("123abc"), 2294);
+  assertNull(res[789].firstMatch("mno123456 "), 2295);
+  assertNull(res[789].firstMatch("*** Failers"), 2296);
+  assertNull(res[789].firstMatch("abc12345"), 2297);
+  assertNull(res[789].firstMatch("wxy123z"), 2298);
+  assertNull(res[789].firstMatch("abcxyz"), 2299);
+  assertNull(res[789].firstMatch("123abcxyz999 "), 2300);
+  assertToStringEquals("abc", res[791].firstMatch("abcdef"), 2301);
+  assertNull(res[791].firstMatch("*** Failers"), 2302);
+  assertToStringEquals("abc", res[791].firstMatch("abcdefB  "), 2303);
+  assertToStringEquals(",", res[792].firstMatch("bcd"), 2304);
+  assertToStringEquals("aaa,aaa", res[792].firstMatch("aaabcd"), 2305);
+  assertToStringEquals(",", res[792].firstMatch("xyz"), 2306);
+  assertToStringEquals(",", res[792].firstMatch("xyzN  "), 2307);
+  assertToStringEquals(",", res[792].firstMatch("*** Failers"), 2308);
+  assertToStringEquals(",", res[792].firstMatch("bcdN   "), 2309);
+  assertToStringEquals("xyz", res[793].firstMatch("xyz"), 2310);
+  assertNull(res[793].firstMatch("xyz\n"), 2311);
+  assertNull(res[793].firstMatch("*** Failers"), 2312);
+  assertNull(res[793].firstMatch("xyzZ"), 2313);
+  assertNull(res[793].firstMatch("xyz\nZ    "), 2314);
+  assertToStringEquals("xyz", res[794].firstMatch("xyz"), 2315);
+  assertToStringEquals("xyz", res[794].firstMatch("xyz\n "), 2316);
+  assertToStringEquals("xyz", res[794].firstMatch("abcxyz\npqr "), 2317);
+  assertToStringEquals("xyz", res[794].firstMatch("abcxyz\npqrZ "), 2318);
+  assertToStringEquals("xyz", res[794].firstMatch("xyz\nZ    "), 2319);
+  assertNull(res[794].firstMatch("*** Failers"), 2320);
+  assertNull(res[794].firstMatch("xyzZ"), 2321);
+  assertNull(res[795].firstMatch("abcdef"), 2322);
+  assertNull(res[795].firstMatch("defabcxyz>3 "), 2323);
+  assertNull(res[795].firstMatch("*** Failers "), 2324);
+  assertNull(res[795].firstMatch("defabcxyz"), 2325);
+  assertNull(res[796].firstMatch("abP"), 2326);
+  assertNull(res[796].firstMatch("abcdeP"), 2327);
+  assertToStringEquals("abcdef", res[796].firstMatch("abcdefP"), 2328);
+  assertNull(res[796].firstMatch("*** Failers"), 2329);
+  assertNull(res[796].firstMatch("abxP    "), 2330);
+  assertNull(res[797].firstMatch("aP"), 2331);
+  assertNull(res[797].firstMatch("aaP"), 2332);
+  assertNull(res[797].firstMatch("aa2P "), 2333);
+  assertNull(res[797].firstMatch("aaaP"), 2334);
+  assertNull(res[797].firstMatch("aaa23P "), 2335);
+  assertNull(res[797].firstMatch("aaaa12345P"), 2336);
+  assertToStringEquals("aa0z", res[797].firstMatch("aa0zP"), 2337);
+  assertToStringEquals("aaaa4444444444444z", res[797].firstMatch("aaaa4444444444444zP "), 2338);
+  assertNull(res[797].firstMatch("*** Failers"), 2339);
+  assertNull(res[797].firstMatch("azP "), 2340);
+  assertNull(res[797].firstMatch("aaaaaP "), 2341);
+  assertNull(res[797].firstMatch("a56P "), 2342);
+  assertNull(res[799].firstMatch("adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkjPZ"), 2343);
+  assertNull(res[799].firstMatch("lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefaPBZ"), 2344);
+  assertNull(res[799].firstMatch("cdabbbbbbbbPRBZ"), 2345);
+  assertNull(res[799].firstMatch("efabbbbbbbbbbbbbbbbPRBZ"), 2346);
+  assertNull(res[799].firstMatch("bbbbbbbbbbbbcdXyasdfadfPRBZ    "), 2347);
+  assertNull(res[799].firstMatch("abc"), 2348);
+  assertNull(res[799].firstMatch("** Failers"), 2349);
+  assertNull(res[799].firstMatch("def  "), 2350);
+  assertToStringEquals("the quick brown fox", res[800].firstMatch("the quick brown fox"), 2351);
+  assertNull(res[800].firstMatch("The quick brown FOX"), 2352);
+  assertToStringEquals("the quick brown fox", res[800].firstMatch("What do you know about the quick brown fox?"), 2353);
+  assertNull(res[800].firstMatch("What do you know about THE QUICK BROWN FOX?"), 2354);
+  assertToStringEquals("the quick brown fox", res[801].firstMatch("the quick brown fox"), 2355);
+  assertToStringEquals("The quick brown FOX", res[801].firstMatch("The quick brown FOX"), 2356);
+  assertToStringEquals("the quick brown fox", res[801].firstMatch("What do you know about the quick brown fox?"), 2357);
+  assertToStringEquals("THE QUICK BROWN FOX", res[801].firstMatch("What do you know about THE QUICK BROWN FOX?"), 2358);
+  assertToStringEquals("abcd\x09\n\x0d\x0cae9;\$\\?caxyz", res[802].firstMatch("abcd\x09\n\x0d\x0cae9;\$\\?caxyz"), 2359);
+  assertToStringEquals("abxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("abxyzpqrrrabbxyyyypqAzz"), 2360);
+  assertToStringEquals("abxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("abxyzpqrrrabbxyyyypqAzz"), 2361);
+  assertToStringEquals("aabxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aabxyzpqrrrabbxyyyypqAzz"), 2362);
+  assertToStringEquals("aaabxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaabxyzpqrrrabbxyyyypqAzz"), 2363);
+  assertToStringEquals("aaaabxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaaabxyzpqrrrabbxyyyypqAzz"), 2364);
+  assertToStringEquals("abcxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("abcxyzpqrrrabbxyyyypqAzz"), 2365);
+  assertToStringEquals("aabcxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aabcxyzpqrrrabbxyyyypqAzz"), 2366);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypAzz"), 2367);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqAzz"), 2368);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqAzz"), 2369);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqqqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqqAzz"), 2370);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqqqqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqqqAzz"), 2371);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqqqqqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqqqqAzz"), 2372);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypqqqqqqAzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqqqqqAzz"), 2373);
+  assertToStringEquals("aaaabcxyzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaaabcxyzpqrrrabbxyyyypqAzz"), 2374);
+  assertToStringEquals("abxyzzpqrrrabbxyyyypqAzz", res[803].firstMatch("abxyzzpqrrrabbxyyyypqAzz"), 2375);
+  assertToStringEquals("aabxyzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aabxyzzzpqrrrabbxyyyypqAzz"), 2376);
+  assertToStringEquals("aaabxyzzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaabxyzzzzpqrrrabbxyyyypqAzz"), 2377);
+  assertToStringEquals("aaaabxyzzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaaabxyzzzzpqrrrabbxyyyypqAzz"), 2378);
+  assertToStringEquals("abcxyzzpqrrrabbxyyyypqAzz", res[803].firstMatch("abcxyzzpqrrrabbxyyyypqAzz"), 2379);
+  assertToStringEquals("aabcxyzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aabcxyzzzpqrrrabbxyyyypqAzz"), 2380);
+  assertToStringEquals("aaabcxyzzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaabcxyzzzzpqrrrabbxyyyypqAzz"), 2381);
+  assertToStringEquals("aaaabcxyzzzzpqrrrabbxyyyypqAzz", res[803].firstMatch("aaaabcxyzzzzpqrrrabbxyyyypqAzz"), 2382);
+  assertToStringEquals("aaaabcxyzzzzpqrrrabbbxyyyypqAzz", res[803].firstMatch("aaaabcxyzzzzpqrrrabbbxyyyypqAzz"), 2383);
+  assertToStringEquals("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz", res[803].firstMatch("aaaabcxyzzzzpqrrrabbbxyyyyypqAzz"), 2384);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypABzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypABzz"), 2385);
+  assertToStringEquals("aaabcxyzpqrrrabbxyyyypABBzz", res[803].firstMatch("aaabcxyzpqrrrabbxyyyypABBzz"), 2386);
+  assertToStringEquals("aaabxyzpqrrrabbxyyyypqAzz", res[803].firstMatch(">>>aaabxyzpqrrrabbxyyyypqAzz"), 2387);
+  assertToStringEquals("aaaabxyzpqrrrabbxyyyypqAzz", res[803].firstMatch(">aaaabxyzpqrrrabbxyyyypqAzz"), 2388);
+  assertToStringEquals("abcxyzpqrrrabbxyyyypqAzz", res[803].firstMatch(">>>>abcxyzpqrrrabbxyyyypqAzz"), 2389);
+  assertNull(res[803].firstMatch("*** Failers"), 2390);
+  assertNull(res[803].firstMatch("abxyzpqrrabbxyyyypqAzz"), 2391);
+  assertNull(res[803].firstMatch("abxyzpqrrrrabbxyyyypqAzz"), 2392);
+  assertNull(res[803].firstMatch("abxyzpqrrrabxyyyypqAzz"), 2393);
+  assertNull(res[803].firstMatch("aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz"), 2394);
+  assertNull(res[803].firstMatch("aaaabcxyzzzzpqrrrabbbxyyypqAzz"), 2395);
+  assertNull(res[803].firstMatch("aaabcxyzpqrrrabbxyyyypqqqqqqqAzz"), 2396);
+  assertToStringEquals("abczz,abc", res[804].firstMatch("abczz"), 2397);
+  assertToStringEquals("abcabczz,abc", res[804].firstMatch("abcabczz"), 2398);
+  assertNull(res[804].firstMatch("*** Failers"), 2399);
+  assertNull(res[804].firstMatch("zz"), 2400);
+  assertNull(res[804].firstMatch("abcabcabczz"), 2401);
+  assertNull(res[804].firstMatch(">>abczz"), 2402);
+  assertToStringEquals("bc,b", res[805].firstMatch("bc"), 2403);
+  assertToStringEquals("bbc,b", res[805].firstMatch("bbc"), 2404);
+  assertToStringEquals("bbbc,bb", res[805].firstMatch("bbbc"), 2405);
+  assertToStringEquals("bac,a", res[805].firstMatch("bac"), 2406);
+  assertToStringEquals("bbac,a", res[805].firstMatch("bbac"), 2407);
+  assertToStringEquals("aac,a", res[805].firstMatch("aac"), 2408);
+  assertToStringEquals("abbbbbbbbbbbc,bbbbbbbbbbb", res[805].firstMatch("abbbbbbbbbbbc"), 2409);
+  assertToStringEquals("bbbbbbbbbbbac,a", res[805].firstMatch("bbbbbbbbbbbac"), 2410);
+  assertNull(res[805].firstMatch("*** Failers"), 2411);
+  assertNull(res[805].firstMatch("aaac"), 2412);
+  assertNull(res[805].firstMatch("abbbbbbbbbbbac"), 2413);
+  assertToStringEquals("bc,b", res[806].firstMatch("bc"), 2414);
+  assertToStringEquals("bbc,bb", res[806].firstMatch("bbc"), 2415);
+  assertToStringEquals("bbbc,bbb", res[806].firstMatch("bbbc"), 2416);
+  assertToStringEquals("bac,a", res[806].firstMatch("bac"), 2417);
+  assertToStringEquals("bbac,a", res[806].firstMatch("bbac"), 2418);
+  assertToStringEquals("aac,a", res[806].firstMatch("aac"), 2419);
+  assertToStringEquals("abbbbbbbbbbbc,bbbbbbbbbbb", res[806].firstMatch("abbbbbbbbbbbc"), 2420);
+  assertToStringEquals("bbbbbbbbbbbac,a", res[806].firstMatch("bbbbbbbbbbbac"), 2421);
+  assertNull(res[806].firstMatch("*** Failers"), 2422);
+  assertNull(res[806].firstMatch("aaac"), 2423);
+  assertNull(res[806].firstMatch("abbbbbbbbbbbac"), 2424);
+  assertToStringEquals("bbc,bb", res[806].firstMatch("bbc"), 2425);
+  assertToStringEquals("babc,ba", res[807].firstMatch("babc"), 2426);
+  assertToStringEquals("bbabc,ba", res[807].firstMatch("bbabc"), 2427);
+  assertToStringEquals("bababc,ba", res[807].firstMatch("bababc"), 2428);
+  assertNull(res[807].firstMatch("*** Failers"), 2429);
+  assertNull(res[807].firstMatch("bababbc"), 2430);
+  assertNull(res[807].firstMatch("babababc"), 2431);
+  assertToStringEquals("babc,ba", res[808].firstMatch("babc"), 2432);
+  assertToStringEquals("bbabc,ba", res[808].firstMatch("bbabc"), 2433);
+  assertToStringEquals("bababc,ba", res[808].firstMatch("bababc"), 2434);
+  assertNull(res[808].firstMatch("*** Failers"), 2435);
+  assertNull(res[808].firstMatch("bababbc"), 2436);
+  assertNull(res[808].firstMatch("babababc"), 2437);
+  assertThrows(() => new RegExp(r"^\\ca\\cA\\c[\\c{\\c:"), 2438);
+  assertNull(res[808].firstMatch("\x01\x01e;z"), 2439);
+  assertToStringEquals("a", res[809].firstMatch("athing"), 2440);
+  assertToStringEquals("b", res[809].firstMatch("bthing"), 2441);
+  assertToStringEquals("]", res[809].firstMatch("]thing"), 2442);
+  assertToStringEquals("c", res[809].firstMatch("cthing"), 2443);
+  assertToStringEquals("d", res[809].firstMatch("dthing"), 2444);
+  assertToStringEquals("e", res[809].firstMatch("ething"), 2445);
+  assertNull(res[809].firstMatch("*** Failers"), 2446);
+  assertNull(res[809].firstMatch("fthing"), 2447);
+  assertNull(res[809].firstMatch("[thing"), 2448);
+  assertNull(res[809].firstMatch("\\thing"), 2449);
+  assertNull(res[810].firstMatch("]thing"), 2450);
+  assertNull(res[810].firstMatch("cthing"), 2451);
+  assertNull(res[810].firstMatch("dthing"), 2452);
+  assertNull(res[810].firstMatch("ething"), 2453);
+  assertNull(res[810].firstMatch("*** Failers"), 2454);
+  assertNull(res[810].firstMatch("athing"), 2455);
+  assertNull(res[810].firstMatch("fthing"), 2456);
+  assertToStringEquals("f", res[811].firstMatch("fthing"), 2457);
+  assertToStringEquals("[", res[811].firstMatch("[thing"), 2458);
+  assertToStringEquals("\\", res[811].firstMatch("\\thing"), 2459);
+  assertToStringEquals("*", res[811].firstMatch("*** Failers"), 2460);
+  assertNull(res[811].firstMatch("athing"), 2461);
+  assertNull(res[811].firstMatch("bthing"), 2462);
+  assertNull(res[811].firstMatch("]thing"), 2463);
+  assertNull(res[811].firstMatch("cthing"), 2464);
+  assertNull(res[811].firstMatch("dthing"), 2465);
+  assertNull(res[811].firstMatch("ething"), 2466);
+  assertNull(res[812].firstMatch("athing"), 2467);
+  assertNull(res[812].firstMatch("fthing"), 2468);
+  assertNull(res[812].firstMatch("*** Failers"), 2469);
+  assertNull(res[812].firstMatch("]thing"), 2470);
+  assertNull(res[812].firstMatch("cthing"), 2471);
+  assertNull(res[812].firstMatch("dthing"), 2472);
+  assertNull(res[812].firstMatch("ething"), 2473);
+  assertNull(res[812].firstMatch("\ufffd"), 2474);
+  assertNull(res[812].firstMatch("\ufffd"), 2475);
+  assertToStringEquals("0", res[813].firstMatch("0"), 2476);
+  assertToStringEquals("1", res[813].firstMatch("1"), 2477);
+  assertToStringEquals("2", res[813].firstMatch("2"), 2478);
+  assertToStringEquals("3", res[813].firstMatch("3"), 2479);
+  assertToStringEquals("4", res[813].firstMatch("4"), 2480);
+  assertToStringEquals("5", res[813].firstMatch("5"), 2481);
+  assertToStringEquals("6", res[813].firstMatch("6"), 2482);
+  assertToStringEquals("7", res[813].firstMatch("7"), 2483);
+  assertToStringEquals("8", res[813].firstMatch("8"), 2484);
+  assertToStringEquals("9", res[813].firstMatch("9"), 2485);
+  assertToStringEquals("10", res[813].firstMatch("10"), 2486);
+  assertToStringEquals("100", res[813].firstMatch("100"), 2487);
+  assertNull(res[813].firstMatch("*** Failers"), 2488);
+  assertNull(res[813].firstMatch("abc"), 2489);
+  assertToStringEquals("enter", res[814].firstMatch("enter"), 2490);
+  assertToStringEquals("inter", res[814].firstMatch("inter"), 2491);
+  assertToStringEquals("uponter", res[814].firstMatch("uponter"), 2492);
+  assertToStringEquals("xxx0", res[815].firstMatch("xxx0"), 2493);
+  assertToStringEquals("xxx1234", res[815].firstMatch("xxx1234"), 2494);
+  assertNull(res[815].firstMatch("*** Failers"), 2495);
+  assertNull(res[815].firstMatch("xxx"), 2496);
+  assertToStringEquals("x123", res[816].firstMatch("x123"), 2497);
+  assertToStringEquals("xx123", res[816].firstMatch("xx123"), 2498);
+  assertToStringEquals("123456", res[816].firstMatch("123456"), 2499);
+  assertNull(res[816].firstMatch("*** Failers"), 2500);
+  assertNull(res[816].firstMatch("123"), 2501);
+  assertToStringEquals("x1234", res[816].firstMatch("x1234"), 2502);
+  assertToStringEquals("x123", res[817].firstMatch("x123"), 2503);
+  assertToStringEquals("xx123", res[817].firstMatch("xx123"), 2504);
+  assertToStringEquals("123456", res[817].firstMatch("123456"), 2505);
+  assertNull(res[817].firstMatch("*** Failers"), 2506);
+  assertNull(res[817].firstMatch("123"), 2507);
+  assertToStringEquals("x1234", res[817].firstMatch("x1234"), 2508);
+  assertToStringEquals("abc!pqr=apquxz.ixr.zzz.ac.uk,abc,pqr", res[818].firstMatch("abc!pqr=apquxz.ixr.zzz.ac.uk"), 2509);
+  assertNull(res[818].firstMatch("*** Failers"), 2510);
+  assertNull(res[818].firstMatch("!pqr=apquxz.ixr.zzz.ac.uk"), 2511);
+  assertNull(res[818].firstMatch("abc!=apquxz.ixr.zzz.ac.uk"), 2512);
+  assertNull(res[818].firstMatch("abc!pqr=apquxz:ixr.zzz.ac.uk"), 2513);
+  assertNull(res[818].firstMatch("abc!pqr=apquxz.ixr.zzz.ac.ukk"), 2514);
+  assertToStringEquals(":", res[819].firstMatch("Well, we need a colon: somewhere"), 2515);
+  assertNull(res[819].firstMatch("*** Fail if we don't"), 2516);
+  assertToStringEquals("0abc,0abc", res[820].firstMatch("0abc"), 2517);
+  assertToStringEquals("abc,abc", res[820].firstMatch("abc"), 2518);
+  assertToStringEquals("fed,fed", res[820].firstMatch("fed"), 2519);
+  assertToStringEquals("E,E", res[820].firstMatch("E"), 2520);
+  assertToStringEquals("::,::", res[820].firstMatch("::"), 2521);
+  assertToStringEquals("5f03:12C0::932e,5f03:12C0::932e", res[820].firstMatch("5f03:12C0::932e"), 2522);
+  assertToStringEquals("def,def", res[820].firstMatch("fed def"), 2523);
+  assertToStringEquals("ff,ff", res[820].firstMatch("Any old stuff"), 2524);
+  assertNull(res[820].firstMatch("*** Failers"), 2525);
+  assertNull(res[820].firstMatch("0zzz"), 2526);
+  assertNull(res[820].firstMatch("gzzz"), 2527);
+  assertNull(res[820].firstMatch("fed "), 2528);
+  assertNull(res[820].firstMatch("Any old rubbish"), 2529);
+  assertToStringEquals(".1.2.3,1,2,3", res[821].firstMatch(".1.2.3"), 2530);
+  assertToStringEquals("A.12.123.0,12,123,0", res[821].firstMatch("A.12.123.0"), 2531);
+  assertNull(res[821].firstMatch("*** Failers"), 2532);
+  assertNull(res[821].firstMatch(".1.2.3333"), 2533);
+  assertNull(res[821].firstMatch("1.2.3"), 2534);
+  assertNull(res[821].firstMatch("1234.2.3"), 2535);
+  assertToStringEquals("1 IN SOA non-sp1 non-sp2(,1,non-sp1,non-sp2", res[822].firstMatch("1 IN SOA non-sp1 non-sp2("), 2536);
+  assertToStringEquals("1    IN    SOA    non-sp1    non-sp2   (,1,non-sp1,non-sp2", res[822].firstMatch("1    IN    SOA    non-sp1    non-sp2   ("), 2537);
+  assertNull(res[822].firstMatch("*** Failers"), 2538);
+  assertNull(res[822].firstMatch("1IN SOA non-sp1 non-sp2("), 2539);
+  assertToStringEquals("a.,", res[823].firstMatch("a."), 2540);
+  assertToStringEquals("Z.,", res[823].firstMatch("Z."), 2541);
+  assertToStringEquals("2.,", res[823].firstMatch("2."), 2542);
+  assertToStringEquals("ab-c.pq-r.,.pq-r", res[823].firstMatch("ab-c.pq-r."), 2543);
+  assertToStringEquals("sxk.zzz.ac.uk.,.uk", res[823].firstMatch("sxk.zzz.ac.uk."), 2544);
+  assertToStringEquals("x-.y-.,.y-", res[823].firstMatch("x-.y-."), 2545);
+  assertNull(res[823].firstMatch("*** Failers"), 2546);
+  assertNull(res[823].firstMatch("-abc.peq."), 2547);
+  assertToStringEquals("*.a,,,", res[824].firstMatch("*.a"), 2548);
+  assertToStringEquals("*.b0-a,0-a,,", res[824].firstMatch("*.b0-a"), 2549);
+  assertToStringEquals("*.c3-b.c,3-b,.c,", res[824].firstMatch("*.c3-b.c"), 2550);
+  assertToStringEquals("*.c-a.b-c,-a,.b-c,-c", res[824].firstMatch("*.c-a.b-c"), 2551);
+  assertNull(res[824].firstMatch("*** Failers"), 2552);
+  assertNull(res[824].firstMatch("*.0"), 2553);
+  assertNull(res[824].firstMatch("*.a-"), 2554);
+  assertNull(res[824].firstMatch("*.a-b.c-"), 2555);
+  assertNull(res[824].firstMatch("*.c-a.0-c"), 2556);
+  assertToStringEquals("abde,de,abd,e", res[825].firstMatch("abde"), 2557);
+  assertToStringEquals("abdf,,abd,f", res[826].firstMatch("abdf"), 2558);
+  assertToStringEquals("ab,abcd,cd,ab", res[827].firstMatch("abcd"), 2559);
+  assertToStringEquals("a.b.c.d,.d", res[828].firstMatch("a.b.c.d"), 2560);
+  assertToStringEquals("A.B.C.D,.D", res[828].firstMatch("A.B.C.D"), 2561);
+  assertToStringEquals("a.b.c.1.2.3.C,.C", res[828].firstMatch("a.b.c.1.2.3.C"), 2562);
+  assertToStringEquals("\"1234\",", res[829].firstMatch("\"1234\""), 2563);
+  assertToStringEquals("\"abcd\" ;,;", res[829].firstMatch("\"abcd\" ;"), 2564);
+  assertToStringEquals("\"\" ; rhubarb,; rhubarb", res[829].firstMatch("\"\" ; rhubarb"), 2565);
+  assertNull(res[829].firstMatch("*** Failers"), 2566);
+  assertNull(res[829].firstMatch("\"1234\" : things"), 2567);
+  assertNull(res[830].firstMatch("\\"), 2568);
+  assertNull(res[830].firstMatch("*** Failers"), 2569);
+  assertToStringEquals("ab c", res[831].firstMatch("ab c"), 2570);
+  assertNull(res[831].firstMatch("*** Failers"), 2571);
+  assertNull(res[831].firstMatch("abc"), 2572);
+  assertNull(res[831].firstMatch("ab cde"), 2573);
+  assertToStringEquals("ab c", res[831].firstMatch("ab c"), 2574);
+  assertNull(res[831].firstMatch("*** Failers"), 2575);
+  assertNull(res[831].firstMatch("abc"), 2576);
+  assertNull(res[831].firstMatch("ab cde"), 2577);
+  assertToStringEquals("a bcd", res[832].firstMatch("a bcd"), 2578);
+  assertNull(res[832].firstMatch("a b d"), 2579);
+  assertNull(res[832].firstMatch("*** Failers"), 2580);
+  assertNull(res[832].firstMatch("abcd"), 2581);
+  assertNull(res[832].firstMatch("ab d"), 2582);
+  assertToStringEquals("abcdefhijklm,abc,bc,c,def,ef,f,hij,ij,j,klm,lm,m", res[833].firstMatch("abcdefhijklm"), 2583);
+  assertToStringEquals("abcdefhijklm,bc,c,ef,f,ij,j,lm,m", res[834].firstMatch("abcdefhijklm"), 2584);
+  assertNull(res[835].firstMatch("a+ Z0+\x08\n\x1d\x12"), 2585);
+  assertNull(res[835].firstMatch(".^\$(*+)|{?,?}"), 2586);
+  assertToStringEquals("z", res[836].firstMatch("z"), 2587);
+  assertToStringEquals("az", res[836].firstMatch("az"), 2588);
+  assertToStringEquals("aaaz", res[836].firstMatch("aaaz"), 2589);
+  assertToStringEquals("a", res[836].firstMatch("a"), 2590);
+  assertToStringEquals("aa", res[836].firstMatch("aa"), 2591);
+  assertToStringEquals("aaaa", res[836].firstMatch("aaaa"), 2592);
+  assertToStringEquals("a", res[836].firstMatch("a+"), 2593);
+  assertToStringEquals("aa", res[836].firstMatch("aa+"), 2594);
+  assertToStringEquals("z", res[837].firstMatch("z"), 2595);
+  assertToStringEquals("a", res[837].firstMatch("az"), 2596);
+  assertToStringEquals("a", res[837].firstMatch("aaaz"), 2597);
+  assertToStringEquals("a", res[837].firstMatch("a"), 2598);
+  assertToStringEquals("a", res[837].firstMatch("aa"), 2599);
+  assertToStringEquals("a", res[837].firstMatch("aaaa"), 2600);
+  assertToStringEquals("a", res[837].firstMatch("a+"), 2601);
+  assertToStringEquals("a", res[837].firstMatch("aa+"), 2602);
+  assertToStringEquals("az", res[838].firstMatch("az"), 2603);
+  assertToStringEquals("aaaz", res[838].firstMatch("aaaz"), 2604);
+  assertToStringEquals("aa", res[838].firstMatch("aa"), 2605);
+  assertToStringEquals("aaaa", res[838].firstMatch("aaaa"), 2606);
+  assertToStringEquals("aa", res[838].firstMatch("aa+"), 2607);
+  assertToStringEquals("az", res[839].firstMatch("az"), 2608);
+  assertToStringEquals("aa", res[839].firstMatch("aaaz"), 2609);
+  assertToStringEquals("aa", res[839].firstMatch("aa"), 2610);
+  assertToStringEquals("aa", res[839].firstMatch("aaaa"), 2611);
+  assertToStringEquals("aa", res[839].firstMatch("aa+"), 2612);
+  assertToStringEquals("1234567890", res[840].firstMatch("1234567890"), 2613);
+  assertToStringEquals("12345678ab", res[840].firstMatch("12345678ab"), 2614);
+  assertToStringEquals("12345678__", res[840].firstMatch("12345678__"), 2615);
+  assertNull(res[840].firstMatch("*** Failers"), 2616);
+  assertNull(res[840].firstMatch("1234567"), 2617);
+  assertToStringEquals("uoie", res[841].firstMatch("uoie"), 2618);
+  assertToStringEquals("1234", res[841].firstMatch("1234"), 2619);
+  assertToStringEquals("12345", res[841].firstMatch("12345"), 2620);
+  assertToStringEquals("aaaaa", res[841].firstMatch("aaaaa"), 2621);
+  assertNull(res[841].firstMatch("*** Failers"), 2622);
+  assertNull(res[841].firstMatch("123456"), 2623);
+  assertToStringEquals("uoie", res[842].firstMatch("uoie"), 2624);
+  assertToStringEquals("1234", res[842].firstMatch("1234"), 2625);
+  assertToStringEquals("1234", res[842].firstMatch("12345"), 2626);
+  assertToStringEquals("aaaa", res[842].firstMatch("aaaaa"), 2627);
+  assertToStringEquals("1234", res[842].firstMatch("123456"), 2628);
+  assertToStringEquals("From abcd  Mon Sep 01 12:33,abcd", res[843].firstMatch("From abcd  Mon Sep 01 12:33:02 1997"), 2629);
+  assertToStringEquals("From abcd  Mon Sep 01 12:33,Sep ", res[844].firstMatch("From abcd  Mon Sep 01 12:33:02 1997"), 2630);
+  assertToStringEquals("From abcd  Mon Sep  1 12:33,Sep  ", res[844].firstMatch("From abcd  Mon Sep  1 12:33:02 1997"), 2631);
+  assertNull(res[844].firstMatch("*** Failers"), 2632);
+  assertNull(res[844].firstMatch("From abcd  Sep 01 12:33:02 1997"), 2633);
+  assertNull(res[845].firstMatch("12\n34"), 2634);
+  assertNull(res[845].firstMatch("12\x0d34"), 2635);
+  assertToStringEquals("brown", res[846].firstMatch("the quick brown\x09 fox"), 2636);
+  assertToStringEquals("foolish see?,lish see?", res[847].firstMatch("foobar is foolish see?"), 2637);
+  assertToStringEquals("rowbar etc, etc", res[848].firstMatch("foobar crowbar etc"), 2638);
+  assertToStringEquals("barrel,rel", res[848].firstMatch("barrel"), 2639);
+  assertToStringEquals("2barrel,rel", res[848].firstMatch("2barrel"), 2640);
+  assertToStringEquals("A barrel,rel", res[848].firstMatch("A barrel"), 2641);
+  assertToStringEquals("abc,abc", res[849].firstMatch("abc456"), 2642);
+  assertNull(res[849].firstMatch("*** Failers"), 2643);
+  assertNull(res[849].firstMatch("abc123"), 2644);
+  assertToStringEquals("1234", res[850].firstMatch("1234"), 2645);
+  assertToStringEquals("1234", res[851].firstMatch("1234"), 2646);
+  assertToStringEquals("abcd", res[852].firstMatch("abcd"), 2647);
+  assertToStringEquals("abcd", res[853].firstMatch("abcd"), 2648);
+  assertToStringEquals("abc", res[854].firstMatch("the abc"), 2649);
+  assertNull(res[854].firstMatch("*** Failers"), 2650);
+  assertNull(res[854].firstMatch("abc"), 2651);
+  assertToStringEquals("abc", res[855].firstMatch("abc"), 2652);
+  assertNull(res[855].firstMatch("*** Failers"), 2653);
+  assertNull(res[855].firstMatch("the abc"), 2654);
+  assertToStringEquals("aabb,b", res[856].firstMatch("aabbbbb"), 2655);
+  assertToStringEquals("aabbbbb,abbbbb", res[857].firstMatch("aabbbbb"), 2656);
+  assertToStringEquals("aa,a", res[858].firstMatch("aabbbbb"), 2657);
+  assertToStringEquals("aabb,b", res[859].firstMatch("aabbbbb"), 2658);
+  assertToStringEquals("Alan Other <user@dom.ain>", res[860].firstMatch("Alan Other <user@dom.ain>"), 2659);
+  assertToStringEquals("user@dom.ain", res[860].firstMatch("<user@dom.ain>"), 2660);
+  assertToStringEquals("user@dom.ain", res[860].firstMatch("user@dom.ain"), 2661);
+  assertToStringEquals("\"A. Other\" <user.1234@dom.ain> (a comment)", res[860].firstMatch("\"A. Other\" <user.1234@dom.ain> (a comment)"), 2662);
+  assertToStringEquals(" Other <user.1234@dom.ain> (a comment)", res[860].firstMatch("A. Other <user.1234@dom.ain> (a comment)"), 2663);
+  assertToStringEquals("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay", res[860].firstMatch("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay"), 2664);
+  assertToStringEquals("user@some.where", res[860].firstMatch("A missing angle <user@some.where"), 2665);
+  assertNull(res[860].firstMatch("*** Failers"), 2666);
+  assertNull(res[860].firstMatch("The quick brown fox"), 2667);
+  assertToStringEquals("Alan Other <user@dom.ain>", res[861].firstMatch("Alan Other <user@dom.ain>"), 2668);
+  assertToStringEquals("user@dom.ain", res[861].firstMatch("<user@dom.ain>"), 2669);
+  assertToStringEquals("user@dom.ain", res[861].firstMatch("user@dom.ain"), 2670);
+  assertToStringEquals("\"A. Other\" <user.1234@dom.ain>", res[861].firstMatch("\"A. Other\" <user.1234@dom.ain> (a comment)"), 2671);
+  assertToStringEquals(" Other <user.1234@dom.ain>", res[861].firstMatch("A. Other <user.1234@dom.ain> (a comment)"), 2672);
+  assertToStringEquals("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay", res[861].firstMatch("\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay"), 2673);
+  assertToStringEquals("user@some.where", res[861].firstMatch("A missing angle <user@some.where"), 2674);
+  assertNull(res[861].firstMatch("*** Failers"), 2675);
+  assertNull(res[861].firstMatch("The quick brown fox"), 2676);
+  assertNull(res[861].firstMatch("abc\x00def\x00pqr\x00xyz\x000AB"), 2677);
+  assertNull(res[861].firstMatch("abc456 abc\x00def\x00pqr\x00xyz\x000ABCDE"), 2678);
+  assertToStringEquals("abc\x0def\x00pqr\x000xyz\x0000AB", res[862].firstMatch("abc\x0def\x00pqr\x000xyz\x0000AB"), 2679);
+  assertToStringEquals("abc\x0def\x00pqr\x000xyz\x0000AB", res[862].firstMatch("abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE"), 2680);
+  assertToStringEquals("\x00", res[863].firstMatch("\x00A"), 2681);
+  assertToStringEquals("\x01", res[863].firstMatch("\x01B"), 2682);
+  assertToStringEquals("\x1f", res[863].firstMatch("\x1fC"), 2683);
+  assertToStringEquals("\x00\x00\x00\x00", res[864].firstMatch("\x00\x00\x00\x00"), 2684);
+  assertNull(res[865].firstMatch("The Ax0x0Z"), 2685);
+  assertNull(res[865].firstMatch("An A\x00x0\x00Z"), 2686);
+  assertNull(res[865].firstMatch("*** Failers"), 2687);
+  assertNull(res[865].firstMatch("A\x00Z"), 2688);
+  assertNull(res[865].firstMatch("A\x00x0\x00x0Z"), 2689);
+  assertToStringEquals(" ", res[866].firstMatch(" abc"), 2690);
+  assertToStringEquals("\x0c", res[866].firstMatch("\x0cabc"), 2691);
+  assertToStringEquals("\n", res[866].firstMatch("\nabc"), 2692);
+  assertToStringEquals("\x0d", res[866].firstMatch("\x0dabc"), 2693);
+  assertToStringEquals("\x09", res[866].firstMatch("\x09abc"), 2694);
+  assertNull(res[866].firstMatch("*** Failers"), 2695);
+  assertNull(res[866].firstMatch("abc"), 2696);
+  assertToStringEquals("abc", res[867].firstMatch("abc"), 2697);
+  assertToStringEquals("abbbbc", res[868].firstMatch("abbbbc"), 2698);
+  assertToStringEquals("abbbc", res[868].firstMatch("abbbc"), 2699);
+  assertToStringEquals("abbc", res[868].firstMatch("abbc"), 2700);
+  assertNull(res[868].firstMatch("*** Failers"), 2701);
+  assertNull(res[868].firstMatch("abc"), 2702);
+  assertNull(res[868].firstMatch("abbbbbc"), 2703);
+  assertToStringEquals("track1.title:TBlah blah blah,track1,title,Blah blah blah", res[869].firstMatch("track1.title:TBlah blah blah"), 2704);
+  assertToStringEquals("track1.title:TBlah blah blah,track1,title,Blah blah blah", res[870].firstMatch("track1.title:TBlah blah blah"), 2705);
+  assertToStringEquals("track1.title:TBlah blah blah,track1,title,Blah blah blah", res[871].firstMatch("track1.title:TBlah blah blah"), 2706);
+  assertToStringEquals("WXY_^abc", res[872].firstMatch("WXY_^abc"), 2707);
+  assertNull(res[872].firstMatch("*** Failers"), 2708);
+  assertNull(res[872].firstMatch("wxy"), 2709);
+  assertToStringEquals("WXY_^abc", res[873].firstMatch("WXY_^abc"), 2710);
+  assertToStringEquals("wxy_^ABC", res[873].firstMatch("wxy_^ABC"), 2711);
+  assertToStringEquals("WXY_^abc", res[874].firstMatch("WXY_^abc"), 2712);
+  assertToStringEquals("wxy_^ABC", res[874].firstMatch("wxy_^ABC"), 2713);
+  assertToStringEquals("abc", res[875].firstMatch("abc"), 2714);
+  assertToStringEquals("abc", res[875].firstMatch("qqq\nabc"), 2715);
+  assertToStringEquals("abc", res[875].firstMatch("abc\nzzz"), 2716);
+  assertToStringEquals("abc", res[875].firstMatch("qqq\nabc\nzzz"), 2717);
+  assertToStringEquals("abc", res[876].firstMatch("abc"), 2718);
+  assertNull(res[876].firstMatch("*** Failers"), 2719);
+  assertNull(res[876].firstMatch("qqq\nabc"), 2720);
+  assertNull(res[876].firstMatch("abc\nzzz"), 2721);
+  assertNull(res[876].firstMatch("qqq\nabc\nzzz"), 2722);
+  assertNull(res[877].firstMatch("abc"), 2723);
+  assertNull(res[877].firstMatch("abc\n "), 2724);
+  assertNull(res[877].firstMatch("*** Failers"), 2725);
+  assertNull(res[877].firstMatch("qqq\nabc"), 2726);
+  assertNull(res[877].firstMatch("abc\nzzz"), 2727);
+  assertNull(res[877].firstMatch("qqq\nabc\nzzz"), 2728);
+  assertNull(res[878].firstMatch("abc\ndef"), 2729);
+  assertNull(res[879].firstMatch("*** Failers"), 2730);
+  assertNull(res[879].firstMatch("abc\ndef"), 2731);
+  assertToStringEquals("b", res[880].firstMatch("b::c"), 2732);
+  assertToStringEquals("::", res[880].firstMatch("c::b"), 2733);
+  assertToStringEquals("az-", res[881].firstMatch("az-"), 2734);
+  assertToStringEquals("a", res[881].firstMatch("*** Failers"), 2735);
+  assertNull(res[881].firstMatch("b"), 2736);
+  assertToStringEquals("za-", res[882].firstMatch("za-"), 2737);
+  assertToStringEquals("a", res[882].firstMatch("*** Failers"), 2738);
+  assertNull(res[882].firstMatch("b"), 2739);
+  assertToStringEquals("a-z", res[883].firstMatch("a-z"), 2740);
+  assertToStringEquals("a", res[883].firstMatch("*** Failers"), 2741);
+  assertNull(res[883].firstMatch("b"), 2742);
+  assertToStringEquals("abcdxyz", res[884].firstMatch("abcdxyz"), 2743);
+  assertToStringEquals("12-34", res[885].firstMatch("12-34"), 2744);
+  assertNull(res[885].firstMatch("*** Failers"), 2745);
+  assertNull(res[885].firstMatch("aaa"), 2746);
+  assertToStringEquals("12-34z", res[886].firstMatch("12-34z"), 2747);
+  assertNull(res[886].firstMatch("*** Failers"), 2748);
+  assertNull(res[886].firstMatch("aaa"), 2749);
+  assertToStringEquals("\\", res[887].firstMatch("\\\\"), 2750);
+  assertToStringEquals(" Z", res[888].firstMatch("the Zoo"), 2751);
+  assertNull(res[888].firstMatch("*** Failers"), 2752);
+  assertNull(res[888].firstMatch("Zulu"), 2753);
+  assertToStringEquals("ab{3cd", res[889].firstMatch("ab{3cd"), 2754);
+  assertToStringEquals("ab{3,cd", res[890].firstMatch("ab{3,cd"), 2755);
+  assertToStringEquals("ab{3,4a}cd", res[891].firstMatch("ab{3,4a}cd"), 2756);
+  assertToStringEquals("{4,5a}bc", res[892].firstMatch("{4,5a}bc"), 2757);
+  assertNull(res[893].firstMatch("a\x0db"), 2758);
+  assertNull(res[893].firstMatch("*** Failers"), 2759);
+  assertNull(res[893].firstMatch("a\nb"), 2760);
+  assertToStringEquals("abc", res[894].firstMatch("abc"), 2761);
+  assertNull(res[894].firstMatch("abc\n"), 2762);
+  assertNull(res[894].firstMatch("*** Failers"), 2763);
+  assertNull(res[894].firstMatch("abc\ndef"), 2764);
+  assertToStringEquals("abcS,abc", res[895].firstMatch("abcS"), 2765);
+  assertToStringEquals("abc\x93,abc", res[896].firstMatch("abc\x93"), 2766);
+  assertToStringEquals("abc\xd3,abc", res[897].firstMatch("abc\xd3"), 2767);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@"), 2768);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@"), 2769);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2770);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2771);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2772);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2773);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2774);
+  assertToStringEquals("abc@,abc", res[898].firstMatch("abc@0"), 2775);
+  assertNull(res[899].firstMatch("abc\x0081"), 2776);
+  assertNull(res[899].firstMatch("abc\x0081"), 2777);
+  assertNull(res[900].firstMatch("abc\x0091"), 2778);
+  assertNull(res[900].firstMatch("abc\x0091"), 2779);
+  assertToStringEquals("abcdefghijk\nS,a,b,c,d,e,f,g,h,i,j,k", res[901].firstMatch("abcdefghijk\nS"), 2780);
+  assertToStringEquals("abidef", res[902].firstMatch("abidef"), 2781);
+  assertToStringEquals("bc", res[903].firstMatch("bc"), 2782);
+  assertToStringEquals("xyz,,", res[904].firstMatch("xyz"), 2783);
+  assertToStringEquals("abc\x08de", res[905].firstMatch("abc\x08de"), 2784);
+  assertToStringEquals("abc\x01de", res[906].firstMatch("abc\x01de"), 2785);
+  assertToStringEquals("abc\x01de,abc", res[907].firstMatch("abc\x01de"), 2786);
+  assertNull(res[907].firstMatch("a\nb"), 2787);
+  assertToStringEquals("baNOTcccc,b,a,NOT,cccc", res[908].firstMatch("baNOTccccd"), 2788);
+  assertToStringEquals("baNOTccc,b,a,NOT,ccc", res[908].firstMatch("baNOTcccd"), 2789);
+  assertToStringEquals("baNOTcc,b,a,NO,Tcc", res[908].firstMatch("baNOTccd"), 2790);
+  assertToStringEquals("baccc,b,a,,ccc", res[908].firstMatch("bacccd"), 2791);
+  assertToStringEquals("*** Failers,*,*,* Fail,ers", res[908].firstMatch("*** Failers"), 2792);
+  assertNull(res[908].firstMatch("anything"), 2793);
+  assertNull(res[908].firstMatch("b\x08c   "), 2794);
+  assertNull(res[908].firstMatch("baccd"), 2795);
+  assertToStringEquals("A", res[909].firstMatch("Abc"), 2796);
+  assertToStringEquals("b", res[910].firstMatch("Abc "), 2797);
+  assertToStringEquals("AAA", res[911].firstMatch("AAAaAbc"), 2798);
+  assertToStringEquals("bc ", res[912].firstMatch("AAAaAbc "), 2799);
+  assertToStringEquals("bbb\nccc", res[913].firstMatch("bbb\nccc"), 2800);
+  assertToStringEquals("c", res[914].firstMatch("abc"), 2801);
+  assertToStringEquals("s", res[914].firstMatch("*** Failers"), 2802);
+  assertToStringEquals(" ", res[914].firstMatch("abk   "), 2803);
+  assertToStringEquals("abc", res[915].firstMatch("abc"), 2804);
+  assertToStringEquals("bc", res[915].firstMatch("kbc"), 2805);
+  assertToStringEquals("bc ", res[915].firstMatch("kabc "), 2806);
+  assertToStringEquals("ers", res[915].firstMatch("*** Failers"), 2807);
+  assertNull(res[915].firstMatch("abk"), 2808);
+  assertNull(res[915].firstMatch("akb"), 2809);
+  assertNull(res[915].firstMatch("akk "), 2810);
+  assertToStringEquals("12345678@a.b.c.d", res[916].firstMatch("12345678@a.b.c.d"), 2811);
+  assertToStringEquals("123456789@x.y.z", res[916].firstMatch("123456789@x.y.z"), 2812);
+  assertNull(res[916].firstMatch("*** Failers"), 2813);
+  assertNull(res[916].firstMatch("12345678@x.y.uk"), 2814);
+  assertNull(res[916].firstMatch("1234567@a.b.c.d       "), 2815);
+  assertToStringEquals("b", res[917].firstMatch("aaaabcd"), 2816);
+  assertToStringEquals("A", res[917].firstMatch("aaAabcd "), 2817);
+  assertToStringEquals("b", res[918].firstMatch("aaaabcd"), 2818);
+  assertToStringEquals("b", res[918].firstMatch("aaAabcd "), 2819);
+  assertToStringEquals("b", res[919].firstMatch("aaaabcd"), 2820);
+  assertToStringEquals("A", res[919].firstMatch("aaAabcd "), 2821);
+  assertToStringEquals("b", res[920].firstMatch("aaaabcd"), 2822);
+  assertToStringEquals("b", res[920].firstMatch("aaAabcd "), 2823);
+  assertToStringEquals("PSTAIREISLL", res[922].firstMatch("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx"), 2824);
+  assertToStringEquals("PSTAIREISLL", res[923].firstMatch("xxxxxxxxxxxPSTAIREISLLxxxxxxxxx"), 2825);
+  assertToStringEquals(".230003938,.23", res[924].firstMatch("1.230003938"), 2826);
+  assertToStringEquals(".875000282,.875", res[924].firstMatch("1.875000282   "), 2827);
+  assertToStringEquals(".235,.23", res[924].firstMatch("1.235  "), 2828);
+  assertNull(res[924].firstMatch("              "), 2829);
+  assertToStringEquals(".23,.23,", res[925].firstMatch("1.230003938      "), 2830);
+  assertToStringEquals(".875,.875,5", res[925].firstMatch("1.875000282"), 2831);
+  assertNull(res[925].firstMatch("*** Failers "), 2832);
+  assertNull(res[925].firstMatch("1.235 "), 2833);
+  assertThrows(() => new RegExp(r"a(?)b"), 2834);
+  assertNull(res[925].firstMatch("ab "), 2835);
+  assertToStringEquals("foo table,foo,table", res[926].firstMatch("Food is on the foo table"), 2836);
+  assertToStringEquals("food is under the bar in the bar,d is under the bar in the ", res[927].firstMatch("The food is under the bar in the barn."), 2837);
+  assertToStringEquals("food is under the bar,d is under the ", res[928].firstMatch("The food is under the bar in the barn."), 2838);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: 53147,", res[929].firstMatch("I have 2 numbers: 53147"), 2839);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: 5314,7", res[930].firstMatch("I have 2 numbers: 53147"), 2840);
+  assertToStringEquals(",,", res[931].firstMatch("I have 2 numbers: 53147"), 2841);
+  assertToStringEquals("I have 2,I have ,2", res[932].firstMatch("I have 2 numbers: 53147"), 2842);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: 5314,7", res[933].firstMatch("I have 2 numbers: 53147"), 2843);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: ,53147", res[934].firstMatch("I have 2 numbers: 53147"), 2844);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: ,53147", res[935].firstMatch("I have 2 numbers: 53147"), 2845);
+  assertToStringEquals("I have 2 numbers: 53147,I have 2 numbers: ,53147", res[936].firstMatch("I have 2 numbers: 53147"), 2846);
+  assertToStringEquals("AB", res[937].firstMatch("ABC123"), 2847);
+  assertToStringEquals(" ", res[937].firstMatch(" "), 2848);
+  assertToStringEquals("ABC,ABC", res[938].firstMatch("ABC445"), 2849);
+  assertNull(res[938].firstMatch("*** Failers"), 2850);
+  assertNull(res[938].firstMatch("ABC123"), 2851);
+  assertToStringEquals("W46]", res[939].firstMatch("W46]789 "), 2852);
+  assertToStringEquals("-46]", res[939].firstMatch("-46]789"), 2853);
+  assertNull(res[939].firstMatch("*** Failers"), 2854);
+  assertNull(res[939].firstMatch("Wall"), 2855);
+  assertNull(res[939].firstMatch("Zebra"), 2856);
+  assertNull(res[939].firstMatch("42"), 2857);
+  assertNull(res[939].firstMatch("[abcd] "), 2858);
+  assertNull(res[939].firstMatch("]abcd["), 2859);
+  assertNull(res[939].firstMatch("   "), 2860);
+  assertToStringEquals("W", res[940].firstMatch("W46]789 "), 2861);
+  assertToStringEquals("W", res[940].firstMatch("Wall"), 2862);
+  assertToStringEquals("Z", res[940].firstMatch("Zebra"), 2863);
+  assertToStringEquals("X", res[940].firstMatch("Xylophone  "), 2864);
+  assertToStringEquals("4", res[940].firstMatch("42"), 2865);
+  assertToStringEquals("[", res[940].firstMatch("[abcd] "), 2866);
+  assertToStringEquals("]", res[940].firstMatch("]abcd["), 2867);
+  assertToStringEquals("\\", res[940].firstMatch("\\backslash "), 2868);
+  assertNull(res[940].firstMatch("*** Failers"), 2869);
+  assertNull(res[940].firstMatch("-46]789"), 2870);
+  assertNull(res[940].firstMatch("well"), 2871);
+  assertToStringEquals("01/01/2000", res[941].firstMatch("01/01/2000"), 2872);
+  assertToStringEquals("01/01/2000", res[941].firstMatch("01/01/2000"), 2872);
+  assertToStringEquals(",", res[944].firstMatch("bcd"), 2873);
+  assertToStringEquals(",", res[944].firstMatch("abc"), 2874);
+  assertToStringEquals(",", res[944].firstMatch("aab     "), 2875);
+  assertToStringEquals(",", res[945].firstMatch("bcd"), 2876);
+  assertToStringEquals("a,a", res[945].firstMatch("abc"), 2877);
+  assertToStringEquals("a,a", res[945].firstMatch("aab  "), 2878);
+  assertToStringEquals(",", res[946].firstMatch("bcd"), 2879);
+  assertToStringEquals("a,a", res[946].firstMatch("abc"), 2880);
+  assertToStringEquals("aa,a", res[946].firstMatch("aab  "), 2881);
+  assertToStringEquals(",", res[947].firstMatch("bcd"), 2882);
+  assertToStringEquals("a,a", res[947].firstMatch("abc"), 2883);
+  assertToStringEquals("aa,a", res[947].firstMatch("aab"), 2884);
+  assertToStringEquals("aaa,a", res[947].firstMatch("aaa   "), 2885);
+  assertToStringEquals(",", res[948].firstMatch("bcd"), 2886);
+  assertToStringEquals("a,a", res[948].firstMatch("abc"), 2887);
+  assertToStringEquals("aa,a", res[948].firstMatch("aab"), 2888);
+  assertToStringEquals("aaa,a", res[948].firstMatch("aaa"), 2889);
+  assertToStringEquals("aaaaaaaa,a", res[948].firstMatch("aaaaaaaa    "), 2890);
+  assertNull(res[949].firstMatch("bcd"), 2891);
+  assertToStringEquals("a,a", res[949].firstMatch("abc"), 2892);
+  assertToStringEquals("a,a", res[949].firstMatch("aab  "), 2893);
+  assertNull(res[950].firstMatch("bcd"), 2894);
+  assertToStringEquals("a,a", res[950].firstMatch("abc"), 2895);
+  assertToStringEquals("aa,a", res[950].firstMatch("aab  "), 2896);
+  assertNull(res[951].firstMatch("bcd"), 2897);
+  assertToStringEquals("a,a", res[951].firstMatch("abc"), 2898);
+  assertToStringEquals("aa,a", res[951].firstMatch("aab"), 2899);
+  assertToStringEquals("aaa,a", res[951].firstMatch("aaa   "), 2900);
+  assertNull(res[952].firstMatch("bcd"), 2901);
+  assertToStringEquals("a,a", res[952].firstMatch("abc"), 2902);
+  assertToStringEquals("aa,a", res[952].firstMatch("aab"), 2903);
+  assertToStringEquals("aaa,a", res[952].firstMatch("aaa"), 2904);
+  assertToStringEquals("aaaaaaaa,a", res[952].firstMatch("aaaaaaaa    "), 2905);
+  assertToStringEquals("bib.gif", res[953].firstMatch("borfle\nbib.gif\nno"), 2906);
+  assertToStringEquals("bib.gif", res[954].firstMatch("borfle\nbib.gif\nno"), 2907);
+  assertToStringEquals("bib.gif", res[955].firstMatch("borfle\nbib.gif\nno"), 2908);
+  assertToStringEquals("bib.gif", res[956].firstMatch("borfle\nbib.gif\nno"), 2909);
+  assertToStringEquals("bib.gif", res[957].firstMatch("borfle\nbib.gif\nno"), 2910);
+  assertToStringEquals("no", res[958].firstMatch("borfle\nbib.gif\nno"), 2911);
+  assertToStringEquals("borfle", res[959].firstMatch("borfle\nbib.gif\nno"), 2912);
+  assertToStringEquals("no", res[960].firstMatch("borfle\nbib.gif\nno"), 2913);
+  assertToStringEquals("borfle", res[961].firstMatch("borfle\nbib.gif\nno"), 2914);
+  assertToStringEquals("", res[962].firstMatch("borfle\nbib.gif\nno\n"), 2915);
+  assertToStringEquals("borfle", res[963].firstMatch("borfle\nbib.gif\nno\n"), 2916);
+  assertToStringEquals("", res[964].firstMatch("borfle\nbib.gif\nno\n"), 2917);
+  assertToStringEquals("borfle", res[965].firstMatch("borfle\nbib.gif\nno\n"), 2918);
+  assertToStringEquals("1234X,1234X", res[966].firstMatch("abcde\n1234Xyz"), 2919);
+  assertToStringEquals("B,B", res[966].firstMatch("BarFoo "), 2920);
+  assertNull(res[966].firstMatch("*** Failers"), 2921);
+  assertNull(res[966].firstMatch("abcde\nBar  "), 2922);
+  assertToStringEquals("1234X,1234X", res[967].firstMatch("abcde\n1234Xyz"), 2923);
+  assertToStringEquals("B,B", res[967].firstMatch("BarFoo "), 2924);
+  assertToStringEquals("B,B", res[967].firstMatch("abcde\nBar  "), 2925);
+  assertToStringEquals("1234X,1234X", res[968].firstMatch("abcde\n1234Xyz"), 2926);
+  assertToStringEquals("B,B", res[968].firstMatch("BarFoo "), 2927);
+  assertNull(res[968].firstMatch("*** Failers"), 2928);
+  assertNull(res[968].firstMatch("abcde\nBar  "), 2929);
+  assertToStringEquals("1234X,1234X", res[969].firstMatch("abcde\n1234Xyz"), 2930);
+  assertToStringEquals("B,B", res[969].firstMatch("BarFoo "), 2931);
+  assertToStringEquals("B,B", res[969].firstMatch("abcde\nBar  "), 2932);
+  assertToStringEquals("1234X,1234X", res[969].firstMatch("abcde\n1234Xyz"), 2933);
+  assertToStringEquals("B,B", res[969].firstMatch("BarFoo "), 2934);
+  assertNull(res[969].firstMatch("*** Failers "), 2935);
+  assertToStringEquals("B,B", res[969].firstMatch("abcde\nBar  "), 2936);
+  assertToStringEquals("1234X,1234X", res[969].firstMatch("abcde\n1234Xyz"), 2937);
+  assertToStringEquals("B,B", res[969].firstMatch("BarFoo "), 2938);
+  assertNull(res[969].firstMatch("*** Failers "), 2939);
+  assertToStringEquals("B,B", res[969].firstMatch("abcde\nBar  "), 2940);
+  assertNull(res[970].firstMatch("**** Failers"), 2941);
+  assertNull(res[970].firstMatch("abc\nB"), 2942);
+  assertNull(res[970].firstMatch(" "), 2943);
+  assertNull(res[970].firstMatch("abc\nB"), 2944);
+  assertNull(res[970].firstMatch("abc\nB"), 2945);
+  assertNull(res[970].firstMatch(" "), 2946);
+  assertNull(res[970].firstMatch("abc\nB"), 2947);
+  assertNull(res[970].firstMatch("abc\nB"), 2948);
+  assertToStringEquals("B", res[970].firstMatch("B\n"), 2949);
+  assertToStringEquals("123456654321", res[971].firstMatch("123456654321"), 2950);
+  assertToStringEquals("123456654321", res[972].firstMatch("123456654321 "), 2951);
+  assertToStringEquals("123456654321", res[973].firstMatch("123456654321"), 2952);
+  assertToStringEquals("abcabcabcabc", res[974].firstMatch("abcabcabcabc"), 2953);
+  assertToStringEquals("abcabcabcabc", res[975].firstMatch("abcabcabcabc"), 2954);
+  assertToStringEquals("abcabcabcabc,c", res[976].firstMatch("abcabcabcabc "), 2955);
+  assertToStringEquals("n", res[977].firstMatch("n"), 2956);
+  assertNull(res[977].firstMatch("*** Failers "), 2957);
+  assertNull(res[977].firstMatch("z "), 2958);
+  assertToStringEquals("abcd", res[978].firstMatch("abcd"), 2959);
+  assertNull(res[978].firstMatch("*** Failers"), 2960);
+  assertNull(res[978].firstMatch("abce  "), 2961);
+  assertToStringEquals("abe", res[979].firstMatch("abe"), 2962);
+  assertNull(res[979].firstMatch("*** Failers"), 2963);
+  assertNull(res[979].firstMatch("abcde "), 2964);
+  assertToStringEquals("abd,", res[980].firstMatch("abd"), 2965);
+  assertNull(res[980].firstMatch("*** Failers"), 2966);
+  assertNull(res[980].firstMatch("abcd   "), 2967);
+  assertToStringEquals("a,", res[981].firstMatch("a"), 2968);
+  assertToStringEquals("ab,b", res[981].firstMatch("ab"), 2969);
+  assertToStringEquals("abbbb,bbbb", res[981].firstMatch("abbbb"), 2970);
+  assertToStringEquals("a,", res[981].firstMatch("*** Failers"), 2971);
+  assertNull(res[981].firstMatch("bbbbb    "), 2972);
+  assertToStringEquals("abe", res[982].firstMatch("abe"), 2973);
+  assertNull(res[982].firstMatch("*** Failers"), 2974);
+  assertNull(res[982].firstMatch("ab1e   "), 2975);
+  assertToStringEquals("\"quick\",quick", res[983].firstMatch("the \"quick\" brown fox"), 2976);
+  assertToStringEquals("\"the \\\"quick\\\" brown fox\", brown fox", res[983].firstMatch("\"the \\\"quick\\\" brown fox\" "), 2977);
+  assertToStringEquals("", res[984].firstMatch("abc"), 2978);
+  assertToStringEquals("", res[985].firstMatch("abc "), 2979);
+  assertToStringEquals("", res[986].firstMatch("abc "), 2980);
+  // Dart does not have RegExp literals and thus no translatation of the below.
+  // assertThrows("var re = //;", 2981);
+  assertToStringEquals("", res[986].firstMatch("abc"), 2982);
+  assertToStringEquals("acb", res[988].firstMatch("acb"), 2983);
+  assertToStringEquals("a\nb", res[988].firstMatch("a\nb"), 2984);
+  assertToStringEquals("acb", res[989].firstMatch("acb"), 2985);
+  assertNull(res[989].firstMatch("*** Failers "), 2986);
+  assertNull(res[989].firstMatch("a\nb   "), 2987);
+  assertToStringEquals("acb", res[990].firstMatch("acb"), 2988);
+  assertToStringEquals("a\nb", res[990].firstMatch("a\nb  "), 2989);
+  assertToStringEquals("acb", res[991].firstMatch("acb"), 2990);
+  assertNull(res[991].firstMatch("a\nb  "), 2991);
+  assertToStringEquals("bac,a", res[992].firstMatch("bac"), 2992);
+  assertToStringEquals("bbac,a", res[992].firstMatch("bbac"), 2993);
+  assertToStringEquals("bbbac,a", res[992].firstMatch("bbbac"), 2994);
+  assertToStringEquals("bbbbac,a", res[992].firstMatch("bbbbac"), 2995);
+  assertToStringEquals("bbbbbac,a", res[992].firstMatch("bbbbbac "), 2996);
+  assertToStringEquals("bac,a", res[993].firstMatch("bac"), 2997);
+  assertToStringEquals("bbac,a", res[993].firstMatch("bbac"), 2998);
+  assertToStringEquals("bbbac,a", res[993].firstMatch("bbbac"), 2999);
+  assertToStringEquals("bbbbac,a", res[993].firstMatch("bbbbac"), 3000);
+  assertToStringEquals("bbbbbac,a", res[993].firstMatch("bbbbbac "), 3001);
+  assertToStringEquals("x", res[994].firstMatch("x\nb\n"), 3002);
+  assertToStringEquals("x", res[994].firstMatch("a\x08x\n  "), 3003);
+  assertNull(res[995].firstMatch("\x00{ab} "), 3004);
+  assertToStringEquals("CD,", res[996].firstMatch("CD "), 3005);
+  assertToStringEquals("CD,", res[997].firstMatch("CD "), 3006);
+  assertNull(res[997].firstMatch("foo"), 3007);
+  assertNull(res[997].firstMatch("catfood"), 3008);
+  assertNull(res[997].firstMatch("arfootle"), 3009);
+  assertNull(res[997].firstMatch("rfoosh"), 3010);
+  assertNull(res[997].firstMatch("*** Failers"), 3011);
+  assertNull(res[997].firstMatch("barfoo"), 3012);
+  assertNull(res[997].firstMatch("towbarfoo"), 3013);
+  assertNull(res[997].firstMatch("catfood"), 3014);
+  assertNull(res[997].firstMatch("*** Failers"), 3015);
+  assertNull(res[997].firstMatch("foo"), 3016);
+  assertNull(res[997].firstMatch("barfoo"), 3017);
+  assertNull(res[997].firstMatch("towbarfoo"), 3018);
+  assertNull(res[997].firstMatch("fooabar"), 3019);
+  assertNull(res[997].firstMatch("*** Failers"), 3020);
+  assertNull(res[997].firstMatch("bar"), 3021);
+  assertNull(res[997].firstMatch("foobbar"), 3022);
+  assertNull(res[997].firstMatch("  "), 3023);
+  assertNull(res[998].firstMatch("abc"), 3024);
+  assertNull(res[998].firstMatch("*** Failers"), 3025);
+  assertNull(res[998].firstMatch("abc\n   "), 3026);
+  assertNull(res[998].firstMatch("qqq\nabc"), 3027);
+  assertNull(res[998].firstMatch("abc\nzzz"), 3028);
+  assertNull(res[998].firstMatch("qqq\nabc\nzzz"), 3029);
+  assertNull(res[998].firstMatch("/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/"), 3030);
+  assertNull(res[998].firstMatch("/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo"), 3031);
+  assertNull(res[998].firstMatch("1.230003938"), 3032);
+  assertNull(res[998].firstMatch("1.875000282"), 3033);
+  assertNull(res[998].firstMatch("*** Failers "), 3034);
+  assertNull(res[998].firstMatch("1.235 "), 3035);
+  assertNull(res[998].firstMatch("now is the time for all good men to come to the aid of the party"), 3036);
+  assertNull(res[998].firstMatch("*** Failers"), 3037);
+  assertNull(res[998].firstMatch("this is not a line with only words and spaces!"), 3038);
+  assertToStringEquals("12345a,12345,a", res[999].firstMatch("12345a"), 3039);
+  assertToStringEquals("12345,1234,5", res[999].firstMatch("12345+ "), 3040);
+  assertToStringEquals("12345a,12345,a", res[999].firstMatch("12345a"), 3041);
+  assertNull(res[999].firstMatch("*** Failers"), 3042);
+  assertToStringEquals("12345,1234,5", res[999].firstMatch("12345+ "), 3043);
+  assertNull(res[999].firstMatch("aaab"), 3044);
+  assertNull(res[999].firstMatch("aaab"), 3045);
+  assertNull(res[999].firstMatch("aaab"), 3046);
+  assertNull(res[999].firstMatch("aaabbbccc"), 3047);
+  assertNull(res[999].firstMatch("aaabbbbccccd"), 3048);
+  assertToStringEquals("aaabbbbcccc,ccc", res[1000].firstMatch("aaabbbbccccd"), 3049);
+  assertToStringEquals("abc,b", res[1000].firstMatch("((abc(ade)ufh()()x"), 3050);
+  assertNull(res[1000].firstMatch(""), 3051);
+  assertToStringEquals("abc,b", res[1000].firstMatch("(abc)"), 3052);
+  assertToStringEquals("abc,b", res[1000].firstMatch("(abc(def)xyz)"), 3053);
+  assertNull(res[1000].firstMatch("*** Failers"), 3054);
+  assertNull(res[1000].firstMatch("ab"), 3055);
+  assertNull(res[1000].firstMatch("Ab"), 3056);
+  assertNull(res[1000].firstMatch("*** Failers "), 3057);
+  assertNull(res[1000].firstMatch("aB"), 3058);
+  assertNull(res[1000].firstMatch("AB"), 3059);
+  assertNull(res[1000].firstMatch("    "), 3060);
+  assertToStringEquals("bc,b", res[1000].firstMatch("a bcd e"), 3061);
+  assertNull(res[1000].firstMatch("*** Failers"), 3062);
+  assertToStringEquals("c,", res[1000].firstMatch("a b cd e"), 3063);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abcd e   "), 3064);
+  assertToStringEquals("bc,b", res[1000].firstMatch("a bcde "), 3065);
+  assertToStringEquals("bc,b", res[1000].firstMatch("a bcde f"), 3066);
+  assertNull(res[1000].firstMatch("*** Failers"), 3067);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abcdef  "), 3068);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc"), 3069);
+  assertToStringEquals("c,", res[1000].firstMatch("aBc"), 3070);
+  assertNull(res[1000].firstMatch("*** Failers"), 3071);
+  assertNull(res[1000].firstMatch("abC"), 3072);
+  assertNull(res[1000].firstMatch("aBC  "), 3073);
+  assertToStringEquals("bc,b", res[1000].firstMatch("Abc"), 3074);
+  assertToStringEquals("c,", res[1000].firstMatch("ABc"), 3075);
+  assertNull(res[1000].firstMatch("ABC"), 3076);
+  assertNull(res[1000].firstMatch("AbC"), 3077);
+  assertNull(res[1000].firstMatch(""), 3078);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc"), 3079);
+  assertToStringEquals("c,", res[1000].firstMatch("aBc"), 3080);
+  assertNull(res[1000].firstMatch("*** Failers "), 3081);
+  assertNull(res[1000].firstMatch("ABC"), 3082);
+  assertNull(res[1000].firstMatch("abC"), 3083);
+  assertNull(res[1000].firstMatch("aBC"), 3084);
+  assertNull(res[1000].firstMatch(""), 3085);
+  assertToStringEquals("c,", res[1000].firstMatch("aBc"), 3086);
+  assertToStringEquals("c,", res[1000].firstMatch("aBBc"), 3087);
+  assertNull(res[1000].firstMatch("*** Failers "), 3088);
+  assertNull(res[1000].firstMatch("aBC"), 3089);
+  assertNull(res[1000].firstMatch("aBBC"), 3090);
+  assertNull(res[1000].firstMatch(""), 3091);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abcd"), 3092);
+  assertNull(res[1000].firstMatch("abCd"), 3093);
+  assertNull(res[1000].firstMatch("*** Failers"), 3094);
+  assertNull(res[1000].firstMatch("aBCd"), 3095);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abcD     "), 3096);
+  assertNull(res[1000].firstMatch(""), 3097);
+  assertNull(res[1000].firstMatch("more than million"), 3098);
+  assertNull(res[1000].firstMatch("more than MILLION"), 3099);
+  assertNull(res[1000].firstMatch("more \n than Million "), 3100);
+  assertNull(res[1000].firstMatch("*** Failers"), 3101);
+  assertNull(res[1000].firstMatch("MORE THAN MILLION    "), 3102);
+  assertNull(res[1000].firstMatch("more \n than \n million "), 3103);
+  assertNull(res[1000].firstMatch("more than million"), 3104);
+  assertNull(res[1000].firstMatch("more than MILLION"), 3105);
+  assertNull(res[1000].firstMatch("more \n than Million "), 3106);
+  assertNull(res[1000].firstMatch("*** Failers"), 3107);
+  assertNull(res[1000].firstMatch("MORE THAN MILLION    "), 3108);
+  assertNull(res[1000].firstMatch("more \n than \n million "), 3109);
+  assertNull(res[1000].firstMatch(""), 3110);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc"), 3111);
+  assertToStringEquals("bc,b", res[1000].firstMatch("aBbc"), 3112);
+  assertToStringEquals("c,", res[1000].firstMatch("aBBc "), 3113);
+  assertNull(res[1000].firstMatch("*** Failers"), 3114);
+  assertToStringEquals("bc,b", res[1000].firstMatch("Abc"), 3115);
+  assertNull(res[1000].firstMatch("abAb    "), 3116);
+  assertNull(res[1000].firstMatch("abbC "), 3117);
+  assertNull(res[1000].firstMatch(""), 3118);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc"), 3119);
+  assertToStringEquals("c,", res[1000].firstMatch("aBc"), 3120);
+  assertNull(res[1000].firstMatch("*** Failers"), 3121);
+  assertNull(res[1000].firstMatch("Ab "), 3122);
+  assertNull(res[1000].firstMatch("abC"), 3123);
+  assertNull(res[1000].firstMatch("aBC     "), 3124);
+  assertNull(res[1000].firstMatch(""), 3125);
+  assertToStringEquals("c,", res[1000].firstMatch("abxxc"), 3126);
+  assertToStringEquals("c,", res[1000].firstMatch("aBxxc"), 3127);
+  assertNull(res[1000].firstMatch("*** Failers"), 3128);
+  assertToStringEquals("c,", res[1000].firstMatch("Abxxc"), 3129);
+  assertToStringEquals("c,", res[1000].firstMatch("ABxxc"), 3130);
+  assertNull(res[1000].firstMatch("abxxC      "), 3131);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc:"), 3132);
+  assertNull(res[1000].firstMatch("12"), 3133);
+  assertNull(res[1000].firstMatch("*** Failers"), 3134);
+  assertNull(res[1000].firstMatch("123"), 3135);
+  assertNull(res[1000].firstMatch("xyz    "), 3136);
+  assertToStringEquals("abc,b", res[1000].firstMatch("abc:"), 3137);
+  assertNull(res[1000].firstMatch("12"), 3138);
+  assertNull(res[1000].firstMatch("*** Failers"), 3139);
+  assertNull(res[1000].firstMatch("123"), 3140);
+  assertNull(res[1000].firstMatch("xyz    "), 3141);
+  assertNull(res[1000].firstMatch(""), 3142);
+  assertNull(res[1000].firstMatch("foobar"), 3143);
+  assertToStringEquals("c,", res[1000].firstMatch("cat"), 3144);
+  assertToStringEquals("c,", res[1000].firstMatch("fcat"), 3145);
+  assertToStringEquals("c,", res[1000].firstMatch("focat   "), 3146);
+  assertNull(res[1000].firstMatch("*** Failers"), 3147);
+  assertToStringEquals("c,", res[1000].firstMatch("foocat  "), 3148);
+  assertNull(res[1000].firstMatch("foobar"), 3149);
+  assertToStringEquals("c,", res[1000].firstMatch("cat"), 3150);
+  assertToStringEquals("c,", res[1000].firstMatch("fcat"), 3151);
+  assertToStringEquals("c,", res[1000].firstMatch("focat   "), 3152);
+  assertNull(res[1000].firstMatch("*** Failers"), 3153);
+  assertToStringEquals("c,", res[1000].firstMatch("foocat  "), 3154);
+  assertNull(res[1000].firstMatch("a"), 3155);
+  assertNull(res[1000].firstMatch("aa"), 3156);
+  assertNull(res[1000].firstMatch("aaaa"), 3157);
+  assertNull(res[1000].firstMatch(""), 3158);
+  assertToStringEquals("abc,abc", res[1001].firstMatch("abc"), 3159);
+  assertToStringEquals("abcabc,abc", res[1001].firstMatch("abcabc"), 3160);
+  assertToStringEquals("abcabcabc,abc", res[1001].firstMatch("abcabcabc"), 3161);
+  assertToStringEquals(",", res[1001].firstMatch("xyz      "), 3162);
+  assertToStringEquals("a,a", res[1002].firstMatch("a"), 3163);
+  assertToStringEquals("aaaaa,aaaaa", res[1002].firstMatch("aaaaa "), 3164);
+  assertToStringEquals("a,a", res[1003].firstMatch("a"), 3165);
+  assertToStringEquals("b,b", res[1003].firstMatch("b"), 3166);
+  assertToStringEquals("ababab,ababab", res[1003].firstMatch("ababab"), 3167);
+  assertToStringEquals("aaaab,aaaab", res[1003].firstMatch("aaaabcde"), 3168);
+  assertToStringEquals("bbbb,bbbb", res[1003].firstMatch("bbbb    "), 3169);
+  assertToStringEquals("b,b", res[1004].firstMatch("b"), 3170);
+  assertToStringEquals("bbbb,bbbb", res[1004].firstMatch("bbbb"), 3171);
+  assertToStringEquals(",", res[1004].firstMatch("aaa   "), 3172);
+  assertToStringEquals("cccc,cccc", res[1005].firstMatch("cccc"), 3173);
+  assertToStringEquals(",", res[1005].firstMatch("abab  "), 3174);
+  assertToStringEquals("a,a", res[1006].firstMatch("a"), 3175);
+  assertToStringEquals("aaaa,a", res[1006].firstMatch("aaaa "), 3176);
+  assertToStringEquals("a,a", res[1007].firstMatch("a"), 3177);
+  assertToStringEquals("b,b", res[1007].firstMatch("b"), 3178);
+  assertToStringEquals("abab,b", res[1007].firstMatch("abab"), 3179);
+  assertToStringEquals("baba,a", res[1007].firstMatch("baba   "), 3180);
+  assertToStringEquals("b,b", res[1008].firstMatch("b"), 3181);
+  assertToStringEquals("bbbb,b", res[1008].firstMatch("bbbb"), 3182);
+  assertToStringEquals(",", res[1008].firstMatch("aaa   "), 3183);
+  assertToStringEquals("c,c", res[1009].firstMatch("c"), 3184);
+  assertToStringEquals("cccc,c", res[1009].firstMatch("cccc"), 3185);
+  assertToStringEquals(",", res[1009].firstMatch("baba   "), 3186);
+  assertToStringEquals(",", res[1009].firstMatch("a"), 3187);
+  assertToStringEquals(",", res[1009].firstMatch("aaabcde "), 3188);
+  assertToStringEquals(",", res[1009].firstMatch("aaaaa"), 3189);
+  assertToStringEquals(",", res[1009].firstMatch("aabbaa "), 3190);
+  assertToStringEquals(",", res[1009].firstMatch("aaaaa"), 3191);
+  assertToStringEquals(",", res[1009].firstMatch("aabbaa "), 3192);
+  assertToStringEquals("12-sep-98,8", res[1009].firstMatch("12-sep-98"), 3193);
+  assertToStringEquals("12-09-98,8", res[1009].firstMatch("12-09-98"), 3194);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3195);
+  assertToStringEquals("sep-12-98,8", res[1009].firstMatch("sep-12-98"), 3196);
+  assertToStringEquals("    , ", res[1009].firstMatch("    "), 3197);
+  assertToStringEquals("s,s", res[1009].firstMatch("saturday"), 3198);
+  assertToStringEquals("sund,d", res[1009].firstMatch("sunday"), 3199);
+  assertToStringEquals("S,S", res[1009].firstMatch("Saturday"), 3200);
+  assertToStringEquals("Sund,d", res[1009].firstMatch("Sunday"), 3201);
+  assertToStringEquals("SATURDAY,Y", res[1009].firstMatch("SATURDAY"), 3202);
+  assertToStringEquals("SUNDAY,Y", res[1009].firstMatch("SUNDAY"), 3203);
+  assertToStringEquals("SunD,D", res[1009].firstMatch("SunDay"), 3204);
+  assertToStringEquals(",", res[1009].firstMatch("abcx"), 3205);
+  assertToStringEquals(",", res[1009].firstMatch("aBCx"), 3206);
+  assertToStringEquals(",", res[1009].firstMatch("bbx"), 3207);
+  assertToStringEquals("BBx,x", res[1009].firstMatch("BBx"), 3208);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3209);
+  assertToStringEquals(",", res[1009].firstMatch("abcX"), 3210);
+  assertToStringEquals(",", res[1009].firstMatch("aBCX"), 3211);
+  assertToStringEquals(",", res[1009].firstMatch("bbX"), 3212);
+  assertToStringEquals("BBX               , ", res[1009].firstMatch("BBX               "), 3213);
+  assertToStringEquals(",", res[1009].firstMatch("ac"), 3214);
+  assertToStringEquals(",", res[1009].firstMatch("aC"), 3215);
+  assertToStringEquals(",", res[1009].firstMatch("bD"), 3216);
+  assertToStringEquals("eleph,h", res[1009].firstMatch("elephant"), 3217);
+  assertToStringEquals("Europe , ", res[1009].firstMatch("Europe "), 3218);
+  assertToStringEquals("frog,g", res[1009].firstMatch("frog"), 3219);
+  assertToStringEquals("Fr,r", res[1009].firstMatch("France"), 3220);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3221);
+  assertToStringEquals("Afric,c", res[1009].firstMatch("Africa     "), 3222);
+  assertToStringEquals(",", res[1009].firstMatch("ab"), 3223);
+  assertToStringEquals(",", res[1009].firstMatch("aBd"), 3224);
+  assertToStringEquals("xy,y", res[1009].firstMatch("xy"), 3225);
+  assertToStringEquals("xY,Y", res[1009].firstMatch("xY"), 3226);
+  assertToStringEquals("ze,e", res[1009].firstMatch("zebra"), 3227);
+  assertToStringEquals("Z,Z", res[1009].firstMatch("Zambesi"), 3228);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3229);
+  assertToStringEquals(",", res[1009].firstMatch("aCD  "), 3230);
+  assertToStringEquals("XY  , ", res[1009].firstMatch("XY  "), 3231);
+  assertToStringEquals("foo\n,\n", res[1009].firstMatch("foo\nbar"), 3232);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3233);
+  assertToStringEquals(",", res[1009].firstMatch("bar"), 3234);
+  assertToStringEquals(",", res[1009].firstMatch("baz\nbar   "), 3235);
+  assertToStringEquals(",", res[1009].firstMatch("barbaz"), 3236);
+  assertToStringEquals(",", res[1009].firstMatch("barbarbaz "), 3237);
+  assertToStringEquals("koo,o", res[1009].firstMatch("koobarbaz "), 3238);
+  assertToStringEquals("*** F,F", res[1009].firstMatch("*** Failers"), 3239);
+  assertToStringEquals(",", res[1009].firstMatch("baz"), 3240);
+  assertToStringEquals("foo,o", res[1009].firstMatch("foobarbaz "), 3241);
+  assertToStringEquals("abc", res[1012].firstMatch("abc"), 3242);
+  assertToStringEquals("abc", res[1012].firstMatch("xabcy"), 3243);
+  assertToStringEquals("abc", res[1012].firstMatch("ababc"), 3244);
+  assertNull(res[1012].firstMatch("*** Failers"), 3245);
+  assertNull(res[1012].firstMatch("xbc"), 3246);
+  assertNull(res[1012].firstMatch("axc"), 3247);
+  assertNull(res[1012].firstMatch("abx"), 3248);
+  assertToStringEquals("abc", res[1013].firstMatch("abc"), 3249);
+  assertToStringEquals("abc", res[1014].firstMatch("abc"), 3250);
+  assertToStringEquals("abbc", res[1014].firstMatch("abbc"), 3251);
+  assertToStringEquals("abbbbc", res[1014].firstMatch("abbbbc"), 3252);
+  assertToStringEquals("a", res[1015].firstMatch("abbbbc"), 3253);
+  assertToStringEquals("abbb", res[1016].firstMatch("abbbbc"), 3254);
+  assertToStringEquals("abbbbc", res[1017].firstMatch("abbbbc"), 3255);
+  assertToStringEquals("abbc", res[1018].firstMatch("abbc"), 3256);
+  assertNull(res[1018].firstMatch("*** Failers"), 3257);
+  assertNull(res[1018].firstMatch("abc"), 3258);
+  assertNull(res[1018].firstMatch("abq"), 3259);
+  assertToStringEquals("abbbbc", res[1020].firstMatch("abbbbc"), 3260);
+  assertToStringEquals("abbbbc", res[1021].firstMatch("abbbbc"), 3261);
+  assertToStringEquals("abbbbc", res[1022].firstMatch("abbbbc"), 3262);
+  assertToStringEquals("abbbbc", res[1023].firstMatch("abbbbc"), 3263);
+  assertNull(res[1024].firstMatch("*** Failers"), 3264);
+  assertNull(res[1024].firstMatch("abq"), 3265);
+  assertNull(res[1024].firstMatch("abbbbc"), 3266);
+  assertToStringEquals("abbc", res[1025].firstMatch("abbc"), 3267);
+  assertToStringEquals("abc", res[1025].firstMatch("abc"), 3268);
+  assertToStringEquals("abc", res[1026].firstMatch("abc"), 3269);
+  assertToStringEquals("abc", res[1028].firstMatch("abc"), 3270);
+  assertToStringEquals("abc", res[1029].firstMatch("abc"), 3271);
+  assertToStringEquals("abc", res[1030].firstMatch("abc"), 3272);
+  assertNull(res[1030].firstMatch("*** Failers"), 3273);
+  assertNull(res[1030].firstMatch("abbbbc"), 3274);
+  assertNull(res[1030].firstMatch("abcc"), 3275);
+  assertToStringEquals("abc", res[1031].firstMatch("abcc"), 3276);
+  assertToStringEquals("abc", res[1033].firstMatch("aabc"), 3277);
+  assertNull(res[1033].firstMatch("*** Failers"), 3278);
+  assertToStringEquals("abc", res[1033].firstMatch("aabc"), 3279);
+  assertNull(res[1033].firstMatch("aabcd"), 3280);
+  assertToStringEquals("", res[1034].firstMatch("abc"), 3281);
+  assertToStringEquals("", res[1035].firstMatch("abc"), 3282);
+  assertToStringEquals("abc", res[1036].firstMatch("abc"), 3283);
+  assertToStringEquals("axc", res[1036].firstMatch("axc"), 3284);
+  assertToStringEquals("axyzc", res[1037].firstMatch("axyzc"), 3285);
+  assertToStringEquals("abd", res[1038].firstMatch("abd"), 3286);
+  assertNull(res[1038].firstMatch("*** Failers"), 3287);
+  assertNull(res[1038].firstMatch("axyzd"), 3288);
+  assertNull(res[1038].firstMatch("abc"), 3289);
+  assertToStringEquals("ace", res[1039].firstMatch("ace"), 3290);
+  assertToStringEquals("ac", res[1040].firstMatch("aac"), 3291);
+  assertToStringEquals("a-", res[1041].firstMatch("a-"), 3292);
+  assertToStringEquals("a-", res[1042].firstMatch("a-"), 3293);
+  assertToStringEquals("a]", res[1043].firstMatch("a]"), 3294);
+  assertNull(res[1044].firstMatch("a]b"), 3295);
+  assertToStringEquals("aed", res[1045].firstMatch("aed"), 3296);
+  assertNull(res[1045].firstMatch("*** Failers"), 3297);
+  assertNull(res[1045].firstMatch("abd"), 3298);
+  assertNull(res[1045].firstMatch("abd"), 3299);
+  assertToStringEquals("adc", res[1046].firstMatch("adc"), 3300);
+  assertNull(res[1047].firstMatch("adc"), 3301);
+  assertNull(res[1047].firstMatch("*** Failers"), 3302);
+  assertNull(res[1047].firstMatch("a-c"), 3303);
+  assertNull(res[1047].firstMatch("a]c"), 3304);
+  assertToStringEquals("a", res[1048].firstMatch("a-"), 3305);
+  assertToStringEquals("a", res[1048].firstMatch("-a"), 3306);
+  assertToStringEquals("a", res[1048].firstMatch("-a-"), 3307);
+  assertNull(res[1049].firstMatch("*** Failers"), 3308);
+  assertNull(res[1049].firstMatch("xy"), 3309);
+  assertNull(res[1049].firstMatch("yz"), 3310);
+  assertNull(res[1049].firstMatch("xyz"), 3311);
+  assertToStringEquals("a", res[1050].firstMatch("*** Failers"), 3312);
+  assertNull(res[1050].firstMatch("a-"), 3313);
+  assertNull(res[1050].firstMatch("-a"), 3314);
+  assertNull(res[1050].firstMatch("-a-"), 3315);
+  assertToStringEquals("y", res[1051].firstMatch("xy"), 3316);
+  assertToStringEquals("y", res[1052].firstMatch("yz"), 3317);
+  assertToStringEquals("y", res[1053].firstMatch("xyz"), 3318);
+  assertToStringEquals("a", res[1054].firstMatch("a"), 3319);
+  assertToStringEquals("-", res[1055].firstMatch("-"), 3320);
+  assertToStringEquals("*", res[1055].firstMatch("*** Failers"), 3321);
+  assertToStringEquals("-", res[1055].firstMatch("-"), 3322);
+  assertNull(res[1055].firstMatch("a"), 3323);
+  assertToStringEquals("a b", res[1056].firstMatch("a b"), 3324);
+  assertToStringEquals("a-b", res[1057].firstMatch("a-b"), 3325);
+  assertNull(res[1057].firstMatch("*** Failers"), 3326);
+  assertToStringEquals("a-b", res[1057].firstMatch("a-b"), 3327);
+  assertNull(res[1057].firstMatch("a b"), 3328);
+  assertToStringEquals("1", res[1058].firstMatch("1"), 3329);
+  assertToStringEquals("-", res[1059].firstMatch("-"), 3330);
+  assertToStringEquals("*", res[1059].firstMatch("*** Failers"), 3331);
+  assertToStringEquals("-", res[1059].firstMatch("-"), 3332);
+  assertNull(res[1059].firstMatch("1"), 3333);
+  assertToStringEquals("a", res[1060].firstMatch("a"), 3334);
+  assertToStringEquals("-", res[1061].firstMatch("-"), 3335);
+  assertToStringEquals("*", res[1061].firstMatch("*** Failers"), 3336);
+  assertToStringEquals("-", res[1061].firstMatch("-"), 3337);
+  assertNull(res[1061].firstMatch("a"), 3338);
+  assertToStringEquals("a b", res[1062].firstMatch("a b"), 3339);
+  assertToStringEquals("a-b", res[1063].firstMatch("a-b"), 3340);
+  assertNull(res[1063].firstMatch("*** Failers"), 3341);
+  assertToStringEquals("a-b", res[1063].firstMatch("a-b"), 3342);
+  assertNull(res[1063].firstMatch("a b"), 3343);
+  assertToStringEquals("1", res[1064].firstMatch("1"), 3344);
+  assertToStringEquals("-", res[1065].firstMatch("-"), 3345);
+  assertToStringEquals("*", res[1065].firstMatch("*** Failers"), 3346);
+  assertToStringEquals("-", res[1065].firstMatch("-"), 3347);
+  assertNull(res[1065].firstMatch("1"), 3348);
+  assertToStringEquals("ab", res[1066].firstMatch("abc"), 3349);
+  assertToStringEquals("ab", res[1066].firstMatch("abcd"), 3350);
+  assertToStringEquals("ef,", res[1067].firstMatch("def"), 3351);
+  assertToStringEquals("a(b", res[1069].firstMatch("a(b"), 3352);
+  assertNull(res[1069].firstMatch("ab"), 3353);
+  assertNull(res[1069].firstMatch("a((b"), 3354);
+  assertNull(res[1070].firstMatch("a\x08"), 3355);
+  assertToStringEquals("a,a,a", res[1071].firstMatch("abc"), 3356);
+  assertToStringEquals("abc,a,c", res[1072].firstMatch("abc"), 3357);
+  assertToStringEquals("abc", res[1073].firstMatch("aabbabc"), 3358);
+  assertToStringEquals("abc", res[1074].firstMatch("aabbabc"), 3359);
+  assertToStringEquals("abc", res[1075].firstMatch("abcabc"), 3360);
+  assertToStringEquals("ab,b", res[1076].firstMatch("ab"), 3361);
+  assertToStringEquals("ab,b", res[1077].firstMatch("ab"), 3362);
+  assertToStringEquals("ab,b", res[1078].firstMatch("ab"), 3363);
+  assertToStringEquals("ab,b", res[1079].firstMatch("ab"), 3364);
+  assertToStringEquals("a,a", res[1080].firstMatch("ab"), 3365);
+  assertToStringEquals("a,a", res[1081].firstMatch("ab"), 3366);
+  assertToStringEquals("cde", res[1082].firstMatch("cde"), 3367);
+  assertNull(res[1083].firstMatch("*** Failers"), 3368);
+  assertNull(res[1083].firstMatch("b"), 3369);
+  assertToStringEquals("abbbcd,c", res[1085].firstMatch("abbbcd"), 3370);
+  assertToStringEquals("abcd,a", res[1086].firstMatch("abcd"), 3371);
+  assertToStringEquals("e", res[1087].firstMatch("e"), 3372);
+  assertToStringEquals("ef,e", res[1088].firstMatch("ef"), 3373);
+  assertToStringEquals("abcdefg", res[1089].firstMatch("abcdefg"), 3374);
+  assertToStringEquals("ab", res[1090].firstMatch("xabyabbbz"), 3375);
+  assertToStringEquals("a", res[1090].firstMatch("xayabbbz"), 3376);
+  assertToStringEquals("cde,cd", res[1091].firstMatch("abcde"), 3377);
+  assertToStringEquals("hij", res[1092].firstMatch("hij"), 3378);
+  assertToStringEquals("ef,", res[1094].firstMatch("abcdef"), 3379);
+  assertToStringEquals("bcd,b", res[1095].firstMatch("abcd"), 3380);
+  assertToStringEquals("abc,a", res[1096].firstMatch("abc"), 3381);
+  assertToStringEquals("abc,bc", res[1097].firstMatch("abc"), 3382);
+  assertToStringEquals("abcd,bc,d", res[1098].firstMatch("abcd"), 3383);
+  assertToStringEquals("abcd,bc,d", res[1099].firstMatch("abcd"), 3384);
+  assertToStringEquals("abcd,b,cd", res[1100].firstMatch("abcd"), 3385);
+  assertToStringEquals("adcdcde", res[1101].firstMatch("adcdcde"), 3386);
+  assertNull(res[1102].firstMatch("*** Failers"), 3387);
+  assertNull(res[1102].firstMatch("abcde"), 3388);
+  assertNull(res[1102].firstMatch("adcdcde"), 3389);
+  assertToStringEquals("abc,ab", res[1103].firstMatch("abc"), 3390);
+  assertToStringEquals("abcd,abc,a,b,d", res[1104].firstMatch("abcd"), 3391);
+  assertToStringEquals("alpha", res[1105].firstMatch("alpha"), 3392);
+  assertToStringEquals("bh,", res[1106].firstMatch("abh"), 3393);
+  assertToStringEquals("effgz,effgz,", res[1107].firstMatch("effgz"), 3394);
+  assertToStringEquals("ij,ij,j", res[1107].firstMatch("ij"), 3395);
+  assertToStringEquals("effgz,effgz,", res[1107].firstMatch("reffgz"), 3396);
+  assertNull(res[1107].firstMatch("*** Failers"), 3397);
+  assertNull(res[1107].firstMatch("effg"), 3398);
+  assertNull(res[1107].firstMatch("bcdd"), 3399);
+  assertToStringEquals("a,a,a,a,a,a,a,a,a,a,a", res[1108].firstMatch("a"), 3400);
+  assertToStringEquals("a,a,a,a,a,a,a,a,a,a", res[1109].firstMatch("a"), 3401);
+  assertNull(res[1110].firstMatch("*** Failers"), 3402);
+  assertNull(res[1110].firstMatch("aa"), 3403);
+  assertNull(res[1110].firstMatch("uh-uh"), 3404);
+  assertToStringEquals("multiple words", res[1111].firstMatch("multiple words, yeah"), 3405);
+  assertToStringEquals("abcde,ab,de", res[1112].firstMatch("abcde"), 3406);
+  assertToStringEquals("(a, b),a,b", res[1113].firstMatch("(a, b)"), 3407);
+  assertToStringEquals("abcd", res[1115].firstMatch("abcd"), 3408);
+  assertToStringEquals("abcd,bc", res[1116].firstMatch("abcd"), 3409);
+  assertToStringEquals("ac", res[1117].firstMatch("ac"), 3410);
+  assertToStringEquals("ABC", res[1118].firstMatch("ABC"), 3411);
+  assertToStringEquals("ABC", res[1118].firstMatch("XABCY"), 3412);
+  assertToStringEquals("ABC", res[1118].firstMatch("ABABC"), 3413);
+  assertNull(res[1118].firstMatch("*** Failers"), 3414);
+  assertNull(res[1118].firstMatch("aaxabxbaxbbx"), 3415);
+  assertNull(res[1118].firstMatch("XBC"), 3416);
+  assertNull(res[1118].firstMatch("AXC"), 3417);
+  assertNull(res[1118].firstMatch("ABX"), 3418);
+  assertToStringEquals("ABC", res[1119].firstMatch("ABC"), 3419);
+  assertToStringEquals("ABC", res[1120].firstMatch("ABC"), 3420);
+  assertToStringEquals("ABBC", res[1120].firstMatch("ABBC"), 3421);
+  assertToStringEquals("ABBBBC", res[1121].firstMatch("ABBBBC"), 3422);
+  assertToStringEquals("ABBBBC", res[1122].firstMatch("ABBBBC"), 3423);
+  assertToStringEquals("ABBC", res[1123].firstMatch("ABBC"), 3424);
+  assertNull(res[1124].firstMatch("*** Failers"), 3425);
+  assertNull(res[1124].firstMatch("ABC"), 3426);
+  assertNull(res[1124].firstMatch("ABQ"), 3427);
+  assertToStringEquals("ABBBBC", res[1126].firstMatch("ABBBBC"), 3428);
+  assertToStringEquals("ABBBBC", res[1127].firstMatch("ABBBBC"), 3429);
+  assertToStringEquals("ABBBBC", res[1128].firstMatch("ABBBBC"), 3430);
+  assertToStringEquals("ABBBBC", res[1129].firstMatch("ABBBBC"), 3431);
+  assertNull(res[1130].firstMatch("*** Failers"), 3432);
+  assertNull(res[1130].firstMatch("ABQ"), 3433);
+  assertNull(res[1130].firstMatch("ABBBBC"), 3434);
+  assertToStringEquals("ABBC", res[1131].firstMatch("ABBC"), 3435);
+  assertToStringEquals("ABC", res[1131].firstMatch("ABC"), 3436);
+  assertToStringEquals("ABC", res[1132].firstMatch("ABC"), 3437);
+  assertToStringEquals("ABC", res[1134].firstMatch("ABC"), 3438);
+  assertToStringEquals("ABC", res[1135].firstMatch("ABC"), 3439);
+  assertToStringEquals("ABC", res[1136].firstMatch("ABC"), 3440);
+  assertNull(res[1136].firstMatch("*** Failers"), 3441);
+  assertNull(res[1136].firstMatch("ABBBBC"), 3442);
+  assertNull(res[1136].firstMatch("ABCC"), 3443);
+  assertToStringEquals("ABC", res[1137].firstMatch("ABCC"), 3444);
+  assertToStringEquals("ABC", res[1139].firstMatch("AABC"), 3445);
+  assertToStringEquals("", res[1140].firstMatch("ABC"), 3446);
+  assertToStringEquals("", res[1141].firstMatch("ABC"), 3447);
+  assertToStringEquals("ABC", res[1142].firstMatch("ABC"), 3448);
+  assertToStringEquals("AXC", res[1142].firstMatch("AXC"), 3449);
+  assertToStringEquals("AXYZC", res[1143].firstMatch("AXYZC"), 3450);
+  assertNull(res[1144].firstMatch("*** Failers"), 3451);
+  assertToStringEquals("AABC", res[1144].firstMatch("AABC"), 3452);
+  assertNull(res[1144].firstMatch("AXYZD"), 3453);
+  assertToStringEquals("ABD", res[1145].firstMatch("ABD"), 3454);
+  assertToStringEquals("ACE", res[1146].firstMatch("ACE"), 3455);
+  assertNull(res[1146].firstMatch("*** Failers"), 3456);
+  assertNull(res[1146].firstMatch("ABC"), 3457);
+  assertNull(res[1146].firstMatch("ABD"), 3458);
+  assertToStringEquals("AC", res[1147].firstMatch("AAC"), 3459);
+  assertToStringEquals("A-", res[1148].firstMatch("A-"), 3460);
+  assertToStringEquals("A-", res[1149].firstMatch("A-"), 3461);
+  assertToStringEquals("A]", res[1150].firstMatch("A]"), 3462);
+  assertNull(res[1151].firstMatch("A]B"), 3463);
+  assertToStringEquals("AED", res[1152].firstMatch("AED"), 3464);
+  assertToStringEquals("ADC", res[1153].firstMatch("ADC"), 3465);
+  assertNull(res[1153].firstMatch("*** Failers"), 3466);
+  assertNull(res[1153].firstMatch("ABD"), 3467);
+  assertNull(res[1153].firstMatch("A-C"), 3468);
+  assertNull(res[1154].firstMatch("ADC"), 3469);
+  assertToStringEquals("AB", res[1155].firstMatch("ABC"), 3470);
+  assertToStringEquals("AB", res[1155].firstMatch("ABCD"), 3471);
+  assertToStringEquals("EF,", res[1156].firstMatch("DEF"), 3472);
+  assertNull(res[1157].firstMatch("*** Failers"), 3473);
+  assertNull(res[1157].firstMatch("A]C"), 3474);
+  assertNull(res[1157].firstMatch("B"), 3475);
+  assertToStringEquals("A(B", res[1158].firstMatch("A(B"), 3476);
+  assertNull(res[1158].firstMatch("AB"), 3477);
+  assertNull(res[1158].firstMatch("A((B"), 3478);
+  assertNull(res[1159].firstMatch("AB"), 3479);
+  assertToStringEquals("A,A,A", res[1160].firstMatch("ABC"), 3480);
+  assertToStringEquals("ABC,A,C", res[1161].firstMatch("ABC"), 3481);
+  assertToStringEquals("ABC", res[1162].firstMatch("AABBABC"), 3482);
+  assertToStringEquals("ABC", res[1163].firstMatch("AABBABC"), 3483);
+  assertToStringEquals("ABC", res[1164].firstMatch("ABCABC"), 3484);
+  assertToStringEquals("ABC", res[1165].firstMatch("ABCABC"), 3485);
+  assertToStringEquals("ABC", res[1166].firstMatch("ABCABC"), 3486);
+  assertToStringEquals("AB,B", res[1167].firstMatch("AB"), 3487);
+  assertToStringEquals("AB,B", res[1168].firstMatch("AB"), 3488);
+  assertToStringEquals("AB,B", res[1169].firstMatch("AB"), 3489);
+  assertToStringEquals("AB,B", res[1170].firstMatch("AB"), 3490);
+  assertToStringEquals("A,A", res[1171].firstMatch("AB"), 3491);
+  assertToStringEquals("A,A", res[1172].firstMatch("AB"), 3492);
+  assertToStringEquals(",", res[1173].firstMatch("AB"), 3493);
+  assertToStringEquals("CDE", res[1174].firstMatch("CDE"), 3494);
+  assertToStringEquals("ABBBCD,C", res[1177].firstMatch("ABBBCD"), 3495);
+  assertToStringEquals("ABCD,A", res[1178].firstMatch("ABCD"), 3496);
+  assertToStringEquals("E", res[1179].firstMatch("E"), 3497);
+  assertToStringEquals("EF,E", res[1180].firstMatch("EF"), 3498);
+  assertToStringEquals("ABCDEFG", res[1181].firstMatch("ABCDEFG"), 3499);
+  assertToStringEquals("AB", res[1182].firstMatch("XABYABBBZ"), 3500);
+  assertToStringEquals("A", res[1182].firstMatch("XAYABBBZ"), 3501);
+  assertToStringEquals("CDE,CD", res[1183].firstMatch("ABCDE"), 3502);
+  assertToStringEquals("HIJ", res[1184].firstMatch("HIJ"), 3503);
+  assertNull(res[1185].firstMatch("ABCDE"), 3504);
+  assertToStringEquals("EF,", res[1186].firstMatch("ABCDEF"), 3505);
+  assertToStringEquals("BCD,B", res[1187].firstMatch("ABCD"), 3506);
+  assertToStringEquals("ABC,A", res[1188].firstMatch("ABC"), 3507);
+  assertToStringEquals("ABC,BC", res[1189].firstMatch("ABC"), 3508);
+  assertToStringEquals("ABCD,BC,D", res[1190].firstMatch("ABCD"), 3509);
+  assertToStringEquals("ABCD,BC,D", res[1191].firstMatch("ABCD"), 3510);
+  assertToStringEquals("ABCD,B,CD", res[1192].firstMatch("ABCD"), 3511);
+  assertToStringEquals("ADCDCDE", res[1193].firstMatch("ADCDCDE"), 3512);
+  assertToStringEquals("ABC,AB", res[1195].firstMatch("ABC"), 3513);
+  assertToStringEquals("ABCD,ABC,A,B,D", res[1196].firstMatch("ABCD"), 3514);
+  assertToStringEquals("ALPHA", res[1197].firstMatch("ALPHA"), 3515);
+  assertToStringEquals("BH,", res[1198].firstMatch("ABH"), 3516);
+  assertToStringEquals("EFFGZ,EFFGZ,", res[1199].firstMatch("EFFGZ"), 3517);
+  assertToStringEquals("IJ,IJ,J", res[1199].firstMatch("IJ"), 3518);
+  assertToStringEquals("EFFGZ,EFFGZ,", res[1199].firstMatch("REFFGZ"), 3519);
+  assertNull(res[1199].firstMatch("*** Failers"), 3520);
+  assertNull(res[1199].firstMatch("ADCDCDE"), 3521);
+  assertNull(res[1199].firstMatch("EFFG"), 3522);
+  assertNull(res[1199].firstMatch("BCDD"), 3523);
+  assertToStringEquals("A,A,A,A,A,A,A,A,A,A,A", res[1200].firstMatch("A"), 3524);
+  assertToStringEquals("A,A,A,A,A,A,A,A,A,A", res[1201].firstMatch("A"), 3525);
+  assertToStringEquals("A,A", res[1202].firstMatch("A"), 3526);
+  assertToStringEquals("C,C", res[1203].firstMatch("C"), 3527);
+  assertNull(res[1204].firstMatch("*** Failers"), 3528);
+  assertNull(res[1204].firstMatch("AA"), 3529);
+  assertNull(res[1204].firstMatch("UH-UH"), 3530);
+  assertToStringEquals("MULTIPLE WORDS", res[1205].firstMatch("MULTIPLE WORDS, YEAH"), 3531);
+  assertToStringEquals("ABCDE,AB,DE", res[1206].firstMatch("ABCDE"), 3532);
+  assertToStringEquals("(A, B),A,B", res[1207].firstMatch("(A, B)"), 3533);
+  assertToStringEquals("ABCD", res[1209].firstMatch("ABCD"), 3534);
+  assertToStringEquals("ABCD,BC", res[1210].firstMatch("ABCD"), 3535);
+  assertToStringEquals("AC", res[1211].firstMatch("AC"), 3536);
+  assertToStringEquals("ad", res[1212].firstMatch("abad"), 3537);
+  assertToStringEquals("ad", res[1213].firstMatch("abad"), 3538);
+  assertToStringEquals("ad", res[1214].firstMatch("abad"), 3539);
+  assertToStringEquals("ace,e", res[1215].firstMatch("ace"), 3540);
+  assertToStringEquals("ace,e", res[1216].firstMatch("ace"), 3541);
+  assertToStringEquals("ace,e", res[1217].firstMatch("ace"), 3542);
+  assertToStringEquals("acd,d", res[1217].firstMatch("acdbcdbe"), 3543);
+  assertToStringEquals("acdbcdbe,e", res[1218].firstMatch("acdbcdbe"), 3544);
+  assertToStringEquals("acdb,b", res[1219].firstMatch("acdbcdbe"), 3545);
+  assertToStringEquals("acdbcdb,b", res[1220].firstMatch("acdbcdbe"), 3546);
+  assertToStringEquals("acdbcd,d", res[1221].firstMatch("acdbcdbe"), 3547);
+  assertToStringEquals("foobar,bar,,bar", res[1222].firstMatch("foobar"), 3548);
+  assertToStringEquals("acdbcdbe,e", res[1223].firstMatch("acdbcdbe"), 3549);
+  assertToStringEquals("acdbcdbe,e", res[1224].firstMatch("acdbcdbe"), 3550);
+  assertToStringEquals("acdbcdbe,e", res[1225].firstMatch("acdbcdbe"), 3551);
+  assertToStringEquals("acdbcdb,b", res[1226].firstMatch("acdbcdbe"), 3552);
+  assertToStringEquals("acdbcdbe,e", res[1227].firstMatch("acdbcdbe"), 3553);
+  assertToStringEquals("acdbcdb,b", res[1228].firstMatch("acdbcdbe"), 3554);
+  assertToStringEquals("ace,c,e", res[1229].firstMatch("ace"), 3555);
+  assertToStringEquals("AB,A", res[1230].firstMatch("AB"), 3556);
+  assertToStringEquals(".,.,", res[1231].firstMatch("."), 3557);
+  assertToStringEquals("<&", res[1232].firstMatch("<&OUT"), 3558);
+  assertToStringEquals("foobar,,,,b,a,r", res[1233].firstMatch("foobar"), 3559);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("ab"), 3560);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("*** Failers"), 3561);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("cb"), 3562);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("b"), 3563);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("ab"), 3564);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("b"), 3565);
+  assertToStringEquals(",,,,,,", res[1233].firstMatch("b"), 3566);
+  assertToStringEquals("aba", res[1234].firstMatch("aba"), 3567);
+  assertToStringEquals("a", res[1235].firstMatch("aba"), 3568);
+  assertToStringEquals(",", res[1236].firstMatch("abc"), 3569);
+  assertToStringEquals("aax,a", res[1237].firstMatch("aax"), 3570);
+  assertToStringEquals("aax,a,a", res[1238].firstMatch("aax"), 3571);
+  assertToStringEquals("aax,a,a", res[1239].firstMatch("aax"), 3572);
+  assertToStringEquals("ab,", res[1240].firstMatch("cab"), 3573);
+  assertToStringEquals("ab,", res[1241].firstMatch("cab"), 3574);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3575);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3576);
+  assertNull(res[1241].firstMatch("Ab"), 3577);
+  assertNull(res[1241].firstMatch("Ab"), 3578);
+  assertNull(res[1241].firstMatch("*** Failers"), 3579);
+  assertNull(res[1241].firstMatch("cb"), 3580);
+  assertNull(res[1241].firstMatch("aB"), 3581);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3582);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3583);
+  assertNull(res[1241].firstMatch("Ab"), 3584);
+  assertNull(res[1241].firstMatch("Ab"), 3585);
+  assertNull(res[1241].firstMatch("*** Failers"), 3586);
+  assertNull(res[1241].firstMatch("aB"), 3587);
+  assertNull(res[1241].firstMatch("aB"), 3588);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3589);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3590);
+  assertNull(res[1241].firstMatch("aB"), 3591);
+  assertNull(res[1241].firstMatch("aB"), 3592);
+  assertNull(res[1241].firstMatch("*** Failers"), 3593);
+  assertNull(res[1241].firstMatch("aB"), 3594);
+  assertNull(res[1241].firstMatch("Ab"), 3595);
+  assertNull(res[1241].firstMatch("aB"), 3596);
+  assertNull(res[1241].firstMatch("aB"), 3597);
+  assertNull(res[1241].firstMatch("*** Failers"), 3598);
+  assertNull(res[1241].firstMatch("Ab"), 3599);
+  assertNull(res[1241].firstMatch("AB"), 3600);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3601);
+  assertToStringEquals("ab,", res[1241].firstMatch("ab"), 3602);
+  assertNull(res[1241].firstMatch("aB"), 3603);
+  assertNull(res[1241].firstMatch("aB"), 3604);
+  assertNull(res[1241].firstMatch("*** Failers"), 3605);
+  assertNull(res[1241].firstMatch("AB"), 3606);
+  assertNull(res[1241].firstMatch("Ab"), 3607);
+  assertNull(res[1241].firstMatch("aB"), 3608);
+  assertNull(res[1241].firstMatch("aB"), 3609);
+  assertNull(res[1241].firstMatch("*** Failers"), 3610);
+  assertNull(res[1241].firstMatch("Ab"), 3611);
+  assertNull(res[1241].firstMatch("AB"), 3612);
+  assertNull(res[1241].firstMatch("*** Failers"), 3613);
+  assertNull(res[1241].firstMatch("AB"), 3614);
+  assertNull(res[1241].firstMatch("a\nB"), 3615);
+  assertNull(res[1241].firstMatch("a\nB"), 3616);
+  assertToStringEquals("cabbbb", res[1242].firstMatch("cabbbb"), 3617);
+  assertToStringEquals("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", res[1243].firstMatch("caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), 3618);
+  assertToStringEquals("foobar1234baz", res[1244].firstMatch("foobar1234baz"), 3619);
+  assertToStringEquals("x~~,~~", res[1245].firstMatch("x~~"), 3620);
+  assertToStringEquals("aaac", res[1246].firstMatch("aaac"), 3621);
+  assertToStringEquals("aaac", res[1247].firstMatch("aaac"), 3622);
+  assertNull(res[1247].firstMatch("*** Failers"), 3623);
+  assertNull(res[1247].firstMatch("B\nB"), 3624);
+  assertNull(res[1247].firstMatch("dbcb"), 3625);
+  assertNull(res[1247].firstMatch("dbaacb"), 3626);
+  assertNull(res[1247].firstMatch("dbaacb"), 3627);
+  assertNull(res[1247].firstMatch("cdaccb"), 3628);
+  assertNull(res[1248].firstMatch("*** Failers"), 3629);
+  assertNull(res[1248].firstMatch("dbcb"), 3630);
+  assertNull(res[1248].firstMatch("a--"), 3631);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3632);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3633);
+  assertNull(res[1248].firstMatch("a\nb\n"), 3634);
+  assertNull(res[1248].firstMatch("a\nb\n"), 3635);
+  assertNull(res[1248].firstMatch("a\nb\n"), 3636);
+  assertNull(res[1248].firstMatch("a\nb\n"), 3637);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3638);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3639);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3640);
+  assertNull(res[1248].firstMatch("a\nb\nc\n"), 3641);
+  assertNull(res[1250].firstMatch("*** Failers"), 3642);
+  assertNull(res[1250].firstMatch("a\nb\nc\n"), 3643);
+  assertNull(res[1250].firstMatch("a\nb\nc\n"), 3644);
+  assertNull(res[1250].firstMatch("a\nb\nc\n"), 3645);
+  assertNull(res[1250].firstMatch("a"), 3646);
+  assertNull(res[1250].firstMatch("*** Failers"), 3647);
+  assertNull(res[1250].firstMatch("a"), 3648);
+  assertNull(res[1250].firstMatch("a"), 3649);
+  assertNull(res[1250].firstMatch("a"), 3650);
+  assertToStringEquals("one:,one:", res[1251].firstMatch("one:"), 3651);
+  assertNull(res[1251].firstMatch("a"), 3652);
+  assertToStringEquals("abcd,,abcd", res[1252].firstMatch("abcd"), 3653);
+  assertToStringEquals("xy:z:::abcd,xy:z:::,abcd", res[1252].firstMatch("xy:z:::abcd"), 3654);
+  assertToStringEquals("aexyc,c", res[1253].firstMatch("aexycd"), 3655);
+  assertToStringEquals("aab,aa", res[1254].firstMatch("caab"), 3656);
+  assertToStringEquals("abcd,,abcd", res[1255].firstMatch("abcd"), 3657);
+  assertToStringEquals("xy:z:::abcd,xy:z:::,abcd", res[1255].firstMatch("xy:z:::abcd"), 3658);
+  assertToStringEquals("Failers,,Failers", res[1255].firstMatch("*** Failers"), 3659);
+  assertNull(res[1255].firstMatch("abcd:"), 3660);
+  assertNull(res[1255].firstMatch("abcd:"), 3661);
+  assertToStringEquals("aexyc,c", res[1256].firstMatch("aexycd"), 3662);
+  assertNull(res[1257].firstMatch("aaab"), 3663);
+  assertToStringEquals(":[,:[", res[1258].firstMatch("a:[b]:"), 3664);
+  assertToStringEquals("=[,=[", res[1259].firstMatch("a=[b]="), 3665);
+  assertToStringEquals(".[,.[", res[1260].firstMatch("a.[b]."), 3666);
+  assertNull(res[1260].firstMatch("aaab"), 3667);
+  assertNull(res[1260].firstMatch("aaab"), 3668);
+  assertNull(res[1260].firstMatch("((abc(ade)ufh()()x"), 3669);
+  assertNull(res[1261].firstMatch("*** Failers"), 3670);
+  assertNull(res[1261].firstMatch("aaab"), 3671);
+  assertNull(res[1261].firstMatch("a\nb\n"), 3672);
+  assertNull(res[1262].firstMatch("a\nb\n"), 3673);
+  assertNull(res[1264].firstMatch("a\nb"), 3674);
+  assertNull(res[1265].firstMatch("a\nb"), 3675);
+  assertNull(res[1265].firstMatch("*** Failers"), 3676);
+  assertNull(res[1265].firstMatch("alphabetabcd"), 3677);
+  assertNull(res[1265].firstMatch("endingwxyz"), 3678);
+  assertNull(res[1265].firstMatch("*** Failers"), 3679);
+  assertNull(res[1265].firstMatch("a rather long string that doesn't end with one of them"), 3680);
+  assertNull(res[1265].firstMatch("word cat dog elephant mussel cow horse canary baboon snake shark otherword"), 3681);
+  assertNull(res[1265].firstMatch("word cat dog elephant mussel cow horse canary baboon snake shark"), 3682);
+  assertNull(res[1265].firstMatch("word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope"), 3683);
+  assertNull(res[1265].firstMatch("999foo"), 3684);
+  assertNull(res[1265].firstMatch("123999foo "), 3685);
+  assertNull(res[1265].firstMatch("*** Failers"), 3686);
+  assertNull(res[1265].firstMatch("123abcfoo"), 3687);
+  assertNull(res[1265].firstMatch("999foo"), 3688);
+  assertNull(res[1265].firstMatch("123999foo "), 3689);
+  assertNull(res[1265].firstMatch("*** Failers"), 3690);
+  assertNull(res[1265].firstMatch("123abcfoo"), 3691);
+  assertNull(res[1265].firstMatch("123abcfoo"), 3692);
+  assertNull(res[1265].firstMatch("123456foo "), 3693);
+  assertNull(res[1265].firstMatch("*** Failers"), 3694);
+  assertNull(res[1265].firstMatch("123999foo  "), 3695);
+  assertNull(res[1265].firstMatch("123abcfoo   "), 3696);
+  assertNull(res[1265].firstMatch("123456foo "), 3697);
+  assertNull(res[1265].firstMatch("*** Failers"), 3698);
+  assertNull(res[1265].firstMatch("123999foo  "), 3699);
+  assertToStringEquals("ZA,A,", res[1266].firstMatch("ZABCDEFG"), 3700);
+  assertToStringEquals("ZA,A,", res[1267].firstMatch("ZABCDEFG"), 3701);
+  assertToStringEquals("ZA,A,,", res[1268].firstMatch("ZABCDEFG"), 3702);
+  assertToStringEquals("ZA,A,,", res[1268].firstMatch("ZABCDEFG"), 3703);
+  assertToStringEquals("ZA,A,,", res[1268].firstMatch("ZABCDEFG"), 3704);
+  assertToStringEquals("a", res[1269].firstMatch("abbab"), 3705);
+  assertToStringEquals("a", res[1270].firstMatch("abcde"), 3711);
+  assertToStringEquals("-", res[1270].firstMatch("-things"), 3712);
+  assertToStringEquals("0", res[1270].firstMatch("0digit"), 3713);
+  assertNull(res[1270].firstMatch("*** Failers"), 3714);
+  assertNull(res[1270].firstMatch("bcdef    "), 3715);
+  assertNull(res[1271].firstMatch("> \x09\n\x0c\x0d\x0b<"), 3716);
+  assertNull(res[1271].firstMatch(" "), 3717);
+  assertNull(res[1272].firstMatch("> \x09\n\x0c\x0d\x0b<"), 3718);
+  assertNull(res[1272].firstMatch(" "), 3719);
+  assertToStringEquals(" \x09\n\x0c\x0d\x0b", res[1273].firstMatch("> \x09\n\x0c\x0d\x0b<"), 3720);
+  assertToStringEquals(" ", res[1273].firstMatch(" "), 3721);
+  assertToStringEquals(" \x09\n\x0c\x0d\x0b", res[1274].firstMatch("> \x09\n\x0c\x0d\x0b<"), 3722);
+  assertToStringEquals(" ", res[1274].firstMatch(" "), 3723);
+  assertNull(res[1275].firstMatch("ab"), 3724);
+  assertNull(res[1278].firstMatch("abcabcabc"), 3725);
+  assertNull(res[1278].firstMatch("abc(*+|abc "), 3726);
+  assertNull(res[1279].firstMatch("abc abcabc"), 3727);
+  assertNull(res[1279].firstMatch("*** Failers"), 3728);
+  assertNull(res[1279].firstMatch("abcabcabc  "), 3729);
+  assertNull(res[1280].firstMatch("abc#not comment\n    literal     "), 3730);
+  assertNull(res[1281].firstMatch("abc#not comment\n    literal     "), 3731);
+  assertNull(res[1282].firstMatch("abc#not comment\n    literal     "), 3732);
+  assertNull(res[1283].firstMatch("abc#not comment\n    literal     "), 3733);
+  assertNull(res[1284].firstMatch("abc\\\$xyz"), 3734);
+  assertNull(res[1285].firstMatch("abc\\\$xyz"), 3735);
+  assertNull(res[1286].firstMatch("abc"), 3736);
+  assertNull(res[1286].firstMatch("*** Failers"), 3737);
+  assertNull(res[1286].firstMatch("xyzabc  "), 3738);
+  assertNull(res[1287].firstMatch("abc1abc2xyzabc3"), 3739);
+  assertToStringEquals("abc1", res[1288].firstMatch("abc1abc2xyzabc3 "), 3740);
+  assertNull(res[1288].firstMatch("*** Failers "), 3742);
+  assertNull(res[1288].firstMatch("Xa b c d Y "), 3743);
+  assertToStringEquals("abcY", res[1288].firstMatch("XabcY"), 3744);
+  assertNull(res[1288].firstMatch("AxyzB "), 3745);
+  assertNull(res[1288].firstMatch("XabCY"), 3746);
+  assertNull(res[1288].firstMatch("*** Failers"), 3747);
+  assertToStringEquals("abcY", res[1288].firstMatch("XabcY  "), 3748);
+  assertNull(res[1288].firstMatch("abCE"), 3749);
+  assertNull(res[1288].firstMatch("DE"), 3750);
+  assertNull(res[1288].firstMatch("*** Failers"), 3751);
+  assertToStringEquals("abcE", res[1288].firstMatch("abcE"), 3752);
+  assertNull(res[1288].firstMatch("abCe  "), 3753);
+  assertNull(res[1288].firstMatch("dE"), 3754);
+  assertNull(res[1288].firstMatch("De    "), 3755);
+  assertNull(res[1289].firstMatch("z"), 3756);
+  assertNull(res[1289].firstMatch("a"), 3757);
+  assertNull(res[1289].firstMatch("-"), 3758);
+  assertNull(res[1289].firstMatch("d"), 3759);
+  assertNull(res[1289].firstMatch("] "), 3760);
+  assertNull(res[1289].firstMatch("*** Failers"), 3761);
+  assertNull(res[1289].firstMatch("b     "), 3762);
+  assertToStringEquals("z", res[1290].firstMatch("z"), 3763);
+  assertToStringEquals("C", res[1290].firstMatch("C "), 3764);
+  assertToStringEquals("M", res[1291].firstMatch("M "), 3765);
+  assertNull(res[1292].firstMatch(""), 3766);
+  assertNull(res[1292].firstMatch("REGular"), 3767);
+  assertNull(res[1292].firstMatch("regulaer"), 3768);
+  assertNull(res[1292].firstMatch("Regex  "), 3769);
+  assertNull(res[1292].firstMatch("regul\ufffdr "), 3770);
+  assertNull(res[1292].firstMatch("\ufffd\ufffd\ufffd\ufffd\ufffd"), 3771);
+  assertNull(res[1292].firstMatch("\ufffd\ufffd\ufffd\ufffd\ufffd"), 3772);
+  assertNull(res[1292].firstMatch("\ufffd\ufffd\ufffd\ufffd\ufffd"), 3773);
+  assertNull(res[1292].firstMatch("\ufffd\ufffd\ufffd\ufffd\ufffd"), 3774);
+  assertNull(res[1292].firstMatch("\x84XAZXB"), 3775);
+  assertNull(res[1292].firstMatch("123a"), 3776);
+  assertNull(res[1292].firstMatch("ac"), 3777);
+  assertToStringEquals("b,", res[1292].firstMatch("bbbbc"), 3778);
+  assertToStringEquals("ab,a", res[1292].firstMatch("abc"), 3779);
+  assertNull(res[1292].firstMatch("*** Failers"), 3780);
+  assertToStringEquals("b,", res[1292].firstMatch("bca"), 3781);
+  assertNull(res[1292].firstMatch(""), 3782);
+  assertToStringEquals("ab,a", res[1292].firstMatch("abc"), 3783);
+  assertNull(res[1292].firstMatch("*** Failers"), 3784);
+  assertToStringEquals("b,", res[1292].firstMatch("bca"), 3785);
+  assertToStringEquals("ab,a", res[1292].firstMatch("abc"), 3786);
+  assertNull(res[1292].firstMatch("*** Failers"), 3787);
+  assertNull(res[1292].firstMatch("def  "), 3788);
+  assertNull(res[1292].firstMatch(""), 3789);
+  assertToStringEquals("ab,a", res[1292].firstMatch("abc"), 3790);
+  assertNull(res[1292].firstMatch("*** Failers"), 3791);
+  assertNull(res[1292].firstMatch("def  "), 3792);
+  assertNull(res[1292].firstMatch(""), 3793);
+  assertToStringEquals("line\nbreak", res[1293].firstMatch("this is a line\nbreak"), 3794);
+  assertToStringEquals("line\nbreak", res[1293].firstMatch("line one\nthis is a line\nbreak in the second line "), 3795);
+  assertToStringEquals("line\nbreak", res[1294].firstMatch("this is a line\nbreak"), 3796);
+  assertNull(res[1294].firstMatch("** Failers "), 3797);
+  assertToStringEquals("line\nbreak", res[1294].firstMatch("line one\nthis is a line\nbreak in the second line "), 3798);
+  assertToStringEquals("line\nbreak", res[1295].firstMatch("this is a line\nbreak"), 3799);
+  assertNull(res[1295].firstMatch("** Failers "), 3800);
+  assertToStringEquals("line\nbreak", res[1295].firstMatch("line one\nthis is a line\nbreak in the second line "), 3801);
+  assertNull(res[1296].firstMatch("123P"), 3802);
+  assertNull(res[1296].firstMatch("a4PR"), 3803);
+  assertNull(res[1297].firstMatch("123P"), 3804);
+  assertNull(res[1297].firstMatch("4PR"), 3805);
+  assertToStringEquals("", res[1298].firstMatch("a\nb\nc\n"), 3806);
+  assertToStringEquals("", res[1298].firstMatch(" "), 3807);
+  assertToStringEquals("", res[1298].firstMatch("A\nC\nC\n "), 3808);
+  assertToStringEquals("", res[1298].firstMatch("AB"), 3809);
+  assertToStringEquals("", res[1298].firstMatch("aB  "), 3810);
+  assertToStringEquals("", res[1298].firstMatch("AB"), 3811);
+  assertToStringEquals("", res[1298].firstMatch("aB  "), 3812);
+  assertToStringEquals("", res[1298].firstMatch("AB"), 3813);
+  assertToStringEquals("", res[1298].firstMatch("aB  "), 3814);
+  assertToStringEquals("", res[1298].firstMatch("AB"), 3815);
+  assertToStringEquals("", res[1298].firstMatch("aB  "), 3816);
+  assertToStringEquals("Content-Type:xxxxxyyy ", res[1299].firstMatch("Content-Type:xxxxxyyy "), 3817);
+  assertToStringEquals("Content-Type:xxxxxyyyz", res[1300].firstMatch("Content-Type:xxxxxyyyz"), 3818);
+  assertToStringEquals("Content-Type:xxxyyy ", res[1301].firstMatch("Content-Type:xxxyyy "), 3819);
+  assertToStringEquals("Content-Type:xxxyyyz", res[1302].firstMatch("Content-Type:xxxyyyz"), 3820);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\nabc"), 3821);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\nabc<lf>"), 3822);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0d\nabc<lf>"), 3823);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0dabc<cr>"), 3824);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0d\nabc<crlf>"), 3825);
+  assertNull(res[1303].firstMatch("** Failers "), 3826);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\nabc<cr>"), 3827);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0d\nabc<cr>"), 3828);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\nabc<crlf>"), 3829);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0dabc<crlf>"), 3830);
+  assertToStringEquals("abc", res[1303].firstMatch("xyz\x0dabc<lf>"), 3831);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc"), 3832);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\n "), 3833);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\npqr "), 3834);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d<cr> "), 3835);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0dpqr<cr> "), 3836);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d\n<crlf> "), 3837);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d\npqr<crlf> "), 3838);
+  assertNull(res[1304].firstMatch("** Failers"), 3839);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d "), 3840);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0dpqr "), 3841);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d\n "), 3842);
+  assertToStringEquals("abc", res[1304].firstMatch("xyzabc\x0d\npqr "), 3843);
+  assertToStringEquals("abc", res[1305].firstMatch("xyz\x0dabcdef"), 3844);
+  assertToStringEquals("abc", res[1305].firstMatch("xyz\nabcdef<lf>"), 3845);
+  assertNull(res[1305].firstMatch("** Failers  "), 3846);
+  assertToStringEquals("abc", res[1305].firstMatch("xyz\nabcdef"), 3847);
+  assertNull(res[1305].firstMatch("   "), 3848);
+  assertToStringEquals("abc", res[1306].firstMatch("xyz\nabcdef"), 3849);
+  assertToStringEquals("abc", res[1306].firstMatch("xyz\x0dabcdef<cr>"), 3850);
+  assertNull(res[1306].firstMatch("** Failers  "), 3851);
+  assertToStringEquals("abc", res[1306].firstMatch("xyz\x0dabcdef"), 3852);
+  assertNull(res[1306].firstMatch("   "), 3853);
+  assertToStringEquals("abc", res[1307].firstMatch("xyz\x0d\nabcdef"), 3854);
+  assertToStringEquals("abc", res[1307].firstMatch("xyz\x0dabcdef<cr>"), 3855);
+  assertNull(res[1307].firstMatch("** Failers  "), 3856);
+  assertToStringEquals("abc", res[1307].firstMatch("xyz\x0dabcdef"), 3857);
+  assertToStringEquals("abc", res[1308].firstMatch("abc\ndef"), 3858);
+  assertToStringEquals("abc", res[1308].firstMatch("abc\x0ddef"), 3859);
+  assertToStringEquals("abc", res[1308].firstMatch("abc\x0d\ndef"), 3860);
+  assertToStringEquals("<cr>abc", res[1308].firstMatch("<cr>abc\ndef"), 3861);
+  assertToStringEquals("<cr>abc", res[1308].firstMatch("<cr>abc\x0ddef"), 3862);
+  assertToStringEquals("<cr>abc", res[1308].firstMatch("<cr>abc\x0d\ndef"), 3863);
+  assertToStringEquals("<crlf>abc", res[1308].firstMatch("<crlf>abc\ndef"), 3864);
+  assertToStringEquals("<crlf>abc", res[1308].firstMatch("<crlf>abc\x0ddef"), 3865);
+  assertToStringEquals("<crlf>abc", res[1308].firstMatch("<crlf>abc\x0d\ndef"), 3866);
+  assertNull(res[1309].firstMatch("abc\ndef"), 3867);
+  assertNull(res[1309].firstMatch("abc\x0ddef"), 3868);
+  assertNull(res[1309].firstMatch("abc\x0d\ndef"), 3869);
+  assertToStringEquals("abc=xyz\\,", res[1310].firstMatch("abc=xyz\\\npqr"), 3870);
+  assertToStringEquals("aaaa,a,", res[1311].firstMatch("aaaa"), 3871);
+  assertToStringEquals("aaaa", res[1312].firstMatch("aaaa"), 3872);
+  assertToStringEquals("aaaa,a,", res[1313].firstMatch("aaaa"), 3873);
+  assertToStringEquals("aaaa", res[1314].firstMatch("aaaa"), 3874);
+  assertNull(res[1317].firstMatch("a\x0db"), 3875);
+  assertNull(res[1317].firstMatch("a\nb<cr> "), 3876);
+  assertNull(res[1317].firstMatch("** Failers"), 3877);
+  assertNull(res[1317].firstMatch("a\nb"), 3878);
+  assertNull(res[1317].firstMatch("a\nb<any>"), 3879);
+  assertNull(res[1317].firstMatch("a\x0db<cr>   "), 3880);
+  assertNull(res[1317].firstMatch("a\x0db<any>   "), 3881);
+  assertToStringEquals("abc1", res[1318].firstMatch("abc1 \nabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\nabc6 \x85abc7 JUNK"), 3882);
+  assertToStringEquals("abc1", res[1319].firstMatch("abc1\n abc2\x0b abc3\x0c abc4\x0d abc5\x0d\n abc6\x85 abc9"), 3883);
+  assertNull(res[1320].firstMatch("a\nb"), 3884);
+  assertNull(res[1320].firstMatch("a\x0db"), 3885);
+  assertNull(res[1320].firstMatch("a\x0d\nb"), 3886);
+  assertNull(res[1320].firstMatch("a\x0bb"), 3887);
+  assertNull(res[1320].firstMatch("a\x0cb"), 3888);
+  assertNull(res[1320].firstMatch("a\x85b   "), 3889);
+  assertNull(res[1320].firstMatch("** Failers"), 3890);
+  assertNull(res[1320].firstMatch("a\n\x0db    "), 3891);
+  assertToStringEquals("ab", res[1321].firstMatch("ab"), 3892);
+  assertNull(res[1321].firstMatch("a\nb"), 3893);
+  assertNull(res[1321].firstMatch("a\x0db"), 3894);
+  assertNull(res[1321].firstMatch("a\x0d\nb"), 3895);
+  assertNull(res[1321].firstMatch("a\x0bb"), 3896);
+  assertNull(res[1321].firstMatch("a\x0cb"), 3897);
+  assertNull(res[1321].firstMatch("a\x85b   "), 3898);
+  assertNull(res[1321].firstMatch("a\n\x0db    "), 3899);
+  assertNull(res[1321].firstMatch("a\n\x0d\x85\x0cb "), 3900);
+  assertNull(res[1322].firstMatch("a\nb"), 3901);
+  assertNull(res[1322].firstMatch("a\x0db"), 3902);
+  assertNull(res[1322].firstMatch("a\x0d\nb"), 3903);
+  assertNull(res[1322].firstMatch("a\x0bb"), 3904);
+  assertNull(res[1322].firstMatch("a\x0cb"), 3905);
+  assertNull(res[1322].firstMatch("a\x85b   "), 3906);
+  assertNull(res[1322].firstMatch("a\n\x0db    "), 3907);
+  assertNull(res[1322].firstMatch("a\n\x0d\x85\x0cb "), 3908);
+  assertNull(res[1322].firstMatch("** Failers"), 3909);
+  assertNull(res[1322].firstMatch("ab  "), 3910);
+  assertNull(res[1323].firstMatch("a\nb"), 3911);
+  assertNull(res[1323].firstMatch("a\n\x0db"), 3912);
+  assertNull(res[1323].firstMatch("a\n\x0d\x85b"), 3913);
+  assertNull(res[1323].firstMatch("a\x0d\n\x0d\nb "), 3914);
+  assertNull(res[1323].firstMatch("a\x0d\n\x0d\n\x0d\nb "), 3915);
+  assertNull(res[1323].firstMatch("a\n\x0d\n\x0db"), 3916);
+  assertNull(res[1323].firstMatch("a\n\n\x0d\nb "), 3917);
+  assertNull(res[1323].firstMatch("** Failers"), 3918);
+  assertNull(res[1323].firstMatch("a\n\n\n\x0db"), 3919);
+  assertNull(res[1323].firstMatch("a\x0d"), 3920);
+  assertToStringEquals("aRb", res[1324].firstMatch("aRb"), 3921);
+  assertNull(res[1324].firstMatch("** Failers"), 3922);
+  assertNull(res[1324].firstMatch("a\nb  "), 3923);
+  assertToStringEquals("afoo", res[1325].firstMatch("afoo"), 3924);
+  assertNull(res[1325].firstMatch("** Failers "), 3925);
+  assertNull(res[1325].firstMatch("\x0d\nfoo "), 3926);
+  assertNull(res[1325].firstMatch("\nfoo "), 3927);
+  assertToStringEquals("afoo", res[1326].firstMatch("afoo"), 3928);
+  assertNull(res[1326].firstMatch("\nfoo "), 3929);
+  assertNull(res[1326].firstMatch("** Failers "), 3930);
+  assertNull(res[1326].firstMatch("\x0d\nfoo "), 3931);
+  assertToStringEquals("afoo", res[1327].firstMatch("afoo"), 3932);
+  assertNull(res[1327].firstMatch("** Failers "), 3933);
+  assertNull(res[1327].firstMatch("\nfoo "), 3934);
+  assertNull(res[1327].firstMatch("\x0d\nfoo "), 3935);
+  assertToStringEquals("afoo", res[1328].firstMatch("afoo"), 3936);
+  assertNull(res[1328].firstMatch("\x0d\nfoo "), 3937);
+  assertNull(res[1328].firstMatch("\nfoo "), 3938);
+  assertToStringEquals("", res[1329].firstMatch("abc\x0d\x0dxyz"), 3939);
+  assertToStringEquals("", res[1329].firstMatch("abc\n\x0dxyz  "), 3940);
+  assertNull(res[1329].firstMatch("** Failers "), 3941);
+  assertToStringEquals("", res[1329].firstMatch("abc\x0d\nxyz"), 3942);
+  assertToStringEquals("X", res[1330].firstMatch("XABC"), 3943);
+  assertNull(res[1330].firstMatch("** Failers "), 3944);
+  assertToStringEquals("X", res[1330].firstMatch("XABCB"), 3945);
+  assertNull(res[1330].firstMatch("abc\x0d\n\x0d\n"), 3946);
+  assertNull(res[1330].firstMatch("abc\x0d\n\x0d\n"), 3947);
+  assertNull(res[1330].firstMatch("abc\x0d\n\x0d\n"), 3948);
+  assertThrows(() => new RegExp(r"(?|(abc)|(xyz))"), 3949);
+  assertThrows(() => new RegExp(r"(x)(?|(abc)|(xyz))(x)"), 3950);
+  assertNull(res[1330].firstMatch("xabcx"), 3951);
+  assertNull(res[1330].firstMatch("xxyzx "), 3952);
+  assertThrows(() => new RegExp(r"(x)(?|(abc)(pqr)|(xyz))(x)"), 3953);
+  assertNull(res[1330].firstMatch("xabcpqrx"), 3954);
+  assertNull(res[1330].firstMatch("xxyzx "), 3955);
+  assertNull(res[1330].firstMatch("abcabc"), 3956);
+  assertNull(res[1330].firstMatch("xyzabc "), 3957);
+  assertNull(res[1330].firstMatch("** Failers "), 3958);
+  assertNull(res[1330].firstMatch("xyzxyz "), 3959);
+  assertNull(res[1331].firstMatch("X X\n"), 3960);
+  assertNull(res[1331].firstMatch("X\x09X\x0b"), 3961);
+  assertNull(res[1331].firstMatch("** Failers"), 3962);
+  assertNull(res[1331].firstMatch("\xa0 X\n   "), 3963);
+  assertNull(res[1332].firstMatch("\x09 \xa0X\n\x0b\x0c\x0d\n"), 3964);
+  assertNull(res[1332].firstMatch("\x09 \xa0\n\x0b\x0c\x0d\n"), 3965);
+  assertNull(res[1332].firstMatch("\x09 \xa0\n\x0b\x0c"), 3966);
+  assertNull(res[1332].firstMatch("** Failers "), 3967);
+  assertNull(res[1332].firstMatch("\x09 \xa0\n\x0b"), 3968);
+  assertNull(res[1332].firstMatch(" "), 3969);
+  assertNull(res[1333].firstMatch("XY  ABCDE"), 3970);
+  assertNull(res[1333].firstMatch("XY  PQR ST "), 3971);
+  assertNull(res[1334].firstMatch("XY  AB    PQRS"), 3972);
+  assertNull(res[1335].firstMatch(">XNNNYZ"), 3973);
+  assertNull(res[1335].firstMatch(">  X NYQZ"), 3974);
+  assertNull(res[1335].firstMatch("** Failers"), 3975);
+  assertNull(res[1335].firstMatch(">XYZ   "), 3976);
+  assertNull(res[1335].firstMatch(">  X NY Z"), 3977);
+  assertNull(res[1336].firstMatch(">XY\nZ\nA\x0bNN\x0c"), 3978);
+  assertNull(res[1336].firstMatch(">\n\x0dX\nY\n\x0bZZZ\nAAA\x0bNNN\x0c"), 3979);
+  assertNull(res[1337].firstMatch("\x0d\nA"), 3980);
+  assertToStringEquals("\nA", res[1338].firstMatch("\x0d\nA "), 3981);
+  assertToStringEquals("\nA", res[1339].firstMatch("\x0d\nA "), 3982);
+  assertToStringEquals("\nA,\n", res[1340].firstMatch("\x0d\nA "), 3983);
+  assertNull(res[1341].firstMatch("a\x0db"), 3984);
+  assertNull(res[1341].firstMatch("a\nb"), 3985);
+  assertNull(res[1341].firstMatch("a\x0d\nb"), 3986);
+  assertNull(res[1341].firstMatch("** Failers"), 3987);
+  assertNull(res[1341].firstMatch("a\x85b"), 3988);
+  assertNull(res[1341].firstMatch("a\x0bb     "), 3989);
+  assertNull(res[1342].firstMatch("a\x0db"), 3990);
+  assertNull(res[1342].firstMatch("a\nb"), 3991);
+  assertNull(res[1342].firstMatch("a\x0d\nb"), 3992);
+  assertNull(res[1342].firstMatch("a\x85b"), 3993);
+  assertNull(res[1342].firstMatch("a\x0bb     "), 3994);
+  assertNull(res[1342].firstMatch("** Failers "), 3995);
+  assertNull(res[1342].firstMatch("a\x85b<bsr_anycrlf>"), 3996);
+  assertNull(res[1342].firstMatch("a\x0bb<bsr_anycrlf>"), 3997);
+  assertNull(res[1343].firstMatch("a\x0db"), 3998);
+  assertNull(res[1343].firstMatch("a\nb"), 3999);
+  assertNull(res[1343].firstMatch("a\x0d\nb"), 4000);
+  assertNull(res[1343].firstMatch("** Failers"), 4001);
+  assertNull(res[1343].firstMatch("a\x85b"), 4002);
+  assertNull(res[1343].firstMatch("a\x0bb     "), 4003);
+  assertNull(res[1344].firstMatch("a\x0db"), 4004);
+  assertNull(res[1344].firstMatch("a\nb"), 4005);
+  assertNull(res[1344].firstMatch("a\x0d\nb"), 4006);
+  assertNull(res[1344].firstMatch("a\x85b"), 4007);
+  assertNull(res[1344].firstMatch("a\x0bb     "), 4008);
+  assertNull(res[1344].firstMatch("** Failers "), 4009);
+  assertNull(res[1344].firstMatch("a\x85b<bsr_anycrlf>"), 4010);
+  assertNull(res[1344].firstMatch("a\x0bb<bsr_anycrlf>"), 4011);
+  assertNull(res[1345].firstMatch("a\x0d\n\nb"), 4012);
+  assertNull(res[1345].firstMatch("a\n\x0d\x0db"), 4013);
+  assertNull(res[1345].firstMatch("a\x0d\n\x0d\n\x0d\n\x0d\nb"), 4014);
+  assertNull(res[1345].firstMatch("** Failers"), 4015);
+  assertNull(res[1345].firstMatch("a\x8585b"), 4016);
+  assertNull(res[1345].firstMatch("a\x0b\x00bb     "), 4017);
+  assertNull(res[1346].firstMatch("a\x0d\x0db"), 4018);
+  assertNull(res[1346].firstMatch("a\n\n\nb"), 4019);
+  assertNull(res[1346].firstMatch("a\x0d\n\n\x0d\x0db"), 4020);
+  assertNull(res[1346].firstMatch("a\x8585b"), 4021);
+  assertNull(res[1346].firstMatch("a\x0b\x00bb     "), 4022);
+  assertNull(res[1346].firstMatch("** Failers "), 4023);
+  assertNull(res[1346].firstMatch("a\x0d\x0d\x0d\x0d\x0db "), 4024);
+  assertNull(res[1346].firstMatch("a\x8585b<bsr_anycrlf>"), 4025);
+  assertNull(res[1346].firstMatch("a\x0b\x00bb<bsr_anycrlf>"), 4026);
+  assertToStringEquals("abc", res[1347].firstMatch("abc "), 4027);
+  assertNull(res[1348].firstMatch("** Failers"), 4028);
+  assertNull(res[1348].firstMatch("ab"), 4029);
+  assertNull(res[1349].firstMatch("** Failers"), 4030);
+  assertNull(res[1349].firstMatch("ab "), 4031);
+  assertNull(res[1349].firstMatch("** Failers"), 4032);
+  assertNull(res[1349].firstMatch("ab "), 4033);
+  assertToStringEquals("aXb", res[1350].firstMatch("aXb"), 4034);
+  assertToStringEquals("a\nb", res[1350].firstMatch("a\nb "), 4035);
+  assertNull(res[1350].firstMatch("** Failers"), 4036);
+  assertNull(res[1350].firstMatch("ab  "), 4037);
+  assertToStringEquals("aXb", res[1351].firstMatch("aXb"), 4038);
+  assertToStringEquals("a\nX\nXb", res[1351].firstMatch("a\nX\nXb "), 4039);
+  assertNull(res[1351].firstMatch("** Failers"), 4040);
+  assertNull(res[1351].firstMatch("ab  "), 4041);
+  assertNull(res[1352].firstMatch("ab"), 4042);
+  assertNull(res[1352].firstMatch("ax{100}b  "), 4043);
+  assertNull(res[1352].firstMatch("ax{100}x{100}b  "), 4044);
+  assertNull(res[1352].firstMatch("ax{100}b  "), 4045);
+  assertNull(res[1352].firstMatch("ax{100}x{100}b  "), 4046);
+  assertNull(res[1352].firstMatch("*** Failers "), 4047);
+  assertNull(res[1352].firstMatch("ab"), 4048);
+  assertNull(res[1352].firstMatch(" "), 4049);
+  assertToStringEquals("X", res[1353].firstMatch("Xoanon"), 4050);
+  assertToStringEquals("X", res[1353].firstMatch("+Xoanon"), 4051);
+  assertToStringEquals("X", res[1353].firstMatch("x{300}Xoanon "), 4052);
+  assertNull(res[1353].firstMatch("*** Failers "), 4053);
+  assertNull(res[1353].firstMatch("YXoanon  "), 4054);
+  assertToStringEquals("X", res[1354].firstMatch("YXoanon"), 4055);
+  assertNull(res[1354].firstMatch("*** Failers"), 4056);
+  assertNull(res[1354].firstMatch("Xoanon"), 4057);
+  assertNull(res[1354].firstMatch("+Xoanon    "), 4058);
+  assertNull(res[1354].firstMatch("x{300}Xoanon "), 4059);
+  assertToStringEquals("X", res[1355].firstMatch("X+oanon"), 4060);
+  assertNull(res[1355].firstMatch("ZXx{300}oanon "), 4061);
+  assertToStringEquals("X", res[1355].firstMatch("FAX "), 4062);
+  assertNull(res[1355].firstMatch("*** Failers "), 4063);
+  assertNull(res[1355].firstMatch("Xoanon  "), 4064);
+  assertToStringEquals("X", res[1356].firstMatch("Xoanon  "), 4065);
+  assertNull(res[1356].firstMatch("*** Failers"), 4066);
+  assertNull(res[1356].firstMatch("X+oanon"), 4067);
+  assertToStringEquals("X", res[1356].firstMatch("ZXx{300}oanon "), 4068);
+  assertNull(res[1356].firstMatch("FAX "), 4069);
+  assertToStringEquals("b", res[1357].firstMatch("abcd"), 4070);
+  assertToStringEquals("x", res[1357].firstMatch("ax{100}   "), 4071);
+  assertToStringEquals("b", res[1357].firstMatch("ab99"), 4072);
+  assertToStringEquals("x", res[1357].firstMatch("x{123}x{123}45"), 4073);
+  assertToStringEquals("x", res[1357].firstMatch("x{400}x{401}x{402}6  "), 4074);
+  assertToStringEquals("*", res[1357].firstMatch("*** Failers"), 4075);
+  assertToStringEquals("d", res[1357].firstMatch("d99"), 4076);
+  assertToStringEquals("x", res[1357].firstMatch("x{123}x{122}4   "), 4077);
+  assertToStringEquals("x", res[1357].firstMatch("x{400}x{403}6  "), 4078);
+  assertToStringEquals("x", res[1357].firstMatch("x{400}x{401}x{402}x{402}6  "), 4079);
+  assertNull(res[1358].firstMatch("\ufffd]"), 4080);
+  assertNull(res[1358].firstMatch("\ufffd"), 4081);
+  assertNull(res[1358].firstMatch("\ufffd\ufffd\ufffd"), 4082);
+  assertNull(res[1358].firstMatch("\ufffd\ufffd\ufffd?"), 4083);
+  assertToStringEquals("acb", res[1359].firstMatch("acb"), 4084);
+  assertToStringEquals("ab", res[1359].firstMatch("ab"), 4085);
+  assertNull(res[1359].firstMatch("ax{100}b "), 4086);
+  assertNull(res[1359].firstMatch("*** Failers"), 4087);
+  assertNull(res[1359].firstMatch("a\nb  "), 4088);
+  assertNull(res[1360].firstMatch("ax{4000}xyb "), 4089);
+  assertNull(res[1360].firstMatch("ax{4000}yb "), 4090);
+  assertNull(res[1360].firstMatch("ax{4000}x{100}yb "), 4091);
+  assertNull(res[1360].firstMatch("*** Failers"), 4092);
+  assertNull(res[1360].firstMatch("ax{4000}b "), 4093);
+  assertNull(res[1360].firstMatch("ac\ncb "), 4094);
+  assertToStringEquals("a\xc0,,\xc0", res[1361].firstMatch("a\xc0\x88b"), 4095);
+  assertToStringEquals("ax,,x", res[1362].firstMatch("ax{100}b"), 4096);
+  assertToStringEquals("a\xc0\x88b,\xc0\x88,b", res[1363].firstMatch("a\xc0\x88b"), 4097);
+  assertToStringEquals("ax{100}b,x{100},b", res[1364].firstMatch("ax{100}b"), 4098);
+  assertToStringEquals("a\xc0\x92,\xc0,\x92", res[1365].firstMatch("a\xc0\x92bcd"), 4099);
+  assertToStringEquals("ax{,x,{", res[1366].firstMatch("ax{240}bcd"), 4100);
+  assertToStringEquals("a\xc0\x92,\xc0,\x92", res[1367].firstMatch("a\xc0\x92bcd"), 4101);
+  assertToStringEquals("ax{,x,{", res[1368].firstMatch("ax{240}bcd"), 4102);
+  assertToStringEquals("a\xc0,,\xc0", res[1369].firstMatch("a\xc0\x92bcd"), 4103);
+  assertToStringEquals("ax,,x", res[1370].firstMatch("ax{240}bcd"), 4104);
+  assertNull(res[1371].firstMatch("ax{1234}xyb "), 4105);
+  assertNull(res[1371].firstMatch("ax{1234}x{4321}yb "), 4106);
+  assertNull(res[1371].firstMatch("ax{1234}x{4321}x{3412}b "), 4107);
+  assertNull(res[1371].firstMatch("*** Failers"), 4108);
+  assertNull(res[1371].firstMatch("ax{1234}b "), 4109);
+  assertNull(res[1371].firstMatch("ac\ncb "), 4110);
+  assertToStringEquals("ax{1234}xyb,x{1234}xy", res[1372].firstMatch("ax{1234}xyb "), 4111);
+  assertToStringEquals("ax{1234}x{4321}yb,x{1234}x{4321}y", res[1372].firstMatch("ax{1234}x{4321}yb "), 4112);
+  assertToStringEquals("ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}", res[1372].firstMatch("ax{1234}x{4321}x{3412}b "), 4113);
+  assertToStringEquals("axxxxbcdefghijb,xxxxbcdefghij", res[1372].firstMatch("axxxxbcdefghijb "), 4114);
+  assertToStringEquals("ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}", res[1372].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 4115);
+  assertNull(res[1372].firstMatch("*** Failers"), 4116);
+  assertToStringEquals("ax{1234}b,x{1234}", res[1372].firstMatch("ax{1234}b "), 4117);
+  assertToStringEquals("ax{1234}xyb,x{1234}xy", res[1373].firstMatch("ax{1234}xyb "), 4118);
+  assertToStringEquals("ax{1234}x{4321}yb,x{1234}x{4321}y", res[1373].firstMatch("ax{1234}x{4321}yb "), 4119);
+  assertToStringEquals("ax{1234}x{4321}x{3412}b,x{1234}x{4321}x{3412}", res[1373].firstMatch("ax{1234}x{4321}x{3412}b "), 4120);
+  assertToStringEquals("axxxxb,xxxx", res[1373].firstMatch("axxxxbcdefghijb "), 4121);
+  assertToStringEquals("ax{1234}x{4321}x{3412}x{3421}b,x{1234}x{4321}x{3412}x{3421}", res[1373].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 4122);
+  assertNull(res[1373].firstMatch("*** Failers"), 4123);
+  assertToStringEquals("ax{1234}b,x{1234}", res[1373].firstMatch("ax{1234}b "), 4124);
+  assertNull(res[1374].firstMatch("ax{1234}xyb "), 4125);
+  assertNull(res[1374].firstMatch("ax{1234}x{4321}yb "), 4126);
+  assertNull(res[1374].firstMatch("ax{1234}x{4321}x{3412}b "), 4127);
+  assertToStringEquals("axxxxb,xxxx", res[1374].firstMatch("axxxxbcdefghijb "), 4128);
+  assertNull(res[1374].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 4129);
+  assertToStringEquals("axbxxb,xbxx", res[1374].firstMatch("axbxxbcdefghijb "), 4130);
+  assertToStringEquals("axxxxxb,xxxxx", res[1374].firstMatch("axxxxxbcdefghijb "), 4131);
+  assertNull(res[1374].firstMatch("*** Failers"), 4132);
+  assertNull(res[1374].firstMatch("ax{1234}b "), 4133);
+  assertNull(res[1374].firstMatch("axxxxxxbcdefghijb "), 4134);
+  assertNull(res[1375].firstMatch("ax{1234}xyb "), 4135);
+  assertNull(res[1375].firstMatch("ax{1234}x{4321}yb "), 4136);
+  assertNull(res[1375].firstMatch("ax{1234}x{4321}x{3412}b "), 4137);
+  assertToStringEquals("axxxxb,xxxx", res[1375].firstMatch("axxxxbcdefghijb "), 4138);
+  assertNull(res[1375].firstMatch("ax{1234}x{4321}x{3412}x{3421}b "), 4139);
+  assertToStringEquals("axbxxb,xbxx", res[1375].firstMatch("axbxxbcdefghijb "), 4140);
+  assertToStringEquals("axxxxxb,xxxxx", res[1375].firstMatch("axxxxxbcdefghijb "), 4141);
+  assertNull(res[1375].firstMatch("*** Failers"), 4142);
+  assertNull(res[1375].firstMatch("ax{1234}b "), 4143);
+  assertNull(res[1375].firstMatch("axxxxxxbcdefghijb "), 4144);
+  assertNull(res[1375].firstMatch("*** Failers"), 4145);
+  assertNull(res[1375].firstMatch("x{100}"), 4146);
+  assertNull(res[1375].firstMatch("aXbcd"), 4147);
+  assertNull(res[1375].firstMatch("ax{100}bcd"), 4148);
+  assertNull(res[1375].firstMatch("ax{100000}bcd"), 4149);
+  assertNull(res[1375].firstMatch("x{100}x{100}x{100}b"), 4150);
+  assertNull(res[1375].firstMatch("*** Failers "), 4151);
+  assertNull(res[1375].firstMatch("x{100}x{100}b"), 4152);
+  assertNull(res[1375].firstMatch("x{ab} "), 4153);
+  assertNull(res[1375].firstMatch("\xc2\xab"), 4154);
+  assertNull(res[1375].firstMatch("*** Failers "), 4155);
+  assertNull(res[1375].firstMatch("\x00{ab}"), 4156);
+  assertNull(res[1375].firstMatch("WXYZ"), 4157);
+  assertNull(res[1375].firstMatch("x{256}XYZ "), 4158);
+  assertNull(res[1375].firstMatch("*** Failers"), 4159);
+  assertNull(res[1375].firstMatch("XYZ "), 4160);
+  assertToStringEquals("bcd", res[1376].firstMatch("bcd"), 4161);
+  assertToStringEquals("x{", res[1377].firstMatch("x{100}bc"), 4163);
+  assertToStringEquals("x{100}bcA", res[1378].firstMatch("x{100}bcAa"), 4164);
+  assertToStringEquals("x{", res[1379].firstMatch("x{100}bca"), 4165);
+  assertToStringEquals("bcd", res[1380].firstMatch("bcd"), 4166);
+  assertToStringEquals("x{", res[1381].firstMatch("x{100}bc"), 4168);
+  assertToStringEquals("x{100}bc", res[1382].firstMatch("x{100}bcAa"), 4169);
+  assertToStringEquals("x{", res[1383].firstMatch("x{100}bca"), 4170);
+  assertNull(res[1383].firstMatch("abcd"), 4171);
+  assertNull(res[1383].firstMatch("abcd"), 4172);
+  assertToStringEquals("x{", res[1383].firstMatch("x{100}x{100} "), 4173);
+  assertToStringEquals("x{", res[1383].firstMatch("x{100}x{100} "), 4174);
+  assertToStringEquals("x{", res[1383].firstMatch("x{100}x{100}x{100}x{100} "), 4175);
+  assertNull(res[1383].firstMatch("abce"), 4176);
+  assertToStringEquals("x{", res[1383].firstMatch("x{100}x{100}x{100}x{100} "), 4177);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}x{100} "), 4178);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}x{100} "), 4179);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}x{100} "), 4180);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}XX"), 4181);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}x{100}x{100}x{100}x{100}XX"), 4182);
+  assertNull(res[1383].firstMatch("abcdx{100}x{100}x{100}x{100}x{100}x{100}x{100}XX"), 4183);
+  assertToStringEquals("Xy", res[1383].firstMatch("Xyyyax{100}x{100}bXzzz"), 4184);
+  assertToStringEquals("X", res[1386].firstMatch("1X2"), 4185);
+  assertToStringEquals("x", res[1386].firstMatch("1x{100}2 "), 4186);
+  assertToStringEquals(">X", res[1387].firstMatch("> >X Y"), 4187);
+  assertToStringEquals(">x", res[1387].firstMatch("> >x{100} Y"), 4188);
+  assertToStringEquals("1", res[1388].firstMatch("x{100}3"), 4189);
+  assertToStringEquals(" ", res[1389].firstMatch("x{100} X"), 4190);
+  assertToStringEquals("abcd", res[1390].firstMatch("12abcd34"), 4191);
+  assertToStringEquals("*** Failers", res[1390].firstMatch("*** Failers"), 4192);
+  assertToStringEquals("  ", res[1390].firstMatch("1234  "), 4193);
+  assertToStringEquals("abc", res[1391].firstMatch("12abcd34"), 4194);
+  assertToStringEquals("ab", res[1391].firstMatch("12ab34"), 4195);
+  assertToStringEquals("***", res[1391].firstMatch("*** Failers  "), 4196);
+  assertNull(res[1391].firstMatch("1234"), 4197);
+  assertToStringEquals("  ", res[1391].firstMatch("12a34  "), 4198);
+  assertToStringEquals("ab", res[1392].firstMatch("12abcd34"), 4199);
+  assertToStringEquals("ab", res[1392].firstMatch("12ab34"), 4200);
+  assertToStringEquals("**", res[1392].firstMatch("*** Failers  "), 4201);
+  assertNull(res[1392].firstMatch("1234"), 4202);
+  assertToStringEquals("  ", res[1392].firstMatch("12a34  "), 4203);
+  assertToStringEquals("12", res[1393].firstMatch("12abcd34"), 4204);
+  assertNull(res[1393].firstMatch("*** Failers"), 4205);
+  assertToStringEquals("12", res[1394].firstMatch("12abcd34"), 4206);
+  assertToStringEquals("123", res[1394].firstMatch("1234abcd"), 4207);
+  assertNull(res[1394].firstMatch("*** Failers  "), 4208);
+  assertNull(res[1394].firstMatch("1.4 "), 4209);
+  assertToStringEquals("12", res[1395].firstMatch("12abcd34"), 4210);
+  assertToStringEquals("12", res[1395].firstMatch("1234abcd"), 4211);
+  assertNull(res[1395].firstMatch("*** Failers  "), 4212);
+  assertNull(res[1395].firstMatch("1.4 "), 4213);
+  assertToStringEquals("12abcd34", res[1396].firstMatch("12abcd34"), 4214);
+  assertToStringEquals("***", res[1396].firstMatch("*** Failers"), 4215);
+  assertNull(res[1396].firstMatch("     "), 4216);
+  assertToStringEquals("12a", res[1397].firstMatch("12abcd34"), 4217);
+  assertToStringEquals("123", res[1397].firstMatch("1234abcd"), 4218);
+  assertToStringEquals("***", res[1397].firstMatch("*** Failers"), 4219);
+  assertNull(res[1397].firstMatch("       "), 4220);
+  assertToStringEquals("12", res[1398].firstMatch("12abcd34"), 4221);
+  assertToStringEquals("12", res[1398].firstMatch("1234abcd"), 4222);
+  assertToStringEquals("**", res[1398].firstMatch("*** Failers"), 4223);
+  assertNull(res[1398].firstMatch("       "), 4224);
+  assertToStringEquals(">      <", res[1399].firstMatch("12>      <34"), 4225);
+  assertNull(res[1399].firstMatch("*** Failers"), 4226);
+  assertToStringEquals(">  <", res[1400].firstMatch("ab>  <cd"), 4227);
+  assertToStringEquals(">   <", res[1400].firstMatch("ab>   <ce"), 4228);
+  assertNull(res[1400].firstMatch("*** Failers"), 4229);
+  assertNull(res[1400].firstMatch("ab>    <cd "), 4230);
+  assertToStringEquals(">  <", res[1401].firstMatch("ab>  <cd"), 4231);
+  assertToStringEquals(">   <", res[1401].firstMatch("ab>   <ce"), 4232);
+  assertNull(res[1401].firstMatch("*** Failers"), 4233);
+  assertNull(res[1401].firstMatch("ab>    <cd "), 4234);
+  assertToStringEquals("12", res[1402].firstMatch("12      34"), 4235);
+  assertToStringEquals("Failers", res[1402].firstMatch("*** Failers"), 4236);
+  assertNull(res[1402].firstMatch("+++=*! "), 4237);
+  assertToStringEquals("ab", res[1403].firstMatch("ab  cd"), 4238);
+  assertToStringEquals("abc", res[1403].firstMatch("abcd ce"), 4239);
+  assertToStringEquals("Fai", res[1403].firstMatch("*** Failers"), 4240);
+  assertNull(res[1403].firstMatch("a.b.c"), 4241);
+  assertToStringEquals("ab", res[1404].firstMatch("ab  cd"), 4242);
+  assertToStringEquals("ab", res[1404].firstMatch("abcd ce"), 4243);
+  assertToStringEquals("Fa", res[1404].firstMatch("*** Failers"), 4244);
+  assertNull(res[1404].firstMatch("a.b.c"), 4245);
+  assertToStringEquals("====", res[1405].firstMatch("12====34"), 4246);
+  assertToStringEquals("*** ", res[1405].firstMatch("*** Failers"), 4247);
+  assertToStringEquals(" ", res[1405].firstMatch("abcd "), 4248);
+  assertToStringEquals("===", res[1406].firstMatch("ab====cd"), 4249);
+  assertToStringEquals("==", res[1406].firstMatch("ab==cd"), 4250);
+  assertToStringEquals("***", res[1406].firstMatch("*** Failers"), 4251);
+  assertNull(res[1406].firstMatch("a.b.c"), 4252);
+  assertToStringEquals("==", res[1407].firstMatch("ab====cd"), 4253);
+  assertToStringEquals("==", res[1407].firstMatch("ab==cd"), 4254);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4255);
+  assertNull(res[1407].firstMatch("a.b.c"), 4256);
+  assertNull(res[1407].firstMatch("x{100}"), 4257);
+  assertNull(res[1407].firstMatch("Zx{100}"), 4258);
+  assertNull(res[1407].firstMatch("x{100}Z"), 4259);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers "), 4260);
+  assertNull(res[1407].firstMatch("Zx{100}"), 4261);
+  assertNull(res[1407].firstMatch("x{100}"), 4262);
+  assertNull(res[1407].firstMatch("x{100}Z"), 4263);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers "), 4264);
+  assertNull(res[1407].firstMatch("abcx{200}X"), 4265);
+  assertNull(res[1407].firstMatch("abcx{100}X "), 4266);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4267);
+  assertToStringEquals("  ", res[1407].firstMatch("X  "), 4268);
+  assertNull(res[1407].firstMatch("abcx{200}X"), 4269);
+  assertNull(res[1407].firstMatch("abcx{100}X "), 4270);
+  assertNull(res[1407].firstMatch("abQX "), 4271);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4272);
+  assertToStringEquals("  ", res[1407].firstMatch("X  "), 4273);
+  assertNull(res[1407].firstMatch("abcx{100}x{200}x{100}X"), 4274);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4275);
+  assertNull(res[1407].firstMatch("abcx{200}X"), 4276);
+  assertToStringEquals("  ", res[1407].firstMatch("X  "), 4277);
+  assertNull(res[1407].firstMatch("AX"), 4278);
+  assertNull(res[1407].firstMatch("x{150}X"), 4279);
+  assertNull(res[1407].firstMatch("x{500}X "), 4280);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4281);
+  assertNull(res[1407].firstMatch("x{100}X"), 4282);
+  assertToStringEquals("  ", res[1407].firstMatch("x{200}X   "), 4283);
+  assertNull(res[1407].firstMatch("AX"), 4284);
+  assertNull(res[1407].firstMatch("x{150}X"), 4285);
+  assertNull(res[1407].firstMatch("x{500}X "), 4286);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4287);
+  assertNull(res[1407].firstMatch("x{100}X"), 4288);
+  assertToStringEquals("  ", res[1407].firstMatch("x{200}X   "), 4289);
+  assertNull(res[1407].firstMatch("QX "), 4290);
+  assertNull(res[1407].firstMatch("AX"), 4291);
+  assertNull(res[1407].firstMatch("x{500}X "), 4292);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4293);
+  assertNull(res[1407].firstMatch("x{100}X"), 4294);
+  assertNull(res[1407].firstMatch("x{150}X"), 4295);
+  assertToStringEquals("  ", res[1407].firstMatch("x{200}X   "), 4296);
+  assertNull(res[1407].firstMatch("z"), 4297);
+  assertNull(res[1407].firstMatch("Z "), 4298);
+  assertNull(res[1407].firstMatch("x{100}"), 4299);
+  assertToStringEquals("**", res[1407].firstMatch("*** Failers"), 4300);
+  assertNull(res[1407].firstMatch("x{102}"), 4301);
+  assertToStringEquals("  ", res[1407].firstMatch("y    "), 4302);
+  assertToStringEquals("\xff", res[1408].firstMatch(">\xff<"), 4303);
+  assertNull(res[1409].firstMatch(">x{ff}<"), 4304);
+  assertToStringEquals("X", res[1410].firstMatch("XYZ"), 4305);
+  assertToStringEquals("X", res[1411].firstMatch("XYZ"), 4306);
+  assertToStringEquals("x", res[1411].firstMatch("x{123} "), 4307);
+  assertToStringEquals(",", res[1416].firstMatch("catac"), 4308);
+  assertToStringEquals(",", res[1416].firstMatch("ax{256}a "), 4309);
+  assertToStringEquals(",", res[1416].firstMatch("x{85}"), 4310);
+  assertToStringEquals("abc1", res[1417].firstMatch("abc1 \nabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\nabc6 x{0085}abc7 x{2028}abc8 x{2029}abc9 JUNK"), 4311);
+  assertToStringEquals("abc1", res[1418].firstMatch("abc1\n abc2\x0b abc3\x0c abc4\x0d abc5\x0d\n abc6x{0085} abc7x{2028} abc8x{2029} abc9"), 4312);
+  assertNull(res[1419].firstMatch("a\nb"), 4313);
+  assertNull(res[1419].firstMatch("a\x0db"), 4314);
+  assertNull(res[1419].firstMatch("a\x0d\nb"), 4315);
+  assertNull(res[1419].firstMatch("a\x0bb"), 4316);
+  assertNull(res[1419].firstMatch("a\x0cb"), 4317);
+  assertNull(res[1419].firstMatch("ax{85}b   "), 4318);
+  assertNull(res[1419].firstMatch("ax{2028}b "), 4319);
+  assertNull(res[1419].firstMatch("ax{2029}b "), 4320);
+  assertNull(res[1419].firstMatch("** Failers"), 4321);
+  assertNull(res[1419].firstMatch("a\n\x0db    "), 4322);
+  assertToStringEquals("ab", res[1420].firstMatch("ab"), 4323);
+  assertNull(res[1420].firstMatch("a\nb"), 4324);
+  assertNull(res[1420].firstMatch("a\x0db"), 4325);
+  assertNull(res[1420].firstMatch("a\x0d\nb"), 4326);
+  assertNull(res[1420].firstMatch("a\x0bb"), 4327);
+  assertNull(res[1420].firstMatch("a\x0cx{2028}x{2029}b"), 4328);
+  assertNull(res[1420].firstMatch("ax{85}b   "), 4329);
+  assertNull(res[1420].firstMatch("a\n\x0db    "), 4330);
+  assertNull(res[1420].firstMatch("a\n\x0dx{85}\x0cb "), 4331);
+  assertNull(res[1421].firstMatch("a\nb"), 4332);
+  assertNull(res[1421].firstMatch("a\x0db"), 4333);
+  assertNull(res[1421].firstMatch("a\x0d\nb"), 4334);
+  assertNull(res[1421].firstMatch("a\x0bb"), 4335);
+  assertNull(res[1421].firstMatch("a\x0cx{2028}x{2029}b"), 4336);
+  assertNull(res[1421].firstMatch("ax{85}b   "), 4337);
+  assertNull(res[1421].firstMatch("a\n\x0db    "), 4338);
+  assertNull(res[1421].firstMatch("a\n\x0dx{85}\x0cb "), 4339);
+  assertNull(res[1421].firstMatch("** Failers"), 4340);
+  assertNull(res[1421].firstMatch("ab  "), 4341);
+  assertNull(res[1422].firstMatch("a\nb"), 4342);
+  assertNull(res[1422].firstMatch("a\n\x0db"), 4343);
+  assertNull(res[1422].firstMatch("a\n\x0dx{85}b"), 4344);
+  assertNull(res[1422].firstMatch("a\x0d\n\x0d\nb "), 4345);
+  assertNull(res[1422].firstMatch("a\x0d\n\x0d\n\x0d\nb "), 4346);
+  assertNull(res[1422].firstMatch("a\n\x0d\n\x0db"), 4347);
+  assertNull(res[1422].firstMatch("a\n\n\x0d\nb "), 4348);
+  assertNull(res[1422].firstMatch("** Failers"), 4349);
+  assertNull(res[1422].firstMatch("a\n\n\n\x0db"), 4350);
+  assertNull(res[1422].firstMatch("a\x0d"), 4351);
+  assertNull(res[1423].firstMatch("\x09 x{a0}X\n\x0b\x0c\x0d\n"), 4352);
+  assertNull(res[1424].firstMatch(" x{a0}X\n\x0b\x0c\x0d\n"), 4353);
+  assertNull(res[1425].firstMatch(">\x09 x{a0}X\n\n\n<"), 4354);
+  assertNull(res[1426].firstMatch(">\x09 x{a0}X\n\n\n<"), 4355);
+  assertNull(res[1427].firstMatch("X X\n"), 4356);
+  assertNull(res[1427].firstMatch("X\x09X\x0b"), 4357);
+  assertNull(res[1427].firstMatch("** Failers"), 4358);
+  assertNull(res[1427].firstMatch("x{a0} X\n   "), 4359);
+  assertNull(res[1428].firstMatch("\x09 x{a0}X\n\x0b\x0c\x0d\n"), 4360);
+  assertNull(res[1428].firstMatch("\x09 x{a0}\n\x0b\x0c\x0d\n"), 4361);
+  assertNull(res[1428].firstMatch("\x09 x{a0}\n\x0b\x0c"), 4362);
+  assertNull(res[1428].firstMatch("** Failers "), 4363);
+  assertNull(res[1428].firstMatch("\x09 x{a0}\n\x0b"), 4364);
+  assertNull(res[1428].firstMatch(" "), 4365);
+  assertNull(res[1429].firstMatch("x{3001}x{3000}x{2030}x{2028}"), 4366);
+  assertNull(res[1429].firstMatch("Xx{180e}Xx{85}"), 4367);
+  assertNull(res[1429].firstMatch("** Failers"), 4368);
+  assertNull(res[1429].firstMatch("x{2009} X\n   "), 4369);
+  assertNull(res[1430].firstMatch("x{1680}x{180e}x{2007}Xx{2028}x{2029}\x0c\x0d\n"), 4370);
+  assertNull(res[1430].firstMatch("\x09x{205f}x{a0}\nx{2029}\x0cx{2028}\n"), 4371);
+  assertNull(res[1430].firstMatch("\x09 x{202f}\n\x0b\x0c"), 4372);
+  assertNull(res[1430].firstMatch("** Failers "), 4373);
+  assertNull(res[1430].firstMatch("\x09x{200a}x{a0}x{2028}\x0b"), 4374);
+  assertNull(res[1430].firstMatch(" "), 4375);
+  assertNull(res[1431].firstMatch("a\x0db"), 4376);
+  assertNull(res[1431].firstMatch("a\nb"), 4377);
+  assertNull(res[1431].firstMatch("a\x0d\nb"), 4378);
+  assertNull(res[1431].firstMatch("** Failers"), 4379);
+  assertNull(res[1431].firstMatch("ax{85}b"), 4380);
+  assertNull(res[1431].firstMatch("a\x0bb     "), 4381);
+  assertNull(res[1432].firstMatch("a\x0db"), 4382);
+  assertNull(res[1432].firstMatch("a\nb"), 4383);
+  assertNull(res[1432].firstMatch("a\x0d\nb"), 4384);
+  assertNull(res[1432].firstMatch("ax{85}b"), 4385);
+  assertNull(res[1432].firstMatch("a\x0bb     "), 4386);
+  assertNull(res[1432].firstMatch("** Failers "), 4387);
+  assertNull(res[1432].firstMatch("ax{85}b<bsr_anycrlf>"), 4388);
+  assertNull(res[1432].firstMatch("a\x0bb<bsr_anycrlf>"), 4389);
+  assertNull(res[1433].firstMatch("a\x0db"), 4390);
+  assertNull(res[1433].firstMatch("a\nb"), 4391);
+  assertNull(res[1433].firstMatch("a\x0d\nb"), 4392);
+  assertNull(res[1433].firstMatch("** Failers"), 4393);
+  assertNull(res[1433].firstMatch("ax{85}b"), 4394);
+  assertNull(res[1433].firstMatch("a\x0bb     "), 4395);
+  assertNull(res[1434].firstMatch("a\x0db"), 4396);
+  assertNull(res[1434].firstMatch("a\nb"), 4397);
+  assertNull(res[1434].firstMatch("a\x0d\nb"), 4398);
+  assertNull(res[1434].firstMatch("ax{85}b"), 4399);
+  assertNull(res[1434].firstMatch("a\x0bb     "), 4400);
+  assertNull(res[1434].firstMatch("** Failers "), 4401);
+  assertNull(res[1434].firstMatch("ax{85}b<bsr_anycrlf>"), 4402);
+  assertNull(res[1434].firstMatch("a\x0bb<bsr_anycrlf>"), 4403);
+  assertToStringEquals("X", res[1435].firstMatch("Ax{1ec5}ABCXYZ"), 4404);
+  assertNull(res[1437].firstMatch("AB"), 4405);
+  assertNull(res[1437].firstMatch("*** Failers"), 4406);
+  assertNull(res[1437].firstMatch("A0"), 4407);
+  assertNull(res[1437].firstMatch("00   "), 4408);
+  assertNull(res[1438].firstMatch("AB"), 4409);
+  assertNull(res[1438].firstMatch("Ax{300}BC "), 4410);
+  assertNull(res[1438].firstMatch("Ax{300}x{301}x{302}BC "), 4411);
+  assertNull(res[1438].firstMatch("*** Failers"), 4412);
+  assertNull(res[1438].firstMatch("x{300}  "), 4413);
+  assertNull(res[1439].firstMatch("ABC"), 4414);
+  assertNull(res[1439].firstMatch("Ax{300}Bx{300}x{301}C "), 4415);
+  assertNull(res[1439].firstMatch("Ax{300}x{301}x{302}BC "), 4416);
+  assertNull(res[1439].firstMatch("*** Failers"), 4417);
+  assertNull(res[1439].firstMatch("x{300}  "), 4418);
+  assertNull(res[1440].firstMatch("abcd"), 4419);
+  assertNull(res[1440].firstMatch("a "), 4420);
+  assertNull(res[1440].firstMatch("*** Failers "), 4421);
+  assertNull(res[1441].firstMatch("1234"), 4422);
+  assertNull(res[1441].firstMatch("= "), 4423);
+  assertNull(res[1441].firstMatch("*** Failers "), 4424);
+  assertNull(res[1441].firstMatch("abcd "), 4425);
+  assertNull(res[1442].firstMatch("abcdAx{300}x{301}x{302}"), 4426);
+  assertNull(res[1442].firstMatch("Ax{300}x{301}x{302}"), 4427);
+  assertNull(res[1442].firstMatch("Ax{300}x{301}x{302}Ax{300}x{301}x{302}"), 4428);
+  assertNull(res[1442].firstMatch("a "), 4429);
+  assertNull(res[1442].firstMatch("*** Failers "), 4430);
+  assertNull(res[1442].firstMatch("x{300}x{301}x{302}"), 4431);
+  assertToStringEquals("abc", res[1443].firstMatch("abc"), 4432);
+  assertToStringEquals("abc", res[1443].firstMatch("Ax{300}abc"), 4433);
+  assertToStringEquals("abc", res[1443].firstMatch("Ax{300}x{301}x{302}Ax{300}Ax{300}Ax{300}abcxyz"), 4434);
+  assertToStringEquals("abc", res[1443].firstMatch("x{300}abc  "), 4435);
+  assertNull(res[1443].firstMatch("*** Failers"), 4436);
+  assertToStringEquals("abc", res[1444].firstMatch("abc"), 4437);
+  assertNull(res[1444].firstMatch("Ax{300}abc"), 4438);
+  assertNull(res[1444].firstMatch("*** Failers"), 4439);
+  assertNull(res[1444].firstMatch("Ax{300}x{301}x{302}Ax{300}Ax{300}Ax{300}abcxyz"), 4440);
+  assertNull(res[1444].firstMatch("x{300}abc  "), 4441);
+  assertToStringEquals("abc", res[1445].firstMatch("abc"), 4442);
+  assertToStringEquals("abc", res[1445].firstMatch("Ax{300}abc"), 4443);
+  assertToStringEquals("abc", res[1445].firstMatch("Ax{300}x{301}x{302}Ax{300}Ax{300}Ax{300}abcxyz"), 4444);
+  assertToStringEquals("abc", res[1445].firstMatch("x{300}abc  "), 4445);
+  assertNull(res[1445].firstMatch("*** Failers"), 4446);
+  assertToStringEquals("abc", res[1446].firstMatch("abc"), 4447);
+  assertNull(res[1446].firstMatch("Ax{300}abc"), 4448);
+  assertNull(res[1446].firstMatch("Ax{300}x{301}x{302}Ax{300}Ax{300}Ax{300}abcxyz"), 4449);
+  assertNull(res[1446].firstMatch("*** Failers"), 4450);
+  assertNull(res[1446].firstMatch("x{300}abc  "), 4451);
+  assertNull(res[1447].firstMatch("A=b"), 4452);
+  assertNull(res[1447].firstMatch("=c "), 4453);
+  assertNull(res[1447].firstMatch("*** Failers"), 4454);
+  assertNull(res[1447].firstMatch("1=2 "), 4455);
+  assertNull(res[1447].firstMatch("AAAA=b  "), 4456);
+  assertNull(res[1448].firstMatch("AAAA=b"), 4457);
+  assertNull(res[1448].firstMatch("=c "), 4458);
+  assertNull(res[1448].firstMatch("*** Failers"), 4459);
+  assertNull(res[1448].firstMatch("1=2  "), 4460);
+  assertNull(res[1449].firstMatch("Ax{300}x{301}x{302}Ax{300}x{301}x{302}X"), 4461);
+  assertNull(res[1449].firstMatch("Ax{300}x{301}x{302}Ax{300}x{301}x{302}Ax{300}x{301}x{302}X "), 4462);
+  assertNull(res[1449].firstMatch("*** Failers"), 4463);
+  assertNull(res[1449].firstMatch("X"), 4464);
+  assertNull(res[1449].firstMatch("Ax{300}x{301}x{302}X"), 4465);
+  assertNull(res[1449].firstMatch("Ax{300}x{301}x{302}Ax{300}x{301}x{302}Ax{300}x{301}x{302}Ax{300}x{301}x{302}X"), 4466);
+  assertNull(res[1450].firstMatch("x{c0}x{30f}x{660}x{66c}x{f01}x{1680}<"), 4467);
+  assertNull(res[1450].firstMatch("\npx{300}9!\$ < "), 4468);
+  assertNull(res[1450].firstMatch("** Failers "), 4469);
+  assertNull(res[1450].firstMatch("apx{300}9!\$ < "), 4470);
+  assertNull(res[1451].firstMatch("X"), 4471);
+  assertNull(res[1451].firstMatch("** Failers "), 4472);
+  assertNull(res[1451].firstMatch(""), 4473);
+  assertNull(res[1452].firstMatch("9"), 4474);
+  assertNull(res[1452].firstMatch("** Failers "), 4475);
+  assertNull(res[1452].firstMatch("x{c0}"), 4476);
+  assertNull(res[1453].firstMatch("X"), 4477);
+  assertNull(res[1453].firstMatch("** Failers "), 4478);
+  assertNull(res[1453].firstMatch("x{30f}"), 4479);
+  assertNull(res[1454].firstMatch("X"), 4480);
+  assertNull(res[1454].firstMatch("** Failers "), 4481);
+  assertNull(res[1454].firstMatch("x{660}"), 4482);
+  assertNull(res[1455].firstMatch("X"), 4483);
+  assertNull(res[1455].firstMatch("** Failers "), 4484);
+  assertNull(res[1455].firstMatch("x{66c}"), 4485);
+  assertNull(res[1456].firstMatch("X"), 4486);
+  assertNull(res[1456].firstMatch("** Failers "), 4487);
+  assertNull(res[1456].firstMatch("x{f01}"), 4488);
+  assertNull(res[1457].firstMatch("X"), 4489);
+  assertNull(res[1457].firstMatch("** Failers "), 4490);
+  assertNull(res[1457].firstMatch("x{1680}"), 4491);
+  assertNull(res[1458].firstMatch("x{017}"), 4492);
+  assertNull(res[1458].firstMatch("x{09f} "), 4493);
+  assertNull(res[1458].firstMatch("** Failers"), 4494);
+  assertNull(res[1458].firstMatch("x{0600} "), 4495);
+  assertNull(res[1459].firstMatch("x{601}"), 4496);
+  assertNull(res[1459].firstMatch("** Failers"), 4497);
+  assertNull(res[1459].firstMatch("x{09f} "), 4498);
+  assertNull(res[1460].firstMatch("** Failers"), 4499);
+  assertNull(res[1460].firstMatch("x{09f} "), 4500);
+  assertNull(res[1461].firstMatch("x{f8ff}"), 4501);
+  assertNull(res[1461].firstMatch("** Failers"), 4502);
+  assertNull(res[1461].firstMatch("x{09f} "), 4503);
+  assertNull(res[1462].firstMatch("?x{dfff}"), 4504);
+  assertNull(res[1462].firstMatch("** Failers"), 4505);
+  assertNull(res[1462].firstMatch("x{09f} "), 4506);
+  assertNull(res[1463].firstMatch("a"), 4507);
+  assertNull(res[1463].firstMatch("** Failers "), 4508);
+  assertNull(res[1463].firstMatch("Z"), 4509);
+  assertNull(res[1463].firstMatch("x{e000}  "), 4510);
+  assertNull(res[1464].firstMatch("x{2b0}"), 4511);
+  assertNull(res[1464].firstMatch("** Failers"), 4512);
+  assertNull(res[1464].firstMatch("a "), 4513);
+  assertNull(res[1465].firstMatch("x{1bb}"), 4514);
+  assertNull(res[1465].firstMatch("** Failers"), 4515);
+  assertNull(res[1465].firstMatch("a "), 4516);
+  assertNull(res[1465].firstMatch("x{2b0}"), 4517);
+  assertNull(res[1466].firstMatch("x{1c5}"), 4518);
+  assertNull(res[1466].firstMatch("** Failers"), 4519);
+  assertNull(res[1466].firstMatch("a "), 4520);
+  assertNull(res[1466].firstMatch("x{2b0}"), 4521);
+  assertNull(res[1467].firstMatch("A"), 4522);
+  assertNull(res[1467].firstMatch("** Failers"), 4523);
+  assertNull(res[1467].firstMatch("x{2b0}"), 4524);
+  assertNull(res[1468].firstMatch("x{903}"), 4525);
+  assertNull(res[1468].firstMatch("** Failers"), 4526);
+  assertNull(res[1468].firstMatch("X"), 4527);
+  assertNull(res[1468].firstMatch("x{300}"), 4528);
+  assertNull(res[1468].firstMatch("   "), 4529);
+  assertNull(res[1469].firstMatch("x{488}"), 4530);
+  assertNull(res[1469].firstMatch("** Failers"), 4531);
+  assertNull(res[1469].firstMatch("X"), 4532);
+  assertNull(res[1469].firstMatch("x{903}"), 4533);
+  assertNull(res[1469].firstMatch("x{300}"), 4534);
+  assertNull(res[1470].firstMatch("x{300}"), 4535);
+  assertNull(res[1470].firstMatch("** Failers"), 4536);
+  assertNull(res[1470].firstMatch("X"), 4537);
+  assertNull(res[1470].firstMatch("x{903}"), 4538);
+  assertNull(res[1470].firstMatch("0123456789x{660}x{661}x{662}x{663}x{664}x{665}x{666}x{667}x{668}x{669}x{66a}"), 4539);
+  assertNull(res[1470].firstMatch("x{6f0}x{6f1}x{6f2}x{6f3}x{6f4}x{6f5}x{6f6}x{6f7}x{6f8}x{6f9}x{6fa}"), 4540);
+  assertNull(res[1470].firstMatch("x{966}x{967}x{968}x{969}x{96a}x{96b}x{96c}x{96d}x{96e}x{96f}x{970}"), 4541);
+  assertNull(res[1470].firstMatch("** Failers"), 4542);
+  assertNull(res[1470].firstMatch("X"), 4543);
+  assertNull(res[1471].firstMatch("x{16ee}"), 4544);
+  assertNull(res[1471].firstMatch("** Failers"), 4545);
+  assertNull(res[1471].firstMatch("X"), 4546);
+  assertNull(res[1471].firstMatch("x{966}"), 4547);
+  assertNull(res[1472].firstMatch("x{b2}"), 4548);
+  assertNull(res[1472].firstMatch("x{b3}"), 4549);
+  assertNull(res[1472].firstMatch("** Failers"), 4550);
+  assertNull(res[1472].firstMatch("X"), 4551);
+  assertNull(res[1472].firstMatch("x{16ee}"), 4552);
+  assertNull(res[1473].firstMatch("_"), 4553);
+  assertNull(res[1473].firstMatch("x{203f}"), 4554);
+  assertNull(res[1473].firstMatch("** Failers"), 4555);
+  assertNull(res[1473].firstMatch("X"), 4556);
+  assertNull(res[1473].firstMatch("-"), 4557);
+  assertNull(res[1473].firstMatch("x{58a}"), 4558);
+  assertNull(res[1474].firstMatch("-"), 4559);
+  assertNull(res[1474].firstMatch("x{58a}"), 4560);
+  assertNull(res[1474].firstMatch("** Failers"), 4561);
+  assertNull(res[1474].firstMatch("X"), 4562);
+  assertNull(res[1474].firstMatch("x{203f}"), 4563);
+  assertNull(res[1475].firstMatch(")"), 4564);
+  assertNull(res[1475].firstMatch("]"), 4565);
+  assertNull(res[1475].firstMatch("}"), 4566);
+  assertNull(res[1475].firstMatch("x{f3b}"), 4567);
+  assertNull(res[1475].firstMatch("** Failers"), 4568);
+  assertNull(res[1475].firstMatch("X"), 4569);
+  assertNull(res[1475].firstMatch("x{203f}"), 4570);
+  assertNull(res[1475].firstMatch("("), 4571);
+  assertNull(res[1475].firstMatch("["), 4572);
+  assertNull(res[1475].firstMatch("{"), 4573);
+  assertNull(res[1475].firstMatch("x{f3c}"), 4574);
+  assertNull(res[1476].firstMatch("x{bb}"), 4575);
+  assertNull(res[1476].firstMatch("x{2019}"), 4576);
+  assertNull(res[1476].firstMatch("** Failers"), 4577);
+  assertNull(res[1476].firstMatch("X"), 4578);
+  assertNull(res[1476].firstMatch("x{203f}"), 4579);
+  assertNull(res[1477].firstMatch("x{ab}"), 4580);
+  assertNull(res[1477].firstMatch("x{2018}"), 4581);
+  assertNull(res[1477].firstMatch("** Failers"), 4582);
+  assertNull(res[1477].firstMatch("X"), 4583);
+  assertNull(res[1477].firstMatch("x{203f}"), 4584);
+  assertNull(res[1478].firstMatch("!"), 4585);
+  assertNull(res[1478].firstMatch("x{37e}"), 4586);
+  assertNull(res[1478].firstMatch("** Failers"), 4587);
+  assertNull(res[1478].firstMatch("X"), 4588);
+  assertNull(res[1478].firstMatch("x{203f}"), 4589);
+  assertNull(res[1479].firstMatch("("), 4590);
+  assertNull(res[1479].firstMatch("["), 4591);
+  assertNull(res[1479].firstMatch("{"), 4592);
+  assertNull(res[1479].firstMatch("x{f3c}"), 4593);
+  assertNull(res[1479].firstMatch("** Failers"), 4594);
+  assertNull(res[1479].firstMatch("X"), 4595);
+  assertNull(res[1479].firstMatch(")"), 4596);
+  assertNull(res[1479].firstMatch("]"), 4597);
+  assertNull(res[1479].firstMatch("}"), 4598);
+  assertNull(res[1479].firstMatch("x{f3b}"), 4599);
+  assertNull(res[1479].firstMatch("\$x{a2}x{a3}x{a4}x{a5}x{a6}"), 4600);
+  assertNull(res[1479].firstMatch("x{9f2}"), 4601);
+  assertNull(res[1479].firstMatch("** Failers"), 4602);
+  assertNull(res[1479].firstMatch("X"), 4603);
+  assertNull(res[1479].firstMatch("x{2c2}"), 4604);
+  assertNull(res[1480].firstMatch("x{2c2}"), 4605);
+  assertNull(res[1480].firstMatch("** Failers"), 4606);
+  assertNull(res[1480].firstMatch("X"), 4607);
+  assertNull(res[1480].firstMatch("x{9f2}"), 4608);
+  assertNull(res[1480].firstMatch("+<|~x{ac}x{2044}"), 4609);
+  assertNull(res[1480].firstMatch("** Failers"), 4610);
+  assertNull(res[1480].firstMatch("X"), 4611);
+  assertNull(res[1480].firstMatch("x{9f2}"), 4612);
+  assertNull(res[1481].firstMatch("x{a6}"), 4613);
+  assertNull(res[1481].firstMatch("x{482} "), 4614);
+  assertNull(res[1481].firstMatch("** Failers"), 4615);
+  assertNull(res[1481].firstMatch("X"), 4616);
+  assertNull(res[1481].firstMatch("x{9f2}"), 4617);
+  assertNull(res[1482].firstMatch("x{2028}"), 4618);
+  assertNull(res[1482].firstMatch("** Failers"), 4619);
+  assertNull(res[1482].firstMatch("X"), 4620);
+  assertNull(res[1482].firstMatch("x{2029}"), 4621);
+  assertNull(res[1483].firstMatch("x{2029}"), 4622);
+  assertNull(res[1483].firstMatch("** Failers"), 4623);
+  assertNull(res[1483].firstMatch("X"), 4624);
+  assertNull(res[1483].firstMatch("x{2028}"), 4625);
+  assertNull(res[1484].firstMatch("\\ \\"), 4626);
+  assertNull(res[1484].firstMatch("x{a0}"), 4627);
+  assertNull(res[1484].firstMatch("x{1680}"), 4628);
+  assertNull(res[1484].firstMatch("x{180e}"), 4629);
+  assertNull(res[1484].firstMatch("x{2000}"), 4630);
+  assertNull(res[1484].firstMatch("x{2001}     "), 4631);
+  assertNull(res[1484].firstMatch("** Failers"), 4632);
+  assertNull(res[1484].firstMatch("x{2028}"), 4633);
+  assertNull(res[1484].firstMatch("x{200d} "), 4634);
+  assertNull(res[1484].firstMatch("  x{660}x{661}x{662}ABC"), 4635);
+  assertNull(res[1484].firstMatch("  x{660}x{661}x{662}ABC"), 4636);
+  assertNull(res[1485].firstMatch("  x{660}x{661}x{662}ABC"), 4637);
+  assertNull(res[1486].firstMatch("  x{660}x{661}x{662}ABC"), 4638);
+  assertNull(res[1487].firstMatch("  x{660}x{661}x{662}ABC"), 4639);
+  assertNull(res[1488].firstMatch("  x{660}x{661}x{662}ABC"), 4640);
+  assertNull(res[1489].firstMatch("  x{660}x{661}x{662}ABC"), 4641);
+  assertNull(res[1490].firstMatch("  x{660}x{661}x{662}ABC"), 4642);
+  assertNull(res[1491].firstMatch("  x{660}x{661}x{662}ABC"), 4643);
+  assertNull(res[1492].firstMatch("  x{660}x{661}x{662}ABC"), 4644);
+  assertNull(res[1493].firstMatch("  x{660}x{661}x{662}ABC"), 4645);
+  assertNull(res[1493].firstMatch("  x{660}x{661}x{662}ABC"), 4646);
+  assertNull(res[1493].firstMatch("  x{660}x{661}x{662}ABC"), 4647);
+  assertNull(res[1493].firstMatch("  ** Failers"), 4648);
+  assertNull(res[1493].firstMatch("  x{660}x{661}x{662}ABC"), 4649);
+  assertNull(res[1494].firstMatch("A"), 4650);
+  assertNull(res[1494].firstMatch("ax{10a0}B "), 4651);
+  assertNull(res[1494].firstMatch("** Failers "), 4652);
+  assertNull(res[1494].firstMatch("a"), 4653);
+  assertNull(res[1494].firstMatch("x{1d00}  "), 4654);
+  assertNull(res[1495].firstMatch("1234"), 4655);
+  assertNull(res[1495].firstMatch("** Failers"), 4656);
+  assertNull(res[1495].firstMatch("ABC "), 4657);
+  assertNull(res[1496].firstMatch("1234"), 4658);
+  assertNull(res[1496].firstMatch("** Failers"), 4659);
+  assertNull(res[1496].firstMatch("ABC "), 4660);
+  assertNull(res[1496].firstMatch("A2XYZ"), 4661);
+  assertNull(res[1496].firstMatch("123A5XYZPQR"), 4662);
+  assertNull(res[1496].firstMatch("ABAx{660}XYZpqr"), 4663);
+  assertNull(res[1496].firstMatch("** Failers"), 4664);
+  assertNull(res[1496].firstMatch("AXYZ"), 4665);
+  assertNull(res[1496].firstMatch("XYZ     "), 4666);
+  assertNull(res[1496].firstMatch("1XYZ"), 4667);
+  assertNull(res[1496].firstMatch("AB=XYZ.. "), 4668);
+  assertNull(res[1496].firstMatch("XYZ "), 4669);
+  assertNull(res[1496].firstMatch("** Failers"), 4670);
+  assertNull(res[1496].firstMatch("WXYZ "), 4671);
+  assertNull(res[1497].firstMatch("1234"), 4672);
+  assertNull(res[1497].firstMatch("1234"), 4673);
+  assertNull(res[1497].firstMatch("12-34"), 4674);
+  assertToStringEquals("{", res[1497].firstMatch("12+x{661}-34  "), 4675);
+  assertNull(res[1497].firstMatch("** Failers"), 4676);
+  assertToStringEquals("d", res[1497].firstMatch("abcd  "), 4677);
+  assertToStringEquals("d", res[1498].firstMatch("abcd"), 4678);
+  assertNull(res[1498].firstMatch("** Failers"), 4679);
+  assertNull(res[1498].firstMatch("1234"), 4680);
+  assertNull(res[1499].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 4681);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[1499].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 4682);
+  assertToStringEquals(" ", res[1499].firstMatch(" "), 4683);
+  assertNull(res[1499].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 4684);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[1499].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 4685);
+  assertNull(res[1500].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 4686);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[1500].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 4687);
+  assertNull(res[1501].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 4688);
+  assertNull(res[1501].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 4689);
+  assertNull(res[1502].firstMatch("11111111111111111111111111111111111111111111111111111111111111111111111"), 4690);
+  assertToStringEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", res[1502].firstMatch("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 4691);
+  assertNull(res[1503].firstMatch("a"), 4692);
+  assertNull(res[1503].firstMatch("A "), 4693);
+  assertNull(res[1504].firstMatch("a"), 4694);
+  assertNull(res[1504].firstMatch("A "), 4695);
+  assertNull(res[1505].firstMatch("A"), 4696);
+  assertNull(res[1505].firstMatch("aZ"), 4697);
+  assertNull(res[1505].firstMatch("** Failers"), 4698);
+  assertNull(res[1505].firstMatch("abc   "), 4699);
+  assertNull(res[1506].firstMatch("A"), 4700);
+  assertNull(res[1506].firstMatch("aZ"), 4701);
+  assertNull(res[1506].firstMatch("** Failers"), 4702);
+  assertNull(res[1506].firstMatch("abc   "), 4703);
+  assertNull(res[1507].firstMatch("a"), 4704);
+  assertNull(res[1507].firstMatch("Az"), 4705);
+  assertNull(res[1507].firstMatch("** Failers"), 4706);
+  assertNull(res[1507].firstMatch("ABC   "), 4707);
+  assertNull(res[1508].firstMatch("a"), 4708);
+  assertNull(res[1508].firstMatch("Az"), 4709);
+  assertNull(res[1508].firstMatch("** Failers"), 4710);
+  assertNull(res[1508].firstMatch("ABC   "), 4711);
+  assertNull(res[1508].firstMatch("x{c0}"), 4712);
+  assertNull(res[1508].firstMatch("x{e0} "), 4713);
+  assertNull(res[1508].firstMatch("x{c0}"), 4714);
+  assertNull(res[1508].firstMatch("x{e0} "), 4715);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb0}"), 4716);
+  assertNull(res[1508].firstMatch("** Failers"), 4717);
+  assertNull(res[1508].firstMatch("ax{391}x{10427}x{ff3a}x{1fb0}   "), 4718);
+  assertNull(res[1508].firstMatch("Ax{3b1}x{10427}x{ff3a}x{1fb0}"), 4719);
+  assertNull(res[1508].firstMatch("Ax{391}x{1044F}x{ff3a}x{1fb0}"), 4720);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff5a}x{1fb0}"), 4721);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb8}"), 4722);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb0}"), 4723);
+  assertNull(res[1508].firstMatch("ax{391}x{10427}x{ff3a}x{1fb0}   "), 4724);
+  assertNull(res[1508].firstMatch("Ax{3b1}x{10427}x{ff3a}x{1fb0}"), 4725);
+  assertNull(res[1508].firstMatch("Ax{391}x{1044F}x{ff3a}x{1fb0}"), 4726);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff5a}x{1fb0}"), 4727);
+  assertNull(res[1508].firstMatch("Ax{391}x{10427}x{ff3a}x{1fb8}"), 4728);
+  assertNull(res[1508].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}"), 4729);
+  assertNull(res[1508].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}X"), 4730);
+  assertNull(res[1508].firstMatch("x{391}x{3b1}x{3b1}x{3b1}x{391}X"), 4731);
+  assertNull(res[1508].firstMatch("x{391}"), 4732);
+  assertNull(res[1508].firstMatch("x{ff3a}"), 4733);
+  assertNull(res[1508].firstMatch("x{3b1}"), 4734);
+  assertNull(res[1508].firstMatch("x{ff5a}   "), 4735);
+  assertNull(res[1508].firstMatch("x{c0}"), 4736);
+  assertNull(res[1508].firstMatch("x{e0} "), 4737);
+  assertNull(res[1508].firstMatch("x{104}"), 4738);
+  assertNull(res[1508].firstMatch("x{105}"), 4739);
+  assertNull(res[1508].firstMatch("x{109}  "), 4740);
+  assertNull(res[1508].firstMatch("** Failers"), 4741);
+  assertNull(res[1508].firstMatch("x{100}"), 4742);
+  assertNull(res[1508].firstMatch("x{10a} "), 4743);
+  assertNull(res[1508].firstMatch("Z"), 4744);
+  assertNull(res[1508].firstMatch("z"), 4745);
+  assertNull(res[1508].firstMatch("x{39c}"), 4746);
+  assertNull(res[1508].firstMatch("x{178}"), 4747);
+  assertNull(res[1508].firstMatch("|"), 4748);
+  assertNull(res[1508].firstMatch("x{80}"), 4749);
+  assertNull(res[1508].firstMatch("x{ff}"), 4750);
+  assertNull(res[1508].firstMatch("x{100}"), 4751);
+  assertNull(res[1508].firstMatch("x{101} "), 4752);
+  assertNull(res[1508].firstMatch("** Failers"), 4753);
+  assertNull(res[1508].firstMatch("x{102}"), 4754);
+  assertNull(res[1508].firstMatch("Y"), 4755);
+  assertNull(res[1508].firstMatch("y           "), 4756);
+  assertNull(res[1509].firstMatch("A"), 4757);
+  assertNull(res[1509].firstMatch("Ax{300}BC "), 4758);
+  assertNull(res[1509].firstMatch("Ax{300}x{301}x{302}BC "), 4759);
+  assertNull(res[1509].firstMatch("*** Failers"), 4760);
+  assertNull(res[1509].firstMatch("x{300}  "), 4761);
+  assertToStringEquals("X", res[1510].firstMatch("X123"), 4762);
+  assertNull(res[1510].firstMatch("*** Failers"), 4763);
+  assertNull(res[1510].firstMatch("AXYZ"), 4764);
+  assertNull(res[1511].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 4765);
+  assertNull(res[1511].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 4766);
+  assertNull(res[1512].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 4767);
+  assertNull(res[1512].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 4768);
+  assertToStringEquals("A,,A", res[1513].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 4769);
+  assertToStringEquals("A,,A", res[1513].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 4770);
+  assertToStringEquals("A,,A", res[1514].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301} "), 4771);
+  assertToStringEquals("A,,A", res[1514].firstMatch("Ax{300}x{301}x{302}BCAx{300}x{301}C "), 4772);
+  assertNull(res[1515].firstMatch("*** Failers"), 4773);
+  assertNull(res[1515].firstMatch("Ax{300}x{301}x{302}"), 4774);
+  assertNull(res[1516].firstMatch("Ax{300}x{301}Bx{300}X"), 4775);
+  assertNull(res[1516].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}"), 4776);
+  assertNull(res[1516].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}X"), 4777);
+  assertNull(res[1516].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}DAx{300}X"), 4778);
+  assertNull(res[1517].firstMatch("Ax{300}x{301}Bx{300}X"), 4779);
+  assertNull(res[1517].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}"), 4780);
+  assertNull(res[1517].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}X"), 4781);
+  assertNull(res[1517].firstMatch("Ax{300}x{301}Bx{300}Cx{300}x{301}DAx{300}X"), 4782);
+  assertNull(res[1518].firstMatch("12X"), 4783);
+  assertNull(res[1518].firstMatch("123X"), 4784);
+  assertNull(res[1518].firstMatch("*** Failers"), 4785);
+  assertNull(res[1518].firstMatch("X"), 4786);
+  assertNull(res[1518].firstMatch("1X"), 4787);
+  assertNull(res[1518].firstMatch("1234X     "), 4788);
+  assertNull(res[1518].firstMatch("x{100}   "), 4789);
+  assertNull(res[1518].firstMatch("x{101} "), 4790);
+  assertNull(res[1518].firstMatch("x{2e81}x{3007}x{2f804}x{31a0}"), 4791);
+  assertNull(res[1518].firstMatch("** Failers"), 4792);
+  assertNull(res[1518].firstMatch("x{2e7f}  "), 4793);
+  assertNull(res[1518].firstMatch("x{3105}"), 4794);
+  assertNull(res[1518].firstMatch("** Failers"), 4795);
+  assertNull(res[1518].firstMatch("x{30ff}  "), 4796);
+  assertNull(res[1519].firstMatch("x{06e9}"), 4797);
+  assertNull(res[1519].firstMatch("x{060b}"), 4798);
+  assertNull(res[1519].firstMatch("** Failers"), 4799);
+  assertNull(res[1519].firstMatch("Xx{06e9}   "), 4800);
+  assertNull(res[1520].firstMatch("x{2f800}"), 4801);
+  assertNull(res[1520].firstMatch("** Failers"), 4802);
+  assertNull(res[1520].firstMatch("x{a014}"), 4803);
+  assertNull(res[1520].firstMatch("x{a4c6}   "), 4804);
+  assertNull(res[1521].firstMatch("AXYZ"), 4805);
+  assertNull(res[1521].firstMatch("x{1234}XYZ "), 4806);
+  assertNull(res[1521].firstMatch("** Failers"), 4807);
+  assertNull(res[1521].firstMatch("X  "), 4808);
+  assertNull(res[1522].firstMatch("** Failers"), 4809);
+  assertNull(res[1522].firstMatch("AX"), 4810);
+  assertNull(res[1523].firstMatch("XYZ"), 4811);
+  assertNull(res[1523].firstMatch("AXYZ"), 4812);
+  assertNull(res[1523].firstMatch("x{1234}XYZ "), 4813);
+  assertNull(res[1523].firstMatch("** Failers"), 4814);
+  assertNull(res[1523].firstMatch("ABXYZ   "), 4815);
+  assertNull(res[1524].firstMatch("XYZ"), 4816);
+  assertNull(res[1524].firstMatch("** Failers"), 4817);
+  assertNull(res[1524].firstMatch("AXYZ"), 4818);
+  assertNull(res[1524].firstMatch("x{1234}XYZ "), 4819);
+  assertNull(res[1524].firstMatch("ABXYZ   "), 4820);
+  assertNull(res[1524].firstMatch("AXYZ"), 4821);
+  assertNull(res[1524].firstMatch("x{1234}XYZ"), 4822);
+  assertNull(res[1524].firstMatch("Ax{1234}XYZ"), 4823);
+  assertNull(res[1524].firstMatch("** Failers"), 4824);
+  assertNull(res[1524].firstMatch("XYZ"), 4825);
+  assertNull(res[1524].firstMatch("** Failers"), 4826);
+  assertNull(res[1524].firstMatch("AXYZ"), 4827);
+  assertNull(res[1524].firstMatch("x{1234}XYZ"), 4828);
+  assertNull(res[1524].firstMatch("Ax{1234}XYZ"), 4829);
+  assertNull(res[1524].firstMatch("XYZ"), 4830);
+  assertNull(res[1525].firstMatch("XYZ"), 4831);
+  assertNull(res[1525].firstMatch("AXYZ"), 4832);
+  assertNull(res[1525].firstMatch("x{1234}XYZ"), 4833);
+  assertNull(res[1525].firstMatch("Ax{1234}XYZ"), 4834);
+  assertNull(res[1525].firstMatch("** Failers"), 4835);
+  assertNull(res[1526].firstMatch("XYZ"), 4836);
+  assertNull(res[1526].firstMatch("** Failers"), 4837);
+  assertNull(res[1526].firstMatch("AXYZ"), 4838);
+  assertNull(res[1526].firstMatch("x{1234}XYZ"), 4839);
+  assertNull(res[1526].firstMatch("Ax{1234}XYZ"), 4840);
+  assertToStringEquals("AX", res[1527].firstMatch("AXYZ"), 4841);
+  assertNull(res[1527].firstMatch("x{1234}XYZ "), 4842);
+  assertNull(res[1527].firstMatch("** Failers"), 4843);
+  assertNull(res[1527].firstMatch("X  "), 4844);
+  assertNull(res[1528].firstMatch("** Failers"), 4845);
+  assertToStringEquals("AX", res[1528].firstMatch("AX"), 4846);
+  assertToStringEquals("X", res[1529].firstMatch("XYZ"), 4847);
+  assertToStringEquals("AX", res[1529].firstMatch("AXYZ"), 4848);
+  assertNull(res[1529].firstMatch("x{1234}XYZ "), 4849);
+  assertNull(res[1529].firstMatch("** Failers"), 4850);
+  assertNull(res[1529].firstMatch("ABXYZ   "), 4851);
+  assertToStringEquals("X", res[1530].firstMatch("XYZ"), 4852);
+  assertNull(res[1530].firstMatch("** Failers"), 4853);
+  assertToStringEquals("AX", res[1530].firstMatch("AXYZ"), 4854);
+  assertNull(res[1530].firstMatch("x{1234}XYZ "), 4855);
+  assertNull(res[1530].firstMatch("ABXYZ   "), 4856);
+  assertToStringEquals("AX", res[1531].firstMatch("AXYZ"), 4857);
+  assertNull(res[1531].firstMatch("x{1234}XYZ"), 4858);
+  assertNull(res[1531].firstMatch("Ax{1234}XYZ"), 4859);
+  assertNull(res[1531].firstMatch("** Failers"), 4860);
+  assertNull(res[1531].firstMatch("XYZ"), 4861);
+  assertNull(res[1532].firstMatch("** Failers"), 4862);
+  assertToStringEquals("AX", res[1532].firstMatch("AXYZ"), 4863);
+  assertNull(res[1532].firstMatch("x{1234}XYZ"), 4864);
+  assertNull(res[1532].firstMatch("Ax{1234}XYZ"), 4865);
+  assertNull(res[1532].firstMatch("XYZ"), 4866);
+  assertToStringEquals("X", res[1533].firstMatch("XYZ"), 4867);
+  assertToStringEquals("AX", res[1533].firstMatch("AXYZ"), 4868);
+  assertNull(res[1533].firstMatch("x{1234}XYZ"), 4869);
+  assertNull(res[1533].firstMatch("Ax{1234}XYZ"), 4870);
+  assertNull(res[1533].firstMatch("** Failers"), 4871);
+  assertToStringEquals("X", res[1534].firstMatch("XYZ"), 4872);
+  assertNull(res[1534].firstMatch("** Failers"), 4873);
+  assertToStringEquals("AX", res[1534].firstMatch("AXYZ"), 4874);
+  assertNull(res[1534].firstMatch("x{1234}XYZ"), 4875);
+  assertNull(res[1534].firstMatch("Ax{1234}XYZ"), 4876);
+  assertNull(res[1535].firstMatch("abcdefgh"), 4877);
+  assertNull(res[1535].firstMatch("x{1234}\n\x0dx{3456}xyz "), 4878);
+  assertNull(res[1536].firstMatch("abcdefgh"), 4879);
+  assertNull(res[1536].firstMatch("x{1234}\n\x0dx{3456}xyz "), 4880);
+  assertNull(res[1537].firstMatch("** Failers"), 4881);
+  assertNull(res[1537].firstMatch("abcdefgh"), 4882);
+  assertNull(res[1537].firstMatch("x{1234}\n\x0dx{3456}xyz "), 4883);
+  assertNull(res[1538].firstMatch(" AXY"), 4884);
+  assertNull(res[1538].firstMatch(" aXY"), 4885);
+  assertNull(res[1538].firstMatch(" x{1c5}XY"), 4886);
+  assertNull(res[1538].firstMatch(" ** Failers"), 4887);
+  assertNull(res[1538].firstMatch(" x{1bb}XY"), 4888);
+  assertNull(res[1538].firstMatch(" x{2b0}XY"), 4889);
+  assertNull(res[1538].firstMatch(" !XY      "), 4890);
+  assertNull(res[1539].firstMatch(" AXY"), 4891);
+  assertNull(res[1539].firstMatch(" aXY"), 4892);
+  assertNull(res[1539].firstMatch(" x{1c5}XY"), 4893);
+  assertNull(res[1539].firstMatch(" ** Failers"), 4894);
+  assertNull(res[1539].firstMatch(" x{1bb}XY"), 4895);
+  assertNull(res[1539].firstMatch(" x{2b0}XY"), 4896);
+  assertNull(res[1539].firstMatch(" !XY      "), 4897);
+  assertNull(res[1539].firstMatch(" AXY"), 4898);
+  assertNull(res[1539].firstMatch(" aXY"), 4899);
+  assertNull(res[1539].firstMatch(" AbcdeXyz "), 4900);
+  assertNull(res[1539].firstMatch(" x{1c5}AbXY"), 4901);
+  assertNull(res[1539].firstMatch(" abcDEXypqreXlmn "), 4902);
+  assertNull(res[1539].firstMatch(" ** Failers"), 4903);
+  assertNull(res[1539].firstMatch(" x{1bb}XY"), 4904);
+  assertNull(res[1539].firstMatch(" x{2b0}XY"), 4905);
+  assertNull(res[1539].firstMatch(" !XY      "), 4906);
+  assertNull(res[1540].firstMatch(" AXY"), 4907);
+  assertNull(res[1540].firstMatch(" aXY"), 4908);
+  assertNull(res[1540].firstMatch(" AbcdeXyz "), 4909);
+  assertNull(res[1540].firstMatch(" x{1c5}AbXY"), 4910);
+  assertNull(res[1540].firstMatch(" abcDEXypqreXlmn "), 4911);
+  assertNull(res[1540].firstMatch(" ** Failers"), 4912);
+  assertNull(res[1540].firstMatch(" x{1bb}XY"), 4913);
+  assertNull(res[1540].firstMatch(" x{2b0}XY"), 4914);
+  assertNull(res[1540].firstMatch(" !XY      "), 4915);
+  assertNull(res[1540].firstMatch(" AXY"), 4916);
+  assertNull(res[1540].firstMatch(" aXY"), 4917);
+  assertNull(res[1540].firstMatch(" AbcdeXyz "), 4918);
+  assertNull(res[1540].firstMatch(" x{1c5}AbXY"), 4919);
+  assertNull(res[1540].firstMatch(" abcDEXypqreXlmn "), 4920);
+  assertNull(res[1540].firstMatch(" ** Failers"), 4921);
+  assertNull(res[1540].firstMatch(" x{1bb}XY"), 4922);
+  assertNull(res[1540].firstMatch(" x{2b0}XY"), 4923);
+  assertNull(res[1540].firstMatch(" !XY      "), 4924);
+  assertNull(res[1541].firstMatch(" AXY"), 4925);
+  assertNull(res[1541].firstMatch(" aXY"), 4926);
+  assertNull(res[1541].firstMatch(" AbcdeXyz "), 4927);
+  assertNull(res[1541].firstMatch(" x{1c5}AbXY"), 4928);
+  assertNull(res[1541].firstMatch(" abcDEXypqreXlmn "), 4929);
+  assertNull(res[1541].firstMatch(" ** Failers"), 4930);
+  assertNull(res[1541].firstMatch(" x{1bb}XY"), 4931);
+  assertNull(res[1541].firstMatch(" x{2b0}XY"), 4932);
+  assertNull(res[1541].firstMatch(" !XY      "), 4933);
+  assertNull(res[1542].firstMatch(" !XY"), 4934);
+  assertNull(res[1542].firstMatch(" x{1bb}XY"), 4935);
+  assertNull(res[1542].firstMatch(" x{2b0}XY"), 4936);
+  assertNull(res[1542].firstMatch(" ** Failers"), 4937);
+  assertNull(res[1542].firstMatch(" x{1c5}XY"), 4938);
+  assertNull(res[1542].firstMatch(" AXY      "), 4939);
+  assertNull(res[1543].firstMatch(" !XY"), 4940);
+  assertNull(res[1543].firstMatch(" x{1bb}XY"), 4941);
+  assertNull(res[1543].firstMatch(" x{2b0}XY"), 4942);
+  assertNull(res[1543].firstMatch(" ** Failers"), 4943);
+  assertNull(res[1543].firstMatch(" x{1c5}XY"), 4944);
+  assertNull(res[1543].firstMatch(" AXY      "), 4945);
+  assertNull(res[1543].firstMatch("x{c0}x{e0}x{116}x{117}"), 4946);
+  assertNull(res[1543].firstMatch("x{c0}x{e0}x{116}x{117}"), 4947);
+  assertNull(res[1545].firstMatch("123abcdefg"), 4948);
+  assertNull(res[1545].firstMatch("123abc\xc4\xc5zz"), 4949);
+  assertNull(res[1546].firstMatch("x{102A4}x{AA52}x{A91D}x{1C46}x{10283}x{1092E}x{1C6B}x{A93B}x{A8BF}x{1BA0}x{A50A}===="), 4950);
+  assertNull(res[1546].firstMatch("x{a77d}x{1d79}"), 4951);
+  assertNull(res[1546].firstMatch("x{1d79}x{a77d} "), 4952);
+  assertNull(res[1546].firstMatch("x{a77d}x{1d79}"), 4953);
+  assertNull(res[1546].firstMatch("** Failers "), 4954);
+  assertNull(res[1546].firstMatch("x{1d79}x{a77d} "), 4955);
+  // Dart does not have RegExp literals and thus no translatation of the below.
+  // assertThrows("var re = //;", 4956);
+}
diff --git a/tests/corelib/regexp/quantified-assertions_test.dart b/tests/corelib/regexp/quantified-assertions_test.dart
new file mode 100644
index 0000000..0ed670c
--- /dev/null
+++ b/tests/corelib/regexp/quantified-assertions_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  "This page tests assertions followed by quantifiers."
+  );
+
+  var regexp;
+
+  regexp = new RegExp(r"(?=a){0}", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('a'));
+
+  regexp = new RegExp(r"(?=a){1}", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('a'));
+
+  regexp = new RegExp(r"(?!a){0}", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('b'));
+
+  regexp = new RegExp(r"(?!a){1}", multiLine: true);
+  shouldBeTrue(regexp.hasMatch('b'));
+
+  shouldBeTrue(new RegExp(r"^(?=a)?b$").hasMatch("b"));
+}
diff --git a/tests/corelib/regexp/range-bound-ffff_test.dart b/tests/corelib/regexp/range-bound-ffff_test.dart
new file mode 100644
index 0000000..29d5a77
--- /dev/null
+++ b/tests/corelib/regexp/range-bound-ffff_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for rdar:/68455379, a case-insensitive regex containing a character class containing a range with an upper bound of \uFFFF can lead to an infinite-loop.'
+  );
+
+  shouldBe(firstMatch("A", new RegExp(r"[\u0001-\uFFFF]", caseSensitive: false)), ["A"]);
+}
diff --git a/tests/corelib/regexp/range-out-of-order_test.dart b/tests/corelib/regexp/range-out-of-order_test.dart
new file mode 100644
index 0000000..252c08f
--- /dev/null
+++ b/tests/corelib/regexp/range-out-of-order_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=16129">bug 16129</a>: REGRESSION (r27761-r27811): malloc error while visiting http://mysit.es (crashes release build).'
+  );
+
+  assertThrows(() => new RegExp(r"^[\s{-.\[\]\(\)]$"));
+}
diff --git a/tests/corelib/regexp/ranges-and-escaped-hyphens_test.dart b/tests/corelib/regexp/ranges-and-escaped-hyphens_test.dart
new file mode 100644
index 0000000..5b8611b
--- /dev/null
+++ b/tests/corelib/regexp/ranges-and-escaped-hyphens_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Tests for bug <a href="https://bugs.webkit.org/show_bug.cgi?id=21232">#21232</a>, and related range issues described in bug.'
+  );
+
+  // Basic test for ranges - one to three and five are in regexp, four is not, and '-' should not match
+  var regexp01 = new RegExp(r"[1-35]+").firstMatch("-12354");
+  shouldBe(regexp01, ["1235"]);
+  // Tests inserting an escape character class into the above pattern - where the spaces fall within the
+  // range it is no longer a range - hyphens should now match, two should not.
+  var regexp01a = new RegExp(r"[\s1-35]+").firstMatch("-123 54");
+  shouldBe(regexp01a, ["123 5"]);
+
+  // These are invalid ranges, according to ECMA-262, but we allow them.
+  var regexp01b = new RegExp(r"[1\s-35]+").firstMatch("21-3 54");
+  shouldBe(regexp01b, ["1-3 5"]);
+  var regexp01c = new RegExp(r"[1-\s35]+").firstMatch("21-3 54");
+  shouldBe(regexp01c, ["1-3 5"]);
+
+  var regexp01d = new RegExp(r"[1-3\s5]+").firstMatch("-123 54");
+  shouldBe(regexp01d, ["123 5"]);
+  var regexp01e = new RegExp(r"[1-35\s5]+").firstMatch("-123 54");
+  shouldBe(regexp01e, ["123 5"]);
+  // hyphens are normal charaters if a range is not fully specified.
+  var regexp01f = new RegExp(r"[-3]+").firstMatch("2-34");
+  shouldBe(regexp01f, ["-3"]);
+  var regexp01g = new RegExp(r"[2-]+").firstMatch("12-3");
+  shouldBe(regexp01g, ["2-"]);
+
+  // Similar to the above tests, but where the hyphen is escaped this is never a range.
+  var regexp02 = new RegExp(r"[1\-35]+").firstMatch("21-354");
+  shouldBe(regexp02, ["1-35"]);
+  // As above.
+  var regexp02a = new RegExp(r"[\s1\-35]+").firstMatch("21-3 54");
+  shouldBe(regexp02a, ["1-3 5"]);
+  var regexp02b = new RegExp(r"[1\s\-35]+").firstMatch("21-3 54");
+  shouldBe(regexp02b, ["1-3 5"]);
+  var regexp02c = new RegExp(r"[1\-\s35]+").firstMatch("21-3 54");
+  shouldBe(regexp02c, ["1-3 5"]);
+  var regexp02d = new RegExp(r"[1\-3\s5]+").firstMatch("21-3 54");
+  shouldBe(regexp02d, ["1-3 5"]);
+  var regexp02e = new RegExp(r"[1\-35\s5]+").firstMatch("21-3 54");
+  shouldBe(regexp02e, ["1-3 5"]);
+
+  // Test that an escaped hyphen can be used as a bound on a range.
+  var regexp03a = new RegExp(r"[\--0]+").firstMatch(",-.01");
+  shouldBe(regexp03a, ["-.0"]);
+  var regexp03b = new RegExp(r"[+-\-]+").firstMatch("*+,-.");
+  shouldBe(regexp03b, ["+,-"]);
+
+  // The actual bug reported.
+  var bug21232 = (new RegExp(r"^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$")).hasMatch('@');
+  shouldBeFalse(bug21232);
+}
diff --git a/tests/corelib/regexp/regexp_kde_test.dart b/tests/corelib/regexp/regexp_kde_test.dart
new file mode 100644
index 0000000..b4873c4
--- /dev/null
+++ b/tests/corelib/regexp/regexp_kde_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description("KDE JS Test");
+
+  var ri = new RegExp(r"a", caseSensitive: false);
+  var rm = new RegExp(r"a", multiLine: true);
+  var rg = new RegExp(r"a");
+
+  shouldBe(new RegExp(r"(b)c").firstMatch('abcd'), ["bc", "b"]);
+
+  shouldBe(firstMatch('abcdefghi', new RegExp(r"(abc)def(ghi)")), ['abcdefghi', 'abc', 'ghi']);
+  shouldBe(new RegExp(r"(abc)def(ghi)").firstMatch('abcdefghi'), ['abcdefghi', 'abc', 'ghi']);
+
+  shouldBe(firstMatch('abcdefghi', new RegExp(r"(a(b(c(d(e)f)g)h)i)")), ['abcdefghi', 'abcdefghi', 'bcdefgh', 'cdefg', 'def', 'e']);
+
+  shouldBe(firstMatch('(100px 200px 150px 15px)', new RegExp(r"\((\d+)(px)* (\d+)(px)* (\d+)(px)* (\d+)(px)*\)")),
+          ['(100px 200px 150px 15px)', '100', 'px', '200', 'px', '150', 'px', '15', 'px']);
+  shouldBeNull(firstMatch('', new RegExp(r"\((\d+)(px)* (\d+)(px)* (\d+)(px)* (\d+)(px)*\)")));
+
+  var invalidChars = new RegExp(r"[^@\.\w]"); // #47092
+  shouldBeTrue(firstMatch('faure@kde.org', invalidChars) == null);
+  shouldBeFalse(firstMatch('faure-kde@kde.org', invalidChars) == null);
+
+  assertEquals('test1test2'.replaceAll('test','X'),'X1X2');
+  assertEquals('test1test2'.replaceAll(new RegExp(r"\d"),'X'),'testXtestX');
+  assertEquals('1test2test3'.replaceAll(new RegExp(r"\d"),''),'testtest');
+  assertEquals('test1test2'.replaceAll(new RegExp(r"test"),'X'),'X1X2');
+  assertEquals('1test2test3'.replaceAll(new RegExp(r"\d"),''),'testtest');
+  assertEquals('1test2test3'.replaceAll(new RegExp(r"x"),''),'1test2test3');
+  assertEquals('test1test2'.replaceAllMapped(new RegExp(r"(te)(st)"),
+              (m) => "${m.group(2)}${m.group(1)}"),'stte1stte2');
+  assertEquals('foo+bar'.replaceAll(new RegExp(r"\+"),'%2B'), 'foo%2Bbar');
+  var caught = false; try { new RegExp("+"); } catch (e) { caught = true; }
+  shouldBeTrue(caught); // #40435
+  assertEquals('foo'.replaceAll(new RegExp(r"z?"),'x'), 'xfxoxox');
+  assertEquals('test test'.replaceAll(new RegExp(r"\s*"),''),'testtest'); // #50985
+  assertEquals('abc\$%@'.replaceAll(new RegExp(r"[^0-9a-z]*", caseSensitive: false),''),'abc'); // #50848
+  assertEquals('ab'.replaceAll(new RegExp(r"[^\d\.]*", caseSensitive: false),''),''); // #75292
+  assertEquals('1ab'.replaceAll(new RegExp(r"[^\d\.]*", caseSensitive: false),''),'1'); // #75292
+
+  Expect.listEquals('1test2test3blah'.split(new RegExp(r"test")), ['1', '2', '3blah']);
+  var reg = new RegExp(r"(\d\d )");
+  var str = '98 76 blah';
+  shouldBe(reg.firstMatch(str),['98 ', '98 ']);
+
+  str = "For more information, see Chapter 3.4.5.1";
+  var re = new RegExp(r"(chapter \d+(\.\d)*)", caseSensitive: false);
+  // This returns the array containing Chapter 3.4.5.1,Chapter 3.4.5.1,.1
+  // 'Chapter 3.4.5.1' is the first match and the first value remembered from (Chapter \d+(\.\d)*).
+  // '.1' is the second value remembered from (\.\d)
+  shouldBe(firstMatch(str, re),['Chapter 3.4.5.1', 'Chapter 3.4.5.1', '.1']);
+
+  str = "abcDdcba";
+  // The returned array contains D, d.
+  re = new RegExp(r"d", caseSensitive: false);
+  var matches = re.allMatches(str);
+  Expect.listEquals(
+      matches.map((m) => m.group(0)).toList(),
+      ['D', 'd']);
+
+  // unicode escape sequence
+  shouldBe(firstMatch('abc', new RegExp(r"\u0062")), ['b']);
+}
diff --git a/tests/corelib/regexp/regexp_test.dart b/tests/corelib/regexp/regexp_test.dart
new file mode 100644
index 0000000..60483ba
--- /dev/null
+++ b/tests/corelib/regexp/regexp_test.dart
@@ -0,0 +1,594 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import "package:expect/expect.dart";
+
+void testEscape(str, regex) {
+  assertEquals("foo:bar:baz", str.split(regex).join(":"));
+}
+
+void assertEquals(actual, expected, [message]) =>
+    Expect.equals(actual, expected, message);
+void assertTrue(actual, [message]) => Expect.isTrue(actual, message);
+void assertFalse(actual, [message]) => Expect.isFalse(actual, message);
+void assertThrows(fn) => Expect.throws(fn);
+
+void main() {
+  testEscape("foo\nbar\nbaz", new RegExp(r"\n"));
+  testEscape("foo bar baz", new RegExp(r"\s"));
+  testEscape("foo\tbar\tbaz", new RegExp(r"\s"));
+  testEscape("foo-bar-baz", new RegExp(r"\u002D"));
+
+  // Test containing null char in regexp.
+  var s = '[' + new String.fromCharCode(0) + ']';
+  var re = new RegExp(s);
+  assertEquals(re.allMatches(s).length, 1);
+  assertEquals(re.stringMatch(s), new String.fromCharCode(0));
+
+  final _vmFrame = new RegExp(
+    r'^#\d+\s+(\S.*) \((.+?):(\d+)(?::(\d+))?\)$');
+  final _traceLine =
+    "#0      Trace.Trace.parse (package:stack_trace/src/trace.dart:130:7)";
+  Expect.equals(_vmFrame.firstMatch(_traceLine).group(0), _traceLine);
+
+  // Test the UTF16 case insensitive comparison.
+  re = new RegExp(r"x(a)\1x", caseSensitive: false);
+  Expect.equals(re.firstMatch("xaAx\u1234").group(0), "xaAx");
+
+  // Test strings containing all line separators
+  s = 'aA\nbB\rcC\r\ndD\u2028eE\u2029fF';
+  // any non-newline character at the beginning of a line
+  re = new RegExp(r"^.", multiLine: true);
+  var result = re.allMatches(s).toList();
+  assertEquals(result.length, 6);
+  assertEquals(result[0][0], 'a');
+  assertEquals(result[1][0], 'b');
+  assertEquals(result[2][0], 'c');
+  assertEquals(result[3][0], 'd');
+  assertEquals(result[4][0], 'e');
+  assertEquals(result[5][0], 'f');
+
+  // any non-newline character at the end of a line
+  re = new RegExp(r".$", multiLine: true);
+  result = re.allMatches(s).toList();
+  assertEquals(result.length, 6);
+  assertEquals(result[0][0], 'A');
+  assertEquals(result[1][0], 'B');
+  assertEquals(result[2][0], 'C');
+  assertEquals(result[3][0], 'D');
+  assertEquals(result[4][0], 'E');
+  assertEquals(result[5][0], 'F');
+
+  // *any* character at the beginning of a line
+  re = new RegExp(r"^[^]", multiLine: true);
+  result = re.allMatches(s).toList();
+  assertEquals(result.length, 7);
+  assertEquals(result[0][0], 'a');
+  assertEquals(result[1][0], 'b');
+  assertEquals(result[2][0], 'c');
+  assertEquals(result[3][0], '\n');
+  assertEquals(result[4][0], 'd');
+  assertEquals(result[5][0], 'e');
+  assertEquals(result[6][0], 'f');
+
+  // *any* character at the end of a line
+  re = new RegExp(r"[^]$", multiLine: true);
+  result = re.allMatches(s).toList();
+  assertEquals(result.length, 7);
+  assertEquals(result[0][0], 'A');
+  assertEquals(result[1][0], 'B');
+  assertEquals(result[2][0], 'C');
+  assertEquals(result[3][0], '\r');
+  assertEquals(result[4][0], 'D');
+  assertEquals(result[5][0], 'E');
+  assertEquals(result[6][0], 'F');
+
+  // Some tests from the Mozilla tests, where our behavior used to differ
+  // from SpiderMonkey.
+  // From ecma_3/RegExp/regress-334158.js
+  assertTrue( "\x01" .contains(new RegExp(r"\ca")));
+  assertFalse( "\\ca" .contains(new RegExp(r"\ca")));
+  assertFalse( "ca" .contains(new RegExp(r"\ca")));
+  assertTrue( "\\ca" .contains(new RegExp(r"\c[a/]")));
+  assertTrue( "\\c/" .contains(new RegExp(r"\c[a/]")));
+
+  // Test \c in character class
+  re = r"^[\cM]$";
+  assertTrue("\r".contains(new RegExp(re)));
+  assertFalse("M".contains(new RegExp(re)));
+  assertFalse("c".contains(new RegExp(re)));
+  assertFalse("\\".contains(new RegExp(re)));
+  assertFalse("\x03".contains(new RegExp(re)));  // I.e., read as \cc
+
+  re = r"^[\c]]$";
+  assertTrue("c]".contains(new RegExp(re)));
+  assertTrue("\\]".contains(new RegExp(re)));
+  assertFalse("\x1d".contains(new RegExp(re)));  // ']' & 0x1f
+  assertFalse("\x03]".contains(new RegExp(re)));  // I.e., read as \cc
+
+  // Digit control characters are masked in character classes.
+  re = r"^[\c1]$";
+  assertTrue("\x11".contains(new RegExp(re)));
+  assertFalse("\\".contains(new RegExp(re)));
+  assertFalse("c".contains(new RegExp(re)));
+  assertFalse("1".contains(new RegExp(re)));
+
+  // Underscore control character is masked in character classes.
+  re = r"^[\c_]$";
+  assertTrue("\x1f".contains(new RegExp(re)));
+  assertFalse("\\".contains(new RegExp(re)));
+  assertFalse("c".contains(new RegExp(re)));
+  assertFalse("_".contains(new RegExp(re)));
+
+  re = r"^[\c$]$";  // Other characters are interpreted literally.
+  assertFalse("\x04".contains(new RegExp(re)));
+  assertTrue("\\".contains(new RegExp(re)));
+  assertTrue("c".contains(new RegExp(re)));
+  assertTrue(r"$".contains(new RegExp(re)));
+
+  assertTrue("Z[\\cde".contains(new RegExp(r"^[Z-\c-e]*$")));
+
+  // Test that we handle \s and \S correctly on special Unicode characters.
+  re = r"\s";
+  assertTrue("\u2028".contains(new RegExp(re)));
+  assertTrue("\u2029".contains(new RegExp(re)));
+  assertTrue("\uFEFF".contains(new RegExp(re)));
+
+  re = r"\S";
+  assertFalse("\u2028".contains(new RegExp(re)));
+  assertFalse("\u2029".contains(new RegExp(re)));
+  assertFalse("\uFEFF".contains(new RegExp(re)));
+
+  // Test that we handle \s and \S correctly inside some bizarre
+  // character classes.
+  re = r"[\s-:]";
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue(':'.contains(new RegExp(re)));
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\t'.contains(new RegExp(re)));
+  assertTrue('\n'.contains(new RegExp(re)));
+  assertFalse('a'.contains(new RegExp(re)));
+  assertFalse('Z'.contains(new RegExp(re)));
+
+  re = r"[\S-:]";
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue(':'.contains(new RegExp(re)));
+  assertFalse(' '.contains(new RegExp(re)));
+  assertFalse('\t'.contains(new RegExp(re)));
+  assertFalse('\n'.contains(new RegExp(re)));
+  assertTrue('a'.contains(new RegExp(re)));
+  assertTrue('Z'.contains(new RegExp(re)));
+
+  re = r"[^\s-:]";
+  assertFalse('-'.contains(new RegExp(re)));
+  assertFalse(':'.contains(new RegExp(re)));
+  assertFalse(' '.contains(new RegExp(re)));
+  assertFalse('\t'.contains(new RegExp(re)));
+  assertFalse('\n'.contains(new RegExp(re)));
+  assertTrue('a'.contains(new RegExp(re)));
+  assertTrue('Z'.contains(new RegExp(re)));
+
+  re = r"[^\S-:]";
+  assertFalse('-'.contains(new RegExp(re)));
+  assertFalse(':'.contains(new RegExp(re)));
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\t'.contains(new RegExp(re)));
+  assertTrue('\n'.contains(new RegExp(re)));
+  assertFalse('a'.contains(new RegExp(re)));
+  assertFalse('Z'.contains(new RegExp(re)));
+
+  re = r"[\s]";
+  assertFalse('-'.contains(new RegExp(re)));
+  assertFalse(':'.contains(new RegExp(re)));
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\t'.contains(new RegExp(re)));
+  assertTrue('\n'.contains(new RegExp(re)));
+  assertFalse('a'.contains(new RegExp(re)));
+  assertFalse('Z'.contains(new RegExp(re)));
+
+  re = r"[^\s]";
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue(':'.contains(new RegExp(re)));
+  assertFalse(' '.contains(new RegExp(re)));
+  assertFalse('\t'.contains(new RegExp(re)));
+  assertFalse('\n'.contains(new RegExp(re)));
+  assertTrue('a'.contains(new RegExp(re)));
+  assertTrue('Z'.contains(new RegExp(re)));
+
+  re = r"[\S]";
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue(':'.contains(new RegExp(re)));
+  assertFalse(' '.contains(new RegExp(re)));
+  assertFalse('\t'.contains(new RegExp(re)));
+  assertFalse('\n'.contains(new RegExp(re)));
+  assertTrue('a'.contains(new RegExp(re)));
+  assertTrue('Z'.contains(new RegExp(re)));
+
+  re = r"[^\S]";
+  assertFalse('-'.contains(new RegExp(re)));
+  assertFalse(':'.contains(new RegExp(re)));
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\t'.contains(new RegExp(re)));
+  assertTrue('\n'.contains(new RegExp(re)));
+  assertFalse('a'.contains(new RegExp(re)));
+  assertFalse('Z'.contains(new RegExp(re)));
+
+  re = r"[\s\S]";
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue(':'.contains(new RegExp(re)));
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\t'.contains(new RegExp(re)));
+  assertTrue('\n'.contains(new RegExp(re)));
+  assertTrue('a'.contains(new RegExp(re)));
+  assertTrue('Z'.contains(new RegExp(re)));
+
+  re = r"[^\s\S]";
+  assertFalse('-'.contains(new RegExp(re)));
+  assertFalse(':'.contains(new RegExp(re)));
+  assertFalse(' '.contains(new RegExp(re)));
+  assertFalse('\t'.contains(new RegExp(re)));
+  assertFalse('\n'.contains(new RegExp(re)));
+  assertFalse('a'.contains(new RegExp(re)));
+  assertFalse('Z'.contains(new RegExp(re)));
+
+  // First - is treated as range operator, second as literal minus.
+  // This follows the specification in parsing, but doesn't throw on
+  // the \s at the beginning of the range.
+  re = r"[\s-0-9]";
+  assertTrue(' '.contains(new RegExp(re)));
+  assertTrue('\xA0'.contains(new RegExp(re)));
+  assertTrue('-'.contains(new RegExp(re)));
+  assertTrue('0'.contains(new RegExp(re)));
+  assertTrue('9'.contains(new RegExp(re)));
+  assertFalse('1'.contains(new RegExp(re)));
+
+  // Test beginning and end of line assertions with or without the
+  // multiline flag.
+  re = r"^\d+";
+  assertFalse("asdf\n123".contains(new RegExp(re)));
+  re = new RegExp(r"^\d+", multiLine: true);
+  assertTrue("asdf\n123".contains(re));
+
+  re = r"\d+$";
+  assertFalse("123\nasdf".contains(new RegExp(re)));
+  re = new RegExp(r"\d+$", multiLine: true);
+  assertTrue("123\nasdf".contains(re));
+
+  // Test that empty matches are handled correctly for multiline global
+  // regexps.
+  re = new RegExp(r"^(.*)", multiLine: true);
+  assertEquals(3, re.allMatches("a\n\rb").length);
+  assertEquals("*a\n*b\r*c\n*\r*d\r*\n*e",
+      "a\nb\rc\n\rd\r\ne".replaceAllMapped(
+        re, (Match m) => "*${m.group(1)}"));
+
+  // Test that empty matches advance one character
+  re = new RegExp("");
+  assertEquals("xAx", "A".replaceAll(re, "x"));
+  assertEquals(3, new String.fromCharCode(161).replaceAll(re, "x").length);
+
+  // Check for lazy RegExp literal creation
+  lazyLiteral(doit) {
+    if (doit) return "".replaceAll(
+        new RegExp(r"foo(", caseSensitive: false), "");
+    return true;
+  }
+
+  assertTrue(lazyLiteral(false));
+  assertThrows(() => lazyLiteral(true));
+
+  // Check $01 and $10
+  re = new RegExp("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)");
+  assertEquals("t", "123456789t".replaceAllMapped(
+        re, (Match m) => m.group(10)));
+  assertEquals("15", "123456789t".replaceAllMapped(
+        re, (Match m) => "${m.group(1)}5"));
+  assertEquals("1", "123456789t".replaceAllMapped(
+        re, (Match m) => m.group(1)));
+
+  assertFalse("football".contains(new RegExp(r"()foo$\1")), "football1");
+  assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football2");
+  assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football3");
+  assertTrue("foo".contains(new RegExp(r"()foo$\1")), "football4");
+  assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football5");
+  assertTrue("foo".contains(new RegExp(r"()foo$(?!bar)")), "football6");
+  assertFalse("football".contains(new RegExp(r"(x?)foo$\1")), "football7");
+  assertFalse("football".contains(new RegExp(r"foo$(?=ball)")), "football8");
+  assertFalse("football".contains(new RegExp(r"foo$(?!bar)")), "football9");
+  assertTrue("foo".contains(new RegExp(r"(x?)foo$\1")), "football10");
+  assertTrue("foo".contains(new RegExp(r"foo$(?=(ball)?)")), "football11");
+  assertTrue("foo".contains(new RegExp(r"foo$(?!bar)")), "football12");
+
+  // Check that the back reference has two successors.  See
+  // BackReferenceNode::PropagateForward.
+  assertFalse('foo'.contains(new RegExp(r"f(o)\b\1")));
+  assertTrue('foo'.contains(new RegExp(r"f(o)\B\1")));
+
+  // Back-reference, ignore case:
+  // ASCII
+  assertEquals("a", new RegExp(r"x(a)\1x", caseSensitive: false)
+      .firstMatch("xaAx").group(1), "backref-ASCII");
+  assertFalse("xaaaaa".contains(new RegExp(r"x(...)\1",
+                                caseSensitive: false)),
+      "backref-ASCII-short");
+  assertTrue("xx".contains(new RegExp(r"x((?:))\1\1x", caseSensitive: false)),
+      "backref-ASCII-empty");
+  assertTrue("xabcx".contains(
+        new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)),
+      "backref-ASCII-uncaptured");
+  assertTrue("xabcABCx".contains(
+        new RegExp(r"x(?:...|(...))\1x", caseSensitive: false)),
+      "backref-ASCII-backtrack");
+  assertEquals("aBc", new RegExp(r"x(...)\1\1x", caseSensitive: false)
+      .firstMatch("xaBcAbCABCx").group(1), "backref-ASCII-twice");
+
+  for (var i = 0; i < 128; i++) {
+    var testName = "backref-ASCII-char-$i,,${i^0x20}";
+    var test = new String.fromCharCodes([i, i ^ 0x20])
+      .contains(new RegExp(r"^(.)\1$", caseSensitive: false));
+    if (('A'.codeUnitAt(0) <= i && i <= 'Z'.codeUnitAt(0)) ||
+        ('a'.codeUnitAt(0) <= i && i <= 'z'.codeUnitAt(0))) {
+      assertTrue(test, testName);
+    } else {
+      assertFalse(test, testName);
+    }
+  }
+
+  assertFalse('foo'.contains(new RegExp(r"f(o)$\1")),
+              "backref detects at_end");
+
+  // Check decimal escapes doesn't overflow.
+  // (Note: \214 is interpreted as octal).
+  assertEquals("\x8c7483648", new RegExp(r"\2147483648")
+      .firstMatch("\x8c7483648").group(0), "Overflow decimal escape");
+
+  // Check numbers in quantifiers doesn't overflow and doesn't throw on
+  // too large numbers.
+  assertFalse('b'.contains(
+        new RegExp(r"a{111111111111111111111111111111111111111111111}")),
+              "overlarge1");
+  assertFalse('b'.contains(
+        new RegExp(r"a{999999999999999999999999999999999999999999999}")),
+              "overlarge2");
+  assertFalse('b'.contains(
+        new RegExp(r"a{1,111111111111111111111111111111111111111111111}")),
+              "overlarge3");
+  assertFalse('b'.contains(
+        new RegExp(r"a{1,999999999999999999999999999999999999999999999}")),
+              "overlarge4");
+  assertFalse('b'.contains(new RegExp(r"a{2147483648}")),
+              "overlarge5");
+  assertFalse('b'.contains(new RegExp(r"a{21474836471}")),
+              "overlarge6");
+  assertFalse('b'.contains(new RegExp(r"a{1,2147483648}")),
+              "overlarge7");
+  assertFalse('b'.contains(new RegExp(r"a{1,21474836471}")),
+              "overlarge8");
+  assertFalse('b'.contains(new RegExp(r"a{2147483648,2147483648}")),
+              "overlarge9");
+  assertFalse('b'.contains(new RegExp(r"a{21474836471,21474836471}")),
+              "overlarge10");
+  assertFalse('b'.contains(new RegExp(r"a{2147483647}")),
+              "overlarge11");
+  assertFalse('b'.contains(new RegExp(r"a{1,2147483647}")),
+              "overlarge12");
+  assertTrue('a'.contains(new RegExp(r"a{1,2147483647}")),
+              "overlarge13");
+  assertFalse('a'.contains(new RegExp(r"a{2147483647,2147483647}")),
+              "overlarge14");
+
+  // Check that we don't read past the end of the string.
+  assertFalse('b'.contains(new RegExp(r"f")));
+  assertFalse('x'.contains(new RegExp(r"[abc]f")));
+  assertFalse('xa'.contains(new RegExp(r"[abc]f")));
+  assertFalse('x'.contains(new RegExp(r"[abc]<")));
+  assertFalse('xa'.contains(new RegExp(r"[abc]<")));
+  assertFalse('b'.contains(new RegExp(r"f", caseSensitive: false)));
+  assertFalse('x'.contains(new RegExp(r"[abc]f", caseSensitive: false)));
+  assertFalse('xa'.contains(new RegExp(r"[abc]f", caseSensitive: false)));
+  assertFalse('x'.contains(new RegExp(r"[abc]<", caseSensitive: false)));
+  assertFalse('xa'.contains(new RegExp(r"[abc]<", caseSensitive: false)));
+  assertFalse('x'.contains(new RegExp(r"f[abc]")));
+  assertFalse('xa'.contains(new RegExp(r"f[abc]")));
+  assertFalse('x'.contains(new RegExp(r"<[abc]")));
+  assertFalse('xa'.contains(new RegExp(r"<[abc]")));
+  assertFalse('x'.contains(new RegExp(r"f[abc]", caseSensitive: false)));
+  assertFalse('xa'.contains(new RegExp(r"f[abc]", caseSensitive: false)));
+  assertFalse('x'.contains(new RegExp(r"<[abc]", caseSensitive: false)));
+  assertFalse('xa'.contains(new RegExp(r"<[abc]", caseSensitive: false)));
+
+  // Test that merging of quick test masks gets it right.
+  assertFalse('x7%%y'.contains(new RegExp(r"x([0-7]%%x|[0-6]%%y)")), 'qt');
+  assertFalse('xy7%%%y'.contains(
+        new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt2');
+  assertFalse('xy%%%y'.contains(
+        new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt3');
+  assertFalse('xy7%%%y'.contains(
+        new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt4');
+  assertFalse('xy%%%y'.contains(
+        new RegExp(r"()x\1(y([0-7]%%%x|[0-6]%%%y)|dkjasldkas)")), 'qt5');
+  assertFalse('xy7%%%y'.contains(
+        new RegExp(r"()x\1y([0-7]%%%x|[0-6]%%%y)")), 'qt6');
+  assertFalse('xy7%%%y'.contains(
+        new RegExp(r"xy([0-7]%%%x|[0-6]%%%y)")), 'qt7');
+  assertFalse('x7%%%y'.contains(new RegExp(r"x([0-7]%%%x|[0-6]%%%y)")),
+              'qt8');
+
+
+  // Don't hang on this one.
+  "".contains(new RegExp(r"[^\xfe-\xff]*"));
+
+  var longbuffer = new StringBuffer("a");
+  for (var i = 0; i < 100000; i++) {
+    longbuffer.write("a?");
+  }
+  var long = longbuffer.toString();
+
+  // Don't crash on this one, but maybe throw an exception.
+  try {
+    new RegExp(long).allMatches("a");
+  } catch (e) {
+    assertTrue(e.toString().indexOf("Stack overflow") >= 0, "overflow");
+  }
+
+
+  // Test boundary-checks.
+  void assertRegExpTest(re, input, test) {
+    assertEquals(test, input.contains(
+          new RegExp(re)), "test:" + re + ":" + input);
+  }
+
+  assertRegExpTest(r"b\b", "b", true);
+  assertRegExpTest(r"b\b$", "b", true);
+  assertRegExpTest(r"\bb", "b", true);
+  assertRegExpTest(r"^\bb", "b", true);
+  assertRegExpTest(r",\b", ",", false);
+  assertRegExpTest(r",\b$", ",", false);
+  assertRegExpTest(r"\b,", ",", false);
+  assertRegExpTest(r"^\b,", ",", false);
+
+  assertRegExpTest(r"b\B", "b", false);
+  assertRegExpTest(r"b\B$", "b", false);
+  assertRegExpTest(r"\Bb", "b", false);
+  assertRegExpTest(r"^\Bb", "b", false);
+  assertRegExpTest(r",\B", ",", true);
+  assertRegExpTest(r",\B$", ",", true);
+  assertRegExpTest(r"\B,", ",", true);
+  assertRegExpTest(r"^\B,", ",", true);
+
+  assertRegExpTest(r"b\b", "b,", true);
+  assertRegExpTest(r"b\b", "ba", false);
+  assertRegExpTest(r"b\B", "b,", false);
+  assertRegExpTest(r"b\B", "ba", true);
+
+  assertRegExpTest(r"b\Bb", "bb", true);
+  assertRegExpTest(r"b\bb", "bb", false);
+
+  assertRegExpTest(r"b\b[,b]", "bb", false);
+  assertRegExpTest(r"b\B[,b]", "bb", true);
+  assertRegExpTest(r"b\b[,b]", "b,", true);
+  assertRegExpTest(r"b\B[,b]", "b,", false);
+
+  assertRegExpTest(r"[,b]\bb", "bb", false);
+  assertRegExpTest(r"[,b]\Bb", "bb", true);
+  assertRegExpTest(r"[,b]\bb", ",b", true);
+  assertRegExpTest(r"[,b]\Bb", ",b", false);
+
+  assertRegExpTest(r"[,b]\b[,b]", "bb", false);
+  assertRegExpTest(r"[,b]\B[,b]", "bb", true);
+  assertRegExpTest(r"[,b]\b[,b]", ",b", true);
+  assertRegExpTest(r"[,b]\B[,b]", ",b", false);
+  assertRegExpTest(r"[,b]\b[,b]", "b,", true);
+  assertRegExpTest(r"[,b]\B[,b]", "b,", false);
+
+  // Skipped tests from V8:
+
+  // Test that caching of result doesn't share result objects.
+  // More iterations increases the chance of hitting a GC.
+
+  // Test that we perform the spec required conversions in the correct order.
+
+  // Check that properties of RegExp have the correct permissions.
+
+  // Check that end-anchored regexps are optimized correctly.
+  re = r"(?:a|bc)g$";
+  assertTrue("ag".contains(new RegExp(re)));
+  assertTrue("bcg".contains(new RegExp(re)));
+  assertTrue("abcg".contains(new RegExp(re)));
+  assertTrue("zimbag".contains(new RegExp(re)));
+  assertTrue("zimbcg".contains(new RegExp(re)));
+
+  assertFalse("g".contains(new RegExp(re)));
+  assertFalse("".contains(new RegExp(re)));
+
+  // Global regexp (non-zero start).
+  re = r"(?:a|bc)g$";
+  assertTrue("ag".contains(new RegExp(re)));
+  // Near start of string.
+  assertTrue(new RegExp(re).allMatches("zimbag", 1).isNotEmpty);
+  // At end of string.
+  assertTrue(new RegExp(re).allMatches("zimbag", 6).isEmpty);
+  // Near end of string.
+  assertTrue(new RegExp(re).allMatches("zimbag", 5).isEmpty);
+  assertTrue(new RegExp(re).allMatches("zimbag", 4).isNotEmpty);
+
+  // Anchored at both ends.
+  re = r"^(?:a|bc)g$";
+  assertTrue("ag".contains(new RegExp(re)));
+  assertTrue(new RegExp(re).allMatches("ag", 1).isEmpty);
+  assertTrue(new RegExp(re).allMatches("zag", 1).isEmpty);
+
+  // Long max_length of RegExp.
+  re = r"VeryLongRegExp!{1,1000}$";
+  assertTrue("BahoolaVeryLongRegExp!!!!!!".contains(new RegExp(re)));
+  assertFalse("VeryLongRegExp".contains(new RegExp(re)));
+  assertFalse("!".contains(new RegExp(re)));
+
+  // End anchor inside disjunction.
+  re = r"(?:a$|bc$)";
+  assertTrue("a".contains(new RegExp(re)));
+  assertTrue("bc".contains(new RegExp(re)));
+  assertTrue("abc".contains(new RegExp(re)));
+  assertTrue("zimzamzumba".contains(new RegExp(re)));
+  assertTrue("zimzamzumbc".contains(new RegExp(re)));
+  assertFalse("c".contains(new RegExp(re)));
+  assertFalse("".contains(new RegExp(re)));
+
+  // Only partially anchored.
+  re = r"(?:a|bc$)";
+  assertTrue("a".contains(new RegExp(re)));
+  assertTrue("bc".contains(new RegExp(re)));
+  assertEquals("a", new RegExp(re).firstMatch("abc").group(0));
+  assertEquals(4, new RegExp(re).firstMatch("zimzamzumba").start);
+  assertEquals("bc", new RegExp(re).firstMatch("zimzomzumbc").group(0));
+  assertFalse("c".contains(new RegExp(re)));
+  assertFalse("".contains(new RegExp(re)));
+
+  // Valid syntax in ES5.
+  re = new RegExp("(?:x)*");
+  re = new RegExp("(x)*");
+
+  // Syntax extension relative to ES5, for matching JSC (and ES3).
+  // Shouldn't throw.
+  re = new RegExp("(?=x)*");
+  re = new RegExp("(?!x)*");
+
+  // Should throw. Shouldn't hit asserts in debug mode.
+  assertThrows(() => new RegExp('(*)'));
+  assertThrows(() => new RegExp('(?:*)'));
+  assertThrows(() => new RegExp('(?=*)'));
+  assertThrows(() => new RegExp('(?!*)'));
+
+  // Test trimmed regular expression for RegExp.test().
+  assertTrue("abc".contains(new RegExp(r".*abc")));
+  assertFalse("q".contains(new RegExp(r".*\d+")));
+
+  // Tests skipped from V8:
+  // Test that RegExp.prototype.toString() throws TypeError for
+  // incompatible receivers (ES5 section 15.10.6 and 15.10.6.4).
+}
diff --git a/tests/corelib/regexp/regress-6-9-regexp_test.dart b/tests/corelib/regexp/regress-6-9-regexp_test.dart
new file mode 100644
index 0000000..3fbef87
--- /dev/null
+++ b/tests/corelib/regexp/regress-6-9-regexp_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Check that the perfect mask check isn't overly optimistic.
+
+  assertFalse(new RegExp(r"[6-9]").hasMatch('2'));
+}
diff --git a/tests/corelib/regexp/regress-regexp-codeflush_test.dart b/tests/corelib/regexp/regress-regexp-codeflush_test.dart
new file mode 100644
index 0000000..23a4954
--- /dev/null
+++ b/tests/corelib/regexp/regress-regexp-codeflush_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2011 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Flags: --gc_global
+
+  // Regression test for regexp that has multiple matches and which
+  // internally calls RegExpImpl::IrregexpExecOnce more than once without
+  // ensuring that the regexp is compiled.
+  // This can create a crash if the code was exchanged with the sweep
+  // generation (for code flushing support) in GC durring the matching.
+
+  var re = new RegExp('(s)');
+
+  dynamic foo(Match m) {
+    return "42";
+  }
+
+  // Run enough times to get a number of GC's (all mark sweep because of the
+  // --gc_global) flag.
+  for ( var i = 0; i < 10; i++) {
+    // Make a long string with plenty of matches for re.
+    var x = "s foo s bar s foo s bar s";
+    x = x + x;
+    x = x + x;
+    x = x + x;
+    x = x + x;
+    x = x + x;
+    x = x + x;
+    x = x + x;
+    x.replaceAllMapped(re, foo);
+  }
+}
diff --git a/tests/corelib/regexp/regress-regexp-construct-result_test.dart b/tests/corelib/regexp/regress-regexp-construct-result_test.dart
new file mode 100644
index 0000000..ac9c032
--- /dev/null
+++ b/tests/corelib/regexp/regress-regexp-construct-result_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Create a huge regexp with many alternative capture groups, most of
+  // which do not capture anything, but the corresponding capture slot
+  // in the result object has to exist, even though filled with null.
+  // Having a large result array helps stressing GC.
+
+  var num_captures = 1000;
+  var regexp_string = "(a)";
+  for (var i = 0; i < num_captures - 1; i++) {
+    regexp_string += "|(b)";
+  }
+  var regexp = new RegExp(regexp_string);
+
+  for (var i = 0; i < 10; i++) {
+    var matches = regexp.firstMatch("a");
+    var count = 0;
+    assertEquals(num_captures + 1, matches.groupCount + 1);
+  }
+}
diff --git a/tests/corelib/regexp/repeat-match-waldemar_test.dart b/tests/corelib/regexp/repeat-match-waldemar_test.dart
new file mode 100644
index 0000000..3adc775
--- /dev/null
+++ b/tests/corelib/regexp/repeat-match-waldemar_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // "Some test cases identified by Waldemar Horwat in response to this bug:
+  // https:new RegExp(r"/bugs.webkit.org")show_bug.cgi?id=48101"
+
+  shouldBe(new RegExp(r"(?:a*?){2,}").firstMatch("aa"), ["aa"]);
+  shouldBe(new RegExp(r"(?:a*?){2,}").firstMatch("a"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?){2,}").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?)").firstMatch("aa"), [""]);
+  shouldBe(new RegExp(r"(?:a*?)").firstMatch("a"), [""]);
+  shouldBe(new RegExp(r"(?:a*?)").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?)(?:a*?)(?:a*?)").firstMatch("aa"), [""]);
+  shouldBe(new RegExp(r"(?:a*?)(?:a*?)(?:a*?)").firstMatch("a"), [""]);
+  shouldBe(new RegExp(r"(?:a*?)(?:a*?)(?:a*?)").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?){2}").firstMatch("aa"), [""]);
+  shouldBe(new RegExp(r"(?:a*?){2}").firstMatch("a"), [""]);
+  shouldBe(new RegExp(r"(?:a*?){2}").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?){2,3}").firstMatch("aa"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?){2,3}").firstMatch("a"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?){2,3}").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?)?").firstMatch("aa"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?)?").firstMatch("a"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?)?").firstMatch(""), [""]);
+
+  shouldBe(new RegExp(r"(?:a*?)*").firstMatch("aa"), ["aa"]);
+  shouldBe(new RegExp(r"(?:a*?)*").firstMatch("a"), ["a"]);
+  shouldBe(new RegExp(r"(?:a*?)*").firstMatch(""), [""]);
+}
diff --git a/tests/corelib/regexp/results-cache_test.dart b/tests/corelib/regexp/results-cache_test.dart
new file mode 100644
index 0000000..45226e1
--- /dev/null
+++ b/tests/corelib/regexp/results-cache_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  // Long string to trigger caching.
+  var string =
+  """Friends, Romans, countrymen, lend me your ears!  
+  I come to bury Caesar, not to praise him.        
+  The evil that men do lives after them,           
+  The good is oft interred with their bones;       
+  So let it be with Caesar. The noble Brutus       
+  Hath told you Caesar was ambitious;              
+  If it were so, it was a grievous fault,          
+  And grievously hath Caesar answer'd it.          
+  Here, under leave of Brutus and the rest-        
+  For Brutus is an honorable man;                  
+  So are they all, all honorable men-              
+  Come I to speak in Caesar's funeral.             
+  He was my friend, faithful and just to me;       
+  But Brutus says he was ambitious,                
+  And Brutus is an honorable man.                  
+  He hath brought many captives home to Rome,      
+  Whose ransoms did the general coffers fill.      
+  Did this in Caesar seem ambitious?               
+  When that the poor have cried, Caesar hath wept; 
+  Ambition should be made of sterner stuff:        
+  Yet Brutus says he was ambitious,                
+  And Brutus is an honorable man.                  
+  You all did see that on the Lupercal             
+  I thrice presented him a kingly crown,           
+  Which he did thrice refuse. Was this ambition?   
+  Yet Brutus says he was ambitious,                
+  And sure he is an honorable man.                 
+  I speak not to disprove what Brutus spoke,       
+  But here I am to speak what I do know.           
+  You all did love him once, not without cause;    
+  What cause withholds you then to mourn for him?  
+  O judgement, thou art fled to brutish beasts,    
+  And men have lost their reason. Bear with me;    
+  My heart is in the coffin there with Caesar,     
+  And I must pause till it come back to me.""";
+
+  var replaced = string.replaceAll(new RegExp(r"\b\w+\b"), "foo");
+  for (var i = 0; i < 3; i++) {
+    assertEquals(replaced,
+                string.replaceAll(new RegExp(r"\b\w+\b"), "foo"));
+  }
+
+  // Check that the result is in a COW array.
+  var words = string.split(" ");
+  assertEquals("Friends,", words[0]);
+  words[0] = "Enemies,";
+  words = string.split(" ");
+  assertEquals("Friends,", words[0]);
+}
diff --git a/tests/corelib/regexp/stack-overflow2_test.dart b/tests/corelib/regexp/stack-overflow2_test.dart
new file mode 100644
index 0000000..6bc2b78
--- /dev/null
+++ b/tests/corelib/regexp/stack-overflow2_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, 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.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+// Failing tests extracted from pcre_test.dart. Large generated functions
+// cause a stack overflow in DiscoverBlocks().
+
+void main() {
+  var res149 = new RegExp(r"(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)", caseSensitive: false);
+
+  assertToStringEquals("1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 ,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60 ,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70 ,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80 ,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90 ,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99 ,100 ,101 ,102 ,103 ,104 ,105 ,106 ,107 ,108 ,109 ,110 ,111 ,112 ,113 ,114 ,115 ,116 ,117 ,118 ,119 ,120 ,121 ,122 ,123 ,124 ,125 ,126 ,127 ,128 ,129 ,130 ,131 ,132 ,133 ,134 ,135 ,136 ,137 ,138 ,139 ,140 ,141 ,142 ,143 ,144 ,145 ,146 ,147 ,148 ,149 ,150 ,151 ,152 ,153 ,154 ,155 ,156 ,157 ,158 ,159 ,160 ,161 ,162 ,163 ,164 ,165 ,166 ,167 ,168 ,169 ,170 ,171 ,172 ,173 ,174 ,175 ,176 ,177 ,178 ,179 ,180 ,181 ,182 ,183 ,184 ,185 ,186 ,187 ,188 ,189 ,190 ,191 ,192 ,193 ,194 ,195 ,196 ,197 ,198 ,199 ,200 ,201 ,202 ,203 ,204 ,205 ,206 ,207 ,208 ,209 ,210 ,211 ,212 ,213 ,214 ,215 ,216 ,217 ,218 ,219 ,220 ,221 ,222 ,223 ,224 ,225 ,226 ,227 ,228 ,229 ,230 ,231 ,232 ,233 ,234 ,235 ,236 ,237 ,238 ,239 ,240 ,241 ,242 ,243 ,244 ,245 ,246 ,247 ,248 ,249 ,250 ,251 ,252 ,253 ,254 ,255 ,256 ,257 ,258 ,259 ,260 ,261 ,262 ,263 ,264 ,265 ,266 ,267 ,268 ,269 ,ABC,ABC",
+      res149.firstMatch("O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC"), 242);
+}
+
diff --git a/tests/corelib/regexp/stack-overflow_test.dart b/tests/corelib/regexp/stack-overflow_test.dart
new file mode 100644
index 0000000..2669b6f
--- /dev/null
+++ b/tests/corelib/regexp/stack-overflow_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=8870">bug 8870</a>: Crash typing in Yahoo auto-complete widget.'
+  );
+
+  var re = new RegExp(r'^(\s+|[,:{}\[\]]|"(\\["\\\/bfnrtu]|[^\u0000-\u001f"\\]+)*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)+$');
+
+  var result= re.firstMatch('{"ResultSet":{"totalResultsAvailable":"101000000","totalResultsReturned":100,"firstResultPosition":1,"Result":[{"Title":"Solar Eclipses of Saros 132","Summary":"Solar Eclipses of Saros 132 Solar Eclipses of Saros 132 The periodicity and recurrence of solar (and lunar) eclipses is governed by the Saros cycle, a period of approximately 6,585. 3 days (18 years 11 days 8 hours). When two eclipses are ...","Url":"http:\\/\\/sunearth.gsfc.nasa.gov\\/eclipse\\/SEsaros\\/SEsaros132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBUBzdmMwF;_ylu=X3oDMTB2cXVjNTM5BGNvbG8DdwRsA1dTMQRwb3MDMQRzZWMDc3IEdnRpZAM-\\/SIG=19ip3vo9u\\/EXP=1147592336\\/**http%3a\\/\\/rdrw1.yahoo.com\\/click%3fu=http%3a\\/\\/sunearth.gsfc.nasa.gov\\/eclipse\\/SEsaros\\/SEsaros132.html%26y=0405DC60F30D6DD673%26i=482%26c=15685%26q=02%255ESSHPM%255BL7.,-6%26e=utf-8%26r=0%26d=wow%7eWBSV-en-us%26n=3O6KG7JU5PIK8T7I%26s=6%26t=%26m=44658D10%26x=05A6B5FDC2F29725CD6EE467684E0FE76D","ModificationDate":1146207600,"MimeType":"text\\/html"},{"Title":"Psalms 132 -Matthew Henry\'s Commentary - Bible Software by johnhurt.com","Summary":"Psalms 132 - Matthew Henry Commentary - Bible Software by johnhurt.com ... Henry\'s Psalms 131. Psalms 132. Outline of Psalms 132. David\'s care for the ark ...","Url":"http:\\/\\/www.htmlbible.com\\/kjv30\\/henry\\/H19C132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBVhzdmMwF;_ylu=X3oDMTB2ZjQ4dDExBGNvbG8DdwRsA1dTMQRwb3MDMgRzZWMDc3IEdnRpZAM-\\/SIG=1246fjpfq\\/EXP=1147592336\\/**http%3a\\/\\/www.htmlbible.com\\/kjv30\\/henry\\/H19C132.htm","ModificationDate":1015660800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBWxzdmMwF;_ylu=X3oDMTBwZG5hOWwzBGNvbG8DdwRwb3MDMgRzZWMDc3IEdnRpZAM-\\/SIG=16llm3b1a\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.htmlbible.com\\/kjv30\\/henry\\/H19C132.htm%26w=132%26d=XlIIG0aqMlsm%26icp=1%26.intl=us","Size":"4160"}},{"Title":"General requirements. - 1910.132","Summary":"General%20requirements.%20-%201910.132 ... Regulations (Standards - 29 CFR) General requirements. - 1910.132 ... of any part of the body through absorption, inhalation or physical contact. 1910.132(b) Employee-owned equipment ...","Url":"http:\\/\\/www.osha.gov\\/pls\\/oshaweb\\/owadisp.show_document?p_table=STANDARDS&p_id=9777","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBXRzdmMwF;_ylu=X3oDMTB2M3MzdmZoBGNvbG8DdwRsA1dTMQRwb3MDMwRzZWMDc3IEdnRpZAM-\\/SIG=13916ebti\\/EXP=1147592336\\/**http%3a\\/\\/www.osha.gov\\/pls\\/oshaweb\\/owadisp.show_document%3fp_table=STANDARDS%26p_id=9777","ModificationDate":1147330800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBYhzdmMwF;_ylu=X3oDMTBwZ2dpZ2ZkBGNvbG8DdwRwb3MDMwRzZWMDc3IEdnRpZAM-\\/SIG=186osem1n\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.osha.gov\\/pls\\/oshaweb\\/owadisp.show_document%253Fp_table%253DSTANDARDS%2526p_id%253D9777%26w=132%26d=Ujn5sEaqMw88%26icp=1%26.intl=us","Size":"29922"}},{"Title":"USCCB - NAB - Psalm 132","Summary":"Chapter 132. 1. 1 A song of ascents. 2 LORD, remember David and all his anxious care; 2. 3 How he swore an oath to the LORD, vowed to the Mighty One of Jacob: 3. \\"I will not enter the house where I live, nor lie on the couch where I sleep; ... 1 [Psalm 132] A song for a liturgical ceremony in which the ark, the throne of Israel\'s God, was carried in ...","Url":"http:\\/\\/www.usccb.org\\/nab\\/bible\\/psalms\\/psalm132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBZBzdmMwF;_ylu=X3oDMTB2OWM1MXQ5BGNvbG8DdwRsA1dTMQRwb3MDNARzZWMDc3IEdnRpZAM-\\/SIG=126n03p75\\/EXP=1147592336\\/**http%3a\\/\\/www.usccb.org\\/nab\\/bible\\/psalms\\/psalm132.htm","ModificationDate":1054623600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBaRzdmMwF;_ylu=X3oDMTBwYzFnNmkxBGNvbG8DdwRwb3MDNARzZWMDc3IEdnRpZAM-\\/SIG=16nvcm74b\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.usccb.org\\/nab\\/bible\\/psalms\\/psalm132.htm%26w=132%26d=FMBGyUaqMh-a%26icp=1%26.intl=us","Size":"8840"}},{"Title":"* City of Lost Dreams Mod *","Summary":"Mafia game modification","Url":"http:\\/\\/www.citizen-132.com\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBaxzdmMwF;_ylu=X3oDMTB2NW50aG1hBGNvbG8DdwRsA1dTMQRwb3MDNQRzZWMDc3IEdnRpZAM-\\/SIG=11fnqlf31\\/EXP=1147592336\\/**http%3a\\/\\/www.citizen-132.com\\/","ModificationDate":1107676800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBcBzdmMwF;_ylu=X3oDMTBwdDJ0dDBoBGNvbG8DdwRwb3MDNQRzZWMDc3IEdnRpZAM-\\/SIG=160jdk4g3\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.citizen-132.com\\/%26w=132%26d=ZiSHAkaqMuny%26icp=1%26.intl=us","Size":"6861"}},{"Title":"BibleGateway.com: Search for a Bible passage in over 35 languages and 50 versions.","Summary":"English (EN) Espa\\u00f1ol (ES) Passage results ... Footnotes: Psalm 132:6 That is, Kiriath Jearim. Psalm 132:6 Or heard of it in ...","Url":"http:\\/\\/www.biblegateway.com\\/passage\\/?book_id=23&chapter=132&version=31","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBchzdmMwF;_ylu=X3oDMTB2azJrdmpwBGNvbG8DdwRsA1dTMQRwb3MDNgRzZWMDc3IEdnRpZAM-\\/SIG=1300p6cfh\\/EXP=1147592336\\/**http%3a\\/\\/www.biblegateway.com\\/passage\\/%3fbook_id=23%26chapter=132%26version=31","ModificationDate":1147158000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBdxzdmMwF;_ylu=X3oDMTBwYmwxdWo4BGNvbG8DdwRwb3MDNgRzZWMDc3IEdnRpZAM-\\/SIG=183q9adk2\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.biblegateway.com\\/passage\\/%253Fbook_id%253D23%2526chapter%253D132%2526version%253D31%26w=132%26d=XUM-1kaqMwKY%26icp=1%26.intl=us","Size":"27373"}},{"Title":"132 - Wikipedia, the free encyclopedia","Summary":"From Wikipedia, the free encyclopedia. This article is about the year. For other uses, see 132 (number). Events. Roman Empire. The Olympeion in Athens is completed ... Your continued donations keep Wikipedia running! 132. From Wikipedia, the free encyclopedia ... For other uses, see 132 (number). Years: 128 129 130 131 - 132 - 133 134 135 136 ...","Url":"http:\\/\\/en.wikipedia.org\\/wiki\\/132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBeRzdmMwF;_ylu=X3oDMTB2bDEyNXM5BGNvbG8DdwRsA1dTMQRwb3MDNwRzZWMDc3IEdnRpZAM-\\/SIG=11k81281i\\/EXP=1147592336\\/**http%3a\\/\\/en.wikipedia.org\\/wiki\\/132","ModificationDate":1145862000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBfhzdmMwF;_ylu=X3oDMTBwMTB0ZWFoBGNvbG8DdwRwb3MDNwRzZWMDc3IEdnRpZAM-\\/SIG=165kmnv8l\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=en.wikipedia.org\\/wiki\\/132%26w=132%26d=OcxF4UaqMuf2%26icp=1%26.intl=us","Size":"15956"}},{"Title":"BBC SPORT | Football | Internationals","Summary":"Visit BBC Sport for all the action as it happens - up-to-the-minute news, results, breaking news, video, audio and feature stories. BBC Sport covers the major events and all the professional football clubs in the UK, plus cricket, rugby, golf, ...","Url":"http:\\/\\/news.bbc.co.uk\\/sport1\\/hi\\/football\\/internationals\\/default.stm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBgBzdmMwF;_ylu=X3oDMTB2bTU4Zm85BGNvbG8DdwRsA1dTMQRwb3MDOARzZWMDc3IEdnRpZAM-\\/SIG=12n3aafin\\/EXP=1147592336\\/**http%3a\\/\\/news.bbc.co.uk\\/sport1\\/hi\\/football\\/internationals\\/default.stm","ModificationDate":1147417200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBhRzdmMwF;_ylu=X3oDMTBwYTZ1aGtmBGNvbG8DdwRwb3MDOARzZWMDc3IEdnRpZAM-\\/SIG=178rplb9d\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=news.bbc.co.uk\\/sport1\\/hi\\/football\\/internationals\\/default.stm%26w=132%26d=PmSx-kaqMw8o%26icp=1%26.intl=us","Size":"52634"}},{"Title":"Metro Route 132 Timetable, Weekday","Summary":"... Custom Print Help. 132. Weekday: Feb. 11 thru June 2, 2006 ...","Url":"http:\\/\\/transit.metrokc.gov\\/tops\\/bus\\/schedules\\/s132_0_.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBhxzdmMwF;_ylu=X3oDMTB2dW8yNmN0BGNvbG8DdwRsA1dTMQRwb3MDOQRzZWMDc3IEdnRpZAM-\\/SIG=12eusl28m\\/EXP=1147592336\\/**http%3a\\/\\/transit.metrokc.gov\\/tops\\/bus\\/schedules\\/s132_0_.html","ModificationDate":1146553200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBjBzdmMwF;_ylu=X3oDMTBwOTRzYmZlBGNvbG8DdwRwb3MDOQRzZWMDc3IEdnRpZAM-\\/SIG=16vd4gkvv\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=transit.metrokc.gov\\/tops\\/bus\\/schedules\\/s132_0_.html%26w=132%26d=Nvq_ekaqMulb%26icp=1%26.intl=us","Size":"27482"}},{"Title":"BBC NEWS | Politics | Bush arrives for state visit","Summary":"George Bush arrives in the UK for the first state visit by a US president amid some of the tightest security London has seen.","Url":"http:\\/\\/news.bbc.co.uk\\/1\\/hi\\/uk_politics\\/3279179.stm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBjhzdmMwF;_ylu=X3oDMTEwc3RuNTk4BGNvbG8DdwRsA1dTMQRwb3MDMTAEc2VjA3NyBHZ0aWQD\\/SIG=126am8694\\/EXP=1147592336\\/**http%3a\\/\\/news.bbc.co.uk\\/1\\/hi\\/uk_politics\\/3279179.stm","ModificationDate":1147417200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBkxzdmMwF;_ylu=X3oDMTBxNTUzbTg4BGNvbG8DdwRwb3MDMTAEc2VjA3NyBHZ0aWQD\\/SIG=16nt5u57o\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=news.bbc.co.uk\\/1\\/hi\\/uk_politics\\/3279179.stm%26w=132%26d=CxDE2UaqMw8U%26icp=1%26.intl=us","Size":"43537"}},{"Title":"132 (number) - Wikipedia, the free encyclopedia","Summary":"... you can make from 132, you get 132: 12 + 13 + 21 + 23 + 31 + 32 = 132. 132 is the smallest number ...","Url":"http:\\/\\/en.wikipedia.org\\/wiki\\/132_(number)","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBlRzdmMwF;_ylu=X3oDMTEwNXN0b3YwBGNvbG8DdwRsA1dTMQRwb3MDMTEEc2VjA3NyBHZ0aWQD\\/SIG=11thbnu67\\/EXP=1147592336\\/**http%3a\\/\\/en.wikipedia.org\\/wiki\\/132_(number)","ModificationDate":1145430000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBmhzdmMwF;_ylu=X3oDMTBxYnA3amlzBGNvbG8DdwRwb3MDMTEEc2VjA3NyBHZ0aWQD\\/SIG=16m4qjjlq\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=en.wikipedia.org\\/wiki\\/132_%2528number%2529%26w=132%26d=Ygdh6EaqMsBb%26icp=1%26.intl=us","Size":"13154"}},{"Title":"Psalms, Chapter 132","Summary":"King James Reference Suite - Bible Software by johnhurt.com ... Chapter 132. 1. Lord, remember David, and all his afflictions ... Notes on Chapter 132. 1. 2. 3 ...","Url":"http:\\/\\/www.htmlbible.com\\/kjv30\\/B19C132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBnBzdmMwF;_ylu=X3oDMTEwNmgxNTZoBGNvbG8DdwRsA1dTMQRwb3MDMTIEc2VjA3NyBHZ0aWQD\\/SIG=11uujk8hq\\/EXP=1147592336\\/**http%3a\\/\\/www.htmlbible.com\\/kjv30\\/B19C132.htm","ModificationDate":1079942400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBoRzdmMwF;_ylu=X3oDMTBxN2cybDkwBGNvbG8DdwRwb3MDMTIEc2VjA3NyBHZ0aWQD\\/SIG=16fpgk3vj\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.htmlbible.com\\/kjv30\\/B19C132.htm%26w=132%26d=TaFtBUaqMwcr%26icp=1%26.intl=us","Size":"8721"}},{"Title":"SPACE.com -- Privately Funded SpaceShipOne Breaks Sound Barrier","Summary":"A privately financed passenger-carrying sub-orbital rocket plane screamed its way through the sound barrier today, the 100th anniversary of the Wright Brothers historic 12-second flight over Kitty Hawk, North Carolina.","Url":"http:\\/\\/www.space.com\\/businesstechnology\\/technology\\/rutan_update_031217.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBoxzdmMwF;_ylu=X3oDMTEwNHRmcnV0BGNvbG8DdwRsA1dTMQRwb3MDMTMEc2VjA3NyBHZ0aWQD\\/SIG=12vltjpcd\\/EXP=1147592336\\/**http%3a\\/\\/www.space.com\\/businesstechnology\\/technology\\/rutan_update_031217.html","ModificationDate":1147330800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBqBzdmMwF;_ylu=X3oDMTBxajcxM3AwBGNvbG8DdwRwb3MDMTMEc2VjA3NyBHZ0aWQD\\/SIG=17g6i6br5\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.space.com\\/businesstechnology\\/technology\\/rutan_update_031217.html%26w=132%26d=CklT2kaqMwqb%26icp=1%26.intl=us","Size":"39319"}},{"Title":"D&C 132","Summary":"THE DOCTRINE AND COVENANTS. SECTION 132 ... LDS HomeScriptures Doctrine and Covenants Sections Section 132. Prev | Next ... SECTION 132. Revelation given through Joseph Smith the Prophet, at Nauvoo, Illinois, recorded July 12, 1843 ...","Url":"http:\\/\\/scriptures.lds.org\\/dc\\/132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBqhzdmMwF;_ylu=X3oDMTEwamo4ZjVjBGNvbG8DdwRsA1dTMQRwb3MDMTQEc2VjA3NyBHZ0aWQD\\/SIG=11k67f7oi\\/EXP=1147592336\\/**http%3a\\/\\/scriptures.lds.org\\/dc\\/132","ModificationDate":1146985200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBrxzdmMwF;_ylu=X3oDMTBxcDhuOXFrBGNvbG8DdwRwb3MDMTQEc2VjA3NyBHZ0aWQD\\/SIG=165qbp40u\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=scriptures.lds.org\\/dc\\/132%26w=132%26d=KIW1S0aqMwF3%26icp=1%26.intl=us","Size":"51549"}},{"Title":"State Representative District 132","Summary":"State Representative District 132. State Representative District 132 is shaded area. SACO. BIDDEFORD. 127. 132. 133. 136. OLD ORCHARD BEACH. SACO","Url":"http:\\/\\/mainegov-images.informe.org\\/sos\\/cec\\/elec\\/apport\\/House\\/h132.pdf","ClickUrl":"http:\\/\\/mainegov-images.informe.org\\/sos\\/cec\\/elec\\/apport\\/House\\/h132.pdf#search=\'\'","ModificationDate":1075968000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBtBzdmMwF;_ylu=X3oDMTBxbnZxbGc1BGNvbG8DdwRwb3MDMTUEc2VjA3NyBHZ0aWQD\\/SIG=17at7erej\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=mainegov-images.informe.org\\/sos\\/cec\\/elec\\/apport\\/House\\/h132.pdf%26w=132%26d=DsRim0aqMiIQ%26icp=1%26.intl=us","Size":"129767"}},{"Title":"BLB Psa 132","Summary":"We apologize, but the page layout is not visible because you are using an older browser. We recommend upgrading to a standards-compliant browser. Without such, this page will remain viewable, though unformatted.","Url":"http:\\/\\/www.blueletterbible.org\\/kjv\\/Psa\\/Psa132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBthzdmMwF;_ylu=X3oDMTEwdXRzN2p1BGNvbG8DdwRsA1dTMQRwb3MDMTYEc2VjA3NyBHZ0aWQD\\/SIG=126nkscdr\\/EXP=1147592336\\/**http%3a\\/\\/www.blueletterbible.org\\/kjv\\/Psa\\/Psa132.html","ModificationDate":1146985200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBuxzdmMwF;_ylu=X3oDMTBxdWpsMnAxBGNvbG8DdwRwb3MDMTYEc2VjA3NyBHZ0aWQD\\/SIG=16nmo95in\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.blueletterbible.org\\/kjv\\/Psa\\/Psa132.html%26w=132%26d=RzXlkkaqMwDE%26icp=1%26.intl=us","Size":"40835"}},{"Title":"ADL Found Guilty Of Spying By California Court","Summary":"ADL Found Guilty Of Spying. By California Court. By Barbara Ferguson. Arab News Correspondent. 4-27-2","Url":"http:\\/\\/www.rense.com\\/general24\\/adl.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBvRzdmMwF;_ylu=X3oDMTEwcm5pb3BuBGNvbG8DdwRsA1dTMQRwb3MDMTcEc2VjA3NyBHZ0aWQD\\/SIG=11qjguns4\\/EXP=1147592336\\/**http%3a\\/\\/www.rense.com\\/general24\\/adl.htm","ModificationDate":1019890800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBwhzdmMwF;_ylu=X3oDMTBxN2RrOGV1BGNvbG8DdwRwb3MDMTcEc2VjA3NyBHZ0aWQD\\/SIG=16bnmcrht\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.rense.com\\/general24\\/adl.htm%26w=132%26d=Xkre4EaqMuwO%26icp=1%26.intl=us","Size":"5916"}},{"Title":"FindLaw for Legal Professionals - Case Law, Federal and State Resources, Forms, and Code","Summary":"FindLaw for Legal Professionals is a free resource for attorneys that includes online case law, free state codes, free federal codes, free legal forms, and a directory of products and services for lawyers. This online legal Web site also includes...","Url":"http:\\/\\/caselaw.lp.findlaw.com\\/cgi-bin\\/getcase.pl?court=US&vol=391&invol=936","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBxBzdmMwF;_ylu=X3oDMTEwa2drb20xBGNvbG8DdwRsA1dTMQRwb3MDMTgEc2VjA3NyBHZ0aWQD\\/SIG=135rsl3q8\\/EXP=1147592336\\/**http%3a\\/\\/caselaw.lp.findlaw.com\\/cgi-bin\\/getcase.pl%3fcourt=US%26vol=391%26invol=936","ModificationDate":1147330800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcByRzdmMwF;_ylu=X3oDMTBxZGJndmNzBGNvbG8DdwRwb3MDMTgEc2VjA3NyBHZ0aWQD\\/SIG=188s7bq1v\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=caselaw.lp.findlaw.com\\/cgi-bin\\/getcase.pl%253Fcourt%253DUS%2526vol%253D391%2526invol%253D936%26w=132%26d=GCWYIUaqMwZK%26icp=1%26.intl=us","Size":"57332"}},{"Title":"Chapter 132","Summary":"... Public Records. \\u00a7 132\\u20101. \\" Public records\\" defined ... Public records, as defined in G.S. 132\\u20101, shall not include written communications (and copies thereof) to any public ...","Url":"http:\\/\\/www.ncleg.net\\/EnactedLegislation\\/Statutes\\/HTML\\/ByChapter\\/Chapter_132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcByxzdmMwF;_ylu=X3oDMTEwdjV0NWw0BGNvbG8DdwRsA1dTMQRwb3MDMTkEc2VjA3NyBHZ0aWQD\\/SIG=1349nldcc\\/EXP=1147592336\\/**http%3a\\/\\/www.ncleg.net\\/EnactedLegislation\\/Statutes\\/HTML\\/ByChapter\\/Chapter_132.html","ModificationDate":1141027200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB0BzdmMwF;_ylu=X3oDMTBxdDJjbXM4BGNvbG8DdwRwb3MDMTkEc2VjA3NyBHZ0aWQD\\/SIG=17lgm2hmb\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.ncleg.net\\/EnactedLegislation\\/Statutes\\/HTML\\/ByChapter\\/Chapter_132.html%26w=132%26d=akl3I0aqMt5y%26icp=1%26.intl=us","Size":"76411"}},{"Title":"oremus Bible Browser : Psalm 132","Summary":"Psalm 132. A Song of Ascents. 1O Lord, remember in David\'s favour. all the hardships he endured; 2how he swore to the Lord. and vowed to the Mighty One of Jacob, 3 I will not enter my house. or get into my bed;","Url":"http:\\/\\/bible.oremus.org\\/?passage=Psalm+132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB0hzdmMwF;_ylu=X3oDMTEwcDU0bmdlBGNvbG8DdwRsA1dTMQRwb3MDMjAEc2VjA3NyBHZ0aWQD\\/SIG=122hghelb\\/EXP=1147592336\\/**http%3a\\/\\/bible.oremus.org\\/%3fpassage=Psalm%2b132","ModificationDate":1138003200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB1xzdmMwF;_ylu=X3oDMTBxbjVuNnZxBGNvbG8DdwRwb3MDMjAEc2VjA3NyBHZ0aWQD\\/SIG=16ppk73gi\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=bible.oremus.org\\/%253Fpassage%253DPsalm%2b132%26w=132%26d=MBPBT0aqMkLR%26icp=1%26.intl=us","Size":"6083"}},{"Title":"Electronic Code of Federal Regulations:","Summary":"... Application of part 132 requirements in Great Lakes States and Tribes ... Appendix A to Part 132 --Great Lakes Water Quality Initiative Methodologies for Development of Aquatic Life ...","Url":"http:\\/\\/ecfr.gpoaccess.gov\\/cgi\\/t\\/text\\/text-idx?c=ecfr&tpl=\\/ecfrbrowse\\/Title40\\/40cfr132_main_02.tpl","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB2RzdmMwF;_ylu=X3oDMTEwMGRnbnZ2BGNvbG8DdwRsA1dTMQRwb3MDMjEEc2VjA3NyBHZ0aWQD\\/SIG=13p811gl2\\/EXP=1147592336\\/**http%3a\\/\\/ecfr.gpoaccess.gov\\/cgi\\/t\\/text\\/text-idx%3fc=ecfr%26tpl=\\/ecfrbrowse\\/Title40\\/40cfr132_main_02.tpl","ModificationDate":1147244400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB3hzdmMwF;_ylu=X3oDMTBxb2QzaXJsBGNvbG8DdwRwb3MDMjEEc2VjA3NyBHZ0aWQD\\/SIG=18m524f9v\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=ecfr.gpoaccess.gov\\/cgi\\/t\\/text\\/text-idx%253Fc%253Decfr%2526tpl%253D\\/ecfrbrowse\\/Title40\\/40cfr132_main_02.tpl%26w=132%26d=OC6Oa0aqMwQa%26icp=1%26.intl=us","Size":"24321"}},{"Title":"BibleGateway.com - Passage Lookup: Psalms 132;","Summary":"English (EN) Espa\\u00f1ol (ES) Passage results ... View commentary related to this passage : Psalm 132. Psalm 132 (Amplified Bible ...","Url":"http:\\/\\/www.biblegateway.com\\/passage?search=Psalms+132;&version=45;","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB4BzdmMwF;_ylu=X3oDMTEwMmJvNjYwBGNvbG8DdwRsA1dTMQRwb3MDMjIEc2VjA3NyBHZ0aWQD\\/SIG=12s5v8a5i\\/EXP=1147592336\\/**http%3a\\/\\/www.biblegateway.com\\/passage%3fsearch=Psalms%2b132;%26version=45;","ModificationDate":1139990400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB5RzdmMwF;_ylu=X3oDMTBxOTdwc3RpBGNvbG8DdwRwb3MDMjIEc2VjA3NyBHZ0aWQD\\/SIG=1810cufkn\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.biblegateway.com\\/passage%253Fsearch%253DPsalms%2b132%253B%2526version%253D45%253B%26w=132%26d=KJ4R3EaqMjLm%26icp=1%26.intl=us","Size":"27611"}},{"Title":"N-132: Wu-ftpd Buffer Overflow Vulnerability","Summary":"INFORMATION BULLETIN. N-132: Wu-ftpd Buffer Overflow Vulnerability. [Red Hat Security Advisory RHSA-2003:245-15] July 31, 2003 18:00 GMT. [Revised 13 Aug 2003] [Revised 14 Aug 2003] [Revised 5 Sept 2003] [Revised 8 Oct 2003]","Url":"http:\\/\\/www.ciac.org\\/ciac\\/bulletins\\/n-132.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB5xzdmMwF;_ylu=X3oDMTEwZXVqN2J0BGNvbG8DdwRsA1dTMQRwb3MDMjMEc2VjA3NyBHZ0aWQD\\/SIG=122msf6uh\\/EXP=1147592336\\/**http%3a\\/\\/www.ciac.org\\/ciac\\/bulletins\\/n-132.shtml","ModificationDate":1146812400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB7BzdmMwF;_ylu=X3oDMTBxbm8wZ2ZmBGNvbG8DdwRwb3MDMjMEc2VjA3NyBHZ0aWQD\\/SIG=16jq98ra6\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.ciac.org\\/ciac\\/bulletins\\/n-132.shtml%26w=132%26d=cBzeO0aqMu2t%26icp=1%26.intl=us","Size":"12337"}},{"Title":"Bumpy Objects","Summary":"Bumpy Objects","Url":"http:\\/\\/acm.uva.es\\/p\\/v1\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB7hzdmMwF;_ylu=X3oDMTEwZmNyM2VjBGNvbG8DdwRsA1dTMQRwb3MDMjQEc2VjA3NyBHZ0aWQD\\/SIG=11j1o5t64\\/EXP=1147592336\\/**http%3a\\/\\/acm.uva.es\\/p\\/v1\\/132.html","ModificationDate":1057820400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB8xzdmMwF;_ylu=X3oDMTBxNWw4M3FvBGNvbG8DdwRwb3MDMjQEc2VjA3NyBHZ0aWQD\\/SIG=164vlv52k\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=acm.uva.es\\/p\\/v1\\/132.html%26w=132%26d=ZSctVkaqMvQs%26icp=1%26.intl=us","Size":"2803"}},{"Title":"The Hayes memo is important\\u2014but bogus. By Daniel Benjamin","Summary":"When they published their \\" Case Closed\\" cover story three weeks ago on the relationship between Saddam Hussein\'s Iraq and al-Qaida, the editors of the Weekly Standard aimed to set off a bomb. The article was centered on a sizable leak\\u2014a gusher...","Url":"http:\\/\\/www.slate.com\\/id\\/2092180\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB9RzdmMwF;_ylu=X3oDMTEwamxzbHY1BGNvbG8DdwRsA1dTMQRwb3MDMjUEc2VjA3NyBHZ0aWQD\\/SIG=11kj0d4q1\\/EXP=1147592336\\/**http%3a\\/\\/www.slate.com\\/id\\/2092180\\/","ModificationDate":1147071600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB.hzdmMwF;_ylu=X3oDMTBxdGc1MmltBGNvbG8DdwRwb3MDMjUEc2VjA3NyBHZ0aWQD\\/SIG=16507c1iu\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=slate.msn.com\\/id\\/2092180\\/%26w=132%26d=bWigBUaqMvyd%26icp=1%26.intl=us","Size":"40222"}},{"Title":"FNMOC WXMAP: North America","Summary":"UNCLASSIFIED. FNMOC WXMAP. Model: NOGAPS. Area: North America. DTG: 2006050500. UNCLASSIFIED","Url":"https:\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi?area=ngp_namer&prod=850&tau=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB_BzdmMwF;_ylu=X3oDMTEwNDNwbjA5BGNvbG8DdwRsA1dTMQRwb3MDMjYEc2VjA3NyBHZ0aWQD\\/SIG=13g43sejj\\/EXP=1147592336\\/**https%3a\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi%3farea=ngp_namer%26prod=850%26tau=132","ModificationDate":1146812400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBAR3dmMwF;_ylu=X3oDMTBxN2ZrcnVrBGNvbG8DdwRwb3MDMjYEc2VjA3NyBHZ0aWQD\\/SIG=18s7gc72v\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=https%3a\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi%253Farea%253Dngp_namer%2526prod%253D850%2526tau%253D132%26w=132%26d=KiW5fUaqMvIm%26icp=1%26.intl=us","Size":"9048"}},{"Title":"O-132: BEA WebLogic Server and Express Certificate Spoofing Vulnerability","Summary":"INFORMATION BULLETIN. O-132: BEA WebLogic Server and Express Certificate Spoofing Vulnerability. [BEA Security Advisory: BEA04-54.00] April 30, 2004 20:00 GMT. PROBLEM:","Url":"http:\\/\\/ciac.llnl.gov\\/ciac\\/bulletins\\/o-132.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBAx3dmMwF;_ylu=X3oDMTEwb2lhN21nBGNvbG8DdwRsA1dTMQRwb3MDMjcEc2VjA3NyBHZ0aWQD\\/SIG=1231gt787\\/EXP=1147592336\\/**http%3a\\/\\/ciac.llnl.gov\\/ciac\\/bulletins\\/o-132.shtml","ModificationDate":1142064000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBCB3dmMwF;_ylu=X3oDMTBxaGVsMDBlBGNvbG8DdwRwb3MDMjcEc2VjA3NyBHZ0aWQD\\/SIG=16k4puak0\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=ciac.llnl.gov\\/ciac\\/bulletins\\/o-132.shtml%26w=132%26d=ZZgzx0aqMjzn%26icp=1%26.intl=us","Size":"10701"}},{"Title":"NET Bible\\u00ae - Psalms 132","Summary":"... Psalms 132. Psalm 1321. A song of ascents.2. 132:1 O Lord, for David\'s sake remember ...","Url":"http:\\/\\/www.bible.org\\/netbible\\/psa132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBCh3dmMwF;_ylu=X3oDMTEwYjBiNjdsBGNvbG8DdwRsA1dTMQRwb3MDMjgEc2VjA3NyBHZ0aWQD\\/SIG=11sp4034c\\/EXP=1147592336\\/**http%3a\\/\\/www.bible.org\\/netbible\\/psa132.htm","ModificationDate":1133769600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBDx3dmMwF;_ylu=X3oDMTBxOWNtc2JjBGNvbG8DdwRwb3MDMjgEc2VjA3NyBHZ0aWQD\\/SIG=16duuokm4\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.bible.org\\/netbible\\/psa132.htm%26w=132%26d=aVzzT0aqMwNl%26icp=1%26.intl=us","Size":"6048"}},{"Title":"HoustonChronicle.com - Sports: Fran Blinebury","Summary":"06, 2006. Column archive 2002. [an error occurred while processing this directive]","Url":"http:\\/\\/www.chron.com\\/content\\/chronicle\\/sports\\/blinebury\\/home","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBER3dmMwF;_ylu=X3oDMTEwcmlvNjMyBGNvbG8DdwRsA1dTMQRwb3MDMjkEc2VjA3NyBHZ0aWQD\\/SIG=12gac009r\\/EXP=1147592336\\/**http%3a\\/\\/www.chron.com\\/content\\/chronicle\\/sports\\/blinebury\\/home","ModificationDate":1146898800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBFh3dmMwF;_ylu=X3oDMTBxNTVsY25mBGNvbG8DdwRwb3MDMjkEc2VjA3NyBHZ0aWQD\\/SIG=171sgehbh\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.chron.com\\/content\\/chronicle\\/sports\\/blinebury\\/home%26w=132%26d=I3QMYEaqMuxa%26icp=1%26.intl=us","Size":"27335"}},{"Title":"FNMOC WXMAP: North America","Summary":"UNCLASSIFIED. FNMOC WXMAP. Model: NOGAPS. Area: North America. DTG: 2006050512. UNCLASSIFIED","Url":"https:\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi?area=ngp_namer&prod=prp&tau=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBGB3dmMwF;_ylu=X3oDMTEwN2g4ZWdqBGNvbG8DdwRsA1dTMQRwb3MDMzAEc2VjA3NyBHZ0aWQD\\/SIG=13g08kode\\/EXP=1147592336\\/**https%3a\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi%3farea=ngp_namer%26prod=prp%26tau=132","ModificationDate":1146812400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBHR3dmMwF;_ylu=X3oDMTBxaGdhODhjBGNvbG8DdwRwb3MDMzAEc2VjA3NyBHZ0aWQD\\/SIG=18solhmco\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=https%3a\\/\\/www.fnmoc.navy.mil\\/CGI\\/PUBLIC\\/wxmap_single.cgi%253Farea%253Dngp_namer%2526prod%253Dprp%2526tau%253D132%26w=132%26d=MKdCgkaqMuri%26icp=1%26.intl=us","Size":"9048"}},{"Title":"US CODE: Title 36,132. National School Lunch Week","Summary":"National School Lunch Week. Release date: 2005-10-11. (a) Designation.\\u2014. The week beginning on the second Sunday in October is National School Lunch Week. (b) Proclamation.\\u2014 ... TITLE 36 &gt; Subtitle I &gt; Part A &gt; CHAPTER 1 &gt; \\u00a7 132. Prev | Next. \\u00a7 132. National School Lunch Week ...","Url":"http:\\/\\/www4.law.cornell.edu\\/uscode\\/html\\/uscode36\\/usc_sec_36_00000132----000-.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBHx3dmMwF;_ylu=X3oDMTEwN3BsMm9vBGNvbG8DdwRsA1dTMQRwb3MDMzEEc2VjA3NyBHZ0aWQD\\/SIG=1359dp76s\\/EXP=1147592336\\/**http%3a\\/\\/www4.law.cornell.edu\\/uscode\\/html\\/uscode36\\/usc_sec_36_00000132----000-.html","ModificationDate":1145343600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBJB3dmMwF;_ylu=X3oDMTBxNG81cnMxBGNvbG8DdwRwb3MDMzEEc2VjA3NyBHZ0aWQD\\/SIG=17m1he9ur\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www4.law.cornell.edu\\/uscode\\/html\\/uscode36\\/usc_sec_36_00000132----000-.html%26w=132%26d=NTi8bUaqMpvs%26icp=1%26.intl=us","Size":"8976"}},{"Title":"ATel #132: IGR J17464-3213","Summary":"Outside. Other. Present Time: 7 May 2006; 4:08 UT. RSS. XML Gamma Ray Bursts. IGR J17464-3213 ... IGR J17464-3213. ATel #132; M. Revnivtsev (IKI, Moscow; MPA, Garching), M ... XTE J1746-322 = IGR J17464-3213 = H1743-322. 132. IGR J17464-3213 ...","Url":"http:\\/\\/www.astronomerstelegram.org\\/?read=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBJh3dmMwF;_ylu=X3oDMTEwYWI0N2o2BGNvbG8DdwRsA1dTMQRwb3MDMzIEc2VjA3NyBHZ0aWQD\\/SIG=122qvcsd1\\/EXP=1147592336\\/**http%3a\\/\\/www.astronomerstelegram.org\\/%3fread=132","ModificationDate":1146985200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBKx3dmMwF;_ylu=X3oDMTBxYmt2ZDZzBGNvbG8DdwRwb3MDMzIEc2VjA3NyBHZ0aWQD\\/SIG=16pipao89\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.astronomerstelegram.org\\/%253Fread%253D132%26w=132%26d=Pb4lcUaqMvBj%26icp=1%26.intl=us","Size":"9056"}},{"Title":"Vashegyite Mineral Data","Summary":"Vashegyite Mineral Data + General Vashegyite Information. Chemical Formula: Al11(PO4)9(OH)6\\u00b738(H2O) or Al6(PO4)5(OH)3\\u00b723(H2O) Composition: Molecular Weight = 1,938.16 gm. Aluminum 15.31 % Al 28.93 % Al2O3","Url":"http:\\/\\/www.webmineral.com\\/data\\/Vashegyite.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBLR3dmMwF;_ylu=X3oDMTEwNHFvMGppBGNvbG8DdwRsA1dTMQRwb3MDMzMEc2VjA3NyBHZ0aWQD\\/SIG=123ajp144\\/EXP=1147592336\\/**http%3a\\/\\/www.webmineral.com\\/data\\/Vashegyite.shtml","ModificationDate":1146898800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBMh3dmMwF;_ylu=X3oDMTBxNzAwNWY0BGNvbG8DdwRwb3MDMzMEc2VjA3NyBHZ0aWQD\\/SIG=16ktl9ibf\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.webmineral.com\\/data\\/Vashegyite.shtml%26w=132%26d=W38GQkaqMvCt%26icp=1%26.intl=us","Size":"29234"}},{"Title":"2003 CFR Title 40, Volume 19","Summary":"... CHAPTER I--ENVIRONMENTAL PROTECTION AGENCY. PART 132--WATER QUALITY GUIDANCE FOR THE GREAT LAKES SYSTEM. 132.1. Scope, purpose, and availability of documents ...","Url":"http:\\/\\/www.access.gpo.gov\\/nara\\/cfr\\/waisidx_03\\/40cfr132_03.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBNB3dmMwF;_ylu=X3oDMTEwdHZ0ZXZxBGNvbG8DdwRsA1dTMQRwb3MDMzQEc2VjA3NyBHZ0aWQD\\/SIG=12imj9jh5\\/EXP=1147592336\\/**http%3a\\/\\/www.access.gpo.gov\\/nara\\/cfr\\/waisidx_03\\/40cfr132_03.html","ModificationDate":1123916400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBOR3dmMwF;_ylu=X3oDMTBxcml1MjI5BGNvbG8DdwRwb3MDMzQEc2VjA3NyBHZ0aWQD\\/SIG=173ahs683\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.access.gpo.gov\\/nara\\/cfr\\/waisidx_03\\/40cfr132_03.html%26w=132%26d=c8h16UaqMjB2%26icp=1%26.intl=us","Size":"4704"}},{"Title":"Chapter HFS 132","Summary":"... 145. HFS 132.13. DEPARTMENT OF HEALTH AND FAMILY SERVICES ... Subchapter I \\u2014 General. HFS 132.11. Statutory authority. HFS 132.12 ...","Url":"http:\\/\\/www.legis.state.wi.us\\/rsb\\/code\\/hfs\\/hfs132.pdf","ClickUrl":"http:\\/\\/www.legis.state.wi.us\\/rsb\\/code\\/hfs\\/hfs132.pdf#search=\'\'","ModificationDate":1099033200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBPh3dmMwF;_ylu=X3oDMTBxaXI5cmVpBGNvbG8DdwRwb3MDMzUEc2VjA3NyBHZ0aWQD\\/SIG=16p8cmh99\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.legis.state.wi.us\\/rsb\\/code\\/hfs\\/hfs132.pdf%26w=132%26d=CN-yI0aqMkhi%26icp=1%26.intl=us","Size":"283151"}},{"Title":"U.S. Senate: Legislation & Records Home &gt; Votes &gt; Roll Call Vote","Summary":"... Vote Number: 132. Vote Date: June 8, 2005, 05:30 PM ...","Url":"http:\\/\\/www.senate.gov\\/legislative\\/LIS\\/roll_call_lists\\/roll_call_vote_cfm.cfm?congress=109&session=1&vote=00132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBQB3dmMwF;_ylu=X3oDMTEwdTlzNmU2BGNvbG8DdwRsA1dTMQRwb3MDMzYEc2VjA3NyBHZ0aWQD\\/SIG=148g3pmm4\\/EXP=1147592336\\/**http%3a\\/\\/www.senate.gov\\/legislative\\/LIS\\/roll_call_lists\\/roll_call_vote_cfm.cfm%3fcongress=109%26session=1%26vote=00132","ModificationDate":1143360000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBRR3dmMwF;_ylu=X3oDMTBxOTlsaWYxBGNvbG8DdwRwb3MDMzYEc2VjA3NyBHZ0aWQD\\/SIG=19b3rasjc\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.senate.gov\\/legislative\\/LIS\\/roll_call_lists\\/roll_call_vote_cfm.cfm%253Fcongress%253D109%2526session%253D1%2526vote%253D00132%26w=132%26d=dtev60aqMh1g%26icp=1%26.intl=us","Size":"51433"}},{"Title":"Storm Prediction Center Tornado Watch 132","Summary":"Severe weather, tornado, thunderstorm, fire weather, storm report, tornado watch, severe thunderstorm watch, mesoscale discussion, convective outlook products from the Storm Prediction Center. ... SEL2 URGENT - IMMEDIATE BROADCAST REQUESTED TORNADO WATCH NUMBER 132 NWS STORM PREDICTION CENTER NORMAN OK 325 PM CDT ...","Url":"http:\\/\\/www.spc.noaa.gov\\/products\\/watch\\/ww0132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBRx3dmMwF;_ylu=X3oDMTEwanQ3MzU2BGNvbG8DdwRsA1dTMQRwb3MDMzcEc2VjA3NyBHZ0aWQD\\/SIG=126urlun7\\/EXP=1147592336\\/**http%3a\\/\\/www.spc.noaa.gov\\/products\\/watch\\/ww0132.html","ModificationDate":1146812400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBTB3dmMwF;_ylu=X3oDMTBxNDRkc3R1BGNvbG8DdwRwb3MDMzcEc2VjA3NyBHZ0aWQD\\/SIG=16n3e4s74\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.spc.noaa.gov\\/products\\/watch\\/ww0132.html%26w=132%26d=N4g-pUaqMusz%26icp=1%26.intl=us","Size":"19990"}},{"Title":"PLANT PHYSIOLOGY ONLINE -- Table of Contents (132 [2])","Summary":"To see an article, click its [Full Text] link. To review many abstracts, check the boxes to the left of the titles you want, and click the \'Get All Checked Abstract(s)\' button. To see one abstract at a time, click its [Abstract] link.","Url":"http:\\/\\/www.plantphysiol.org\\/content\\/vol132\\/issue2\\/index.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBTh3dmMwF;_ylu=X3oDMTEwa2NtaWpsBGNvbG8DdwRsA1dTMQRwb3MDMzgEc2VjA3NyBHZ0aWQD\\/SIG=12hg0jpkp\\/EXP=1147592336\\/**http%3a\\/\\/www.plantphysiol.org\\/content\\/vol132\\/issue2\\/index.shtml","ModificationDate":1141804800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBUx3dmMwF;_ylu=X3oDMTBxYnZvM21yBGNvbG8DdwRwb3MDMzgEc2VjA3NyBHZ0aWQD\\/SIG=172cps28k\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.plantphysiol.org\\/content\\/vol132\\/issue2\\/index.shtml%26w=132%26d=Yvs4KUaqMjZc%26icp=1%26.intl=us","Size":"79038"}},{"Title":"AgGPS 132","Summary":"... The AgGPS 132 outputs sub- meter accuracy DGPS positions ... lightbar is connected to the. AgGPS 132. The AgGPS 132. can output positions up to 10 ...","Url":"http:\\/\\/www.farmgis.com\\/products\\/hardware\\/gps\\/aggps132.pdf","ClickUrl":"http:\\/\\/www.farmgis.com\\/products\\/hardware\\/gps\\/aggps132.pdf#search=\'\'","ModificationDate":1098169200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBWB3dmMwF;_ylu=X3oDMTBxcXNibWtvBGNvbG8DdwRwb3MDMzkEc2VjA3NyBHZ0aWQD\\/SIG=16us46bp9\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.farmgis.com\\/products\\/hardware\\/gps\\/aggps132.pdf%26w=132%26d=EvLM70aqMkiV%26icp=1%26.intl=us","Size":"162160"}},{"Title":"Chapter 132 \\u2014 Grand Jury, Indictments and Other Accusatory Instruments","Summary":"The text appearing in this database was produced from material provided by the Legislative Counsel Committee of the Oregon Legislative Assembly. The official record copy is the printed published copy of the Oregon Revised Statutes. ... 132.010 Composition. A grand jury is a body of seven persons drawn from the jurors in attendance ... 132.030 Challenge of juror prohibited; when juror may be excused. Neither ...","Url":"http:\\/\\/www.leg.state.or.us\\/ors\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBWh3dmMwF;_ylu=X3oDMTEwYTAzbTUxBGNvbG8DdwRsA1dTMQRwb3MDNDAEc2VjA3NyBHZ0aWQD\\/SIG=11r91jes0\\/EXP=1147592336\\/**http%3a\\/\\/www.leg.state.or.us\\/ors\\/132.html","ModificationDate":1144220400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBXx3dmMwF;_ylu=X3oDMTBxdGU5a2FhBGNvbG8DdwRwb3MDNDAEc2VjA3NyBHZ0aWQD\\/SIG=16cbqvrlb\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.leg.state.or.us\\/ors\\/132.html%26w=132%26d=MFh3EUaqMk41%26icp=1%26.intl=us","Size":"73717"}},{"Title":"Downloaded 19 Aug 2002 to 132.163.136.56. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip... ","Summary":"Downloaded 19 Aug 2002 to 132.163.136.56. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/japo\\/japcr.jsp. Downloaded 19 Aug 2002 to 132.163.136.56.","Url":"http:\\/\\/tf.nist.gov\\/general\\/pdf\\/550.pdf","ClickUrl":"http:\\/\\/tf.nist.gov\\/general\\/pdf\\/550.pdf#search=\'\'","ModificationDate":1029740400,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBZB3dmMwF;_ylu=X3oDMTBxcDdtZjJoBGNvbG8DdwRwb3MDNDEEc2VjA3NyBHZ0aWQD\\/SIG=16bgqks5e\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=tf.nist.gov\\/general\\/pdf\\/550.pdf%26w=132%26d=PNXPXkaqMkLS%26icp=1%26.intl=us","Size":"2485625"}},{"Title":"Father Tom Inspired Pflugerville #132 To Evolve Into A Strong Fraternal Society","Summary":"... Monsignor Tom Frank is presented with the 2002 Society #132. Service Award by President Ray Pokorney ... ach year Society #132. of Pflugerville honors ...","Url":"http:\\/\\/www.kjtnet.org\\/web\\/benefits\\/newsletter\\/march03.pdf","ClickUrl":"http:\\/\\/www.kjtnet.org\\/web\\/benefits\\/newsletter\\/march03.pdf#search=\'\'","ModificationDate":1105603200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBaR3dmMwF;_ylu=X3oDMTBxMWU2b2h1BGNvbG8DdwRwb3MDNDIEc2VjA3NyBHZ0aWQD\\/SIG=16u12rqgg\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.kjtnet.org\\/web\\/benefits\\/newsletter\\/march03.pdf%26w=132%26d=fjH4hEaqMwZd%26icp=1%26.intl=us","Size":"2791412"}},{"Title":"Alsakharovite-Zn Mineral Data","Summary":"Alsakharovite-Zn Mineral Data. [Log In] [Current Auction] [Register to Bid] [FAQ] [About Us] Tired of Ebay rip-offs, scams, and dishonest people?","Url":"http:\\/\\/www.webmineral.com\\/data\\/Alsakharovite-Zn.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBax3dmMwF;_ylu=X3oDMTEwN2JwMzlhBGNvbG8DdwRsA1dTMQRwb3MDNDMEc2VjA3NyBHZ0aWQD\\/SIG=129j54b3c\\/EXP=1147592336\\/**http%3a\\/\\/www.webmineral.com\\/data\\/Alsakharovite-Zn.shtml","ModificationDate":1147158000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBcB3dmMwF;_ylu=X3oDMTBxamhmc2lnBGNvbG8DdwRwb3MDNDMEc2VjA3NyBHZ0aWQD\\/SIG=16q6pnttb\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.webmineral.com\\/data\\/Alsakharovite-Zn.shtml%26w=132%26d=B_smj0aqMwJU%26icp=1%26.intl=us","Size":"38594"}},{"Title":"Psalm 132","Summary":"... Psalm 132. The Eternal Dwelling of God in Zion ...","Url":"http:\\/\\/www.hope.edu\\/academic\\/religion\\/bandstra\\/BIBLE\\/PSA\\/PSA132.HTM","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBch3dmMwF;_ylu=X3oDMTEwdXE2dm1tBGNvbG8DdwRsA1dTMQRwb3MDNDQEc2VjA3NyBHZ0aWQD\\/SIG=12n448u4t\\/EXP=1147592336\\/**http%3a\\/\\/www.hope.edu\\/academic\\/religion\\/bandstra\\/BIBLE\\/PSA\\/PSA132.HTM","ModificationDate":1114758000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBdx3dmMwF;_ylu=X3oDMTBxMjBjZXRuBGNvbG8DdwRwb3MDNDQEc2VjA3NyBHZ0aWQD\\/SIG=17829d5da\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.hope.edu\\/academic\\/religion\\/bandstra\\/BIBLE\\/PSA\\/PSA132.HTM%26w=132%26d=Gs9Yt0aqMhg_%26icp=1%26.intl=us","Size":"5137"}},{"Title":"Bug 132 - Heartbeat requires all nodes to be pre-configured in ha.cf","Summary":"... Bugzilla Bug 132. Heartbeat requires all nodes to be pre-configured in ha.cf ... Bug#: 132. Platform: All DEC HP Macintosh PC SGI Sun Other ...","Url":"http:\\/\\/www.osdl.org\\/developer_bugzilla\\/show_bug.cgi?id=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBeR3dmMwF;_ylu=X3oDMTEwa3QxajIyBGNvbG8DdwRsA1dTMQRwb3MDNDUEc2VjA3NyBHZ0aWQD\\/SIG=12g1vvd06\\/EXP=1147592336\\/**http%3a\\/\\/www.osdl.org\\/developer_bugzilla\\/show_bug.cgi%3fid=132","ModificationDate":1146553200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBfh3dmMwF;_ylu=X3oDMTBxbHY2NGw5BGNvbG8DdwRwb3MDNDUEc2VjA3NyBHZ0aWQD\\/SIG=177hj2go7\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.osdl.org\\/developer_bugzilla\\/show_bug.cgi%253Fid%253D132%26w=132%26d=Uzd0n0aqMtwg%26icp=1%26.intl=us","Size":"40101"}},{"Title":"Bug 132 - ChargeDispositionPlea and ChargeDispositionVerdict","Summary":"... Bugzilla Bug 132. ChargeDispositionPlea and ChargeDispositionVerdict ... Bug#: 132. Domain: AAMVA Corrections Courts Juvenile Law Enforcement Parole Probation Prosecution Other ...","Url":"http:\\/\\/justicexml.gtri.gatech.edu\\/feedback\\/show_bug.cgi?id=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBgB3dmMwF;_ylu=X3oDMTEwdmhtYjA4BGNvbG8DdwRsA1dTMQRwb3MDNDYEc2VjA3NyBHZ0aWQD\\/SIG=12klknku3\\/EXP=1147592336\\/**http%3a\\/\\/justicexml.gtri.gatech.edu\\/feedback\\/show_bug.cgi%3fid=132","ModificationDate":1143360000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBhR3dmMwF;_ylu=X3oDMTBxa2g2bWNnBGNvbG8DdwRwb3MDNDYEc2VjA3NyBHZ0aWQD\\/SIG=17bcs6mrt\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=justicexml.gtri.gatech.edu\\/feedback\\/show_bug.cgi%253Fid%253D132%26w=132%26d=e0Zoy0aqMjBn%26icp=1%26.intl=us","Size":"16410"}},{"Title":"Publications","Summary":"... Bulletin 132, Management of the California State Water Project, is a series of annual reports that describe the ... annual Appendix E to Bulletin 132 and the final edition of the ...","Url":"http:\\/\\/www.swpao.water.ca.gov\\/publications","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBhx3dmMwF;_ylu=X3oDMTEwZjVhYXMzBGNvbG8DdwRsA1dTMQRwb3MDNDcEc2VjA3NyBHZ0aWQD\\/SIG=11ud1cv0a\\/EXP=1147592336\\/**http%3a\\/\\/www.swpao.water.ca.gov\\/publications","ModificationDate":1143187200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBjB3dmMwF;_ylu=X3oDMTBxcjNocmY0BGNvbG8DdwRwb3MDNDcEc2VjA3NyBHZ0aWQD\\/SIG=16fvue890\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.swpao.water.ca.gov\\/publications%26w=132%26d=CDqKvkaqMhfi%26icp=1%26.intl=us","Size":"27835"}},{"Title":"Sampling at Head Crater and Bench Crater","Summary":"... 132:10:41 Bean: Boy, this Hand Tool Carrier is light and nice compared to carrying it around ... 132:11:20 Bean: I can see everything from fine-grain basalt ...","Url":"http:\\/\\/www.hq.nasa.gov\\/alsj\\/a12\\/a12.head_bench.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBjh3dmMwF;_ylu=X3oDMTEwYjFmcHI4BGNvbG8DdwRsA1dTMQRwb3MDNDgEc2VjA3NyBHZ0aWQD\\/SIG=127h6jrgp\\/EXP=1147592336\\/**http%3a\\/\\/www.hq.nasa.gov\\/alsj\\/a12\\/a12.head_bench.html","ModificationDate":1139731200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBkx3dmMwF;_ylu=X3oDMTBxazBuMTN2BGNvbG8DdwRwb3MDNDgEc2VjA3NyBHZ0aWQD\\/SIG=16of05gsq\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.hq.nasa.gov\\/alsj\\/a12\\/a12.head_bench.html%26w=132%26d=O2JTbEaqMul1%26icp=1%26.intl=us","Size":"91895"}},{"Title":"Psalms 132","Summary":"Psalms 132. 132:1 A Song of degrees.","Url":"http:\\/\\/www.masterstech-home.com\\/The_Library\\/The_Bible\\/Bible_Chapters\\/Psalms\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBlR3dmMwF;_ylu=X3oDMTEwOG85MWM5BGNvbG8DdwRsA1dTMQRwb3MDNDkEc2VjA3NyBHZ0aWQD\\/SIG=1381oeor0\\/EXP=1147592336\\/**http%3a\\/\\/www.masterstech-home.com\\/The_Library\\/The_Bible\\/Bible_Chapters\\/Psalms\\/132.html","ModificationDate":1135152000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBmh3dmMwF;_ylu=X3oDMTBxNWpuM3FoBGNvbG8DdwRwb3MDNDkEc2VjA3NyBHZ0aWQD\\/SIG=17p7bjs0u\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.masterstech-home.com\\/The_Library\\/The_Bible\\/Bible_Chapters\\/Psalms\\/132.html%26w=132%26d=TUYYg0aqMhg4%26icp=1%26.intl=us","Size":"11669"}},{"Title":"California Highways (www.cahighways.org): Routes 129 through 136","Summary":"... The 2005 Transportation Bill included \$14.4 million to widen Route 132 from Route 99 west to Dakota Avenue ... between Coulterville and Mariposa was cosigned as Route 49 and Route 132 ...","Url":"http:\\/\\/www.cahighways.org\\/129-136.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBnB3dmMwF;_ylu=X3oDMTEwaXBqZ2lxBGNvbG8DdwRsA1dTMQRwb3MDNTAEc2VjA3NyBHZ0aWQD\\/SIG=11q1ne7f6\\/EXP=1147592336\\/**http%3a\\/\\/www.cahighways.org\\/129-136.html","ModificationDate":1145689200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBoR3dmMwF;_ylu=X3oDMTBxbmZjMXVuBGNvbG8DdwRwb3MDNTAEc2VjA3NyBHZ0aWQD\\/SIG=16bhah065\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.cahighways.org\\/129-136.html%26w=132%26d=fRBtE0aqMqve%26icp=1%26.intl=us","Size":"49110"}},{"Title":"Downloaded 11 Nov 2002 to 132.64.1.37. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 11 Nov 2002 to 132.64.1.37. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/rsio\\/rsicr.jsp. Downloaded 11 Nov 2002 to 132.64.1.37.","Url":"http:\\/\\/chem.ch.huji.ac.il\\/~porath\\/NST2\\/Lecture%205\\/Kuk%20and%20Silverman%20Rev_Sci_Inst_60_165_1989.pdf","ClickUrl":"http:\\/\\/chem.ch.huji.ac.il\\/~porath\\/NST2\\/Lecture%205\\/Kuk%20and%20Silverman%20Rev_Sci_Inst_60_165_1989.pdf#search=\'\'","ModificationDate":1069660800,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBph3dmMwF;_ylu=X3oDMTBxZHJldXUyBGNvbG8DdwRwb3MDNTEEc2VjA3NyBHZ0aWQD\\/SIG=190pnnu1n\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=chem.ch.huji.ac.il\\/%257Eporath\\/NST2\\/Lecture%2525205\\/Kuk%252520and%252520Silverman%252520Rev_Sci_Inst_60_165_1989.pdf%26w=132%26d=F4c-T0aqMhfn%26icp=1%26.intl=us","Size":"3386219"}},{"Title":"Phelps Personnel Associates","Summary":"Welcome to Phelps Personnel Associates. Recruiting and Placing Engineers and Management Professionals since 1976. Concentration in the Carolinas and Southeastern job market. Permanent, Company fee-paid positions only. Confidential, courteous service","Url":"http:\\/\\/www.phelpspersonnel.com\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBqB3dmMwF;_ylu=X3oDMTEwazlldjdwBGNvbG8DdwRsA1dTMQRwb3MDNTIEc2VjA3NyBHZ0aWQD\\/SIG=11j85rkug\\/EXP=1147592336\\/**http%3a\\/\\/www.phelpspersonnel.com\\/","ModificationDate":1060239600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBrR3dmMwF;_ylu=X3oDMTBxZWJqMW1lBGNvbG8DdwRwb3MDNTIEc2VjA3NyBHZ0aWQD\\/SIG=164jn86me\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.phelpspersonnel.com\\/%26w=132%26d=KRPdjUaqMwQa%26icp=1%26.intl=us","Size":"6288"}},{"Title":"132 - Loss and resumption of Australian citizenship - Declaration of desre to resume Australian citizenship under ... ","Summary":"... retain another citizenship \\u0096 be under the age of 25 years. 132 (Design date 0705) - Page 1 ... 23A, 23AA, 23AB or 23B. 132 (Design date 0705) - Page 2 ...","Url":"http:\\/\\/www.immi.gov.au\\/allforms\\/pdf\\/132.pdf","ClickUrl":"http:\\/\\/www.immi.gov.au\\/allforms\\/pdf\\/132.pdf#search=\'\'","ModificationDate":1141113600,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBsh3dmMwF;_ylu=X3oDMTBxYzdmNTNvBGNvbG8DdwRwb3MDNTMEc2VjA3NyBHZ0aWQD\\/SIG=16gtd8vkd\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.immi.gov.au\\/allforms\\/pdf\\/132.pdf%26w=132%26d=XLvxbUaqMvqk%26icp=1%26.intl=us","Size":"118238"}},{"Title":"Communication Workersof America Local 3808","Summary":"News Highlights and Headlines. Nominations for one (1) 402 Franklin Road Area Representative will be taken at the June 6, 2006 Membership Meeting. BellSouth CONTRACT INFO. Frequently asked Q&A","Url":"http:\\/\\/cwa3808.org\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBtB3dmMwF;_ylu=X3oDMTEwMGJ0MmQ1BGNvbG8DdwRsA1dTMQRwb3MDNTQEc2VjA3NyBHZ0aWQD\\/SIG=117pqud0l\\/EXP=1147592336\\/**http%3a\\/\\/cwa3808.org\\/","ModificationDate":1147071600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBuR3dmMwF;_ylu=X3oDMTBxY3NiaDkyBGNvbG8DdwRwb3MDNTQEc2VjA3NyBHZ0aWQD\\/SIG=15od3j3p8\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=cwa3808.org\\/%26w=132%26d=ahqtKEaqMwC6%26icp=1%26.intl=us","Size":"53103"}},{"Title":"Mirabilis ICQ 98a Vulnerability","Summary":"... Bugtraq ID: 132. Class: Failure to Handle Exceptional Conditions ...","Url":"http:\\/\\/www.securityfocus.com\\/bid\\/132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBux3dmMwF;_ylu=X3oDMTEwNXIwZzI2BGNvbG8DdwRsA1dTMQRwb3MDNTUEc2VjA3NyBHZ0aWQD\\/SIG=11ocj9p23\\/EXP=1147592336\\/**http%3a\\/\\/www.securityfocus.com\\/bid\\/132","ModificationDate":1146034800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBwB3dmMwF;_ylu=X3oDMTBxbnNnYWFhBGNvbG8DdwRwb3MDNTUEc2VjA3NyBHZ0aWQD\\/SIG=169dn3s31\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.securityfocus.com\\/bid\\/132%26w=132%26d=bbuQiUaqMsU1%26icp=1%26.intl=us","Size":"11819"}},{"Title":"Downloaded 23 Dec 2001 to 132.76.33.15. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 23 Dec 2001 to 132.76.33.15. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/jcpo\\/jcpcr.jsp. Downloaded 23 Dec 2001 to 132.76.33.15.","Url":"http:\\/\\/theochem.weizmann.ac.il\\/AIPreprints\\/8.pdf","ClickUrl":"http:\\/\\/theochem.weizmann.ac.il\\/AIPreprints\\/8.pdf#search=\'\'","ModificationDate":1092294000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBxR3dmMwF;_ylu=X3oDMTBxcjhpcTNrBGNvbG8DdwRwb3MDNTYEc2VjA3NyBHZ0aWQD\\/SIG=16l1r1fiu\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=theochem.weizmann.ac.il\\/AIPreprints\\/8.pdf%26w=132%26d=VrF160aqMjIt%26icp=1%26.intl=us","Size":"1754089"}},{"Title":"Chapter RL 132","Summary":"DEPARTMENT OF REGULATION AND LICENSING. Unofficial Text (See Printed Volume). Current through date and Register shown on Title Page. Register, July, 1999, No. 523. Chapter RL 132. APPLICATIONS. RL 132.01. Authority. RL 132.02 ... Note: Chapter RL 132 was created as an emergency rule effective 11\\u20131\\u201398 ...","Url":"http:\\/\\/www.legis.state.wi.us\\/rsb\\/code\\/rl\\/rl132.pdf","ClickUrl":"http:\\/\\/www.legis.state.wi.us\\/rsb\\/code\\/rl\\/rl132.pdf#search=\'\'","ModificationDate":1011859200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcByh3dmMwF;_ylu=X3oDMTBxZjI4aHZhBGNvbG8DdwRwb3MDNTcEc2VjA3NyBHZ0aWQD\\/SIG=16nps3tc2\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.legis.state.wi.us\\/rsb\\/code\\/rl\\/rl132.pdf%26w=132%26d=VTECeUaqMi-4%26icp=1%26.intl=us","Size":"8138"}},{"Title":"Rebuffing Bush, 132 Mayors Embrace Kyoto Rules - New York Times","Summary":"Greg Nickels of Seattle and 131 other like-minded mayors have joined a bipartisan coalition to fight global warming on the local level.","Url":"http:\\/\\/www.nytimes.com\\/2005\\/05\\/14\\/national\\/14kyoto.html?ex=1273723200&en=c02e1cce1ca43706&ei=5088","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBzB3dmMwF;_ylu=X3oDMTEwbm43bzM3BGNvbG8DdwRsA1dTMQRwb3MDNTgEc2VjA3NyBHZ0aWQD\\/SIG=13repbe72\\/EXP=1147592336\\/**http%3a\\/\\/www.nytimes.com\\/2005\\/05\\/14\\/national\\/14kyoto.html%3fex=1273723200%26en=c02e1cce1ca43706%26ei=5088","ModificationDate":1147330800,"MimeType":"text\\/html"},{"Title":"DHS-Revised Rule 132","Summary":"Easy access to Illinois services and information ... an e-mail address to pose questions regarding Rule 132. Please review the Rule 132 Q&A document posted on ...","Url":"http:\\/\\/www.dhs.state.il.us\\/revisedRule132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB0h3dmMwF;_ylu=X3oDMTEwMjl1dW84BGNvbG8DdwRsA1dTMQRwb3MDNTkEc2VjA3NyBHZ0aWQD\\/SIG=11tb4gcma\\/EXP=1147592336\\/**http%3a\\/\\/www.dhs.state.il.us\\/revisedRule132","ModificationDate":1147244400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB1x3dmMwF;_ylu=X3oDMTBxOWMyazRxBGNvbG8DdwRwb3MDNTkEc2VjA3NyBHZ0aWQD\\/SIG=16e8khp3d\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.dhs.state.il.us\\/revisedRule132%26w=132%26d=Oc4YikaqMwgM%26icp=1%26.intl=us","Size":"22903"}},{"Title":"211 CMR: DIVISION OF INSURANCE 6\\/27\\/97 211 CMR - 837 211 CMR 132.00: ACTUARIAL OPINION AND MEMORANDUM REGULATION ... ","Summary":"... 132.01: Purpose. 132.02: Authority. 132.03: Scope. 132.04: Definitions. 132.05: General Requirements. 132.06: Required Opinions. 132 ... Adequacy Analysis. 132.08: Statement of Actuarial ...","Url":"http:\\/\\/www.mass.gov\\/doi\\/Legal_Hearings\\/211_132.PDF","ClickUrl":"http:\\/\\/www.mass.gov\\/doi\\/Legal_Hearings\\/211_132.PDF#search=\'\'","ModificationDate":1003906800,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB3B3dmMwF;_ylu=X3oDMTBxdG9ldThsBGNvbG8DdwRwb3MDNjAEc2VjA3NyBHZ0aWQD\\/SIG=16no3ibvg\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.mass.gov\\/doi\\/Legal_Hearings\\/211_132.PDF%26w=132%26d=C4QXPkaqMjRM%26icp=1%26.intl=us","Size":"45945"}},{"Title":"Downloaded 22 Jul 2003 to 132.66.16.23. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 22 Jul 2003 to 132.66.16.23. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/jcpo\\/jcpcr.jsp. Downloaded 22 Jul 2003 to 132.66.16.23.","Url":"http:\\/\\/star.tau.ac.il\\/~andelman\\/reprints\\/021_JCP_1987_87_7229.pdf","ClickUrl":"http:\\/\\/star.tau.ac.il\\/~andelman\\/reprints\\/021_JCP_1987_87_7229.pdf#search=\'\'","ModificationDate":1058857200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB4R3dmMwF;_ylu=X3oDMTBxZzZxbDZiBGNvbG8DdwRwb3MDNjEEc2VjA3NyBHZ0aWQD\\/SIG=17adesqgt\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=star.tau.ac.il\\/%257Eandelman\\/reprints\\/021_JCP_1987_87_7229.pdf%26w=132%26d=Lvkyh0aqMh8L%26icp=1%26.intl=us","Size":"1798906"}},{"Title":"Special Troops Battalion, 4th Brigade, 10th Mountain Division Insignia","Summary":"The Institute of Heraldry\'s Special Troops Battalion Section, Special Troops Battalion, 4th Brigade, 10th Mountain Division Insignia Page","Url":"http:\\/\\/www.tioh.hqda.pentagon.mil\\/STB\\/STB4Brigade10MountainDivision.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB4x3dmMwF;_ylu=X3oDMTEwZjFqOHFiBGNvbG8DdwRsA1dTMQRwb3MDNjIEc2VjA3NyBHZ0aWQD\\/SIG=12rjb6bu4\\/EXP=1147592336\\/**http%3a\\/\\/www.tioh.hqda.pentagon.mil\\/STB\\/STB4Brigade10MountainDivision.htm","ModificationDate":1109923200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB6B3dmMwF;_ylu=X3oDMTBxZzN1cnRoBGNvbG8DdwRwb3MDNjIEc2VjA3NyBHZ0aWQD\\/SIG=17c61sq2b\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.tioh.hqda.pentagon.mil\\/STB\\/STB4Brigade10MountainDivision.htm%26w=132%26d=CjDx1kaqMwEn%26icp=1%26.intl=us","Size":"8896"}},{"Title":"NNSA\'s Brooks lauds partnership in nonproliferation","Summary":"... ite Way. U133. 132. A-4. 135. 134. 132. Fun With Science ...","Url":"http:\\/\\/www.llnl.gov\\/llnl\\/06news\\/employee\\/articles\\/2001\\/12.21.01newsline.pdf","ClickUrl":"http:\\/\\/www.llnl.gov\\/llnl\\/06news\\/employee\\/articles\\/2001\\/12.21.01newsline.pdf#search=\'\'","ModificationDate":1099555200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB7R3dmMwF;_ylu=X3oDMTBxZ25nbWN0BGNvbG8DdwRwb3MDNjMEc2VjA3NyBHZ0aWQD\\/SIG=17go91rgp\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.llnl.gov\\/llnl\\/06news\\/employee\\/articles\\/2001\\/12.21.01newsline.pdf%26w=132%26d=aLdSWEaqMjYB%26icp=1%26.intl=us","Size":"472758"}},{"Title":"Psalms 132. The Holy Bible: King James Version.","Summary":"... Reference &gt; The Bible &gt; The King James Version &gt; Psalms &gt; 132 ... The Psalms. 132. A Prayer for Blessing on the Sanctuary ...","Url":"http:\\/\\/www.bartleby.com\\/108\\/19\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB7x3dmMwF;_ylu=X3oDMTEwdm1iOTMzBGNvbG8DdwRsA1dTMQRwb3MDNjQEc2VjA3NyBHZ0aWQD\\/SIG=11rfct28r\\/EXP=1147592336\\/**http%3a\\/\\/www.bartleby.com\\/108\\/19\\/132.html","ModificationDate":1134460800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB9B3dmMwF;_ylu=X3oDMTBxa3RqY29tBGNvbG8DdwRwb3MDNjQEc2VjA3NyBHZ0aWQD\\/SIG=16ckhlf21\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.bartleby.com\\/108\\/19\\/132.html%26w=132%26d=Om0HPEaqMjyM%26icp=1%26.intl=us","Size":"26896"}},{"Title":"The Criterion Collection: Ruling Class, The","Summary":"Title Person. Film Info. 1972. 154 minutes. Color. 1.77:1. Dolby Digital Mono 1.0. Anamorphic. English. Release Info. Catalog Number: CC1575D. ISBN: 1-55940-922-3. UPC: 7-15515-0124-2-3. SRP: \$39.95. Synopsis","Url":"http:\\/\\/www.criterionco.com\\/asp\\/release.asp?id=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB9h3dmMwF;_ylu=X3oDMTEwcTRya2ltBGNvbG8DdwRsA1dTMQRwb3MDNjUEc2VjA3NyBHZ0aWQD\\/SIG=1272o9dh7\\/EXP=1147592336\\/**http%3a\\/\\/www.criterionco.com\\/asp\\/release.asp%3fid=132","ModificationDate":1147244400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB.x3dmMwF;_ylu=X3oDMTBxdDMwMGJvBGNvbG8DdwRwb3MDNjUEc2VjA3NyBHZ0aWQD\\/SIG=16u4fa0dg\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.criterionco.com\\/asp\\/release.asp%253Fid%253D132%26w=132%26d=L2PGVEaqMwN7%26icp=1%26.intl=us","Size":"16920"}},{"Title":"AJP Legacy -- Table of Contents (February 28 1941, 132 [2])","Summary":"Contents: February 28 1941, Volume 132, Issue 2 [Index by Author] Other Issues: To see an article, click its [Full Text] link.","Url":"http:\\/\\/ajplegacy.physiology.org\\/content\\/vol132\\/issue2\\/index.shtml","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB_R3dmMwF;_ylu=X3oDMTEwZWhkczJpBGNvbG8DdwRsA1dTMQRwb3MDNjYEc2VjA3NyBHZ0aWQD\\/SIG=12lf1ce7j\\/EXP=1147592336\\/**http%3a\\/\\/ajplegacy.physiology.org\\/content\\/vol132\\/issue2\\/index.shtml","ModificationDate":1141459200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBAh7dmMwF;_ylu=X3oDMTBxNzI0azAwBGNvbG8DdwRwb3MDNjYEc2VjA3NyBHZ0aWQD\\/SIG=176uub081\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=ajplegacy.physiology.org\\/content\\/vol132\\/issue2\\/index.shtml%26w=132%26d=Ms_vOEaqMj-H%26icp=1%26.intl=us","Size":"24095"}},{"Title":"released a letter (PDF)","Summary":"","Url":"http:\\/\\/www.house.gov\\/judiciary_democrats\\/letters\\/rovehrgrequestltr71405.pdf","ClickUrl":"http:\\/\\/www.house.gov\\/judiciary_democrats\\/letters\\/rovehrgrequestltr71405.pdf#search=\'\'","ModificationDate":1121410800,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBBx7dmMwF;_ylu=X3oDMTBxOXQ3MWF0BGNvbG8DdwRwb3MDNjcEc2VjA3NyBHZ0aWQD\\/SIG=17g69a880\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.house.gov\\/judiciary_democrats\\/letters\\/rovehrgrequestltr71405.pdf%26w=132%26d=LPrB50aqMqRY%26icp=1%26.intl=us","Size":"381000"}},{"Title":"NC General Statutes Chapter 132","Summary":"North Carolina. State Public Records Law. North Carolina General Statutes. Chapter 132. Public Records. Last updated December 10th, 1999. Contents. Section Title. 132-1. \\"Public records\\" defined. 132-1.1. ... Section Title. 132-1. \\"Public records\\" defined. 132-1.1. Confidential communications by legal counsel to public board or agency; State tax ...","Url":"http:\\/\\/www.ah.dcr.state.nc.us\\/e-records\\/ncgs\\/ncgs132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBCR7dmMwF;_ylu=X3oDMTEwMjJmbW84BGNvbG8DdwRsA1dTMQRwb3MDNjgEc2VjA3NyBHZ0aWQD\\/SIG=12ctoo16c\\/EXP=1147592336\\/**http%3a\\/\\/www.ah.dcr.state.nc.us\\/e-records\\/ncgs\\/ncgs132.htm","ModificationDate":953625600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBDh7dmMwF;_ylu=X3oDMTBxYjJtcGphBGNvbG8DdwRwb3MDNjgEc2VjA3NyBHZ0aWQD\\/SIG=16t5vbni8\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.ah.dcr.state.nc.us\\/e-records\\/ncgs\\/ncgs132.htm%26w=132%26d=MyfGH0aqMwR0%26icp=1%26.intl=us","Size":"43695"}},{"Title":"Technical Introduction to CDMA","Summary":"Course 132. Technical. Introduction to CDMA. Technical. Introduction to CDMA. IS-95, CDMA2000 and a glimpse of 1xEV. February, 2005. 132 - 1. Technical Introduction to CDMA v4.0 (c) 2005 Scott Baxter. Course Outline. Basic CDMA Principles. Coding","Url":"http:\\/\\/www.howcdmaworks.com\\/intro\\/132v3.pdf","ClickUrl":"http:\\/\\/www.howcdmaworks.com\\/intro\\/132v3.pdf#search=\'\'","ModificationDate":1107590400,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBEx7dmMwF;_ylu=X3oDMTBxbTJnbmxhBGNvbG8DdwRwb3MDNjkEc2VjA3NyBHZ0aWQD\\/SIG=16ghr9cvr\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.howcdmaworks.com\\/intro\\/132v3.pdf%26w=132%26d=B6dAbEaqMu7t%26icp=1%26.intl=us","Size":"4342039"}},{"Title":"Thread Images Digitizing","Summary":"Free embroidery design. Specializes in providing custom quality embroidery designs to the professional embroiderer.","Url":"http:\\/\\/www.threadimages.com\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBFR7dmMwF;_ylu=X3oDMTEwMmI2cWQzBGNvbG8DdwRsA1dTMQRwb3MDNzAEc2VjA3NyBHZ0aWQD\\/SIG=11gsp7523\\/EXP=1147592336\\/**http%3a\\/\\/www.threadimages.com\\/","ModificationDate":1147158000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBGx7dmMwF;_ylu=X3oDMTBxaml0dDF0BGNvbG8DdwRwb3MDNzAEc2VjA3NyBHZ0aWQD\\/SIG=161ukrsfh\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.threadimages.com\\/%26w=132%26d=BmPG10aqMwgW%26icp=1%26.intl=us","Size":"55861"}},{"Title":"Psalms Chapter 132:1-18.","Summary":"Read the Hebrew Transliteration Psalms 132:1-18 Online.","Url":"http:\\/\\/bibledbdata.org\\/onlinebibles\\/hebrew_translit\\/19_132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBHR7dmMwF;_ylu=X3oDMTEwdXJnMnJuBGNvbG8DdwRsA1dTMQRwb3MDNzEEc2VjA3NyBHZ0aWQD\\/SIG=12i1mped7\\/EXP=1147592336\\/**http%3a\\/\\/bibledbdata.org\\/onlinebibles\\/hebrew_translit\\/19_132.htm","ModificationDate":1044172800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBIh7dmMwF;_ylu=X3oDMTBxNmJocG1iBGNvbG8DdwRwb3MDNzEEc2VjA3NyBHZ0aWQD\\/SIG=173o8ajtj\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=bibledbdata.org\\/onlinebibles\\/hebrew_translit\\/19_132.htm%26w=132%26d=dfiAJkaqMi1u%26icp=1%26.intl=us","Size":"9706"}},{"Title":"PRC-132","Summary":"K6ERO Portable and pedestrian mobile amateur radio. PRC-132 &amp; M50B. To the left is a Loral Terracom M50B. made in 1988 Serial#19 . Its 10 inches tall. with out battery box or external power. box , 3.5 inches wide and 5.25 inches. deep, weight 6.9 lbs . ... The M50B is the early issue version of the. PRC-132 special operations HF Radio ...","Url":"http:\\/\\/www.muttmotorpool.com\\/PRC-132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBJB7dmMwF;_ylu=X3oDMTEwYm80YTY1BGNvbG8DdwRsA1dTMQRwb3MDNzIEc2VjA3NyBHZ0aWQD\\/SIG=11ou3h7bi\\/EXP=1147592336\\/**http%3a\\/\\/www.muttmotorpool.com\\/PRC-132","ModificationDate":1146294000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBKR7dmMwF;_ylu=X3oDMTBxaDgzYWcxBGNvbG8DdwRwb3MDNzIEc2VjA3NyBHZ0aWQD\\/SIG=169r7ofhd\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.muttmotorpool.com\\/PRC-132%26w=132%26d=Utj0H0aqMs48%26icp=1%26.intl=us","Size":"19723"}},{"Title":"Firenze 132 \\/ 170","Summary":"Firenze 132 \\/ 170. Matte Presentation Paper. 132 gram 2-side coated. 170 gram single side coated. Magicl\\u00e9e\\u00ae Firenze 132 and Firenze 170 matte. papers are designed for poster applications and. have an impressive price performance ratio. The ... If using the 132 gram. paper for 2-sided imaging ink limit on ...","Url":"http:\\/\\/www.magicinkjet.com\\/client_data_pdf\\/guides\\/Firenze.pdf","ClickUrl":"http:\\/\\/www.magicinkjet.com\\/client_data_pdf\\/guides\\/Firenze.pdf#search=\'\'","ModificationDate":1081839600,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBLh7dmMwF;_ylu=X3oDMTBxbXY4b2luBGNvbG8DdwRwb3MDNzMEc2VjA3NyBHZ0aWQD\\/SIG=172sdum75\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.magicinkjet.com\\/client_data_pdf\\/guides\\/Firenze.pdf%26w=132%26d=Q4ILzEaqMh1n%26icp=1%26.intl=us","Size":"2152647"}},{"Title":"Museletter # 132 \\/ February 2003: The US and Eurasia: End Game for the Industrial Era?","Summary":"Defining democracy in the wake of the 2002 elections in the U.S.A..","Url":"http:\\/\\/www.museletter.com\\/archive\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBMB7dmMwF;_ylu=X3oDMTEwNGRiZ3FjBGNvbG8DdwRsA1dTMQRwb3MDNzQEc2VjA3NyBHZ0aWQD\\/SIG=11upr7v32\\/EXP=1147592336\\/**http%3a\\/\\/www.museletter.com\\/archive\\/132.html","ModificationDate":1108540800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBNR7dmMwF;_ylu=X3oDMTBxZTNpbG1nBGNvbG8DdwRwb3MDNzQEc2VjA3NyBHZ0aWQD\\/SIG=16fg9g4no\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.museletter.com\\/archive\\/132.html%26w=132%26d=SS0AQEaqMvuR%26icp=1%26.intl=us","Size":"47428"}},{"Title":"Downloaded 25 Oct 2002 to 132.66.16.12. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 25 Oct 2002 to 132.66.16.12. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/jcpo\\/jcpcr.jsp. Downloaded 25 Oct 2002 to 132.66.16.12.","Url":"http:\\/\\/star.tau.ac.il\\/~andelman\\/reprints\\/018_JCP_1987_86_3673.pdf","ClickUrl":"http:\\/\\/star.tau.ac.il\\/~andelman\\/reprints\\/018_JCP_1987_86_3673.pdf#search=\'\'","ModificationDate":1035529200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBOh7dmMwF;_ylu=X3oDMTBxbGZmanU1BGNvbG8DdwRwb3MDNzUEc2VjA3NyBHZ0aWQD\\/SIG=17a4s312u\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=star.tau.ac.il\\/%257Eandelman\\/reprints\\/018_JCP_1987_86_3673.pdf%26w=132%26d=YANT3kaqMhfd%26icp=1%26.intl=us","Size":"1204421"}},{"Title":"Hepatitis B Virus: A Comprehensive Strategy for Eliminating Transmission in the United States Through Universal ... ","Summary":"Hepatitis B Virus: A Comprehensive Strategy for Eliminating Transmission in the United States Through Universal Childhood Vaccination: Recommendations of the Immunization Practices Advisory Committee (ACIP)","Url":"http:\\/\\/www.cdc.gov\\/mmwr\\/preview\\/mmwrhtml\\/00033405.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBPB7dmMwF;_ylu=X3oDMTEwb2NlbHRuBGNvbG8DdwRsA1dTMQRwb3MDNzYEc2VjA3NyBHZ0aWQD\\/SIG=129kdm2n4\\/EXP=1147592336\\/**http%3a\\/\\/www.cdc.gov\\/mmwr\\/preview\\/mmwrhtml\\/00033405.htm","ModificationDate":1139990400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBQR7dmMwF;_ylu=X3oDMTBxZm44bG9sBGNvbG8DdwRwb3MDNzYEc2VjA3NyBHZ0aWQD\\/SIG=16qv48dkp\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.cdc.gov\\/mmwr\\/preview\\/mmwrhtml\\/00033405.htm%26w=132%26d=b-Kz6UaqMwIM%26icp=1%26.intl=us","Size":"87232"}},{"Title":"Tour de France 2005","Summary":"... QUICK STEP - INNERGETIC. 132 - CRETSKENS Wilfried (BEL) Born in 10\\/07\\/1976 \\u00e0 Herk-de-Stad (BEL ...","Url":"http:\\/\\/www.letour.fr\\/2005\\/TDF\\/RIDERS\\/us\\/coureurs\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBQx7dmMwF;_ylu=X3oDMTEwYjdwazg2BGNvbG8DdwRsA1dTMQRwb3MDNzcEc2VjA3NyBHZ0aWQD\\/SIG=12dpjmcf6\\/EXP=1147592336\\/**http%3a\\/\\/www.letour.fr\\/2005\\/TDF\\/RIDERS\\/us\\/coureurs\\/132.html","ModificationDate":1121583600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBSB7dmMwF;_ylu=X3oDMTBxa21laGFvBGNvbG8DdwRwb3MDNzcEc2VjA3NyBHZ0aWQD\\/SIG=16u0nn96f\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.letour.fr\\/2005\\/TDF\\/RIDERS\\/us\\/coureurs\\/132.html%26w=132%26d=BTTUC0aqMv4Z%26icp=1%26.intl=us","Size":"12171"}},{"Title":"This American Life | Father\'s Day \'99","Summary":"... 6\\/18\\/99. Episode 132. For Father\'s Day, stories about fathers going out of their way to protect their kids, and kids going ...","Url":"http:\\/\\/www.thisamericanlife.org\\/pages\\/descriptions\\/99\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBSh7dmMwF;_ylu=X3oDMTEwNDFvam42BGNvbG8DdwRsA1dTMQRwb3MDNzgEc2VjA3NyBHZ0aWQD\\/SIG=12iobnkgv\\/EXP=1147592336\\/**http%3a\\/\\/www.thisamericanlife.org\\/pages\\/descriptions\\/99\\/132.html","ModificationDate":1146466800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBTx7dmMwF;_ylu=X3oDMTBxZzFuNDV2BGNvbG8DdwRwb3MDNzgEc2VjA3NyBHZ0aWQD\\/SIG=1738d5fam\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.thisamericanlife.org\\/pages\\/descriptions\\/99\\/132.html%26w=132%26d=Ss_yvkaqMvWK%26icp=1%26.intl=us","Size":"8411"}},{"Title":"Downloaded 21 Jan 2004 to 132.66.16.34. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 21 Jan 2004 to 132.66.16.34. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/jcpo\\/jcpcr.jsp. Downloaded 21 Jan 2004 to 132.66.16.34.","Url":"http:\\/\\/femto.tau.ac.il\\/~nitzan\\/3.pdf","ClickUrl":"http:\\/\\/femto.tau.ac.il\\/~nitzan\\/3.pdf#search=\'\'","ModificationDate":1088665200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBVB7dmMwF;_ylu=X3oDMTBxdXJmcnJsBGNvbG8DdwRwb3MDNzkEc2VjA3NyBHZ0aWQD\\/SIG=16da99c2u\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=femto.tau.ac.il\\/%257Enitzan\\/3.pdf%26w=132%26d=b5Br7UaqMjB1%26icp=1%26.intl=us","Size":"1071954"}},{"Title":"CHAPTER 12 ENVIRONMENTAL REVIEW \\u2013 EAST 132","Summary":"Solid Waste Management Plan. 12-1. October2004. DEIS. CHAPTER 12. ENVIRONMENTAL REVIEW \\u2013 EAST 132. ND. STREET SITE. 12.1 Introduction. The East 132. nd. Street Site is currently permitted to handle 2,999 tpd of putrescible waste, with a","Url":"http:\\/\\/www.nyc.gov\\/html\\/dsny\\/downloads\\/pdf\\/pubnrpts\\/swmp-4oct\\/deis\\/chapter12.pdf","ClickUrl":"http:\\/\\/www.nyc.gov\\/html\\/dsny\\/downloads\\/pdf\\/pubnrpts\\/swmp-4oct\\/deis\\/chapter12.pdf#search=\'\'","ModificationDate":1099555200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBWR7dmMwF;_ylu=X3oDMTBxaHNlODZrBGNvbG8DdwRwb3MDODAEc2VjA3NyBHZ0aWQD\\/SIG=17llu5bkp\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.nyc.gov\\/html\\/dsny\\/downloads\\/pdf\\/pubnrpts\\/swmp-4oct\\/deis\\/chapter12.pdf%26w=132%26d=RPmqz0aqMiKh%26icp=1%26.intl=us","Size":"1417879"}},{"Title":"Psalms 132 \\/ Hebrew - English Bible \\/ Mechon-Mamre","Summary":"... 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 ... Psalms Chapter 132. \\u00e0 \\u00f9\\u00d1\\u00c4\\u00e9\\u00f8, \\u00e4\\u00c7\\u00ee\\u00cc\\u00c7\\u00f2\\u00c2\\u00ec\\u00e5\\u00c9\\u00fa ...","Url":"http:\\/\\/www.mechon-mamre.org\\/p\\/pt\\/pt26d2.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBWx7dmMwF;_ylu=X3oDMTEwc3RoZXBrBGNvbG8DdwRsA1dTMQRwb3MDODEEc2VjA3NyBHZ0aWQD\\/SIG=11vhbotpk\\/EXP=1147592336\\/**http%3a\\/\\/www.mechon-mamre.org\\/p\\/pt\\/pt26d2.htm","ModificationDate":1138694400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBYB7dmMwF;_ylu=X3oDMTBxNjUwMGs2BGNvbG8DdwRwb3MDODEEc2VjA3NyBHZ0aWQD\\/SIG=16gg7tf89\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.mechon-mamre.org\\/p\\/pt\\/pt26d2.htm%26w=132%26d=WTHLVUaqMu6s%26icp=1%26.intl=us","Size":"13881"}},{"Title":"US CODE: Title 28,132. Creation and composition of district courts","Summary":"Creation and composition of district courts. Release date: 2005-09-29. (a) There shall be in each judicial district a district court which shall be a court of record known as the United States District Court for the district.","Url":"http:\\/\\/www4.law.cornell.edu\\/uscode\\/28\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBYh7dmMwF;_ylu=X3oDMTEwcWlsMGMxBGNvbG8DdwRsA1dTMQRwb3MDODIEc2VjA3NyBHZ0aWQD\\/SIG=122ek55sr\\/EXP=1147592336\\/**http%3a\\/\\/www4.law.cornell.edu\\/uscode\\/28\\/132.html","ModificationDate":1143273600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBZx7dmMwF;_ylu=X3oDMTBxYWs1NmFvBGNvbG8DdwRwb3MDODIEc2VjA3NyBHZ0aWQD\\/SIG=16jb47dcg\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www4.law.cornell.edu\\/uscode\\/28\\/132.html%26w=132%26d=QQ2S7EaqMjbv%26icp=1%26.intl=us","Size":"9107"}},{"Title":"Fiscal Note","Summary":"... Bill, Resolutions and Memorial Documents. SB05-132 ... Final Act\\/ Resolutions or Memorial: 132_enr.pdfn. 132.enrn. Preamended Documents ...","Url":"http:\\/\\/www.leg.state.co.us\\/Clics2005a\\/csl.nsf\\/fsbillcont3\\/A4058D1E27570DC987256F7E0059EAA8?Open&file=132_enr.pdf","ClickUrl":"http:\\/\\/www.leg.state.co.us\\/Clics2005a\\/csl.nsf\\/fsbillcont3\\/A4058D1E27570DC987256F7E0059EAA8?Open&file=132_enr.pdf#search=\'\'","ModificationDate":1124521200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBbB7dmMwF;_ylu=X3oDMTBxbGJmNjEwBGNvbG8DdwRwb3MDODMEc2VjA3NyBHZ0aWQD\\/SIG=191n41l4b\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.leg.state.co.us\\/Clics2005a\\/csl.nsf\\/fsbillcont3\\/A4058D1E27570DC987256F7E0059EAA8%253FOpen%2526file%253D132_enr.pdf%26w=132%26d=LViIXUaqMkKL%26icp=1%26.intl=us","Size":"87930"}},{"Title":"Development -- Table of Contents (January 1 2005, 132 [1])","Summary":"To see an article, click its [Full Text] link. To review many abstracts, check the boxes to the left of the titles you want, and click the \'Get All Checked Abstract(s)\' button. To see one abstract at a time, click its [Abstract] link.","Url":"http:\\/\\/dev.biologists.org\\/content\\/vol132\\/issue1","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBbh7dmMwF;_ylu=X3oDMTEwdWdwcnIyBGNvbG8DdwRsA1dTMQRwb3MDODQEc2VjA3NyBHZ0aWQD\\/SIG=123019ojj\\/EXP=1147592336\\/**http%3a\\/\\/dev.biologists.org\\/content\\/vol132\\/issue1","ModificationDate":1147071600,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBcx7dmMwF;_ylu=X3oDMTBxczM2ZHFvBGNvbG8DdwRwb3MDODQEc2VjA3NyBHZ0aWQD\\/SIG=16kng2m03\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=dev.biologists.org\\/content\\/vol132\\/issue1%26w=132%26d=LFOVEUaqMwR5%26icp=1%26.intl=us","Size":"25711"}},{"Title":"Winter Carnival (1939)","Summary":"Winter Carnival - Cast, Crew, Reviews, Plot Summary, Comments, Discussion, Taglines, Trailers, Posters, Photos, Showtimes, Link to Official Site, Fan Sites","Url":"http:\\/\\/www.imdb.com\\/title\\/tt0032132\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBdR7dmMwF;_ylu=X3oDMTEwb3IzajNvBGNvbG8DdwRsA1dTMQRwb3MDODUEc2VjA3NyBHZ0aWQD\\/SIG=11o6bhdhm\\/EXP=1147592336\\/**http%3a\\/\\/www.imdb.com\\/title\\/tt0032132\\/","ModificationDate":1147417200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBeh7dmMwF;_ylu=X3oDMTBxcG9jdDNjBGNvbG8DdwRwb3MDODUEc2VjA3NyBHZ0aWQD\\/SIG=1696d85k0\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.imdb.com\\/title\\/tt0032132\\/%26w=132%26d=OnC3HUaqMw5H%26icp=1%26.intl=us","Size":"44616"}},{"Title":"XM Radio - C-SPAN Radio","Summary":"... XM 132. &lt;Previous. Next ...","Url":"http:\\/\\/www.xmradio.com\\/programming\\/channel_page.jsp?ch=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBfB7dmMwF;_ylu=X3oDMTEwa3RyODBuBGNvbG8DdwRsA1dTMQRwb3MDODYEc2VjA3NyBHZ0aWQD\\/SIG=12gtfnvt7\\/EXP=1147592336\\/**http%3a\\/\\/www.xmradio.com\\/programming\\/channel_page.jsp%3fch=132","ModificationDate":1147158000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBgR7dmMwF;_ylu=X3oDMTBxN24xYzc0BGNvbG8DdwRwb3MDODYEc2VjA3NyBHZ0aWQD\\/SIG=1774en6i4\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.xmradio.com\\/programming\\/channel_page.jsp%253Fch%253D132%26w=132%26d=WS_5a0aqMwE5%26icp=1%26.intl=us","Size":"23601"}},{"Title":"Al-Qaeda tape says bin Laden alive, urges Iraqis to fight - theage.com.au","Summary":"Arabic television channel Al Arabiya has aired what it says is an audiotape from an al-Qaeda spokesman who says Osama bin Laden is alive and well. - The Age","Url":"http:\\/\\/www.theage.com.au\\/articles\\/2003\\/08\\/18\\/1061059775995.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBgx7dmMwF;_ylu=X3oDMTEwNXU4aDFlBGNvbG8DdwRsA1dTMQRwb3MDODcEc2VjA3NyBHZ0aWQD\\/SIG=12jscc3ng\\/EXP=1147592336\\/**http%3a\\/\\/www.theage.com.au\\/articles\\/2003\\/08\\/18\\/1061059775995.html","ModificationDate":1147158000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBiB7dmMwF;_ylu=X3oDMTBxZjFrNnYwBGNvbG8DdwRwb3MDODcEc2VjA3NyBHZ0aWQD\\/SIG=174fs4fo6\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.theage.com.au\\/articles\\/2003\\/08\\/18\\/1061059775995.html%26w=132%26d=VUVD3UaqMwJD%26icp=1%26.intl=us","Size":"25163"}},{"Title":"Psalms 132","Summary":"Psalms 132. 132:1. Lord, remember David, and all his afflictions: 132:2. How he sware unto the LORD, and vowed unto the mighty God of Jacob; 132:3 ... Psalms 132. Chapters: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 132:3. Surely I will not come into the tabernacle of my ...","Url":"http:\\/\\/www.maitreg.com\\/bible\\/view.asp?book=38&chapter=132","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBih7dmMwF;_ylu=X3oDMTEwZjVxcHI4BGNvbG8DdwRsA1dTMQRwb3MDODgEc2VjA3NyBHZ0aWQD\\/SIG=12hild8td\\/EXP=1147592336\\/**http%3a\\/\\/www.maitreg.com\\/bible\\/view.asp%3fbook=38%26chapter=132","ModificationDate":1117609200,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBjx7dmMwF;_ylu=X3oDMTBxb2JpMW5pBGNvbG8DdwRwb3MDODgEc2VjA3NyBHZ0aWQD\\/SIG=17elhve1h\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.maitreg.com\\/bible\\/view.asp%253Fbook%253D38%2526chapter%253D132%26w=132%26d=TMHn-UaqMjbU%26icp=1%26.intl=us","Size":"27216"}},{"Title":"132","Summary":"35 U.S.C. 132 Notice of rejection; reexamination. - Patent Laws. 35 U.S.C. 132 Notice of rejection; reexamination.","Url":"http:\\/\\/www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_132.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBkR7dmMwF;_ylu=X3oDMTEwNTA2aTh1BGNvbG8DdwRsA1dTMQRwb3MDODkEc2VjA3NyBHZ0aWQD\\/SIG=12ucmimjn\\/EXP=1147592336\\/**http%3a\\/\\/www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_132.htm","ModificationDate":1133942400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBlh7dmMwF;_ylu=X3oDMTBxNmVndjYxBGNvbG8DdwRwb3MDODkEc2VjA3NyBHZ0aWQD\\/SIG=17f2jjpsh\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_132.htm%26w=132%26d=Nil-N0aqMjBx%26icp=1%26.intl=us","Size":"8182"}},{"Title":"A CONCISE SUMMARY OF THE PUBLIC HEARINGS","Summary":"... hearing on Bill 132. It shows you who was for, who was ... Opposes BSL, pointed out many anomalies in Bill 132, for example you can\'t teach a pit bull to ...","Url":"http:\\/\\/www.dogwatch.net\\/bill132.pdf","ClickUrl":"http:\\/\\/www.dogwatch.net\\/bill132.pdf#search=\'\'","ModificationDate":1109232000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBmx7dmMwF;_ylu=X3oDMTBxZ2gwNnM2BGNvbG8DdwRwb3MDOTAEc2VjA3NyBHZ0aWQD\\/SIG=168j23ta7\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.dogwatch.net\\/bill132.pdf%26w=132%26d=PkjRQEaqMuwO%26icp=1%26.intl=us","Size":"1982792"}},{"Title":"JPL News -- A Galaxy Far, Far Away Eyed by Linked Hawaiian Telescopes","Summary":"... Keck Observatory, Kamuela, Hawaii. 2003-132. Site Manager: Webmasters ...","Url":"http:\\/\\/www.jpl.nasa.gov\\/releases\\/2003\\/132.cfm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBnR7dmMwF;_ylu=X3oDMTEwaTAxcXV0BGNvbG8DdwRsA1dTMQRwb3MDOTEEc2VjA3NyBHZ0aWQD\\/SIG=12170u1vu\\/EXP=1147592336\\/**http%3a\\/\\/www.jpl.nasa.gov\\/releases\\/2003\\/132.cfm","ModificationDate":1136016000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBoh7dmMwF;_ylu=X3oDMTBxanNkbHBvBGNvbG8DdwRwb3MDOTEEc2VjA3NyBHZ0aWQD\\/SIG=16i2p31tn\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.jpl.nasa.gov\\/releases\\/2003\\/132.cfm%26w=132%26d=VNPrSUaqMkiG%26icp=1%26.intl=us","Size":"22198"}},{"Title":"(132) Justinian I","Summary":"(132) Justinian I - AV solidus, A.D. 527-545, 4.45 g. ( inv. 91.270). Obverse: Facing helmeted and cuirassed bust of Justinian, holding globus cruciger in r.; at l.","Url":"http:\\/\\/www.lawrence.edu\\/dept\\/art\\/buerger\\/catalogue\\/132.html","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBpB7dmMwF;_ylu=X3oDMTEwamM1Y3A2BGNvbG8DdwRsA1dTMQRwb3MDOTIEc2VjA3NyBHZ0aWQD\\/SIG=12f6r1r1h\\/EXP=1147592336\\/**http%3a\\/\\/www.lawrence.edu\\/dept\\/art\\/buerger\\/catalogue\\/132.html","ModificationDate":1006848000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBqR7dmMwF;_ylu=X3oDMTBxZWNpdmpnBGNvbG8DdwRwb3MDOTIEc2VjA3NyBHZ0aWQD\\/SIG=1709bh559\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.lawrence.edu\\/dept\\/art\\/buerger\\/catalogue\\/132.html%26w=132%26d=BJJDnkaqMjfk%26icp=1%26.intl=us","Size":"3186"}},{"Title":"131","Summary":"35 U.S.C. 131 Examination of application. - Patent Laws. 35 U.S.C. 131 Examination of application.","Url":"http:\\/\\/www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_131.htm","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBqx7dmMwF;_ylu=X3oDMTEwdDUzZHBhBGNvbG8DdwRsA1dTMQRwb3MDOTMEc2VjA3NyBHZ0aWQD\\/SIG=12u6cdfcn\\/EXP=1147592336\\/**http%3a\\/\\/www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_131.htm","ModificationDate":1133942400,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBsB7dmMwF;_ylu=X3oDMTBxdXZhZWxkBGNvbG8DdwRwb3MDOTMEc2VjA3NyBHZ0aWQD\\/SIG=17f8j8d98\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.uspto.gov\\/web\\/offices\\/pac\\/mpep\\/documents\\/appxl_35_U_S_C_131.htm%26w=132%26d=R2aGhUaqMj30%26icp=1%26.intl=us","Size":"7341"}},{"Title":"132 on Flickr - Photo Sharing!","Summary":"... 132. To take full advantage of Flickr, you should use a JavaScript-enabled browser and ...","Url":"http:\\/\\/www.flickr.com\\/photos\\/brettsky\\/53839790\\/","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBsh7dmMwF;_ylu=X3oDMTEwZ2lxZDhhBGNvbG8DdwRsA1dTMQRwb3MDOTQEc2VjA3NyBHZ0aWQD\\/SIG=123ojcbf0\\/EXP=1147592336\\/**http%3a\\/\\/www.flickr.com\\/photos\\/brettsky\\/53839790\\/","ModificationDate":1145862000,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBtx7dmMwF;_ylu=X3oDMTBxYTJvNGFhBGNvbG8DdwRwb3MDOTQEc2VjA3NyBHZ0aWQD\\/SIG=16ks6e563\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.flickr.com\\/photos\\/brettsky\\/53839790\\/%26w=132%26d=GA_4oEaqMq4P%26icp=1%26.intl=us","Size":"74392"}},{"Title":"Ag GPS 124 \\/ 132","Summary":"AgGPS 124 \\/ 132. Operation Manual. AgGPS Receiver Firmware Version 1.40, 1.41 and 1.42. Part Number 38747-00-ENG. Revision C. September 2000. T. Support Offices. Trimble Precision Agricultural Systems. 9290 Bond Street, Suite 102. Overland Park, KS 66214 U.S.A. ... describes how to install and configure the AgGPS_ 124, 132, and 132. Air receivers ...","Url":"http:\\/\\/www.linco.com\\/AG124132REVB.PDF","ClickUrl":"http:\\/\\/www.linco.com\\/AG124132REVB.PDF#search=\'\'","ModificationDate":986281200,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBvB7dmMwF;_ylu=X3oDMTBxbDgxOWxkBGNvbG8DdwRwb3MDOTUEc2VjA3NyBHZ0aWQD\\/SIG=16ajtq3hk\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.linco.com\\/AG124132REVB.PDF%26w=132%26d=FCohUkaqMjOV%26icp=1%26.intl=us","Size":"3610097"}},{"Title":"Tehillim - Chapter 132 | Chabad.org","Summary":"Please login for more site features. Tehillim - Chapter 132. 1. A song of ascents. Remember, O Lord, onto David all his affliction. 2. That he swore to the Lord, he vowed to the Mighty One of Jacob; ... Chabad.org \\" Library \\" Classic Texts \\" The Bible (with Rashi) \\" K\'tuvim \\" Tehillim \\" Chapter 132 ...","Url":"http:\\/\\/www.chabad.org\\/library\\/article.asp?AID=16353","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBvh7dmMwF;_ylu=X3oDMTEwam44NW9vBGNvbG8DdwRsA1dTMQRwb3MDOTYEc2VjA3NyBHZ0aWQD\\/SIG=129b821nj\\/EXP=1147592336\\/**http%3a\\/\\/www.chabad.org\\/library\\/article.asp%3fAID=16353","ModificationDate":1146898800,"MimeType":"text\\/html","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBwx7dmMwF;_ylu=X3oDMTBxczRxYWlqBGNvbG8DdwRwb3MDOTYEc2VjA3NyBHZ0aWQD\\/SIG=170gmib5a\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.chabad.org\\/library\\/article.asp%253FAID%253D16353%26w=132%26d=I-adaEaqMvld%26icp=1%26.intl=us","Size":"41051"}},{"Title":"Downloaded 19 Jan 2003 to 132.77.4.43. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 19 Jan 2003 to 132.77.4.43. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/jcpo\\/jcpcr.jsp. Downloaded 19 Jan 2003 to 132.77.4.43.","Url":"http:\\/\\/www.weizmann.ac.il\\/chemphys\\/Frydman_group\\/Publications\\/ExchDynamics-JCP90.pdf","ClickUrl":"http:\\/\\/www.weizmann.ac.il\\/chemphys\\/Frydman_group\\/Publications\\/ExchDynamics-JCP90.pdf#search=\'\'","ModificationDate":1061622000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcByB7dmMwF;_ylu=X3oDMTBxZGVwcTFiBGNvbG8DdwRwb3MDOTcEc2VjA3NyBHZ0aWQD\\/SIG=17p1893is\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.weizmann.ac.il\\/chemphys\\/Frydman_group\\/Publications\\/ExchDynamics-JCP90.pdf%26w=132%26d=KPVdS0aqMkW1%26icp=1%26.intl=us","Size":"816603"}},{"Title":"Downloaded 19 May 2003 to 132.77.4.43. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/... ","Summary":"Downloaded 19 May 2003 to 132.77.4.43. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/japo\\/japcr.jsp. Downloaded 19 May 2003 to 132.77.4.43.","Url":"http:\\/\\/www.weizmann.ac.il\\/wagner\\/COURSES\\/Reading%20material%20(papers)\\/030_JAP_1990_ContactAngle.pdf","ClickUrl":"http:\\/\\/www.weizmann.ac.il\\/wagner\\/COURSES\\/Reading%20material%20(papers)\\/030_JAP_1990_ContactAngle.pdf#search=\'\'","ModificationDate":1136880000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcBzR7dmMwF;_ylu=X3oDMTBxMjBxZ2VoBGNvbG8DdwRwb3MDOTgEc2VjA3NyBHZ0aWQD\\/SIG=18pfdig62\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=www.weizmann.ac.il\\/wagner\\/COURSES\\/Reading%252520material%252520%2528papers%2529\\/030_JAP_1990_ContactAngle.pdf%26w=132%26d=Nf5MWEaqMkV0%26icp=1%26.intl=us","Size":"784314"}},{"Title":"Downloaded 24 Jul 2002 to 132.163.135.12. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip... ","Summary":"Downloaded 24 Jul 2002 to 132.163.135.12. Redistribution subject to AIP license or copyright, see http:\\/\\/ojps.aip.org\\/japo\\/japcr.jsp. Downloaded 24 Jul 2002 to 132.163.135.12.","Url":"http:\\/\\/tf.nist.gov\\/general\\/pdf\\/569.pdf","ClickUrl":"http:\\/\\/tf.nist.gov\\/general\\/pdf\\/569.pdf#search=\'\'","ModificationDate":1027494000,"MimeType":"application\\/pdf","Cache":{"Url":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB0h7dmMwF;_ylu=X3oDMTBxNmJhcjNhBGNvbG8DdwRwb3MDOTkEc2VjA3NyBHZ0aWQD\\/SIG=16b31en6n\\/EXP=1147592336\\/**http%3a\\/\\/66.218.69.11\\/search\\/cache%3fei=UTF-8%26query=132%26output=json%26results=100%26appid=jennyhan_ac%26u=tf.nist.gov\\/general\\/pdf\\/569.pdf%26w=132%26d=IpdTwEaqMirR%26icp=1%26.intl=us","Size":"1002734"}},{"Title":"[DB] naruto 132","Summary":"","Url":"http:\\/\\/yhbt.mine.nu\\/t\\/n132.torrent","ClickUrl":"http:\\/\\/uk.wrs.yahoo.com\\/_ylt=A0Je5VwQjWVEsGcB1B7dmMwF;_ylu=X3oDMTExaW11dG45BGNvbG8DdwRsA1dTMQRwb3MDMTAwBHNlYwNzcgR2dGlkAw--\\/SIG=11m58k4sj\\/EXP=1147592336\\/**http%3a\\/\\/yhbt.mine.nu\\/t\\/n132.torrent","ModificationDate":1114671600,"MimeType":"unknown"}]}}');
+
+  assertEquals(result.groupCount + 1, 5);
+}
diff --git a/tests/corelib/regexp/standalones_test.dart b/tests/corelib/regexp/standalones_test.dart
new file mode 100644
index 0000000..bdc0481
--- /dev/null
+++ b/tests/corelib/regexp/standalones_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  /* Many of the Mozilla regexp tests used 'toSource' to test their
+  * results.  Since we don't currently support toSource, those tests
+  * are disabled and standalone versions are included here.
+  */
+
+  // Tests from ecma_3/RegExp/regress-78156.js
+  var string = 'aaa\n789\r\nccc\r\n345';
+  var pattern = new RegExp(r"^\d", multiLine: true);
+  var result = pattern.allMatches(string).toList();
+  assertEquals(2, result.length, "1");
+  assertEquals('7', result[0].group(0), "2");
+  assertEquals('3', result[1].group(0), "3");
+
+  pattern = new RegExp(r"\d$", multiLine: true);
+  result = pattern.allMatches(string).toList();
+  assertEquals(2, result.length, "4");
+  assertEquals('9', result[0].group(0), "5");
+  assertEquals('5', result[1].group(0), "6");
+
+  string = 'aaa\n789\r\nccc\r\nddd';
+  pattern = new RegExp(r"^\d", multiLine: true);
+  result = pattern.allMatches(string).toList();
+  assertEquals(1, result.length, "7");
+  assertEquals('7', result[0].group(0), "8");
+
+  pattern = new RegExp(r"\d$", multiLine: true);
+  result = pattern.allMatches(string).toList();
+  assertEquals(1, result.length, "9");
+  assertEquals('9', result[0].group(0), "10");
+
+  // Tests from ecma_3/RegExp/regress-72964.js
+  pattern = new RegExp(r"[\S]+");
+  string = '\u00BF\u00CD\u00BB\u00A7';
+  result = pattern.firstMatch(string);
+  assertEquals(1, result.groupCount + 1, "11");
+  assertEquals(string, result.group(0), "12");
+
+  string = '\u00BF\u00CD \u00BB\u00A7';
+  result = pattern.firstMatch(string);
+  assertEquals(1, result.groupCount + 1, "13");
+  assertEquals('\u00BF\u00CD', result.group(0), "14");
+
+  string = '\u4e00\uac00\u4e03\u4e00';
+  result = pattern.firstMatch(string);
+  assertEquals(1, result.groupCount + 1, "15");
+  assertEquals(string, result.group(0), "16");
+
+  string = '\u4e00\uac00 \u4e03\u4e00';
+  result = pattern.firstMatch(string);
+  assertEquals(1, result.groupCount + 1, "17");
+  assertEquals('\u4e00\uac00', result.group(0), "18");
+}
diff --git a/tests/corelib/regexp/toString_test.dart b/tests/corelib/regexp/toString_test.dart
new file mode 100644
index 0000000..0f9ea60
--- /dev/null
+++ b/tests/corelib/regexp/toString_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  dynamic testForwardSlash(pattern, _string)
+  {
+      var string = _string;
+
+      var re1 = new RegExp(pattern);
+
+      return re1.hasMatch(string);
+  }
+
+  dynamic testLineTerminator(pattern)
+  {
+      var re1 = new RegExp(pattern);
+
+      return new RegExp(r"\n|\r|\u2028|\u2029").hasMatch(re1.toString());
+  }
+
+  // These strings are equivalent, since the '\' is identity escaping the '/' at the string level.
+  shouldBeTrue(testForwardSlash("^/\$", "/"));
+  shouldBeTrue(testForwardSlash("^\/\$", "/"));
+  // This string passes "^\/$" to the RegExp, so the '/' is escaped in the re!
+  shouldBeTrue(testForwardSlash("^\\/\$", "/"));
+  // These strings pass "^\\/$" and "^\\\/$" respectively to the RegExp, giving one '\' to match.
+  shouldBeTrue(testForwardSlash("^\\\\/\$", "\\/"));
+  shouldBeTrue(testForwardSlash("^\\\\\\/\$", "\\/"));
+  // These strings match two backslashes (the second with the '/' escaped).
+  shouldBeTrue(testForwardSlash("^\\\\\\\\/\$", "\\\\/"));
+  shouldBeTrue(testForwardSlash("^\\\\\\\\\\/\$", "\\\\/"));
+  // Test that nothing goes wrongif there are multiple forward slashes!
+  shouldBeTrue(testForwardSlash("x/x/x", "x/x/x"));
+  shouldBeTrue(testForwardSlash("x\\/x/x", "x/x/x"));
+  shouldBeTrue(testForwardSlash("x/x\\/x", "x/x/x"));
+  shouldBeTrue(testForwardSlash("x\\/x\\/x", "x/x/x"));
+
+  shouldBeFalse(testLineTerminator("\\n"));
+  shouldBeFalse(testLineTerminator("\\\\n"));
+  shouldBeFalse(testLineTerminator("\\r"));
+  shouldBeFalse(testLineTerminator("\\\\r"));
+  shouldBeFalse(testLineTerminator("\\u2028"));
+  shouldBeFalse(testLineTerminator("\\\\u2028"));
+  shouldBeFalse(testLineTerminator("\\u2029"));
+  shouldBeFalse(testLineTerminator("\\\\u2029"));
+}
diff --git a/tests/corelib/regexp/unicode-handling_test.dart b/tests/corelib/regexp/unicode-handling_test.dart
new file mode 100644
index 0000000..8874135
--- /dev/null
+++ b/tests/corelib/regexp/unicode-handling_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test for proper handling of Unicode RegExps and <a href="http://bugzilla.webkit.org/show_bug.cgi?id=7445">bug 7445</a>: Gmail puts wrong subject in replies.'
+  );
+
+  // Regex to match Re in various languanges straight from Gmail source
+  var I3=new RegExp(r"^\s*(fwd|re|aw|antw|antwort|wg|sv|ang|odp|betreff|betr|transf|reenv\.|reenv|in|res|resp|resp\.|enc|\u8f6c\u53d1|\u56DE\u590D|\u041F\u0435\u0440\u0435\u0441\u043B|\u041E\u0442\u0432\u0435\u0442):\s*(.*)$", caseSensitive: false);
+
+  // Other RegExs from Gmail source
+  var Ci=new RegExp(r"\s+");
+  var BC=new RegExp(r"^ ");
+  var BG=new RegExp(r" $");
+
+  // This function replaces consecutive whitespace with a single space
+  // then removes a leading and trailing space if they exist. (From Gmail)
+  dynamic Gn(a) {
+      return a.replaceAll(Ci, " ").replaceAll(BC, "").replaceAll(BG, "");
+  }
+
+  // Strips leading Re or similar (from Gmail source)
+  dynamic cy(a) {
+      //var b = I3.firstMatch(a);
+      var b = I3.firstMatch(a);
+
+      if (b != null) {
+          a = b.group(2);
+      }
+
+      return Gn(a);
+  }
+
+  assertEquals(cy('Re: Moose'), 'Moose');
+  assertEquals(cy('\u8f6c\u53d1: Moose'), 'Moose');
+
+  // Test handling of \u2820 (skull and crossbones)
+  var sample="sample bm\u2820p cm\\u2820p";
+
+  var inlineRe=new RegExp(r".m\u2820p");
+  assertEquals(inlineRe.firstMatch(sample).group(0), 'bm\u2820p');
+
+
+  // Test handling of \u007c "|"
+  var bsample="sample bm\u007cp cm\\u007cp";
+
+  var binlineRe=new RegExp(r".m\u007cp");
+
+  assertEquals(binlineRe.firstMatch(bsample).group(0), 'bm|p');
+}
diff --git a/tests/corelib/regexp/unicodeCaseInsensitive_test.dart b/tests/corelib/regexp/unicodeCaseInsensitive_test.dart
new file mode 100644
index 0000000..44eb86e
--- /dev/null
+++ b/tests/corelib/regexp/unicodeCaseInsensitive_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  shouldBeTrue(new RegExp(r"ΣΤΙΓΜΑΣ", caseSensitive: false).hasMatch("στιγμας"));
+  shouldBeTrue(new RegExp(r"ΔΣΔ", caseSensitive: false).hasMatch("δςδ"));
+  shouldBeTrue(new RegExp(r"ς", caseSensitive: false).hasMatch("σ"));
+  shouldBeTrue(new RegExp(r"σ", caseSensitive: false).hasMatch("ς"));
+
+  // Simple case, has no canonical equivalents
+  shouldBeTrue(new RegExp(r"\u1f16", caseSensitive: false).hasMatch("\u1f16"));
+
+  // Test the sets of USC2 code points that have more than one canonically equivalent value.
+  dynamic ucs2CodePoint(x) => new String.fromCharCode(x);
+  dynamic testSet(s)
+  {
+      for (var i in s) {
+          for (var j in s) {
+              shouldBeTrue(new RegExp(ucs2CodePoint(i), caseSensitive: false).hasMatch(ucs2CodePoint(j)));
+              shouldBeTrue(new RegExp("[${ucs2CodePoint(i - 1)}-${ucs2CodePoint(i + 1)}]", caseSensitive: false).hasMatch(ucs2CodePoint(j)));
+          }
+      }
+  }
+  testSet([ 0x01c4, 0x01c5, 0x01c6 ]);
+  testSet([ 0x01c7, 0x01c8, 0x01c9 ]);
+  testSet([ 0x01ca, 0x01cb, 0x01cc ]);
+  testSet([ 0x01f1, 0x01f2, 0x01f3 ]);
+  testSet([ 0x0392, 0x03b2, 0x03d0 ]);
+  testSet([ 0x0395, 0x03b5, 0x03f5 ]);
+  testSet([ 0x0398, 0x03b8, 0x03d1 ]);
+  testSet([ 0x0345, 0x0399, 0x03b9, 0x1fbe ]);
+  testSet([ 0x039a, 0x03ba, 0x03f0 ]);
+  testSet([ 0x00b5, 0x039c, 0x03bc ]);
+  testSet([ 0x03a0, 0x03c0, 0x03d6 ]);
+  testSet([ 0x03a1, 0x03c1, 0x03f1 ]);
+  testSet([ 0x03a3, 0x03c2, 0x03c3 ]);
+  testSet([ 0x03a6, 0x03c6, 0x03d5 ]);
+  testSet([ 0x1e60, 0x1e61, 0x1e9b ]);
+
+  // Test a couple of lo/hi pairs
+  shouldBeTrue(new RegExp(r"\u03cf", caseSensitive: false).hasMatch("\u03cf"));
+  shouldBeTrue(new RegExp(r"\u03d7", caseSensitive: false).hasMatch("\u03cf"));
+  shouldBeTrue(new RegExp(r"\u03cf", caseSensitive: false).hasMatch("\u03d7"));
+  shouldBeTrue(new RegExp(r"\u03d7", caseSensitive: false).hasMatch("\u03d7"));
+  shouldBeTrue(new RegExp(r"\u1f11", caseSensitive: false).hasMatch("\u1f11"));
+  shouldBeTrue(new RegExp(r"\u1f19", caseSensitive: false).hasMatch("\u1f11"));
+  shouldBeTrue(new RegExp(r"\u1f11", caseSensitive: false).hasMatch("\u1f19"));
+  shouldBeTrue(new RegExp(r"\u1f19", caseSensitive: false).hasMatch("\u1f19"));
+
+  // Test an aligned alternating capitalization pair.
+  shouldBeFalse(new RegExp(r"\u0489", caseSensitive: false).hasMatch("\u048a"));
+  shouldBeTrue(new RegExp(r"\u048a", caseSensitive: false).hasMatch("\u048a"));
+  shouldBeTrue(new RegExp(r"\u048b", caseSensitive: false).hasMatch("\u048a"));
+  shouldBeFalse(new RegExp(r"\u048c", caseSensitive: false).hasMatch("\u048a"));
+  shouldBeFalse(new RegExp(r"\u0489", caseSensitive: false).hasMatch("\u048b"));
+  shouldBeTrue(new RegExp(r"\u048a", caseSensitive: false).hasMatch("\u048b"));
+  shouldBeTrue(new RegExp(r"\u048b", caseSensitive: false).hasMatch("\u048b"));
+  shouldBeFalse(new RegExp(r"\u048c", caseSensitive: false).hasMatch("\u048b"));
+  shouldBeTrue(new RegExp(r"[\u0489-\u048a]", caseSensitive: false).hasMatch("\u048b"));
+  shouldBeTrue(new RegExp(r"[\u048b-\u048c]", caseSensitive: false).hasMatch("\u048a"));
+
+  // Test an unaligned alternating capitalization pair.
+  shouldBeFalse(new RegExp(r"\u04c4", caseSensitive: false).hasMatch("\u04c5"));
+  shouldBeTrue(new RegExp(r"\u04c5", caseSensitive: false).hasMatch("\u04c5"));
+  shouldBeTrue(new RegExp(r"\u04c6", caseSensitive: false).hasMatch("\u04c5"));
+  shouldBeFalse(new RegExp(r"\u04c7", caseSensitive: false).hasMatch("\u04c5"));
+  shouldBeFalse(new RegExp(r"\u04c4", caseSensitive: false).hasMatch("\u04c6"));
+  shouldBeTrue(new RegExp(r"\u04c5", caseSensitive: false).hasMatch("\u04c6"));
+  shouldBeTrue(new RegExp(r"\u04c6", caseSensitive: false).hasMatch("\u04c6"));
+  shouldBeFalse(new RegExp(r"\u04c7", caseSensitive: false).hasMatch("\u04c6"));
+  shouldBeTrue(new RegExp(r"[\u04c4-\u04c5]", caseSensitive: false).hasMatch("\u04c6"));
+  shouldBeTrue(new RegExp(r"[\u04c6-\u04c7]", caseSensitive: false).hasMatch("\u04c5"));
+
+  var successfullyParsed = true;
+}
diff --git a/tests/corelib/regexp/v8_regexp_utils.dart b/tests/corelib/regexp/v8_regexp_utils.dart
new file mode 100644
index 0000000..83e56d0
--- /dev/null
+++ b/tests/corelib/regexp/v8_regexp_utils.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, 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.
+
+// Utility functions to easily port V8 tests.
+
+import "package:expect/expect.dart";
+
+void assertEquals(actual, expected, [String message = null]) {
+  Expect.equals(actual, expected, message);
+}
+void assertTrue(actual, [String message = null]) { Expect.isTrue(actual, message); }
+void assertFalse(actual, [String message = null]) { Expect.isFalse(actual, message); }
+void assertThrows(fn, [num testid = null]) {
+  Expect.throws(fn, null, "Test $testid");
+}
+void assertNull(actual, [num testid = null]) {
+  Expect.isNull(actual, "Test $testid");
+}
+
+void assertToStringEquals(str, match, num testid) {
+  var actual = [];
+  for (int i = 0; i <= match.groupCount; i++) {
+    var g = match.group(i);
+    actual.add((g == null) ? "" : g);
+  }
+  Expect.equals(str, actual.join(","), "Test $testid");
+}
+
+void shouldBeTrue(actual) { Expect.isTrue(actual); }
+void shouldBeFalse(actual) { Expect.isFalse(actual); }
+void shouldBeNull(actual) { Expect.isNull(actual); }
+
+void shouldBe(actual, expected, [String message = null]) {
+  if (expected == null) {
+    Expect.isNull(actual, message);
+  } else {
+    Expect.equals(expected.length, actual.groupCount + 1);
+    for (int i = 0; i <= actual.groupCount; i++) {
+      Expect.equals(expected[i], actual.group(i), message);
+    }
+  }
+}
+
+Match firstMatch(String str, RegExp pattern) => pattern.firstMatch(str);
+List<String> allStringMatches(String str, RegExp pattern) =>
+    pattern.allMatches(str).map((Match m) => m.group(0)).toList();
+
+void description(str) { }
diff --git a/tests/corelib/regexp/zero-length-alternatives_test.dart b/tests/corelib/regexp/zero-length-alternatives_test.dart
new file mode 100644
index 0000000..1c7c949
--- /dev/null
+++ b/tests/corelib/regexp/zero-length-alternatives_test.dart
@@ -0,0 +1,280 @@
+// Copyright (c) 2014, the Dart project authors. All rights reserved.
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1.  Redistributions of source code must retain the above copyright
+//     notice, this list of conditions and the following disclaimer.
+// 2.  Redistributions in binary form must reproduce the above copyright
+//     notice, this list of conditions and the following disclaimer in the
+//     documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import 'v8_regexp_utils.dart';
+import 'package:expect/expect.dart';
+
+void main() {
+  description(
+  'Test regular expression processing with alternatives that match consuming no characters'
+  );
+
+  var emptyStr = "";
+  var s1 = "xxxx";
+  var s2 = "aaaa";
+  var s3 = "aax";
+  var s4 = "abab";
+  var s5 = "ab";
+  var s6 = "xabx";
+  var s7 = "g0";
+
+  // Non-capturing empty first alternative greedy '*'
+  var re1 = new RegExp(r"(?:|a|z)*");
+  shouldBe(firstMatch(emptyStr, re1), [""]);
+  shouldBe(firstMatch(s1, re1), [""]);
+  shouldBe(firstMatch(s2, re1), ["aaaa"]);
+  shouldBe(firstMatch(s3, re1), ["aa"]);
+
+  // Non-capturing empty middle alternative greedy '*'
+  var re2 = new RegExp(r"(?:a||z)*");
+  shouldBe(firstMatch(emptyStr, re2), [""]);
+  shouldBe(firstMatch(s1, re2), [""]);
+  shouldBe(firstMatch(s2, re2), ["aaaa"]);
+  shouldBe(firstMatch(s3, re2), ["aa"]);
+
+  // Non-capturing empty last alternative greedy '*'
+  var re3 = new RegExp(r"(?:a|z|)*");
+  shouldBe(firstMatch(emptyStr, re3), [""]);
+  shouldBe(firstMatch(s1, re3), [""]);
+  shouldBe(firstMatch(s2, re3), ["aaaa"]);
+  shouldBe(firstMatch(s3, re3), ["aa"]);
+
+  // Capturing empty first alternative greedy '*'
+  var re4 = new RegExp(r"(|a|z)*");
+  shouldBe(firstMatch(emptyStr, re4), ["", null]);
+  shouldBe(firstMatch(s1, re4), ["", null]);
+  shouldBe(firstMatch(s2, re4), ["aaaa", "a"]);
+  shouldBe(firstMatch(s3, re4), ["aa", "a"]);
+
+  // Capturing empty middle alternative greedy '*'
+  var re5 = new RegExp(r"(a||z)*");
+  shouldBe(firstMatch(emptyStr, re5), ["", null]);
+  shouldBe(firstMatch(s1, re5), ["", null]);
+  shouldBe(firstMatch(s2, re5), ["aaaa", "a"]);
+  shouldBe(firstMatch(s3, re5), ["aa", "a"]);
+
+  // Capturing empty last alternative greedy '*'
+  var re6 = new RegExp(r"(a|z|)*");
+  shouldBe(firstMatch(emptyStr, re6), ["", null]);
+  shouldBe(firstMatch(s1, re6), ["", null]);
+  shouldBe(firstMatch(s2, re6), ["aaaa", "a"]);
+  shouldBe(firstMatch(s3, re6), ["aa", "a"]);
+
+  // Non-capturing empty first alternative fixed-count
+  var re7 = new RegExp(r"(?:|a|z){2,5}");
+  shouldBe(firstMatch(emptyStr, re7), [""]);
+  shouldBe(firstMatch(s1, re7), [""]);
+  shouldBe(firstMatch(s2, re7), ["aaa"]);
+  shouldBe(firstMatch(s3, re7), ["aa"]);
+
+  // Non-capturing empty middle alternative fixed-count
+  var re8 = new RegExp(r"(?:a||z){2,5}");
+  shouldBe(firstMatch(emptyStr, re8), [""]);
+  shouldBe(firstMatch(s1, re8), [""]);
+  shouldBe(firstMatch(s2, re8), ["aaaa"]);
+  shouldBe(firstMatch(s3, re8), ["aa"]);
+
+  // Non-capturing empty last alternative fixed-count
+  var re9 = new RegExp(r"(?:a|z|){2,5}");
+  shouldBe(firstMatch(emptyStr, re9), [""]);
+  shouldBe(firstMatch(s1, re9), [""]);
+  shouldBe(firstMatch(s2, re9), ["aaaa"]);
+  shouldBe(firstMatch(s3, re9), ["aa"]);
+
+  // Non-capturing empty first alternative non-greedy '*'
+  var re10 = new RegExp(r"(?:|a|z)*?");
+  shouldBe(firstMatch(emptyStr, re10), [""]);
+  shouldBe(firstMatch(s1, re10), [""]);
+  shouldBe(firstMatch(s2, re10), [""]);
+  shouldBe(firstMatch(s3, re10), [""]);
+
+  // Non-capturing empty middle alternative non-greedy '*'
+  var re11 = new RegExp(r"(?:a||z)*?");
+  shouldBe(firstMatch(emptyStr, re11), [""]);
+  shouldBe(firstMatch(s1, re11), [""]);
+  shouldBe(firstMatch(s2, re11), [""]);
+  shouldBe(firstMatch(s3, re11), [""]);
+
+  // Non-capturing empty last alternative non-greedy '*'
+  var re12 = new RegExp(r"(?:a|z|)*?");
+  shouldBe(firstMatch(emptyStr, re12), [""]);
+  shouldBe(firstMatch(s1, re12), [""]);
+  shouldBe(firstMatch(s2, re12), [""]);
+  shouldBe(firstMatch(s3, re12), [""]);
+
+  // Capturing empty first alternative non-greedy '*'
+  var re13 = new RegExp(r"(|a|z)*?");
+  shouldBe(firstMatch(emptyStr, re13), ["", null]);
+  shouldBe(firstMatch(s1, re13), ["", null]);
+  shouldBe(firstMatch(s2, re13), ["", null]);
+  shouldBe(firstMatch(s3, re13), ["", null]);
+
+  // Capturing empty middle alternative non-greedy '*'
+  var re14 = new RegExp(r"(a||z)*?");
+  shouldBe(firstMatch(emptyStr, re14), ["", null]);
+  shouldBe(firstMatch(s1, re14), ["", null]);
+  shouldBe(firstMatch(s2, re14), ["", null]);
+  shouldBe(firstMatch(s3, re14), ["", null]);
+
+  // Capturing empty last alternative non-greedy '*'
+  var re15 = new RegExp(r"(a|z|)*?");
+  shouldBe(firstMatch(emptyStr, re15), ["", null]);
+  shouldBe(firstMatch(s1, re15), ["", null]);
+  shouldBe(firstMatch(s2, re15), ["", null]);
+  shouldBe(firstMatch(s3, re15), ["", null]);
+
+  // Non-capturing empty first alternative greedy '?'
+  var re16 = new RegExp(r"(?:|a|z)?");
+  shouldBe(firstMatch(emptyStr, re16), [""]);
+  shouldBe(firstMatch(s1, re16), [""]);
+  shouldBe(firstMatch(s2, re16), ["a"]);
+  shouldBe(firstMatch(s3, re16), ["a"]);
+
+  // Non-capturing empty middle alternative greedy '?'
+  var re17 = new RegExp(r"(?:a||z)?");
+  shouldBe(firstMatch(emptyStr, re17), [""]);
+  shouldBe(firstMatch(s1, re17), [""]);
+  shouldBe(firstMatch(s2, re17), ["a"]);
+  shouldBe(firstMatch(s3, re17), ["a"]);
+
+  // Non-capturing empty last alternative greedy '?'
+  var re18 = new RegExp(r"(?:a|z|)?");
+  shouldBe(firstMatch(emptyStr, re18), [""]);
+  shouldBe(firstMatch(s1, re18), [""]);
+  shouldBe(firstMatch(s2, re18), ["a"]);
+  shouldBe(firstMatch(s3, re18), ["a"]);
+
+  // Capturing empty first alternative greedy '?'
+  var re19 = new RegExp(r"(|a|z)?");
+  shouldBe(firstMatch(emptyStr, re19), ["", null]);
+  shouldBe(firstMatch(s1, re19), ["", null]);
+  shouldBe(firstMatch(s2, re19), ["a", "a"]);
+  shouldBe(firstMatch(s3, re19), ["a", "a"]);
+
+  // Capturing empty middle alternative greedy '?'
+  var re20 = new RegExp(r"(a||z)?");
+  shouldBe(firstMatch(emptyStr, re20), ["", null]);
+  shouldBe(firstMatch(s1, re20), ["", null]);
+  shouldBe(firstMatch(s2, re20), ["a", "a"]);
+  shouldBe(firstMatch(s3, re20), ["a", "a"]);
+
+  // Capturing empty last alternative greedy '?'
+  var re21 = new RegExp(r"(a|z|)?");
+  shouldBe(firstMatch(emptyStr, re21), ["", null]);
+  shouldBe(firstMatch(s1, re21), ["", null]);
+  shouldBe(firstMatch(s2, re21), ["a", "a"]);
+  shouldBe(firstMatch(s3, re21), ["a", "a"]);
+
+  // Non-capturing empty first alternative non-greedy '?'
+  var re22 = new RegExp(r"(?:|a|z)??");
+  shouldBe(firstMatch(emptyStr, re22), [""]);
+  shouldBe(firstMatch(s1, re22), [""]);
+  shouldBe(firstMatch(s2, re22), [""]);
+  shouldBe(firstMatch(s3, re22), [""]);
+
+  // Non-capturing empty middle alternative non-greedy '?'
+  var re23 = new RegExp(r"(?:a||z)??");
+  shouldBe(firstMatch(emptyStr, re23), [""]);
+  shouldBe(firstMatch(s1, re23), [""]);
+  shouldBe(firstMatch(s2, re23), [""]);
+  shouldBe(firstMatch(s3, re23), [""]);
+
+  // Non-capturing empty last alternative non-greedy '?'
+  var re24 = new RegExp(r"(?:a|z|)??");
+  shouldBe(firstMatch(emptyStr, re24), [""]);
+  shouldBe(firstMatch(s1, re24), [""]);
+  shouldBe(firstMatch(s2, re24), [""]);
+  shouldBe(firstMatch(s3, re24), [""]);
+
+  // Capturing empty first alternative non-greedy '?'
+  var re25 = new RegExp(r"(|a|z)??");
+  shouldBe(firstMatch(emptyStr, re25), ["", null]);
+  shouldBe(firstMatch(s1, re25), ["", null]);
+  shouldBe(firstMatch(s2, re25), ["", null]);
+  shouldBe(firstMatch(s3, re25), ["", null]);
+
+  // Capturing empty middle alternative non-greedy '?'
+  var re26 = new RegExp(r"(a||z)??");
+  shouldBe(firstMatch(emptyStr, re26), ["", null]);
+  shouldBe(firstMatch(s1, re26), ["", null]);
+  shouldBe(firstMatch(s2, re26), ["", null]);
+  shouldBe(firstMatch(s3, re26), ["", null]);
+
+  // Capturing empty last alternative non-greedy '?'
+  var re27 = new RegExp(r"(a|z|)??");
+  shouldBe(firstMatch(emptyStr, re27), ["", null]);
+  shouldBe(firstMatch(s1, re27), ["", null]);
+  shouldBe(firstMatch(s2, re27), ["", null]);
+  shouldBe(firstMatch(s3, re27), ["", null]);
+
+  // Non-capturing empty first alternative greedy '*' non-terminal
+  var re28 = new RegExp(r"(?:|a|z)*x");
+  shouldBe(firstMatch(emptyStr, re28), null);
+  shouldBe(firstMatch(s1, re28), ["x"]);
+  shouldBe(firstMatch(s2, re28), null);
+  shouldBe(firstMatch(s3, re28), ["aax"]);
+
+  // Non-capturing empty middle alternative greedy '*' non-terminal
+  var re29 = new RegExp(r"(?:a||z)*x");
+  shouldBe(firstMatch(emptyStr, re29), null);
+  shouldBe(firstMatch(s1, re29), ["x"]);
+  shouldBe(firstMatch(s2, re29), null);
+  shouldBe(firstMatch(s3, re29), ["aax"]);
+
+  // Non-capturing empty last alternative greedy '*' non-terminal
+  var re30 = new RegExp(r"(?:a|z|)*x");
+  shouldBe(firstMatch(emptyStr, re30), null);
+  shouldBe(firstMatch(s1, re30), ["x"]);
+  shouldBe(firstMatch(s2, re30), null);
+  shouldBe(firstMatch(s3, re30), ["aax"]);
+
+  // Non-capturing two possibly empty alternatives greedy '*'
+  var re31 = new RegExp(r"(?:a*|b*)*");
+  shouldBe(firstMatch(emptyStr, re31), [""]);
+  shouldBe(firstMatch(s1, re31), [""]);
+  shouldBe(firstMatch(s3, re31), ["aa"]);
+  shouldBe(firstMatch(s4, re31), ["abab"]);
+
+  // Non-capturing two possibly empty non-greedy alternatives non-greedy '*'
+  var re32 = new RegExp(r"(?:a*?|b*?)*");
+  shouldBe(firstMatch(emptyStr, re32), [""]);
+  shouldBe(firstMatch(s1, re32), [""]);
+  shouldBe(firstMatch(s2, re32), ["aaaa"]);
+  shouldBe(firstMatch(s4, re32), ["abab"]);
+  shouldBe(firstMatch(s5, re32), ["ab"]);
+  shouldBe(firstMatch(s6, re32), [""]);
+
+  // Three possibly empty alternatives with greedy +
+  var re33 = new RegExp(r"(?:(?:(?!))|g?|0*\*?)+");
+  shouldBe(firstMatch(emptyStr, re33), [""]);
+  shouldBe(firstMatch(s1, re33), [""]);
+  shouldBe(firstMatch(s7, re33), ["g0"]);
+
+  // first alternative zero length fixed count
+  var re34 = new RegExp(r"(?:|a)");
+  shouldBe(firstMatch(emptyStr, re34), [""]);
+  shouldBe(firstMatch(s1, re34), [""]);
+  shouldBe(firstMatch(s2, re34), [""]);
+  shouldBe(firstMatch(s3, re34), [""]);
+}
diff --git a/tests/html/audioelement_test.dart b/tests/html/audioelement_test.dart
index 2828596..02c8935 100644
--- a/tests/html/audioelement_test.dart
+++ b/tests/html/audioelement_test.dart
@@ -13,9 +13,9 @@
     });
 
   test('constructorTest2', () {
-      var audio = new AudioElement('hahaURL');
+      var audio = new AudioElement('IntentionallyMissingFileURL');
       expect(audio, isNotNull);
       expect(audio is AudioElement, isTrue);
-      expect(audio.src, contains('hahaURL'));
+      expect(audio.src, contains('IntentionallyMissingFileURL'));
     });
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 8fadbe3..b0f6b4f 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -257,8 +257,7 @@
 input_element_test/supported_datetime-local: Fail
 touchevent_test/supported: Fail
 
-[ $runtime == safari && $builder_tag == mac10_8 ]
-element_test/_ElementList: RuntimeError # Issue 21434
+[ $runtime == safari && ($builder_tag == mac10_8 || $builder_tag == mac10_9) ]
 indexeddb_1_test/functional: RuntimeError # Issue 21433
 indexeddb_2_test: RuntimeError # Issue 21433
 indexeddb_4_test: RuntimeError # Issue 21433
diff --git a/tests/language/first_class_types_literals_test.dart b/tests/language/first_class_types_literals_test.dart
index 2f32cfe..c0a0e0f 100644
--- a/tests/language/first_class_types_literals_test.dart
+++ b/tests/language/first_class_types_literals_test.dart
@@ -48,16 +48,16 @@
   Expect.equals((D).runtimeType, (D).runtimeType.runtimeType);
 
   // Test that operator calls on class literals go to Type.
-  Expect.throws(() => C = 1, (e) => e is NoSuchMethodError);
-  Expect.throws(() => C++, (e) => e is NoSuchMethodError);
-  Expect.throws(() => C + 1, (e) => e is NoSuchMethodError);
-  Expect.throws(() => C[2], (e) => e is NoSuchMethodError);
-  Expect.throws(() => C[2] = 'hest', (e) => e is NoSuchMethodError);
-  Expect.throws(() => dynamic = 1, (e) => e is NoSuchMethodError);
-  Expect.throws(() => dynamic++, (e) => e is NoSuchMethodError);
-  Expect.throws(() => dynamic + 1, (e) => e is NoSuchMethodError);
-  Expect.throws(() => dynamic[2], (e) => e is NoSuchMethodError);
-  Expect.throws(() => dynamic[2] = 'hest', (e) => e is NoSuchMethodError);
+  Expect.throws(() => C = 1, (e) => e is NoSuchMethodError); /// 03: static type warning
+  Expect.throws(() => C++, (e) => e is NoSuchMethodError); /// 04: static type warning
+  Expect.throws(() => C + 1, (e) => e is NoSuchMethodError); /// 05: static type warning
+  Expect.throws(() => C[2], (e) => e is NoSuchMethodError); /// 06: static type warning
+  Expect.throws(() => C[2] = 'hest', (e) => e is NoSuchMethodError); /// 07: static type warning
+  Expect.throws(() => dynamic = 1, (e) => e is NoSuchMethodError); /// 08: static type warning
+  Expect.throws(() => dynamic++, (e) => e is NoSuchMethodError); /// 09: static type warning
+  Expect.throws(() => dynamic + 1, (e) => e is NoSuchMethodError); /// 10: static type warning
+  Expect.throws(() => dynamic[2], (e) => e is NoSuchMethodError); /// 11: static type warning
+  Expect.throws(() => dynamic[2] = 'hest', (e) => e is NoSuchMethodError); /// 12: static type warning
 
   Expect.equals((dynamic).toString(), 'dynamic');
 }
diff --git a/tests/language/identical_const_test.dart b/tests/language/identical_const_test.dart
new file mode 100644
index 0000000..cd96244
--- /dev/null
+++ b/tests/language/identical_const_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, 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.
+
+import 'package:expect/expect.dart';
+
+f() {}
+const g = 1;
+
+const identical_ff = identical(f, f);
+const identical_fg = identical(f, g);
+const identical_gf = identical(g, f);
+const identical_gg = identical(g, g);
+
+// Verify proper compile time computation of identical()
+const a = const {
+  identical_ff: 0, /// 01: static type warning
+  identical_gg: 0, /// 02: static type warning
+  true: 0 };
+
+const b = const {
+  identical_fg: 0, /// 03: static type warning
+  identical_gf: 0, /// 04: static type warning
+  false: 0 };
+
+use(x) => x;
+
+main() {
+  use(a);
+  use(b);
+
+  // Verify proper run time computation of identical()
+  Expect.isTrue(identical_ff); /// 05: ok
+  Expect.isTrue(identical_gg); /// 06: ok
+  Expect.isFalse(identical_fg); /// 07: ok
+  Expect.isFalse(identical_gf); /// 08: ok
+}
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 2c5db5a..dacf223 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -17,7 +17,7 @@
 external_test/24: Fail
 external_test/25: Fail
 constructor_duplicate_final_test/03: Fail
-
+identical_const_test: Fail # Issue 21177
 
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
@@ -209,7 +209,11 @@
 field5_negative_test: CompileTimeError
 field6a_negative_test: CompileTimeError
 field6_negative_test: CompileTimeError
-first_class_types_literals_test: StaticWarning # Issue 18731
+first_class_types_literals_test/08: MissingStaticWarning # Issue 18731
+first_class_types_literals_test/09: MissingStaticWarning # Issue 18731
+first_class_types_literals_test/10: MissingStaticWarning # Issue 18731
+first_class_types_literals_test/11: MissingStaticWarning # Issue 18731
+first_class_types_literals_test/12: MissingStaticWarning # Issue 18731
 function_malformed_result_type_test: StaticWarning
 function_subtype_bound_closure7_test: StaticWarning
 function_subtype_checked0_test: StaticWarning
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 739cc54..dc4e312 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -209,7 +209,6 @@
 field5_negative_test: CompileTimeError
 field6a_negative_test: CompileTimeError
 field6_negative_test: CompileTimeError
-first_class_types_literals_test: StaticWarning # Issue 18731
 function_malformed_result_type_test: StaticWarning
 function_subtype_bound_closure7_test: StaticWarning
 function_subtype_checked0_test: StaticWarning
@@ -455,5 +454,3 @@
 main_not_a_function_test/01: Fail # http://dartbug.com/20030
 main_test/03: Fail # http://dartbug.com/20030
 no_main_test/01: Fail # http://dartbug.com/20030
-
-compile_time_constant10_test/none: CompileTimeError # Issue 21177
diff --git a/tests/language/mixin_type_parameter5_test.dart b/tests/language/mixin_type_parameter5_test.dart
new file mode 100644
index 0000000..ce6bad0
--- /dev/null
+++ b/tests/language/mixin_type_parameter5_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, 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.
+
+class MixinA<T> {
+  T intField;
+}
+
+class MixinB<S> {
+  S stringField;
+}
+
+class MixinC<U, V> {
+  U listField;
+  V mapField;
+}
+
+class C extends Object with MixinA<int>, MixinB<String>, MixinC<List, Map> {}
+
+void main() {
+  var c = new C();
+  c.intField = 0;
+  c.stringField = '';
+  c.listField = [];
+  c.mapField = {};
+}
diff --git a/tests/language/mixin_type_parameter6_test.dart b/tests/language/mixin_type_parameter6_test.dart
new file mode 100644
index 0000000..401a1a5
--- /dev/null
+++ b/tests/language/mixin_type_parameter6_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, 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.
+
+class A<T> {}
+
+class B<S> {
+  int foo(S s) => null;
+}
+
+class C extends A<int> with B<String> {}
+
+main() {
+  var list = <String>['foo'];
+  var c = new C();
+  list.map(c.foo);
+}
diff --git a/tests/language/vm/closure_memory_retention_test.dart b/tests/language/vm/closure_memory_retention_test.dart
new file mode 100644
index 0000000..8a41b31
--- /dev/null
+++ b/tests/language/vm/closure_memory_retention_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, 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.
+// VMOptions=--old_gen_heap_size=50
+
+// Test that non-capturing closures don't retain unnecessary memory.
+// It tests that the context of `f` allocated within `bar` not leaking and does
+// not become the context of empty non-capturing closure allocated inside `foo`.
+// If failing it crashes with an OOM error.
+
+import "package:expect/expect.dart";
+
+foo() {
+  return () { };
+}
+
+bar(a, b) {
+  f() => [a, b];
+  return foo();
+}
+
+main() {
+  var closure = null;
+  for (var i = 0; i < 100; i++) {
+    closure = bar(closure, new List(1024 * 1024));
+  }
+  Expect.isTrue(closure is Function);
+}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 6f8d9bd..b69a25e 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -15,9 +15,13 @@
 lib/web_audio/dart2js/web_audio_dart2js: CompileTimeError # Issue 16522
 lib/web_gl/dart2js/web_gl_dart2js: CompileTimeError # Issue 16522
 lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16522
-
+ 
 lib/_internal/compiler/samples/compile_loop/compile_loop: CompileTimeError  # Issue 16524
 
+# The async_await compiler isn't part of the repo so it shouldn't be tested by
+# repo tests.
+lib/_internal/pub_generated/bin/async_compile: Skip
+
 # Pub is starting to use the new async syntax, which isn't supported on the
 # analyzer bots yet.
 lib/_internal/pub/*: Pass, CompileTimeError
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 97c7512..923014f 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -110,10 +110,6 @@
 typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 
-
-[ $runtime == safari && $builder_tag == mac10_8 ]
-mirrors/generics_test/none: RuntimeError # Issue 21427
-
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
diff --git a/tests/lib/mirrors/class_declarations_test.dart b/tests/lib/mirrors/class_declarations_test.dart
index f957c10..6067e07 100644
--- a/tests/lib/mirrors/class_declarations_test.dart
+++ b/tests/lib/mirrors/class_declarations_test.dart
@@ -190,7 +190,11 @@
         ' with test.declarations_model.Mixin.inheritedRedirectingConstructor)'
         ' in s(test.declarations_model.Superclass'
         ' with test.declarations_model.Mixin), constructor)',
-    'Method(s(toString) in s(Object))'],
+    'Method(s(toString) in s(Object))',
+    'Variable(s(mixinStaticVariable) in s(Mixin), static)',
+    'Method(s(mixinStaticGetter) in s(Mixin), static, getter)',
+    'Method(s(mixinStaticSetter=) in s(Mixin), static, setter)',
+    'Method(s(mixinStaticMethod) in s(Mixin), static)'],
     inheritedDeclarations(cm).where((dm) => !dm.isPrivate).map(stringify),
     'transitive public');
   // The public members of Object should be the same in all implementations, so
@@ -322,7 +326,15 @@
     'Method(s(test.declarations_model.Superclass'
         ' with test.declarations_model.Mixin.inheritedRedirectingConstructor)'
         ' in s(test.declarations_model.Superclass'
-        ' with test.declarations_model.Mixin), constructor)'],
+        ' with test.declarations_model.Mixin), constructor)',
+    'Variable(s(mixinStaticVariable) in s(Mixin), static)',
+    'Variable(s(_mixinStaticVariable) in s(Mixin), private, static)',
+    'Method(s(mixinStaticGetter) in s(Mixin), static, getter)',
+    'Method(s(mixinStaticSetter=) in s(Mixin), static, setter)',
+    'Method(s(mixinStaticMethod) in s(Mixin), static)',
+    'Method(s(_mixinStaticGetter) in s(Mixin), private, static, getter)',
+    'Method(s(_mixinStaticSetter=) in s(Mixin), private, static, setter)',
+    'Method(s(_mixinStaticMethod) in s(Mixin), private, static)'],
     inheritedDeclarations(cm)
         .difference(reflectClass(Object).declarations.values.toSet())
         .map(stringify),
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index c9006ea..6d2b92d 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -332,12 +332,14 @@
 
   contentType = new ContentType("text",
                                 "html",
-                                parameters: {"CHARSET": "UTF-8", "xxx": "yyy"});
-  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
+                                parameters: {"CHARSET": "UTF-8", "xxx": "YYY"});
+  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"});
   String s = contentType.toString();
-  bool expectedToString = (s == "text/html; charset=utf-8; xxx=yyy" ||
-                           s == "text/html; xxx=yyy; charset=utf-8");
+  bool expectedToString = (s == "text/html; charset=utf-8; xxx=YYY" ||
+                           s == "text/html; xxx=YYY; charset=utf-8");
   Expect.isTrue(expectedToString);
+  contentType = ContentType.parse("text/html; CHARSET=UTF-8; xxx=YYY");
+  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"});
   Expect.throws(() => contentType.parameters["xxx"] = "yyy",
                 (e) => e is UnsupportedError);
 
diff --git a/tests/standalone/priority_queue_stress_test.dart b/tests/standalone/priority_queue_stress_test.dart
new file mode 100644
index 0000000..a795892
--- /dev/null
+++ b/tests/standalone/priority_queue_stress_test.dart
@@ -0,0 +1,323 @@
+// Copyright (c) 2014, 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.
+
+library priority_queue;
+
+import 'dart:collection';
+import 'dart:math';
+
+/**
+ * A priority used for the priority queue. Subclasses only need to implement
+ * the compareTo function.
+ */
+abstract class Priority implements Comparable {
+  /**
+   * Return < 0 if other is bigger, >0 if other is smaller, 0 if they are equal.
+   */
+  int compareTo(Priority other);
+  bool operator<(Priority other) => compareTo(other) < 0;
+  bool operator>(Priority other) => compareTo(other) > 0;
+  bool operator==(Priority other) => compareTo(other) == 0;
+}
+
+/**
+ * Priority based on integers.
+ */
+class IntPriority extends Priority {
+  int priority;
+  IntPriority(int this.priority);
+
+  int compareTo(IntPriority other) {
+    return priority - other.priority;
+  }
+  String toString() => "$priority";
+}
+
+/**
+ * An element of a priority queue. The type is used restriction based
+ * querying of the queues.
+ */
+abstract class TypedElement<V> {
+  bool typeEquals(var other);
+}
+
+class StringTypedElement<V> extends TypedElement{
+  String type;
+  V value;
+  StringTypedElement(String this.type, V this.value);
+  bool typeEquals(String otherType) => otherType == type;
+  String toString() => "<Type: $type, Value: $value>";
+}
+
+
+/**
+ * A priority node in a priority queue. A priority node contains all of the
+ * values for a given priority in a given queue. It is part of a linked
+ * list of nodes, with prev and next pointers.
+ */
+class PriorityNode<N extends TypedElement, T extends Priority> {
+  T priority;
+  Queue<N> values;
+  PriorityNode prev;
+  PriorityNode next;
+  PriorityNode(N initialNode, T this.priority)
+    : values = new Queue<N>() {
+    add(initialNode);
+  }
+
+  void add(N n) => values.add(n);
+
+  bool remove(N n) => values.remove(n);
+
+  N removeFirst() => values.removeFirst();
+
+  bool get isEmpty => values.isEmpty;
+
+  N get first => values.first;
+
+  String toString() => "Priority: $priority $values";
+}
+
+/**
+ * A priority queue with a FIFO property for nodes with same priority.
+ * The queue guarantees that nodes are returned in the same order they
+ * are added for a given priority.
+ * For type safety this queue is guarded by the elements being subclasses of
+ * TypedElement - this is not strictly neccesary since we never actually
+ * use the value or type of the nodes.
+ */
+class PriorityQueue<N extends TypedElement, P extends Priority> {
+  PriorityNode<N, P> head;
+  int length = 0;
+
+  void add(N value, P priority) {
+    length++;
+    if (head == null) {
+      head = new PriorityNode<N, P>(value, priority);
+      return;
+    }
+    assert(head.next == null);
+    var node = head;
+    while (node.prev != null && node.priority > priority) {
+      node = node.prev;
+    }
+    if (node.priority == priority) {
+      node.add(value);
+    } else if (node.priority < priority) {
+      var newNode = new PriorityNode<N, P>(value, priority);
+      newNode.next = node.next;
+      if (node.next != null) node.next.prev = newNode;
+      newNode.prev = node;
+      node.next = newNode;
+      if (node == head) head = newNode;
+    } else {
+      var newNode = new PriorityNode<N, P>(value, priority);
+      node.prev = newNode;
+      newNode.next = node;
+    }
+  }
+
+  N get first => head.first;
+
+  Priority get firstPriority => head.priority;
+
+  bool get isEmpty => head == null;
+
+  N removeFirst() {
+    if (isEmpty) throw "Can't get element from empty queue";
+    var value = head.removeFirst();
+    if (head.isEmpty) {
+      if (head.prev != null) {
+        head.prev.next = null;
+      }
+      head = head.prev;
+    }
+    length--;
+    assert(head == null || head.next == null);
+    return value;
+  }
+
+  String toString() {
+    if (head == null) return "Empty priority queue";
+    var node = head;
+    var buffer = new StringBuffer();
+    while (node.prev != null) {
+      buffer.writeln(node);
+      node = node.prev;
+    }
+    buffer.writeln(node);
+    return buffer.toString();
+  }
+}
+
+/**
+ * Implements a specialized priority queue that efficiently allows getting
+ * the highest priorized node that adheres to a set of restrictions.
+ * Most notably it allows to get the highest priority node where the node's
+ * type is not in an exclude list.
+ * In addition, the queue has a number of properties:
+ *   The queue has fifo semantics for nodes with the same priority and type,
+ *   i.e., if nodes a and b are added to the queue with priority x and type z
+ *   then a is returned first iff a was added before b
+ * For different types with the same priority no guarantees are given, but
+ * the returned values try to be fair by returning from the biggest list of
+ * tasks in case of priority clash. (This could be fixed by adding timestamps
+ * to every node, that is _only_ used when collisions occur, not for
+ * insertions)
+ */
+class RestrictViewPriorityQueue<N extends TypedElement, P extends Priority> {
+  // We can't use the basic dart priority queue since it does not guarantee
+  // FIFO for items with the same order. This is currently not uptimized for
+  // different N, if many different N is expected here we should have a
+  // priority queue instead of a list.
+  List<PriorityQueue<N, P>> restrictedQueues = new List<PriorityQueue<N, P>>();
+  PriorityQueue<N, P> mainQueue = new PriorityQueue<N, P>();
+
+  void add(N value, P priority) {
+    for (var queue in restrictedQueues) {
+      if (queue.first.value == value) {
+        queue.add(value, priority);
+      }
+    }
+    mainQueue.add(value, priority);
+  }
+
+  bool get isEmpty => restrictedQueues.length + mainQueue.length == 0;
+
+  int get length => restrictedQueues.fold(0, (v, e) => v + element.length) +
+                    mainQueue.length;
+
+  PriorityQueue getRestricted(List<N> restrictions) {
+    var current = null;
+    // Find highest restricted priority.
+    for (var queue in restrictedQueues) {
+      if (!restrictions.any((e) => queue.head.first.typeEquals(e))) {
+        if (current == null || queue.firstPriority > current.firstPriority) {
+          current = queue;
+        } else if (current.firstPriority == queue.firstPriority) {
+          current = queue.length > current.length ? queue : current;
+        }
+      }
+    }
+    return current;
+  }
+
+  N get first {
+    if (isEmpty) throw "Trying to remove node from empty queue";
+    var candidate = getRestricted([]);
+    if (candidate != null &&
+        (mainQueue.isEmpty ||
+         mainQueue.first.priority < candidate.first.priority)) {
+      return candidate.first;
+    }
+    return mainQueue.isEmpty ? null : mainQueue.first;
+  }
+
+  /**
+   * Returns the node that under the given set of restrictions.
+   * If the queue is empty this function throws.
+   * If the queue is not empty, but no node exists that adheres to the
+   * restrictions we return null.
+   */
+  N removeFirst({List restrictions: const []}) {
+    if (isEmpty) throw "Trying to remove node from empty queue";
+    var candidate = getRestricted(restrictions);
+
+    if (candidate != null &&
+        (mainQueue.isEmpty ||
+         mainQueue.firstPriority < candidate.firstPriority)) {
+      var value = candidate.removeFirst();
+      if (candidate.isEmpty) restrictedQueues.remove(candidate);
+      return value;
+    }
+    while (!mainQueue.isEmpty) {
+      var currentPriority = mainQueue.firstPriority;
+      var current = mainQueue.removeFirst();
+      if (!restrictions.any((e) => current.typeEquals(e))) {
+        return current;
+      } else {
+        var restrictedQueue = restrictedQueues
+          .firstWhere((e) => current.typeEquals(e.first.type),
+                      orElse: () => null);
+        if (restrictedQueue == null) {
+          restrictedQueue = new PriorityQueue<N, P>();
+          restrictedQueues.add(restrictedQueue);
+        }
+        restrictedQueue.add(current, currentPriority);
+      }
+    }
+  }
+
+  String toString() {
+    if (isEmpty) return "Empty queue";
+    var buffer = new StringBuffer();
+    if (!restrictedQueues.isEmpty) {
+      buffer.writeln("Restricted queues");
+      for (var queue in restrictedQueues) {
+        buffer.writeln("$queue");
+      }
+    }
+    buffer.writeln("Main queue:");
+    buffer.writeln("$mainQueue");
+    return buffer.toString();
+  }
+}
+
+/// TEMPORARY TESTING AND PERFORMANCE
+void main([args]) {
+  stress(new RestrictViewPriorityQueue<StringTypedElement, IntPriority>());
+}
+
+void stress(queue) {
+  final int SIZE = 50000;
+  Random random = new Random(29);
+
+  var priorities = [1, 2, 3, 16, 32, 42, 56, 57, 59, 90];
+  var values = [new StringTypedElement('safari', 'foo'),
+                new StringTypedElement('ie', 'bar'),
+                new StringTypedElement('ff', 'foobar'),
+                new StringTypedElement('dartium', 'barfoo'),
+                new StringTypedElement('chrome', 'hest'),
+                new StringTypedElement('drt', 'fisk')];
+
+  var restricted = ['safari', 'chrome'];
+
+
+  void addRandom() {
+    queue.add(values[random.nextInt(values.length)],
+              new IntPriority(priorities[random.nextInt(priorities.length)]));
+  }
+
+  var stopwatch = new Stopwatch()..start();
+  while(queue.length < SIZE) {
+    addRandom();
+  }
+
+  stopwatch.stop();
+  print("Adding took: ${stopwatch.elapsedMilliseconds}");
+  print("Queue length: ${queue.length}");
+
+  stopwatch = new Stopwatch()..start();
+  while(queue.length > 0) {
+    queue.removeFirst();
+  }
+  stopwatch.stop();
+  print("Remowing took: ${stopwatch.elapsedMilliseconds}");
+  print("Queue length: ${queue.length}");
+
+
+  print("Restricted add/remove");
+  while(queue.length < SIZE) {
+    addRandom();
+  }
+
+  for (int i = 0; i < SIZE; i++) {
+    if (random.nextDouble() < 0.5) {
+      queue.removeFirst(restrictions: restricted);
+    } else {
+      queue.removeFirst();
+    }
+    addRandom();
+  }
+}
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index d51d56e..80365fc 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -60,6 +60,8 @@
 # This is runtime test.
 io/process_exit_negative_test: Skip
 
+priority_queue_stress_test: StaticWarning # Issue 21468
+
 [ $compiler == dart2js ]
 number_identity_test: Skip # Bigints and int/double diff. not supported.
 typed_data_test: Skip # dart:typed_data support needed.
diff --git a/tests/try/try.status b/tests/try/try.status
index 02c8edc..d045b0b 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -31,5 +31,10 @@
 [ $compiler == dart2js ]
 poi/*: Skip # http://dartbug.com/20031
 
-[ $runtime == ff || $checked || ($system == windows && $compiler == dart2js)]
-web/incremental_compilation_update_test: Slow, Pass
+[ $runtime == ff && $unchecked ]
+# Compilation is slow, test fails at runtime due to time out.
+web/incremental_compilation_update_test: Slow, Fail
+
+[ $compiler == dart2js && $checked ]
+# Compilation is slow, test fails at runtime due to time out.
+web/incremental_compilation_update_test: Slow, Fail
diff --git a/tests/try/web/incremental_compilation_update_test.dart b/tests/try/web/incremental_compilation_update_test.dart
index db2e40ad..70c6544 100644
--- a/tests/try/web/incremental_compilation_update_test.dart
+++ b/tests/try/web/incremental_compilation_update_test.dart
@@ -22,6 +22,8 @@
 
 import 'program_result.dart';
 
+const int TIMEOUT = 100;
+
 const List<List<ProgramResult>> tests = const <List<ProgramResult>>[
     // Basic hello-world test.
     const <ProgramResult>[
@@ -157,8 +159,43 @@
   instance.m();
 }
 """,
-            // TODO(ahe): This test is failing, should print "v2".
+            const <String> ['v2']),
+    ],
+
+    // Test that a stored instance tearoff changes behavior when updated.
+    const <ProgramResult>[
+        const ProgramResult(
+            """
+class C {
+  m() {
+    print('v1');
+  }
+}
+var closure;
+main() {
+  if (closure == null) {
+    closure = new C().m;
+  }
+  closure();
+}
+""",
             const <String> ['v1']),
+        const ProgramResult(
+            """
+class C {
+  m() {
+    print('v2');
+  }
+}
+var closure;
+main() {
+  if (closure == null) {
+    closure = new C().m;
+  }
+  closure();
+}
+""",
+            const <String> ['v2']),
     ],
 ];
 
@@ -203,7 +240,7 @@
           Uri uri = test.scriptUri.resolve('?v${version++}');
           inputProvider.cachedSources[uri] = new Future.value(program.code);
           Future future = test.incrementalCompiler.compileUpdates(
-              {test.scriptUri: uri}, logVerbose: print, logTime: print);
+              {test.scriptUri: uri}, logVerbose: logger, logTime: logger);
           return future.then((String update) {
             print({'update': update});
             iframe.contentWindow.postMessage(['apply-update', update], '*');
@@ -221,3 +258,13 @@
     iframe.remove();
   });
 }
+
+void logger(x) {
+  print(x);
+  bool isCheckedMode = false;
+  assert(isCheckedMode = true);
+  int timeout = isCheckedMode ? TIMEOUT * 2 : TIMEOUT;
+  if (listener.elapsed > timeout) {
+    throw 'Test timed out.';
+  }
+}
diff --git a/tests/try/web/sandbox.dart b/tests/try/web/sandbox.dart
index e11567c..c099165 100644
--- a/tests/try/web/sandbox.dart
+++ b/tests/try/web/sandbox.dart
@@ -83,6 +83,10 @@
 
   String expectedMessage;
 
+  Stopwatch wallclock;
+
+  int get elapsed => wallclock.elapsedMilliseconds ~/ 1000;
+
   void onMessage(MessageEvent e) {
     String message = e.data;
     if (expectedMessage == message) {
@@ -117,6 +121,7 @@
   }
 
   void start() {
+    wallclock = new Stopwatch()..start();
     window.onMessage.listen(onMessage);
   }
 }
diff --git a/tools/VERSION b/tools/VERSION
index 6f49db1..998fa2d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 8
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 246e87f..3a94d30 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -26,7 +26,7 @@
     r'dart2js-(linux|mac|windows)(-(jsshell))?-(debug|release)(-(checked|host-checked))?(-(host-checked))?(-(minified))?(-(x64))?(-(batch))?-?(\d*)-?(\d*)')
 DART2JS_FULL_BUILDER = r'full-(linux|mac|win7|win8)(-(ie10|ie11))?(-checked)?(-minified)?-(\d+)-(\d+)'
 WEB_BUILDER = (
-    r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.8|mac10\.7|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
+    r'dart2js-(ie9|ie10|ie11|ff|safari|chrome|chromeOnAndroid|safarimobilesim|opera|drt)-(win7|win8|mac10\.7|mac10\.8|mac10\.9|linux)(-(all|html))?(-(csp))?(-(\d+)-(\d+))?')
 
 IE_VERSIONS = ['ie10', 'ie11']
 
@@ -138,7 +138,7 @@
     system = 'windows'
 
   # We have both 10.8 and 10.7 bots, functionality is the same.
-  if system == 'mac10.8' or system == 'mac10.7':
+  if system == 'mac10.7' or system == 'mac10.8' or system == 'mac10.9':
     builder_tag = system.replace('.', '_')
     system = 'mac'
 
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index d17612d..8a57d69 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1466,11 +1466,14 @@
       var number_of_tests = 0;
       var current_id;
       var next_id;
-      // Describes a state where we are currently fetching the next test
-      // from the server. We use this to never double request tasks.
+
+      // Has the test in the current iframe reported that it is done?
       var test_completed = true;
+      // Has the test in the current iframe reported that it is started?
+      var test_started = false;
       var testing_window;
 
+      var embedded_iframe_div = document.getElementById('embedded_iframe_div');
       var embedded_iframe = document.getElementById('embedded_iframe');
       var number_div = document.getElementById('number');
       var executing_div = document.getElementById('currently_executing');
@@ -1582,6 +1585,11 @@
           } else {
             embedded_iframe.onload = null;
           }
+          embedded_iframe_div.removeChild(embedded_iframe);
+          embedded_iframe = document.createElement('iframe');
+          embedded_iframe.id = "embedded_iframe";
+          embedded_iframe.style="width:100%;height:100%";
+          embedded_iframe_div.appendChild(embedded_iframe);
           embedded_iframe.src = url;
         } else {
           if (typeof testing_window != 'undefined') {
@@ -1589,6 +1597,8 @@
           }
           testing_window = window.open(url);
         }
+        test_started = false;
+        test_completed = false;
       }
 
       window.onerror = function (message, url, lineNumber) {
@@ -1613,8 +1623,14 @@
 
       function reportMessage(msg, isFirstMessage, isStatusUpdate) {
         if (isFirstMessage) {
-          test_completed = false;
+          if (test_started) {
+            reportMessage(
+                "FAIL: test started more than once (test reloads itself) " +
+                msg, false, false);
+            return;
+          }
           current_id = next_id;
+          test_started = true;
           contactBrowserController(
             'POST', '$startedPath/${browserId}?id=' + current_id,
             function () {}, msg, true);
@@ -1666,7 +1682,12 @@
       function messageHandler(e) {
         var msg = e.data;
         if (typeof msg != 'string') return;
-
+        var expectedSource =
+            use_iframe ? embedded_iframe.contentWindow : testing_window;
+        if (e.source != expectedSource) {
+            reportError("Message received from old test window: " + msg);
+            return;
+        }
         var parsedData = parseResult(msg);
         if (parsedData) {
           // Only if the JSON message contains all required parameters,
@@ -1744,7 +1765,7 @@
     Currently executing: <span id="currently_executing"></span><br>
     Unhandled error: <span id="unhandled_error"></span>
     </div>
-    <div class="test box">
+    <div id="embedded_iframe_div" class="test box">
       <iframe style="width:100%;height:100%;" id="embedded_iframe"></iframe>
     </div>
   </body>
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 14cb0ff..a5e7b8e 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -126,17 +126,7 @@
     "/foo",
     "/bar",
     "/NonExistingFile",
-    "/NonExistingFile.js",
-    "/hahaURL",
-    "/IntentionallyMissingFile",
-    "/IntentionallyMissingFile.dart",
-    "/IntentionallyMissingFile.html",
-    "/IntentionallyMissingFile.png",
-    "/IntentionallyMissingFile.css",
-    "/IntentionallyMissingFile.jpg",
-    "/IntentionallyMissingFile.ttf",
-    "/IntentionallyMissingFile.otf",
-    "/IntentionallyMissingFile.jpeg"
+    "IntentionallyMissingFile",
   ];
 
   List _serverList = [];
@@ -419,8 +409,8 @@
 
   void _sendNotFound(HttpRequest request) {
     bool isHarmlessPath(String path) {
-      return _HARMLESS_REQUEST_PATH_ENDINGS.any((ending) {
-        return path.endsWith(ending);
+      return _HARMLESS_REQUEST_PATH_ENDINGS.any((pattern) {
+        return path.contains(pattern);
       });
     }
     if (!isHarmlessPath(request.uri.path)) {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 3eb76e3..befa478 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -2581,6 +2581,13 @@
 
 bool shouldRetryCommand(CommandOutput output) {
   var command = output.command;
+  // We rerun tests on Safari because 6.2 and 7.1 are flaky. Issue 21434.
+  if (command is BrowserTestCommand && command.browser == 'safari' &&
+      output is BrowserControllerTestOutcome &&
+      output._rawOutcome != Expectation.PASS) {
+    // TODO(whesse): This retries tests that fail intentionally. Fix this
+    return true;
+  }
 
   if (!output.successful) {
     List<String> stdout, stderr;
@@ -2605,8 +2612,8 @@
       }
     }
 
-    // We currently rerun dartium tests, see issue 14074
-    if (command is BrowserTestCommand && command.displayName == 'dartium') {
+    // We currently rerun dartium tests, see issue 14074.
+    if (command is BrowserTestCommand && command.browser == 'dartium') {
       return true;
     }
   }
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index ee33b15..0cdd4ea 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -57,7 +57,8 @@
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
             '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
             '<!@(["python", "../../tools/list_files.py", "\\.(css|ico|js|json|png|sh|txt|yaml|py)$", ".", "../../sdk/lib/_internal/dartdoc"])',
-            '<!@(["python", "../../tools/list_files.py", "\\.dart$", ".", "../../sdk/lib", "../../runtime/lib", "../../runtime/bin"])',
+	    # We implicitly depend on the sdk/lib and vm runtime files by depending on the dart binary above.
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "."])',
             '../../sdk/bin/dart',
             '../../sdk/bin/dart.bat',
             '../../sdk/bin/dart2js',
